Advertisement
losvilos

lista_clientes.html

Feb 28th, 2025
163
0
21 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 8.23 KB | Help | 0 0
  1. {% extends 'base.html' %}
  2. {% block content %}
  3.  
  4. <div class="container mt-4">
  5.     <input type="hidden" id="id_cliente" name="id_cliente">
  6.     <input type="hidden" id="id_direccion_instalacion" name="id_direccion_instalacion">
  7.    
  8.     <h2>Mantenimiento de Clientes</h2>
  9.     <button class="btn btn-primary mb-3" data-toggle="modal" data-target="#modalAgregarCliente">
  10.         <i class="fa fa-plus"></i> Nuevo Registro
  11.     </button>
  12.     <form method="get">
  13.         <input type="text" name="q" placeholder="Buscar clientes..." value="{{ request.GET.q }}">
  14.         <button type="submit">Buscar</button>
  15.     </form>
  16.     <table class="table table-striped">
  17.         <thead>
  18.             <tr>
  19.                 <th>N° Documento</th>
  20.                 <th>Cliente</th>
  21.                 <th>Móvil</th>
  22.                 <th>Email</th>
  23.                 <th>Estado</th>
  24.                 <th>Direcciones</th>
  25.                 <th>Acción</th>
  26.             </tr>
  27.         </thead>
  28.         <tbody>
  29.             {% for cliente in clientes %}
  30.             <tr data-id="{{ cliente.id }}">
  31.                 <td class="documento">{{ cliente.documento }}</td>
  32.                 <td class="nombre">{{ cliente.nombre }} {{ cliente.apellido_paterno }}{% if cliente.apellido_materno %} {{ cliente.apellido_materno }}{% endif %}</td>
  33.                 <td class="telefono">{{ cliente.telefono }}</td>
  34.                 <td class="email">{{ cliente.email }}</td>
  35.                 <td>
  36.                     <span class="badge estatus {% if cliente.estatus %}bg-success{% else %}bg-danger{% endif %}">
  37.                         {% if cliente.estatus %}Activo{% else %}Inactivo{% endif %}
  38.                     </span>
  39.                 </td>
  40.                 <td>
  41.                     <ul>
  42.                         {% for direccion in cliente.direcciones.all %}
  43.                         <li>{{ direccion.direccion }} ({{ direccion.zona.nombre }})</li>
  44.                         {% endfor %}
  45.                     </ul>
  46.                 </td>
  47.                 <td>
  48.                     <a class="btn btn-sm btn-primary" href="{% url 'detalle_cliente_html' cliente.id %}">
  49.                         Ver detalle
  50.                     </a>
  51.                     <button class="btn btn-info btn-sm btn-editar" data-id="{{ cliente.id }}">
  52.                         <i class="fa fa-edit"></i> Editar
  53.                     </button>
  54.                     <button class="btn btn-danger btn-sm btn-eliminar" data-id="{{ cliente.id }}">
  55.                         <i class="fa fa-trash"></i> Eliminar
  56.                     </button>
  57.                 </td>
  58.             </tr>
  59.             {% endfor %}
  60.         </tbody>
  61.     </table>
  62. </div>
  63.  
  64. <!-- Modal para Registrar Cliente -->
  65. <div class="modal fade" id="modalAgregarCliente" tabindex="-1" aria-labelledby="modalAgregarClienteLabel" aria-hidden="true">
  66.     <div class="modal-dialog modal-lg">
  67.       <div class="modal-content">
  68.         <div class="modal-header">
  69.           <h5 class="modal-title">Registrar Cliente</h5>
  70.           <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  71.             <span aria-hidden="true">&times;</span>
  72.           </button>
  73.         </div>
  74.         <form id="formNuevoCliente" method="POST">
  75.           {% csrf_token %}
  76.           <div class="modal-body">
  77.             <div class="container-fluid">
  78.               <h5>Información del Cliente</h5>
  79.               <div class="row">
  80.                 <div class="col-md-6">
  81.                   <div class="form-group">
  82.                     <label for="documento">N° Documento (*)</label>
  83.                     <input type="text" class="form-control" name="documento" id="documento" required>
  84.                   </div>
  85.                   <div class="form-group">
  86.                     <label for="nombre">Nombre (*)</label>
  87.                     <input type="text" class="form-control" name="nombre" id="nombre" required>
  88.                   </div>
  89.                   <div class="form-group">
  90.                     <label for="apellido_paterno">Apellido Paterno (*)</label>
  91.                     <input type="text" class="form-control" name="apellido_paterno" id="apellido_paterno" required>
  92.                   </div>
  93.                   <div class="form-group">
  94.                     <label for="apellido_materno">Apellido Materno</label>
  95.                     <input type="text" class="form-control" name="apellido_materno" id="apellido_materno">
  96.                   </div>
  97.                 </div>
  98.                 <div class="col-md-6">
  99.                   <div class="form-group">
  100.                     <label for="telefono">Móvil (*)</label>
  101.                     <input type="text" class="form-control" name="telefono" id="telefono" required>
  102.                   </div>
  103.                   <div class="form-group">
  104.                     <label for="email">Email</label>
  105.                     <input type="email" class="form-control" name="email" id="email">
  106.                   </div>
  107.                   <div class="form-group">
  108.                     <label for="sexo">Sexo (*)</label>
  109.                     <select name="sexo" id="sexo" class="form-control" required>
  110.                       <option value="">Seleccionar</option>
  111.                       <option value="M">Masculino</option>
  112.                       <option value="F">Femenino</option>
  113.                     </select>
  114.                   </div>
  115.                   <div class="form-group">
  116.                     <label for="estatus">Estado (*)</label>
  117.                     <select name="estatus" id="estatus" class="form-control" required>
  118.                       <option value="1">Activo</option>
  119.                       <option value="0">Inactivo</option>
  120.                     </select>
  121.                   </div>
  122.                 </div>
  123.               </div>
  124.               <hr>
  125.               <h5>Direcciones</h5>
  126.               <div id="direccion_formset">
  127.                 <div class="direccion-form row">
  128.                   <div class="col-md-5">
  129.                     <label for="zona">Zona (*)</label>
  130.                     <select name="zona" class="form-control" required>
  131.                       <option value="">Selecciona una zona</option>
  132.                       {% for zona in zonas %}
  133.                       <option value="{{ zona.id }}">{{ zona.nombre }}</option>
  134.                       {% endfor %}
  135.                     </select>
  136.                   </div>
  137.                   <div class="col-md-5">
  138.                     <label for="direccion">Dirección (*)</label>
  139.                     <input type="text" class="form-control" name="direccion" required>
  140.                   </div>
  141.                   <div class="col-md-2 d-flex align-items-end">
  142.                     <button type="button" class="btn btn-success btn-sm add-direccion"><i class="fa fa-plus"></i></button>
  143.                     <button type="button" class="btn btn-danger btn-sm remove-direccion ml-2"><i class="fa fa-minus"></i></button>
  144.                   </div>
  145.                 </div>
  146.               </div>
  147.             </div>
  148.           </div>
  149.           <div class="modal-footer">
  150.             <button type="submit" class="btn btn-success">Guardar</button>
  151.             <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
  152.           </div>
  153.         </form>
  154.       </div>
  155.     </div>
  156. </div>
  157.  
  158. <script>
  159.   document.getElementById('formNuevoCliente').addEventListener('submit', function(event) {
  160.       event.preventDefault();  // Evita el envío tradicional del formulario
  161.  
  162.       const formData = new FormData(this);
  163.  
  164.       fetch("{% url 'agregar_cliente' %}", {
  165.           method: 'POST',
  166.           body: formData,
  167.           headers: {
  168.               'X-CSRFToken': '{{ csrf_token }}'
  169.           }
  170.       })
  171.       .then(response => response.json())
  172.       .then(data => {
  173.           if (data.success) {
  174.               alert("Cliente agregado exitosamente");
  175.               location.reload();  // 🔥 Recargar la página para ver los cambios
  176.           } else {
  177.               console.error("Errores:", data.errors);
  178.               alert("Error: " + JSON.stringify(data.errors));  // 🔥 Mostrar errores reales
  179.           }
  180.       })
  181.       .catch(error => {
  182.           console.error('Error:', error);
  183.           alert("Ocurrió un error inesperado. Revisa la consola.");
  184.       });
  185.   });
  186.   </script>
  187.  
  188.  
  189.  
  190. {% endblock %}
  191.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement