const moment = require('moment'); const validator = require('validator'); const Servicio = require('../db/tablas/Servicio'); // Caractéres especiales permitidos en una string const caracterEspecial = (char) => { const charset = [ ' ', '.', ',', ':', ';', '?', '¿', '!', '¡', '(', ')', '"', "'", '-', '_', '/', '#', '%', '\n', ]; for (let i = 0; i < charset.length; i++) if (charset[i] === char) return true; return false; }; const yaExiste = (campo, m) => { throw new Error(`Ya se encuentra en uso ${m ? 'el' : 'la'} ${campo}.`); }; const noValido = (campo, m, razon) => { console.log(m); throw new Error( `${m ? 'El' : 'La'} ${campo} no es valid${m ? 'o' : 'a'}, ${razon}.` ); }; /* Valida que la variable contenga un valor, de lo contrario saca un error. */ const noHay = (variable, campo, m) => { if (!variable) throw new Error(`No se mando ${m ? 'el' : 'la'} ${campo}.`); }; /* Valida que la variable sea una string y, si se necesita, que mida igual o menor que una longitud determinada. */ const validacionBasicaStr = (texto, campo, m, length) => { noHay(texto, campo, m); if (typeof texto !== 'string') noValido(campo, m, 'no se mando una string'); if (length && texto.length > length) noValido(campo, m, 'tiene más carecteres de lo permitido'); return texto; }; /* Valida que la variable sea un numero entero, ya sea que recibe una string o un number. Usualmente se usa para validar ids. */ const validarNumeroEntero = (numero, campo, m = true) => { noHay(numero, campo, m); if (typeof numero === 'number') numero = numero.toString(); if (typeof numero !== 'string') noValido(campo, m, 'no se mando una string o un number'); if (!validator.isNumeric(numero, { no_symbols: true })) noValido(campo, m, 'no es un número entero valido'); return Number(numero); }; /* Valida que la stirng mandada sea un correo valido. */ const validarCorreo = (correo, campo = 'correo', m = true, length) => { validacionBasicaStr(correo, campo, m, length); if (!validator.isEmail(correo)) noValido(campo, m, 'no es un correo válido'); return correo; }; /* Valida que la stirng mandada sea solo caracteres del abcdario. Usualmente se usa para validar nombres, apellidos, etc. */ const validarTexto = (texto, campo, m, length) => { validacionBasicaStr(texto, campo, m, length); for (let i = 0; i < texto.length; i++) if ( !validator.isAlpha(texto[i], 'es-ES') && texto[i] != ' ' && texto[i] != '.' ) noValido(campo, m, 'contiene caracteres no validos'); return texto; }; /* Lo mismo que el de arriba pero este permite números y caracteres especiales. */ const validarAlfanumerico = (texto, campo, m, length) => { validacionBasicaStr(texto, campo, m, length); for (let i = 0; i < texto.length; i++) { if (caracterEspecial(texto[i])) continue; if (!validator.isAlphanumeric(texto[i], 'es-ES')) noValido(campo, m, 'contiene caracteres no validos'); } return texto; }; /* Valida que la string sea un número menor a 9 dígitos. */ const validarNumeroCuenta = ( numeroCuenta, campo = 'numero de cuenta', m = true ) => { validacionBasicaStr(numeroCuenta, campo, m, 9); if (!validator.isNumeric(numeroCuenta, { no_symbols: true })) noValido(campo, m, 'tiene caracteres que no son números'); return numeroCuenta; }; /* Valida que la variable sea una fecha moment valida. */ const validarFecha = (fecha, campo, m) => { let fechaMoment = moment(fecha); noHay(fecha, campo, m); if (!fechaMoment.isValid()) noValido(campo, m, 'no es una fecha válida'); return fechaMoment; }; /* Valida que una string contenga solo números */ const validarNumero = ( numero, campo, m, length, no_symbols = true, makeNumber = false ) => { validacionBasicaStr(numero, campo, m, length); if (!validator.isNumeric(numero, { no_symbols })) noValido(campo, m, 'tiene caracteres que no son números'); if (makeNumber) return Number(numero); return numero; }; // const validarAccesibilidad = (usuariosValidos = [], idTipoUsuario) => { // for (let i = 0; i < usuariosValidos.length; i++) // if (idTipoUsuario === usuariosValidos[i]) return; // throw new Error('Este usuario no tiene permitido usar esta linea de la API.'); // }; /* Te dice si un objeto esta vacio o no. */ const validarObjetoVacio = (obj) => { for (let key in obj) if (obj.hasOwnProperty(key)) return false; return true; }; const validarPreTermino = (idServicio) => { // obtener los id cuestionarios by idServicio de la tabla cuestionario // budcar el id cuestionario de alumno en las tablas de alumnos - depende de la version // buscar el id cuestionario de programa en las tablas de programas - depende de la version // validar el if console.log("este es el id en la busqieda", idServicio); return Servicio.findOne({ where: { idServicio } }) .then((res) => { console.log("validando pre termino", res); if ( (res.idCuestionarioPrograma || res.idCuestionarioPrograma2) && (res.idCuestionarioAlumno || res.idCuestionarioAlumno2) && res.cartaTermino && res.informeGlobal ) return Servicio.update({ idStatus: 5 }, { where: { idServicio } }); return false; }) .then((res) => res ? 'Este Servicio Social paso a Termino, espera a que COESI autorice tu liberación.' : '' ); }; const validarCuestionarioAlumno2old = (body) => { console.log("Validando cuestionario alumno 2"); // Excluir p2 de la validación de campos nulos const camposExcluidos = [ // 'p2' ]; // Verificar si algún campo es nulo o indefinido (excepto p2) for (const [key, value] of Object.entries(body)) { if (!camposExcluidos.includes(key) && (value === null || value === undefined || value === '')) { throw new Error(`El campo ${key} no puede estar vacío.`); } } console.log("Validación exitosa. Todos los campos son válidos."); return body; }; const validarCuestionarioAlumno2 = (body) => { console.log("Validando cuestionario alumno 2"); // Definir las claves que se consideran opcionales (las preguntas condicionales en el front) const optionalKeys = ['p5', 'p8', 'p16', 'p18']; // Si p1 viene como array, concatenarla en una cadena separada por comas. if (Array.isArray(body.p1)) { body.p1 = body.p1.join(', '); } // Verificar que cada campo obligatorio (no opcional) no esté vacío. for (const [key, value] of Object.entries(body)) { if (!optionalKeys.includes(key) && (value === null || value === undefined || value === '')) { throw new Error(`El campo ${key} no puede estar vacío.`); } } // Lista de claves obligatorias esperadas (según la función formatearRespuestas en el front) const expectedKeys = [ // Preguntas individuales obligatorias: "p1", "p2", "p4", "p6", "p7", "p9", "p13", "p14", "p15", // Las condicionales se consideran opcionales: p5, p8, p16 y p18 // Tablas: // Tabla 130 (numeroPregunta 3) "p3_1", "p3_2", "p3_3", "p3_4", // Tabla 104 (numeroPregunta 10) "p10_1", "p10_2", "p10_3", // Tabla 105 (numeroPregunta 11) "p11_1", "p11_2", "p11_3", "p11_4", // Tabla 106 (numeroPregunta 17) "p17_1", "p17_2", "p17_3", // Tabla 101 (numeroPregunta 12, sub "A. Habilidades personales") "p12_A_1", "p12_A_2", "p12_A_3", "p12_A_4", // Tabla 102 (numeroPregunta 12, sub "B. Habilidades profesionales") "p12_B_1", "p12_B_2", "p12_B_3", "p12_B_4", // Tabla 103 (numeroPregunta 12, sub "C. Habilidades sociales") "p12_C_1", "p12_C_2", "p12_C_3", "p12_C_4", "p12_C_5", // Tabla 1042 (numeroPregunta 12, sub "D. Conocimientos") "p12_D_1", "p12_D_2", "p12_D_3", "p12_D_4", "p12_D_5" ]; for (const key of expectedKeys) { if (!(key in body)) { throw new Error(`Falta la respuesta para la pregunta ${key}.`); } } console.log("Validación exitosa. Todos los campos son válidos."); return body; }; const validarCuestionarioPrograma2old = (body) => { console.log("Validando cuestionario programa 2"); // Excluir p2 de la validación de campos nulos const camposExcluidos = [ // 'p2' ]; // Verificar si algún campo es nulo o indefinido (excepto p2) for (const [key, value] of Object.entries(body)) { if (!camposExcluidos.includes(key) && (value === null || value === undefined || value === '')) { throw new Error(`El campo ${key} no puede estar vacío.`); } } console.log("Validación exitosa. Todos los campos son válidos."); return body; }; const validarCuestionarioPrograma2 = (body) => { console.log("Validando cuestionario programa 2"); // Definir las claves condicionales (opcionales). En este caso, la pregunta 6 (porqueNoContrataria) es condicional. const camposOpcionales = ["p6"]; // Si la respuesta de p1 viene como array, concatenarla en una cadena if (Array.isArray(body.p1)) { body.p1 = body.p1.join(', '); } // Verificar que cada campo obligatorio (no opcional) no esté vacío for (const [key, value] of Object.entries(body)) { if (!camposOpcionales.includes(key) && (value === null || value === undefined || value === '')) { throw new Error(`El campo ${key} no puede estar vacío.`); } } // Lista de claves obligatorias esperadas (según el formateo que se usa en el front) const expectedKeys = [ // Preguntas individuales obligatorias: "p1", "p2", "p4", "p5", // Las condicionales, como "p6", son opcionales // Tablas: // Tabla 301 (sub "A. Habilidades personales") "p3_A_1", "p3_A_2", "p3_A_3", "p3_A_4", // Tabla 302 (sub "B. Habilidades profesionales") "p3_B_1", "p3_B_2", "p3_B_3", "p3_B_4", // Tabla 303 (sub "C. Habilidades sociales") "p3_C_1", "p3_C_2", "p3_C_3", "p3_C_4", "p3_C_5", // Tabla 304 (sub "D. Conocimientos") "p3_D_1", "p3_D_2", "p3_D_3", "p3_D_4", "p3_D_5" ]; // Verificar que existan todas las claves obligatorias for (const key of expectedKeys) { if (!(key in body)) { throw new Error(`Falta la respuesta para la pregunta ${key}.`); } } console.log("Validación exitosa. Todos los campos son válidos."); return body; }; module.exports = { validarCuestionarioPrograma2 }; module.exports = { yaExiste, noValido, noHay, validacionBasicaStr, validarNumeroEntero, validarCorreo, validarTexto, validarAlfanumerico, validarNumeroCuenta, validarFecha, validarNumero, validarObjetoVacio, validarPreTermino, validarCuestionarioAlumno2, validarCuestionarioPrograma2 };