const csv = require('csvtojson'); const helperPath = '../../helper'; const { validarObjetoVacio } = require(`${helperPath}/validar`); const { eliminarArchivo } = require(`${helperPath}/helper`); const dbPath = '../../db/tablas'; const Carrera = require(`${dbPath}/Carrera`); const TipoUsuario = require(`${dbPath}/TipoUsuario`); const Usuario = require(`${dbPath}/Usuario`); const cargaMasiva = async (file) => { const path = `server/uploads/${file}`; const usuariosNuevos = []; const usuariosUpdate = []; const errores = []; const avisos = []; return csv() .fromFile(path) .then(async (usuarios) => { for (let i = 0; i < usuarios.length; i++) { const mensajeErrBase = `Se salto la linea ${i + 2} por:`; if ( !usuarios[i].cuenta || !usuarios[i].apellidop || !usuarios[i].apellidom || !usuarios[i].nombrew || !usuarios[i].tipoUsuario ) { if (!usuarios[i].cuenta) errores.push(`${mensajeErrBase} falta variable cuenta.`); if (!usuarios[i].apellidop) errores.push(`${mensajeErrBase} falta variable apellidop.`); if (!usuarios[i].apellidom) errores.push(`${mensajeErrBase} falta variable apellidom.`); if (!usuarios[i].nombrew) errores.push(`${mensajeErrBase} falta variable nombrew.`); if (!usuarios[i].tipoUsuario) errores.push(`${mensajeErrBase} falta variable tipoUsuario.`); continue; } const idTipoUsuario = await TipoUsuario.findOne({ where: { tipoUsuario: usuarios[i].tipoUsuario }, }).then((res) => { if (!res) { errores.push(`${mensajeErrBase} tipo de usuario no valido.`); return null; } return res.idTipoUsuario; }); let idCarrera = null; if (!idTipoUsuario) continue; if (idTipoUsuario != 3) { if (!usuarios[i].nomplan) { errores.push(`${mensajeErrBase} falta variable nomplan.`); continue; } idCarrera = await Carrera.findOne({ where: { carrera: usuarios[i].nomplan }, }) .then((res) => { if (!res) { avisos.push( `Se añadio el posgrado/la carrera ${usuarios[i].nomplan} al catálogo.` ); return Carrera.create({ carrera: usuarios[i].nomplan }); } return res; }) .then((res) => res.idCarrera); } if (usuarios[i].cuenta.length === 8) usuarios[i].cuenta = `0${usuarios[i].cuenta}`; await Usuario.findOne({ where: { usuario: usuarios[i].cuenta }, include: [{ model: Carrera }], }).then(async (res) => { let usuario = res; if (!usuario) { const data = { usuario: usuarios[i].cuenta, nombre: `${usuarios[i].apellidop} ${usuarios[i].apellidom} ${usuarios[i].nombrew}`, idTipoUsuario, }; if (data.idTipoUsuario != 3) data.idCarrera = idCarrera; await Usuario.create(data) .then((res) => Usuario.findOne({ where: { idUsuario: res.idUsuario }, include: [{ model: Carrera }, { model: TipoUsuario }], attributes: ['idUsuario', 'usuario', 'nombre'], }) ) .then((res) => usuariosNuevos.push(res)); } else { let update = {}; if (!usuario.activo) { update.activo = true; usuariosUpdate.push( `La cuenta del usuario: ${usuario.usuario} fue activada.` ); } if ( usuario.Carrera && usuario.Carrera.carrera != usuarios[i].nomplan ) { update.idCarrera = idCarrera; usuariosUpdate.push( `Se cambio la carrera del usuario: ${usuario.usuario} de ${usuario.Carrera.carrera} por ${usuarios[i].nomplan}.` ); } if (usuario.idTipoUsuario != idTipoUsuario) { update.idTipoUsuario = idTipoUsuario; usuariosUpdate.push( `Se cambio el tipo de usuario del usuario: ${usuario.usuario} de ${usuario.TipoUsuario.tipoUsuario} por ${usuarios[i].tipoUsuario}.` ); } if (!validarObjetoVacio(update)) await Usuario.update(update, { where: { idUsuario: usuario.idUsuario }, }); else errores.push( `${mensajeErrBase} no se mando nada para actualizar.` ); } }); } return eliminarArchivo(path); }) .then(() => ({ message: 'Se subió correctamente el archivo csv.', usuariosNuevos, usuariosUpdate, errores, avisos, })); }; module.exports = cargaMasiva;