Advertisement
losvilos

clientes.js

Feb 26th, 2025
205
0
20 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. document.addEventListener('DOMContentLoaded', function() {
  2.  
  3.  
  4.     // Función para cargar avenidas (se mantiene sin cambios)
  5.     function cargarAvenidas(zonaId, avenidaSelectId, avenidaSeleccionada = null) {
  6.         let avenidaSelect = document.getElementById(avenidaSelectId);
  7.         if (!avenidaSelect || !zonaId) return;
  8.  
  9.         avenidaSelect.innerHTML = "<option value=''>Cargando avenidas...</option>";
  10.  
  11.         fetch(`/get_avenidas/${zonaId}/`)
  12.             .then(response => {
  13.                 if (!response.ok) {
  14.                     throw new Error(`Error ${response.status}: No se pudo obtener las avenidas`);
  15.                 }
  16.                 return response.json();
  17.             })
  18.             .then(data => {
  19.                 avenidaSelect.innerHTML = "<option value=''>Selecciona una avenida</option>";
  20.  
  21.                 if (!data.avenidas || data.avenidas.length === 0) {
  22.                     avenidaSelect.innerHTML = "<option value=''>No hay avenidas disponibles</option>";
  23.                     return;
  24.                 }
  25.  
  26.                 data.avenidas.forEach(avenida => {
  27.                     let option = document.createElement("option");
  28.                     option.value = avenida.id;
  29.                     option.textContent = avenida.nombre;
  30.                     if (avenidaSeleccionada && avenida.id == avenidaSeleccionada) {
  31.                         option.selected = true;
  32.                     }
  33.                     avenidaSelect.appendChild(option);
  34.                 });
  35.             })
  36.             .catch(error => {
  37.                 console.error("❌ Error al cargar avenidas:", error);
  38.                 avenidaSelect.innerHTML = "<option value=''>Error al cargar</option>";
  39.             });
  40.     }
  41.  
  42.     // Eventos para cargar avenidas (se combinan los listeners repetidos)
  43.     const zonaSelect = document.getElementById("id_zona");
  44.     const editZonaSelect = document.getElementById("edit_zona");
  45.  
  46.     if (zonaSelect) {
  47.         zonaSelect.addEventListener("change", function () {
  48.             let zonaId = this.value;
  49.             console.log(" Cargando avenidas para la zona seleccionada:", zonaId);
  50.             cargarAvenidas(zonaId, "id_avenida");
  51.         });
  52.     }
  53.  
  54.     if (editZonaSelect) {
  55.         editZonaSelect.addEventListener("change", function () {
  56.             let zonaId = this.value;
  57.             console.log(" Cargando avenidas para zona en edición:", zonaId);
  58.             cargarAvenidas(zonaId, "edit_avenida");
  59.         });
  60.     }
  61.  
  62. // --- EDICIÓN DE CLIENTE ---
  63. document.querySelectorAll(".btn-editar").forEach(button => {
  64.     button.addEventListener("click", function () {
  65.         let clienteId = this.getAttribute("data-id");
  66.  
  67.         fetch(`/clientes/${clienteId}/`, { method: "GET" })
  68.         .then(response => {
  69.             if (!response.ok) {
  70.                 throw new Error(`Error ${response.status}: No se pudo obtener la información del cliente.`);
  71.             }
  72.             return response.json();
  73.         })
  74.         .then(data => {
  75.             console.log("Datos recibidos del cliente:", data);
  76.  
  77.             document.getElementById("edit_id").value = data.id;
  78.             document.getElementById("edit_documento").value = data.documento;
  79.             document.getElementById("edit_nombre").value = data.nombre;
  80.             document.getElementById("edit_apellido_paterno").value = data.apellido_paterno;
  81.             document.getElementById("edit_apellido_materno").value = data.apellido_materno;
  82.             document.getElementById("edit_fecha_nacimiento").value = data.fecha_nacimiento;
  83.             document.getElementById("edit_sexo").value = data.sexo;
  84.             document.getElementById("edit_telefono").value = data.telefono;
  85.             document.getElementById("edit_email").value = data.email;
  86.  
  87.             // Cargar la dirección, zona y avenida desde el array "direcciones"
  88.             if (data.direcciones && data.direcciones.length > 0) {
  89.                 document.getElementById("edit_direccion").value = data.direcciones[0].direccion;
  90.                 document.getElementById("edit_zona").value = data.direcciones[0].zona_id || "";
  91.                 // Si tienes la función cargarAvenidas, la llamas para actualizar el select de avenidas:
  92.                 cargarAvenidas(data.direcciones[0].zona_id, "edit_avenida", data.direcciones[0].avenida_id);
  93.             } else {
  94.                 document.getElementById("edit_direccion").value = "";
  95.                 document.getElementById("edit_zona").value = "";
  96.                 document.getElementById("edit_avenida").value = "";
  97.             }
  98.  
  99.             document.getElementById("edit_estatus").checked = data.estatus;
  100.  
  101.             // Mostrar el modal de edición
  102.             $("#modalEditarCliente").modal("show");
  103.  
  104.             // Configurar el submit del formulario de edición
  105.             const formEditarCliente = document.getElementById('formEditarCliente');
  106.             formEditarCliente.action = `/clientes/${clienteId}/`; // URL correcta
  107.  
  108.             formEditarCliente.onsubmit = function(event) {
  109.                 event.preventDefault();
  110.                 const formData = new FormData(formEditarCliente);
  111.  
  112.                 fetch(formEditarCliente.action, {
  113.                     method: 'POST',
  114.                     body: formData,
  115.                     headers: {
  116.                         'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
  117.                     }
  118.                 })
  119.                 .then(response => {
  120.                     if (!response.ok) {
  121.                         return response.json().then(err => {throw new Error(err.error || `Error ${response.status}: No se pudo guardar los cambios del cliente.`)});
  122.                     }
  123.                     return response.json();
  124.                 })
  125.                 .then(data => {
  126.                     console.log("Respuesta del servidor:", data);
  127.                     $('#modalEditarCliente').modal('hide');
  128.                     Swal.fire("Éxito", data.mensaje, "success").then(() => {
  129.                         window.location.reload();
  130.                     });
  131.                 })
  132.                 .catch(error => {
  133.                     console.error("Error al guardar los cambios del cliente:", error);
  134.                     Swal.fire("Error", error.message, "error");
  135.                 });
  136.             };
  137.         })
  138.         .catch(error => {
  139.             console.error("Error al obtener datos del cliente:", error);
  140.             Swal.fire("Error", error.message, "error");
  141.         });
  142.     });
  143. });
  144.  
  145.  
  146.    
  147.  
  148. function editarCliente(clienteId) {
  149.     // Nota: Asegúrate de tener definida "formData" si la usas aquí;
  150.     // de lo contrario, si lo usas sólo en el submit del modal, elimina esta línea.
  151.     fetch(`/clientes/${clienteId}/`, { // URL corregida
  152.         method: 'POST',
  153.         body: formData, // Asegúrate de definir "formData" si es necesario o elimínalo
  154.         headers: {
  155.           'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
  156.         }
  157.       })
  158.     .then(response => {
  159.         if (!response.ok) {
  160.             return response.json().then(err => {throw new Error(err.error || `Error ${response.status}: No se pudo obtener la información del cliente.`)});
  161.         }
  162.         return response.json();
  163.     })
  164.     .then(data => {
  165.         console.log("Datos recibidos del cliente:", data);
  166.  
  167.         document.getElementById("edit_documento").value = data.documento;
  168.         document.getElementById("edit_nombre").value = data.nombre;
  169.         document.getElementById("edit_apellido_paterno").value = data.apellido_paterno;
  170.         document.getElementById("edit_apellido_materno").value = data.apellido_materno;
  171.         document.getElementById("edit_fecha_nacimiento").value = data.fecha_nacimiento;
  172.         document.getElementById("edit_sexo").value = data.sexo;
  173.         document.getElementById("edit_telefono").value = data.telefono;
  174.         document.getElementById("edit_email").value = data.email;
  175.        
  176.         // Reemplazamos la antigua asignación de data.direccion por la lectura del array "direcciones"
  177.         if (data.direcciones && data.direcciones.length > 0) {
  178.             document.getElementById("edit_direccion").value = data.direcciones[0].direccion;
  179.             // Asumiendo que tu vista ahora incluye zona_id y avenida_id en cada dirección
  180.             document.getElementById("edit_zona").value = data.direcciones[0].zona_id || "";
  181.             document.getElementById("edit_avenida").value = data.direcciones[0].avenida_id || "";
  182.         } else {
  183.             document.getElementById("edit_direccion").value = "";
  184.             document.getElementById("edit_zona").value = "";
  185.             document.getElementById("edit_avenida").value = "";
  186.         }
  187.  
  188.         // Manejo de data.estatus (si es numérico)
  189.         const editEstatusCheckbox = document.getElementById("edit_estatus");
  190.         if (typeof data.estatus === 'number') {
  191.             editEstatusCheckbox.checked = data.estatus === 1;
  192.         } else {
  193.             editEstatusCheckbox.checked = data.estatus;
  194.         }
  195.  
  196.         const formEditarCliente = document.getElementById('formEditarCliente');
  197.         formEditarCliente.action = `/clientes/${clienteId}/`; // URL corregida
  198.  
  199.         formEditarCliente.onsubmit = function(event) {
  200.             event.preventDefault();
  201.             const formData = new FormData(formEditarCliente);
  202.             fetch(formEditarCliente.action, {
  203.                 method: 'POST',
  204.                 body: formData,
  205.                 headers: {
  206.                     'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
  207.                 }
  208.             })
  209.             .then(response => {
  210.                 if (!response.ok) {
  211.                     return response.json().then(err => {throw new Error(err.error || `Error ${response.status}: No se pudo guardar los cambios del cliente.`)});
  212.                 }
  213.                 return response.json();
  214.             })
  215.             .then(data => {
  216.                 console.log("Respuesta del servidor:", data);
  217.                 $('#modalEditarCliente').modal('hide');
  218.                 window.location.reload();
  219.                 Swal.fire("Éxito", data.message, "success");
  220.             })
  221.             .catch(error => {
  222.                 console.error("Error al guardar los cambios del cliente:", error);
  223.                 Swal.fire("Error", error.message, "error");
  224.             });
  225.         };
  226.  
  227.         $('#modalEditarCliente').modal('show');
  228.     })
  229.     .catch(error => {
  230.         console.error("Error al obtener datos del cliente:", error);
  231.         Swal.fire("Error", error.message, "error");
  232.     });
  233. }
  234.  
  235.    
  236.    
  237.    // --- ELIMINACIÓN DE CLIENTE ---
  238.    document.querySelectorAll(".btn-eliminar").forEach(btn => {
  239.     btn.addEventListener("click", async function () {
  240.         let clienteId = this.getAttribute("data-id");
  241.  
  242.         Swal.fire({
  243.             title: "¿Estás seguro?",
  244.             text: "Esta acción no se puede deshacer.",
  245.             icon: "warning",
  246.             showCancelButton: true,
  247.             confirmButtonColor: "#d33",
  248.             cancelButtonColor: "#3085d6",
  249.             confirmButtonText: "Sí, eliminar",
  250.             cancelButtonText: "Cancelar"
  251.         }).then(async (result) => {
  252.             if (result.isConfirmed) {
  253.                 try {
  254.                     let response = await fetch(`/clientes/eliminar/${clienteId}/`, {
  255.                         method: "DELETE"
  256.                     });
  257.  
  258.                     let data = await response.json();
  259.  
  260.                     if (response.ok) {
  261.                         Swal.fire("Eliminado", "El cliente ha sido eliminado.", "success");
  262.  
  263.                         //  Eliminar fila de la tabla sin recargar la página
  264.                         let fila = document.querySelector(`tr[data-id="${clienteId}"]`);
  265.                         if (fila) {
  266.                             fila.remove();
  267.                         }
  268.                     } else {
  269.                         Swal.fire("Error", "No se pudo eliminar el cliente.", "error");
  270.                     }
  271.                 } catch (error) {
  272.                     console.error("❌ Error en la solicitud:", error);
  273.                     Swal.fire("Error", "No se pudo eliminar el cliente.", "error");
  274.                 }
  275.             }
  276.         });
  277.     });
  278. });
  279.    
  280.  
  281.  
  282. document.addEventListener("DOMContentLoaded", function() {
  283.     const formNuevoCliente = document.getElementById("formNuevoCliente");
  284.  
  285.     formNuevoCliente.addEventListener("submit", async function(event) {
  286.         event.preventDefault(); // Evita recargar la página
  287.  
  288.         try {
  289.             let formData = new FormData(this);
  290.  
  291.             Swal.fire({
  292.                 title: "Procesando...",
  293.                 html: "Por favor, espere.",
  294.                 allowOutsideClick: false,
  295.                 didOpen: () => {
  296.                     Swal.showLoading();
  297.                 }
  298.             });
  299.  
  300.             let response = await fetch("/clientes/agregar/", {
  301.                 method: "POST",
  302.                 body: formData
  303.             });
  304.  
  305.             if (response.ok) {
  306.                 const data = await response.json();
  307.                
  308.                 // Opción A: Mostrar mensaje, insertar fila en la tabla y cerrar modal sin recargar
  309.                 Swal.fire("Éxito", data.mensaje || "Cliente agregado correctamente.", "success")
  310.                   .then(() => {
  311.                     // Construir la nueva fila y agregarla al tbody
  312.                     const nuevaFila = `
  313.                       <tr data-id="${data.id}">
  314.                           <td class="documento">${data.documento}</td>
  315.                           <td class="nombre">${data.nombre} ${data.apellido_paterno} ${data.apellido_materno || ''}</td>
  316.                           <td class="telefono">${data.telefono}</td>
  317.                           <td class="email">${data.email || ""}</td>
  318.                           <td>
  319.                             <span class="badge estatus ${data.estatus ? 'bg-success' : 'bg-danger'}">
  320.                                 ${data.estatus ? "Activo" : "Inactivo"}
  321.                             </span>
  322.                           </td>
  323.                           <td>
  324.                             <a class="btn btn-sm btn-primary" href="/clientes/${data.id}/">Ver detalle</a>
  325.                             <button class="btn btn-info btn-sm btn-editar" data-id="${data.id}">
  326.                                 <i class="fa fa-edit"></i> Editar
  327.                             </button>
  328.                             <button class="btn btn-danger btn-sm btn-eliminar" data-id="${data.id}">
  329.                                 <i class="fa fa-trash"></i> Eliminar
  330.                             </button>
  331.                           </td>
  332.                       </tr>
  333.                     `;
  334.                     document.querySelector("table tbody").insertAdjacentHTML("beforeend", nuevaFila);
  335.                     $('#modalAgregarCliente').modal('hide');
  336.                     formNuevoCliente.reset();
  337.                     // Opcional: reubicar el foco en un elemento visible
  338.                     document.querySelector("body").focus();
  339.                   });
  340.  
  341.                 // Opción B: Recargar la página
  342.                 // Swal.fire("Éxito", data.mensaje || "Cliente agregado correctamente.", "success")
  343.                 //   .then(() => {
  344.                 //     $('#modalAgregarCliente').modal('hide');
  345.                 //     formNuevoCliente.reset();
  346.                 //     window.location.reload();
  347.                 //   });
  348.  
  349.             } else {
  350.                 try {
  351.                     const errorData = await response.json();
  352.                     const errorMessage = errorData.error || errorData.message || "No se pudo agregar el cliente.";
  353.                     Swal.fire("Error", errorMessage, "error");
  354.                 } catch (parseError) {
  355.                     console.error("Error al parsear la respuesta de error:", parseError);
  356.                     Swal.fire("Error", "Ocurrió un error al procesar la respuesta del servidor.", "error");
  357.                 }
  358.             }
  359.         } catch (error) {
  360.             console.error("❌ Error en la solicitud:", error);
  361.             Swal.fire("Error", "Ocurrió un error inesperado.", "error");
  362.         }
  363.     });
  364. });
  365.  
  366.  
  367.  
  368.  
  369.  
  370. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement