Carpeta js
This commit is contained in:
@@ -0,0 +1,254 @@
|
||||
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 = `
|
||||
<strong>Se encontraron errores:</strong>
|
||||
<ul class="mb-0 mt-2">
|
||||
${errores.map(e => `<li>${e}</li>`).join("")} <!-- convierte array a <li> -->
|
||||
</ul>
|
||||
`;
|
||||
|
||||
// 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 = `
|
||||
<strong>Mensajes de éxito:</strong>
|
||||
<ul class="mb-0 mt-2">
|
||||
${mensajes.map(m => `<li>${m}</li>`).join("")}
|
||||
</ul>
|
||||
`;
|
||||
|
||||
// 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);
|
||||
}
|
||||
Reference in New Issue
Block a user