From c01cac94a9fefd61bcea24665de01b61ffe5126e Mon Sep 17 00:00:00 2001 From: Lemuel Marquez Date: Sun, 27 Dec 2020 21:05:36 -0600 Subject: [PATCH] carga masiva2 --- server/controller/Programa/cargaMasiva.js | 119 ++++++++++++++++++++++ server/db/data-fake.js | 2 +- server/db/tablas/Usuario.js | 3 +- server/helper/correos.js | 43 -------- server/routes/Programa.js | 18 ++++ 5 files changed, 140 insertions(+), 45 deletions(-) diff --git a/server/controller/Programa/cargaMasiva.js b/server/controller/Programa/cargaMasiva.js index e69de29..3e49900 100644 --- a/server/controller/Programa/cargaMasiva.js +++ b/server/controller/Programa/cargaMasiva.js @@ -0,0 +1,119 @@ +const fs = require('fs'); +const moment = require('moment'); +const csv = require('csvtojson'); +const gmail = require('../../helper/gmail'); +const correos = require('../../helper/correos'); +const encriptar = require('../../helper/encriptar'); +const validar = require('../../helper/validar'); +const Programa = require('../../db/tablas/Programa'); +const Usuario = require('../../db/tablas/Usuario'); + +const cargaMasiva = async (file) => { + let path = `server/uploads/${file}`; + + csv() + .fromFile(path) + .then(async (programas) => { + let mensaje = ''; + + for (let i = 0; i < programas.length; i++) { + let usuario = ''; + let clavePrograma = programas[i].clave; + let acatlan = false; + let busquedaPrograma = {}; + + mensaje += `Linea ${i + 2}\n`; + try { + usuario = validar.validarCorreo(programas[i].correo); + } catch (error) { + mensaje += 'Correo no valido, se salto esta linea.\n\n'; + continue; + } + + await Usuario.findOne({ + where: { usuario }, + }).then(async (res) => { + let dataUsuario = res; + + if (!dataUsuario) { + let password = encriptar.generarPassword(); + let correo = correos.enviarSec( + password, + usuario, + programas[i].nombre + ); + + await Usuario.create({ + usuario, + password: encriptar.encriptar(password), + nombre: programas[i].nombre, + activo: true, + idTipoUsuario: 2, + }).then((res) => { + dataUsuario = res.dataValues; + mensaje += `Se creo un responsable de programa con correo: ${dataUsuario.usuario} e id: ${dataUsuario.idUsuario}\n`; + }); + // await gmail(correo.subject, usuario, correo.msj); + } + if (clavePrograma.substr(4) === '-12/20-91') acatlan = true; + if (acatlan) { + busquedaPrograma = { + where: { + clavePrograma: programas[i].clave, + idUsuario: dataUsuario.idUsuario, + }, + include: [{ model: Usuario }], + }; + } else { + busquedaPrograma = { + where: { clavePrograma: programas[i].clave }, + include: [{ model: Usuario }], + }; + } + await Programa.findOne(busquedaPrograma).then(async (res) => { + let dataPrograma = res; + + if (!dataPrograma) { + let activo = true; + + if (clavePrograma.substr(0, 4) < moment().year()) activo = false; + if (clavePrograma.substr(0, 4) > moment().year()) { + mensaje += `El año de esta clave de programa no es valido\n\n`; + } else { + await Programa.create({ + institucion: programas[i].institucion, + dependencia: programas[i].dependencia, + programa: programas[i].programa, + clavePrograma, + acatlan, + activo, + idUsuario: dataUsuario.idUsuario, + }).then((res) => { + dataPrograma = res.dataValues; + mensaje += `Se agrego el programa: ${ + dataPrograma.programa + } con clave: ${dataPrograma.clavePrograma} al responsable ${ + dataUsuario.usuario + } ${ + dataPrograma.activo ? 'se encuentra' : 'no se encuentra' + } activo y ${ + dataPrograma.acatlan ? 'pertenece' : 'no pertenece' + } a Acatlán\n\n`; + }); + } + } else { + mensaje += `Ya existe el programa con clave de programa: ${dataPrograma.clavePrograma} que pertenece al responsable con correo: ${dataPrograma.Usuario.usuario}\n\n`; + } + }); + }); + } + console.log(mensaje); + fs.unlinkSync(path); + }); + return { + message: + 'Se subio correctamente el archivo csv, se enviará un correo a tramites.ss@acatlan.unam.mx con los detalles de la carga masiva.', + }; +}; + +module.exports = cargaMasiva; diff --git a/server/db/data-fake.js b/server/db/data-fake.js index 2cc06c8..5440dfe 100644 --- a/server/db/data-fake.js +++ b/server/db/data-fake.js @@ -78,7 +78,7 @@ const dataPrograma = async () => { institucion: `Institucion Falsa ${i + 1}`, dependencia: `Dependencia Falsa ${j - i + 1}`, programa: `Programa Falso ${j}`, - clavePrograma: `2020/${i + j + 1}-${i + j + 1}`, + clavePrograma: `2020-${i}/${i + j + 1}-${i + j + 1}`, idUsuario: i + 2, }); console.log( diff --git a/server/db/tablas/Usuario.js b/server/db/tablas/Usuario.js index 706c20e..4e7660a 100644 --- a/server/db/tablas/Usuario.js +++ b/server/db/tablas/Usuario.js @@ -13,8 +13,9 @@ Usuario.init( autoIncrement: true, }, usuario: { - type: DataTypes.STRING(60), + type: DataTypes.STRING(100), allowNull: false, + unique: true, }, password: { type: DataTypes.STRING(60), diff --git a/server/helper/correos.js b/server/helper/correos.js index b49fe66..038f142 100644 --- a/server/helper/correos.js +++ b/server/helper/correos.js @@ -183,48 +183,6 @@ Jefa del Departamento de Servicio Social y Bolsa de Trabajo.`, }; }; -const enviarSec2 = (secreto, usuariomail, nombre) => { - return { - subject: `Estimado responsable de programa de servicio social: ${nombre}`, - msj: `Como ya se les había informado mediante las cartas de presentación de nuestros alumnos, en nuestra Facultad estamos en un proceso de actualización administrativa que implica la puesta en marcha de un nuevo sistema interno de servicio social en el cual estará el expediente electrónico del alumno y su seguimiento con respecto a estos trámites. - -La dirección electrónica de dicho sistema es https://iris.acatlan.unam.mx y su usuario y contraseña son: - -Nombre de usuario para ingresar = ${usuariomail} - -Contraseña = ${secreto} - -Le pedimos sea cuidadoso de sus claves de acceso ya que con ellos tiene la facultad para registrar el trámite de inicio y término de servicio social de nuestros alumnos, lo que genera un riesgo para malas prácticas si comparte sus datos con otras personas. - -Para el uso de dicho sistema el proceso es el siguiente: - -1. Al ingresar sólo debe seguir las sencillas instrucciones para pre-registrar a sus prestadores de servicio social, lo cual es un proceso fácil debido a que con sólo capturar el número de cuenta del alumno, aparecerá de manera automática su nombre y carrera, quedando pendiente sólo los campos de correo electrónico del alumno (el cual se encuentra en su carta de presentación) y los datos de su programa de servicio social. Adicionalmente deberá cargar el archivo con la carta de aceptación escaneada en formato pdf. Cabe mencionar que por las medidas de prevención estabecidas en la universidad ante el COVID-19, a partir del 17 de marzo se dejaran de expedir cartas de presentación con la intención de evitar la movilidad de los alumnos y su incorporación a las instituciones en un momento de riesgo. La expedición de este documento se hará de manera normal cuando se reestablezcan las actividades en la Universidad. - -2. Con dicho pre-registro el Departamento de servicio social revisará que la carta de aceptación esté correcta y dará su aprobación en el sistema para que le llegue un correo electrónico al alumno notificándole sus claves de acceso para completar el registro. - -3. El alumno ingresará al sistema para llenar algunos datos pendientes y una vez hecho esto, el Departamento de servicio social validará el registro del alumno y el sistema enviará un correo de notificación tanto al alumno como a usted para que tengan conocimiento que el proceso de registro se completó de manera satisfactoria. - -4. Para notificar el término del alumno deberá ingresar nuevamente al sistema y cargar el archivo de la carta de término escaneada en formato pdf, así como llenar un cuestionario de desempeño del alumno. - -5. Por su parte el alumno ingresará al sistema para subir escaneado su informe de actividades con firma y sello de su jefe inmediato y llenará un cuestionario de evaluación del programa de servicio social en el que participó. - -6. Si todo está correcto el Departamento de servicio social validará el trámite de término del alumno y le notificará el tiempo aproximado en que puede pasar a recoger su carta de liberación de servicio social. - -Le pedimos su apoyo cargando las cartas de los alumnos en un periodo de 10 días hábiles posteriores a la fecha de inicio y término, ya que a su vez los alumnos tendrán otros 10 días hábiles para completar lo que les corresponde en cada etapa. Para todos los casos de este año que ya hayan iniciado su servicio social con anterioridad, le pedimos que antes del 15 de Mayo, quede registrado en nuestro sistema, para regularizar su trámite. - -Finalmente, cabe mencionar que el nuevo procedimiento sólo aplica a los alumnos que inicien su servicio social en 2020, por lo que aquellos que ya habían hecho su trámite de inicio desde 2019, lo terminarán con el proceso anterior entregando su carta original en las ventanillas de servicio social cuando se reestablezcan las actividades en la universidad. - -${dudas} - -Atentamente - -Mtra. Adriana Roque del Angel - -Jefa del Departamento de Servicio Social y Bolsa de Trabajo. -Facultad de Estudios Superiores Acatlán.`, - }; -}; - const avisoTerminoAlumno = (nombre) => { return { subject: `Aviso de Termino de Servicio Social`, @@ -282,7 +240,6 @@ module.exports = { terminoRechazadoAlumno, terminoRechazadoResponsable, enviarSec, - enviarSec2, canceladoAlumno, canceladoResponsable, avisoTerminoAlumno, diff --git a/server/routes/Programa.js b/server/routes/Programa.js index 512384a..b9cd748 100644 --- a/server/routes/Programa.js +++ b/server/routes/Programa.js @@ -1,7 +1,10 @@ const express = require('express'); +const multer = require('multer'); const app = express(); +const upload = multer({ dest: 'server/uploads' }); const route = '/programa'; const get = require('../controller/Programa/get'); +const cargaMasiva = require('../controller/Programa/cargaMasiva'); app.get(`${route}`, (req, res) => { return get(req.query) @@ -13,4 +16,19 @@ app.get(`${route}`, (req, res) => { }); }); +app.post(`${route}/carga_masiva`, upload.single('csv'), (req, res) => { + if (req.file) { + return cargaMasiva(req.file.filename) + .then((data) => { + res.status(201).json(data); + }) + .catch((err) => { + res.status(400).json({ message: err.message }); + }); + } + res + .status(400) + .json({ message: 'No se envio un archivo csv para la carga masiva.' }); +}); + module.exports = app;