Files

377 lines
11 KiB
JavaScript

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
};