document.addEventListener("DOMContentLoaded", () => { if (serverErrors.length > 0) mostrarErrores(serverErrors); if (serverSuccess.length > 0) mostrarSuccess(serverSuccess); const form = document.getElementById("form-crear-proveedor") || document.getElementById("form-editar-proveedor"); if (!form) return; // Funciones utilitarias function isEmpty(value) { return !value || value.trim() === ''; } function isValidEmail(email) { return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(email); } function isValidName(value) { return /^[A-Za-zÁÉÍÓÚÑáéíóúñ0-9&',.\-]+(?: [A-Za-zÁÉÍÓÚÑáéíóúñ0-9&',.\-]+)*(?: (S\.A\.|S\.R\.L\.|S\.C\.|S\.C\.P\.|S\.A\.S\.))?$/.test(value); } // Submit form.addEventListener("submit", (e) => { let errores = []; const razon_social = form.querySelector("input[name='razon_social']"); const telefono = form.querySelector("input[name='telefono']"); const email = form.querySelector("input[name='email']"); // Limpiar estados previos form.querySelectorAll(".is-invalid").forEach(el => el.classList.remove("is-invalid") ); // RAZÓN SOCIAL if (razon_social) { if (isEmpty(razon_social.value)) { errores.push("La razón social es obligatorio."); razon_social.classList.add("is-invalid"); } else if (!isValidName(razon_social.value)) { errores.push("La razón social contiene caracteres inválidos o la abreviatura legal final no es correcta."); razon_social.classList.add("is-invalid"); } else if (razon_social.value.length < 2) { errores.push("La razón social debe tener al menos 2 caracteres."); razon_social.classList.add("is-invalid"); } else if (razon_social.value.length > 50) { errores.push("La razón social no puede superar los 50 caracteres."); razon_social.classList.add("is-invalid"); } } // TELÉFONO if (telefono) { if (isEmpty(telefono.value)) { errores.push("El teléfono es obligatorio."); telefono.classList.add("is-invalid"); } else if (telefono.value.length != 10) { errores.push("El teléfono debe poseer 10 dígitos."); telefono.classList.add("is-invalid"); } } // EMAIL if (email) { if (isEmpty(email.value)) { errores.push("El email es obligatorio."); email.classList.add("is-invalid"); } else if (!isValidEmail(email.value)) { errores.push("El email no tiene un formato válido."); email.classList.add("is-invalid"); } else if (email.value.length > 100) { errores.push("El email no puede superar los 100 caracteres."); email.classList.add("is-invalid"); } } // CONDICIÓN IVA const condIVA = form.querySelector("select[name='cond_iva']"); const condicionesPermitidas = [ "consumidor_final", "monotributo", "responsable_inscripto" ]; if (condIVA) { if (!condicionesPermitidas.includes(condIVA.value)) { errores.push("Condición de IVA inválida."); condIVA.classList.add("is-invalid"); } } // CUIT const cuit1 = form.querySelector("input[name='cuit_1']"); const cuit2 = form.querySelector("input[name='cuit_2']"); const cuit3 = form.querySelector("input[name='cuit_3']"); if (cuit1 && cuit2 && cuit3) { const cuit = cuit1.value.trim() + cuit2.value.trim() + cuit3.value.trim(); // Monotributo y Responsable Inscripto: // CUIT obligatorio if (condIVA && condIVA.value !== "consumidor_final" && cuit === "") { errores.push("Debe ingresar el CUIT."); cuit1.classList.add("is-invalid"); cuit2.classList.add("is-invalid"); cuit3.classList.add("is-invalid"); } // Si se ingresó algo, validar formato if (cuit !== "") { if (!/^\d{11}$/.test(cuit)) { errores.push( "El CUIT debe contener exactamente 11 dígitos." ); cuit1.classList.add("is-invalid"); cuit2.classList.add("is-invalid"); cuit3.classList.add("is-invalid"); } } } // Resultado if (errores.length > 0) { e.preventDefault(); mostrarErrores(errores); } }); // FUNCIÓN PARA MOSTRAR ERRORES function mostrarErrores(errores) { // Buscar si hay un toast previo const viejo = document.getElementById("toastErrores"); // Si existe, se elimina (evita duplicados) if (viejo) viejo.remove(); // Crea el contenedor del toast const toast = document.createElement("div"); // Se le asigna ID para identificarlo toast.id = "toastErrores"; // Clases de estilo (Bootstrap + CSS) toast.className = "toast-flotante alert alert-danger"; // Inserta el contenido dinámico (lista de errores) toast.innerHTML = ` Se encontraron errores: `; // Agrega el toast al body (lo hace visible) document.body.appendChild(toast); // Auto-cierre setTimeout(() => { // Agrega clase para animación de salida (CSS) toast.classList.add("toast-out"); // Elimina el elemento después de la animación setTimeout(() => { toast.remove(); // Elimina el DOM }, 350); }, 5000); // Visible durante 5 segundos } }); // FUNCIÓN PARA MOSTRAR SUCCESS function mostrarSuccess(mensajes) { // Elimina toast previo de éxito si existe const viejo = document.getElementById("toastSuccess"); if (viejo) viejo.remove(); // Crea el contenedor del toast const toast = document.createElement("div"); // Se le asigna ID único toast.id = "toastSuccess"; // Estilo toast.className = "toast-flotante alert alert-success"; // Inserta mensajes dinámicos toast.innerHTML = ` Mensajes de éxito: `; // Agrega al DOM document.body.appendChild(toast); // Auto-cierre a los 5 segundos setTimeout(() => { // Animación de salida toast.classList.add("toast-out"); // Eliminación final setTimeout(() => { toast.remove(); }, 350); }, 5000); }