const fs = require('fs'); const csv = require('csvtojson'); const moment = require('moment'); const helperPath = '../../helper'; const correos = require(`${helperPath}/correos`); const encriptar = require(`${helperPath}/encriptar`); const gmail = require(`${helperPath}/gmail`); const { validarCorreo } = require(`${helperPath}/validar`); const dbPath = '../../db/tablas'; const Programa = require(`${dbPath}/Programa`); const Usuario = require(`${dbPath}/Usuario`); const cargaMasiva = async (file) => { const path = `server/uploads/${file}`; const today = moment(); csv() .fromFile(path) .then(async (programas) => { let mensaje = ''; for (let i = 0; i < programas.length; i++) { mensaje += `Linea ${i + 2}\n`; if ( !programas[i].correo || !programas[i].nombre || !programas[i].institucion || !programas[i].dependencia || !programas[i].programa || !programas[i].clave ) { mensaje += 'Esta liena fue saltada por falta de datos en alguno de sus campos.\n\n'; continue; } try { validarCorreo(programas[i].correo); } catch (err) { console.log(err); mensaje += 'Esta linea contiene un correo no valido.\n\n'; continue; } const acatlan = programas[i].clave.substr(4, 7) === '-12/20-'; const activo = Number(programas[i].clave.substr(0, 4)) === today.year(); const responsable = await Usuario.findOne({ where: { usuario: programas[i].correo, idTipoUsuario: 2 }, }).then((res) => { if (!res) { const password = encriptar.generarPassword(); const correo = correos.enviarSec( password, programas[i].correo, programas[i].nombre ); return Usuario.create({ usuario: programas[i].correo, password: encriptar.encriptar(password), nombre: programas[i].nombre, activo: true, idTipoUsuario: 2, }) .then(async (res) => { await gmail(correo.subject, programas[i].correo, correo.msj); mensaje += `Se creo al responsable con id ${res.idUsuario} y correo ${res.usuario}\n`; return res; }) .catch((err) => { mensaje = mensaje + err.message + err; }); } return res; }); if (!acatlan) { await Programa.findOne({ where: { clavePrograma: programas[i].clave }, include: [{ model: Usuario }], }) .then((res) => { if (!res) { return Programa.create({ institucion: programas[i].institucion, dependencia: programas[i].dependencia, programa: programas[i].programa, clavePrograma: programas[i].clave, activo, idUsuario: responsable.idUsuario, }).catch((err) => { mensaje = mensaje + err.message + err; }); } mensaje += `El programa ${res.clavePrograma} ya ${ programas[i].correo === res.Usuario.usuario ? 'le pertenece a este responsable' : 'fue asignado al responsable' } con id ${res.Usuario.idUsuario} y correo ${ res.Usuario.usuario }.\n`; return false; }) .then((res) => { if (res) mensaje += `Se asigno el programa ${res.clavePrograma} con id ${res.idPrograma} al usuario con id ${responsable.idUsuario} y correo ${responsable.usuario}\n`; }); } else { await Programa.findOne({ where: { clavePrograma: programas[i].clave, idUsuario: responsable.idUsuario, }, }) .then((res) => { if (!res) { return Programa.create({ institucion: 'UNAM', dependencia: 'FES ACATLAN', programa: programas[i].programa, clavePrograma: programas[i].clave, activo, acatlan, idUsuario: responsable.idUsuario, }).catch((err) => { mensaje = mensaje + err.message + err; }); } mensaje += `El programa ${res.clavePrograma} ya pertenece al responsable con id ${responsable.idUsuario} y correo ${responsable.usuario}\n`; return false; }) .then((res) => { if (res) mensaje += `Se asigno el programa ${res.clavePrograma} con id ${res.idPrograma} al usuario con id ${responsable.idUsuario} y correo ${responsable.usuario}\n`; }); } mensaje += '\n'; } await gmail('Reporte carga masiva', 'lemuel@acatlan.unam.mx', mensaje); fs.unlinkSync(path); }); return { message: 'Se subio correctamente el archivo csv para la carga masiva.', }; }; module.exports = cargaMasiva;