Advertisement
losvilos

clientes.js

Feb 27th, 2025 (edited)
282
0
17 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.37 KB | Help | 0 0
  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.             // Llenar los campos del formulario de edición
  78.             document.getElementById("edit_id").value = data.id;
  79.             document.getElementById("edit_documento").value = data.documento;
  80.             document.getElementById("edit_nombre").value = data.nombre;
  81.             document.getElementById("edit_apellido_paterno").value = data.apellido_paterno;
  82.             document.getElementById("edit_apellido_materno").value = data.apellido_materno;
  83.             document.getElementById("edit_fecha_nacimiento").value = data.fecha_nacimiento;
  84.             document.getElementById("edit_sexo").value = data.sexo;
  85.             document.getElementById("edit_telefono").value = data.telefono;
  86.             document.getElementById("edit_email").value = data.email;
  87.  
  88.             // Cargar la dirección, zona y avenida desde el array "direcciones"
  89.             if (data.direcciones && data.direcciones.length > 0) {
  90.                 document.getElementById("edit_direccion").value = data.direcciones[0].direccion;
  91.                 document.getElementById("edit_zona").value = data.direcciones[0].zona_id || "";
  92.                 // Si tienes la función cargarAvenidas, la llamas para actualizar el select de avenidas:
  93.                 cargarAvenidas(data.direcciones[0].zona_id, "edit_avenida", data.direcciones[0].avenida_id);
  94.             } else {
  95.                 document.getElementById("edit_direccion").value = "";
  96.                 document.getElementById("edit_zona").value = "";
  97.                 document.getElementById("edit_avenida").value = "";
  98.             }
  99.  
  100.             // Manejo del campo 'edit_estatus' (cambiar esta línea)
  101.             const estatusElement = document.getElementById("edit_estatus");
  102.             if (estatusElement) {
  103.                 console.log("Elemento 'edit_estatus' encontrado.");
  104.                 estatusElement.value = data.estatus ? "1" : "0"; // Establecer el valor del <select>
  105.             } else {
  106.                 console.error("El elemento 'edit_estatus' no fue encontrado.");
  107.             }
  108.  
  109.             // Mostrar el modal de edición
  110.             $("#modalEditarCliente").modal("show");
  111.  
  112.             // Configurar el submit del formulario de edición
  113.             const formEditarCliente = document.getElementById('formEditarCliente');
  114.             formEditarCliente.action = `/clientes/${clienteId}/`; // URL correcta
  115.  
  116.             formEditarCliente.onsubmit = function(event) {
  117.                 event.preventDefault();
  118.                 const formData = new FormData(formEditarCliente);
  119.  
  120.                 fetch(formEditarCliente.action, {
  121.                     method: 'POST',
  122.                     body: formData,
  123.                     headers: {
  124.                         'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
  125.                     }
  126.                 })
  127.                 .then(response => {
  128.                     if (!response.ok) {
  129.                         return response.json().then(err => {throw new Error(err.error || `Error ${response.status}: No se pudo guardar los cambios del cliente.`)});
  130.                     }
  131.                     return response.json();
  132.                 })
  133.                 .then(data => {
  134.                     console.log("Respuesta del servidor:", data);
  135.                     $('#modalEditarCliente').modal('hide');
  136.                     Swal.fire("Éxito", data.mensaje, "success").then(() => {
  137.                         window.location.reload();
  138.                     });
  139.                 })
  140.                 .catch(error => {
  141.                     console.error("Error al guardar los cambios del cliente:", error);
  142.                     Swal.fire("Error", error.message, "error");
  143.                 });
  144.             };
  145.         })
  146.         .catch(error => {
  147.             console.error("Error al obtener datos del cliente:", error);
  148.             Swal.fire("Error", error.message, "error");
  149.         });
  150.     });
  151. });
  152.  
  153.  
  154.    
  155.  
  156. function editarCliente(clienteId) {
  157.     // Nota: Asegúrate de tener definida "formData" si la usas aquí;
  158.     // de lo contrario, si lo usas sólo en el submit del modal, elimina esta línea.
  159.     fetch(`/clientes/${clienteId}/`, { // URL corregida
  160.         method: 'POST',
  161.         body: formData, // Asegúrate de definir "formData" si es necesario o elimínalo
  162.         headers: {
  163.           'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
  164.         }
  165.       })
  166.     .then(response => {
  167.         if (!response.ok) {
  168.             return response.json().then(err => {throw new Error(err.error || `Error ${response.status}: No se pudo obtener la información del cliente.`)});
  169.         }
  170.         return response.json();
  171.     })
  172.     .then(data => {
  173.         console.log("Datos recibidos del cliente:", data);
  174.  
  175.         document.getElementById("edit_documento").value = data.documento;
  176.         document.getElementById("edit_nombre").value = data.nombre;
  177.         document.getElementById("edit_apellido_paterno").value = data.apellido_paterno;
  178.         document.getElementById("edit_apellido_materno").value = data.apellido_materno;
  179.         document.getElementById("edit_fecha_nacimiento").value = data.fecha_nacimiento;
  180.         document.getElementById("edit_sexo").value = data.sexo;
  181.         document.getElementById("edit_telefono").value = data.telefono;
  182.         document.getElementById("edit_email").value = data.email;
  183.        
  184.         // Reemplazamos la antigua asignación de data.direccion por la lectura del array "direcciones"
  185.         if (data.direcciones && data.direcciones.length > 0) {
  186.             document.getElementById("edit_direccion").value = data.direcciones[0].direccion;
  187.             // Asumiendo que tu vista ahora incluye zona_id y avenida_id en cada dirección
  188.             document.getElementById("edit_zona").value = data.direcciones[0].zona_id || "";
  189.             document.getElementById("edit_avenida").value = data.direcciones[0].avenida_id || "";
  190.         } else {
  191.             document.getElementById("edit_direccion").value = "";
  192.             document.getElementById("edit_zona").value = "";
  193.             document.getElementById("edit_avenida").value = "";
  194.         }
  195.  
  196.         // Manejo de data.estatus (si es numérico)
  197.         const editEstatusCheckbox = document.getElementById("edit_estatus");
  198.         if (typeof data.estatus === 'number') {
  199.             editEstatusCheckbox.checked = data.estatus === 1;
  200.         } else {
  201.             editEstatusCheckbox.checked = data.estatus;
  202.         }
  203.  
  204.         const formEditarCliente = document.getElementById('formEditarCliente');
  205.         formEditarCliente.action = `/clientes/${clienteId}/`; // URL corregida
  206.  
  207.         formEditarCliente.onsubmit = function(event) {
  208.             event.preventDefault();
  209.             const formData = new FormData(formEditarCliente);
  210.             fetch(formEditarCliente.action, {
  211.                 method: 'POST',
  212.                 body: formData,
  213.                 headers: {
  214.                     'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value
  215.                 }
  216.             })
  217.             .then(response => {
  218.                 if (!response.ok) {
  219.                     return response.json().then(err => {throw new Error(err.error || `Error ${response.status}: No se pudo guardar los cambios del cliente.`)});
  220.                 }
  221.                 return response.json();
  222.             })
  223.             .then(data => {
  224.                 console.log("Respuesta del servidor:", data);
  225.                 $('#modalEditarCliente').modal('hide');
  226.                 window.location.reload();
  227.                 Swal.fire("Éxito", data.message, "success");
  228.             })
  229.             .catch(error => {
  230.                 console.error("Error al guardar los cambios del cliente:", error);
  231.                 Swal.fire("Error", error.message, "error");
  232.             });
  233.         };
  234.  
  235.         $('#modalEditarCliente').modal('show');
  236.     })
  237.     .catch(error => {
  238.         console.error("Error al obtener datos del cliente:", error);
  239.         Swal.fire("Error", error.message, "error");
  240.     });
  241. }
  242.  
  243.    
  244.    
  245.    // --- ELIMINACIÓN DE CLIENTE ---
  246.    document.querySelectorAll(".btn-eliminar").forEach(btn => {
  247.     btn.addEventListener("click", async function () {
  248.         let clienteId = this.getAttribute("data-id");
  249.  
  250.         Swal.fire({
  251.             title: "¿Estás seguro?",
  252.             text: "Esta acción no se puede deshacer.",
  253.             icon: "warning",
  254.             showCancelButton: true,
  255.             confirmButtonColor: "#d33",
  256.             cancelButtonColor: "#3085d6",
  257.             confirmButtonText: "Sí, eliminar",
  258.             cancelButtonText: "Cancelar"
  259.         }).then(async (result) => {
  260.             if (result.isConfirmed) {
  261.                 try {
  262.                     let response = await fetch(`/clientes/eliminar/${clienteId}/`, {
  263.                         method: "DELETE"
  264.                     });
  265.  
  266.                     let data = await response.json();
  267.  
  268.                     if (response.ok) {
  269.                         Swal.fire("Eliminado", "El cliente ha sido eliminado.", "success");
  270.  
  271.                         //  Eliminar fila de la tabla sin recargar la página
  272.                         let fila = document.querySelector(`tr[data-id="${clienteId}"]`);
  273.                         if (fila) {
  274.                             fila.remove();
  275.                         }
  276.                     } else {
  277.                         Swal.fire("Error", "No se pudo eliminar el cliente.", "error");
  278.                     }
  279.                 } catch (error) {
  280.                     console.error("❌ Error en la solicitud:", error);
  281.                     Swal.fire("Error", "No se pudo eliminar el cliente.", "error");
  282.                 }
  283.             }
  284.         });
  285.     });
  286. });
  287.    
  288.  
  289.  
  290. document.addEventListener("DOMContentLoaded", function () {
  291.     const formNuevoCliente = document.getElementById("formNuevoCliente");
  292.  
  293.     if (formNuevoCliente) {
  294.         formNuevoCliente.addEventListener("submit", async function (event) {
  295.             event.preventDefault(); // Evita el envío tradicional del formulario
  296.  
  297.             try {
  298.                 // Mostrar un indicador de carga
  299.                 Swal.fire({
  300.                     title: "Procesando...",
  301.                     html: "Por favor, espere.",
  302.                     allowOutsideClick: false,
  303.                     didOpen: () => {
  304.                         Swal.showLoading();
  305.                     },
  306.                 });
  307.  
  308.                 // Crear un FormData con los datos del formulario
  309.                 const formData = new FormData(this);
  310.  
  311.                 // Enviar la solicitud al servidor
  312.                 const response = await fetch("/clientes/agregar/", {
  313.                     method: "POST",
  314.                     body: formData,
  315.                     headers: {
  316.                         "X-CSRFToken": "{{ csrf_token }}", // Asegúrate de incluir el token CSRF
  317.                     },
  318.                 });
  319.  
  320.                 // Verificar si la respuesta es exitosa
  321.                 if (response.ok) {
  322.                     const data = await response.json();
  323.  
  324.                     // Mostrar mensaje de éxito
  325.                     Swal.fire({
  326.                         icon: "success",
  327.                         title: "Éxito",
  328.                         text: data.mensaje || "Cliente agregado correctamente.",
  329.                     }).then(() => {
  330.                         // Construir la nueva fila para la tabla
  331.                         const nuevaFila = `
  332.                             <tr data-id="${data.id}">
  333.                                 <td class="documento">${data.documento}</td>
  334.                                 <td class="nombre">${data.nombre} ${data.apellido_paterno} ${
  335.                             data.apellido_materno || ""
  336.                         }</td>
  337.                                 <td class="telefono">${data.telefono}</td>
  338.                                 <td class="email">${data.email || ""}</td>
  339.                                 <td>
  340.                                     <span class="badge estatus ${
  341.                                        data.estatus ? "bg-success" : "bg-danger"
  342.                                    }">
  343.                                         ${data.estatus ? "Activo" : "Inactivo"}
  344.                                     </span>
  345.                                 </td>
  346.                                 <td>
  347.                                     <a class="btn btn-sm btn-primary" href="/clientes/${data.id}/">Ver detalle</a>
  348.                                     <button class="btn btn-info btn-sm btn-editar" data-id="${data.id}">
  349.                                         <i class="fa fa-edit"></i> Editar
  350.                                     </button>
  351.                                     <button class="btn btn-danger btn-sm btn-eliminar" data-id="${data.id}">
  352.                                         <i class="fa fa-trash"></i> Eliminar
  353.                                     </button>
  354.                                 </td>
  355.                             </tr>
  356.                         `;
  357.  
  358.                         // Insertar la nueva fila en la tabla
  359.                         document.querySelector("table tbody").insertAdjacentHTML("beforeend", nuevaFila);
  360.  
  361.                         // Cerrar el modal y limpiar el formulario
  362.                         $("#modalAgregarCliente").modal("hide");
  363.                         formNuevoCliente.reset();
  364.  
  365.                         // Enfocar un elemento visible (opcional)
  366.                         document.querySelector("body").focus();
  367.                     });
  368.                 } else {
  369.                     // Manejar errores de la respuesta
  370.                     const errorData = await response.json();
  371.                     const errorMessage =
  372.                         errorData.error || errorData.message || "No se pudo agregar el cliente.";
  373.                     Swal.fire({
  374.                         icon: "error",
  375.                         title: "Error",
  376.                         text: errorMessage,
  377.                     });
  378.                 }
  379.             } catch (error) {
  380.                 // Manejar errores inesperados
  381.                 console.error("❌ Error en la solicitud:", error);
  382.                 Swal.fire({
  383.                     icon: "error",
  384.                     title: "Error",
  385.                     text: "Ocurrió un error inesperado. Por favor, inténtalo de nuevo.",
  386.                 });
  387.             }
  388.         });
  389.     } else {
  390.         console.error("El formulario 'formNuevoCliente' no fue encontrado.");
  391.     }
  392. });
  393.  
  394.  
  395.  
  396.  
  397.  
  398. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement