├── 404 ├── 404.css ├── 404.js └── index.html ├── .env ├── .env.example ├── .githelp ├── .gitignore ├── README.md ├── database.config ├── logo.png ├── package-lock.json ├── package.json ├── server.js └── src ├── controllers ├── alumnoController.js ├── areaApoyoController.js ├── asignacionTutoriaController.js ├── buzonSugerenciasController.js ├── coordinadorController.js ├── disponibilidadController.js ├── encuestaController.js ├── etiquetaController.js ├── institucionController.js ├── logController.js ├── notificacionController.js ├── procesoTutoriaController.js ├── programaController.js ├── sesionController.js ├── tutorController.js └── usuarioController.js ├── models ├── alumno.js ├── alumnoXSesion.js ├── areaApoyo.js ├── areaApoyoXSesion.js ├── asignacionTutoria.js ├── asignacionTutoriaXAlumno.js ├── buzonSugerencias.js ├── compromiso.js ├── database.js ├── disponibilidad.js ├── encuesta.js ├── etiqueta.js ├── etiquetaXAlumno.js ├── etiquetaXTutoria.js ├── informacionRelevante.js ├── institucion.js ├── notificacion.js ├── procesoTutoria.js ├── programa.js ├── rol.js ├── rolXUsuarioXPrograma.js ├── sesion.js ├── tutor.js └── usuario.js └── routes ├── alumnoRoutes.js ├── areaApoyoRoutes.js ├── asignacionTutoriaRoutes.js ├── buzonSugerenciasRoutes.js ├── coordinadorRoutes.js ├── disponibilidadRoutes.js ├── encuestaRoutes.js ├── etiquetaRoutes.js ├── frontRoutes.js ├── institucionRoutes.js ├── logRoutes.js ├── notificacionRoutes.js ├── procesoTutoriaRoutes.js ├── programaRoutes.js ├── sesionRoutes.js ├── tutorRoutes.js └── usuarioRoutes.js /.env: -------------------------------------------------------------------------------- 1 | # Global variables 2 | APP_ID=ututor_backend 3 | PORT=80 4 | 5 | 6 | # DataBase connection 7 | PSSW=teamoTyS 8 | DATABASE=dbPruebaInstalacionKND 9 | HOST=inst-pruebainstalacion.cywuoagpzvfc.us-east-1.rds.amazonaws.com 10 | PORTDB=3306 11 | DIALECT=mysql 12 | USR=admin 13 | 14 | UTUTOR_NET_EC2_LOCATION=ututor-front/build -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Global variables 2 | APP_ID=ututor_backend 3 | PORT= 4 | 5 | 6 | # DataBase connection 7 | PSSW= 8 | DATABASE= 9 | HOST= 10 | PORTDB= 11 | DIALECT= 12 | USR= 13 | -------------------------------------------------------------------------------- /.githelp: -------------------------------------------------------------------------------- 1 | ## Change email work-University-work.... and so on 2 | 3 | git config user.email 4 | git config user.email "a20122128@pucp.pe" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | #.env 3 | # dependencies 4 | /node_modules 5 | 6 | database.config 7 | 8 | # production 9 | /build 10 | /ututor-front 11 | .env 12 | -------------------------------------------------------------------------------- /404/404.css: -------------------------------------------------------------------------------- 1 | .page_404 { 2 | padding: 40px 0; 3 | background: #fff; 4 | font-family: "Roboto", serif; 5 | } 6 | 7 | .page_404 img { 8 | width: 100%; 9 | } 10 | 11 | .four_zero_four_bg { 12 | background-image: url(https://cdn.dribbble.com/users/285475/screenshots/2083086/dribbble_1.gif); 13 | height: 400px; 14 | background-position: center; 15 | } 16 | 17 | .four_zero_four_bg h1 { 18 | font-size: 80px; 19 | } 20 | 21 | .four_zero_four_bg h3 { 22 | font-size: 80px; 23 | } 24 | 25 | .link_404 { 26 | color: #fff !important; 27 | padding: 10px 20px; 28 | background: #2e908a; 29 | margin: 20px 0; 30 | display: inline-block; 31 | } 32 | .contant_box_404 { 33 | margin-top: -50px; 34 | } 35 | 36 | -------------------------------------------------------------------------------- /404/404.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JinSSJ3/uTutor_backend/4c850caa3b97fd26b383956c007fd1d3fc61bb3c/404/404.js -------------------------------------------------------------------------------- /404/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 13 | 14 | 15 | 16 | 17 | 18 | 59 | 60 | uTutor-KND 61 | 62 | 63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
logo-ututor 76 | 77 |
78 |
79 |
80 | 81 |

404

82 |
83 | 84 |
85 |

86 | Parece que te perdiste 87 |

88 | 89 |

Esta Pagina no esta disponible!

90 | 91 | Regresar a 93 | ututor.net 94 | 96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 | 104 | 105 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # uTutor BackEnd 2 | # SOFTWARE2020_KND_BackEnd 3 | 4 | Backend project developed by students from PUCP for the Software Engineering course in javascript with Express.js for tutoring management at the university. 5 | 6 | ## Quick Start 7 | 8 | To start developing ... 9 | 10 | ```shell 11 | # Clone the project 12 | git clone ... 13 | 14 | # Install dev dependencies 15 | npm install 16 | 17 | # Copy .env from .env.example and set its properties (for start, set only the DB credentials and a random session secret) 18 | cp .env.example .env 19 | 20 | # Bring up the server up 21 | npm run server 22 | 23 | ``` 24 | 25 | --- 26 | 27 | ## Install Dependencies 28 | 29 | Install all package dependencies (one time operation) 30 | 31 | ```shell 32 | npm install 33 | ``` 34 | 35 | ## Run It 36 | 37 | #### Run in _development_ mode: 38 | 39 | Runs the application is development mode. Should not be used in production (with nodemon to restart if chages were found) 40 | 41 | ```shell 42 | npm run server 43 | ``` 44 | 45 | or debug it 46 | 47 | ```shell 48 | npm run dev:debug 49 | ``` 50 | 51 | #### Run in _production_ mode: 52 | 53 | ##### Requirements 54 | 55 | ... if Flores and skateholders agree to use our product 56 | 57 | ##### Compile it and start it 58 | 59 | Before running into production, change the `.env` file, by setting `IS_PROD` to `true`. 60 | Compiles the application and starts it in production production mode. 61 | 62 | ```shell 63 | npm run compile 64 | pm2 start build/index.js 65 | ``` 66 | 67 | ## Try It 68 | 69 | - Open you're browser to [http://localhost:5000](http://localhost:5000) 70 | - You should see a link to our online documentation through Swagger (still) 71 | 72 | 73 | ## Important! 74 | 75 | Make sure to submit descriptive commit message! We know that it can be tedious, so we made a commit 76 | message template (`.gitcommit`) to help you with that. You can use it by: 77 | 78 | ```bash 79 | git config commit.template ./.gitcommit # Tell Git to read the template file 80 | # (Make some changes) 81 | git add . 82 | git commit -v # Open your editor with the template loaded 83 | ``` 84 | 85 | Notice that we didn't use `git commit -m`. That command by-passes the commit long description and the commit message template. 86 | **Please avoid that command**. Try to be as communicative in 87 | each commit as possible, explaining the "what" and "why"s behind each commit. 88 | 89 | Also, if your changes are getting longer and longer, involving multiple modules, **avoid** committing them in 90 | a single commit. Instead, try to use `git add -p` and split your changes into multiple commits. 91 | That makes it so much more easy to understand the changes. -------------------------------------------------------------------------------- /database.config: -------------------------------------------------------------------------------- 1 | {username: KNDadmin 2 | password: teamotys123 3 | database: KNDdb 4 | host: knd-instdb.cywuoagpzvfc.us-east-1.rds.amazonaws.com 5 | port: 3306 6 | dialect: mysql} -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JinSSJ3/uTutor_backend/4c850caa3b97fd26b383956c007fd1d3fc61bb3c/logo.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ututor_backend", 3 | "version": "1.0.0", 4 | "description": "Backend project for uTutor.knd", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node server.js", 8 | "server": "nodemon server.js", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/JinSSJ3/uTutor_backend.git" 14 | }, 15 | "author": "KND team (Jin, Tys, Jenn, Luis, Renzo, Yeri, Daniel, Gabriel)", 16 | "license": "MIT", 17 | "bugs": { 18 | "url": "https://github.com/JinSSJ3/uTutor_backend/issues" 19 | }, 20 | "homepage": "https://github.com/JinSSJ3/uTutor_backend#readme", 21 | "dependencies": { 22 | "bcrypt": "^4.0.1", 23 | "body-parser": "^1.19.0", 24 | "compression": "^1.7.4", 25 | "concurrently": "^5.1.0", 26 | "dotenv": "^8.2.0", 27 | "express": "^4.17.1", 28 | "fs-path": "0.0.24", 29 | "moment": "^2.26.0", 30 | "morgan": "^1.10.0", 31 | "mysql": "^2.18.1", 32 | "mysql2": "^2.1.0", 33 | "nodemailer": "^6.4.10", 34 | "nodemon": "^2.0.3", 35 | "sequelize": "^5.21.7" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const dotenv = require("dotenv"); 3 | let sequelize = require("./src/models/database"); 4 | const alumno = require("./src/models/alumno"); 5 | const etiqueta = require("./src/models/etiqueta"); 6 | const etiquetaXAlumno = require("./src/models/etiquetaXAlumno"); 7 | const areaApoyoXSesion = require("./src/models/areaApoyoXSesion"); 8 | const sesion = require("./src/models/sesion"); 9 | const morgan = require("morgan"); 10 | const tutor = require("./src/models/tutor"); 11 | const asignacionTutoria = require("./src/models/asignacionTutoria"); 12 | const procesoTutoria = require("./src/models/procesoTutoria"); 13 | const alumnoXSesion = require("./src/models/alumnoXSesion"); 14 | const usuario = require("./src/models/usuario"); 15 | const bodyParser = require("body-parser"); 16 | const rol = require("./src/models/rol"); 17 | const programa = require("./src/models/programa"); 18 | const rolXUsuarioXPrograma = require("./src/models/rolXUsuarioXPrograma"); 19 | const institucion = require("./src/models/institucion"); 20 | const informacionRelevante = require("./src/models/informacionRelevante"); 21 | const notificacion = require("./src/models/notificacion"); 22 | const etiquetaXTutoria = require("./src/models/etiquetaXTutoria"); 23 | const encuesta = require("./src/models/encuesta"); 24 | const disponibilidad = require("./src/models/disponibilidad"); 25 | const compromiso = require("./src/models/compromiso"); 26 | const asignacionTutoriaXAlumno = require("./src/models/asignacionTutoriaXAlumno"); 27 | const areaApoyo = require("./src/models/areaApoyo"); 28 | const mysql = require("mysql2/promise"); 29 | const { QueryInterface, Sequelize } = require("sequelize"); 30 | const path = require("path"); 31 | const compression = require('compression'); 32 | dotenv.config(); 33 | 34 | /* Deployable server 35 | * Author: Jin, Tys, Yeri, Daniel, Jennifer, Luis, Gabriel, Renzo 36 | * Date: 20/07/2020 37 | **/ 38 | 39 | app = express(); 40 | app.use(compression()); 41 | 42 | //app.use(express.json()); 43 | app.use(bodyParser.json({ limit: "10MB", extended: true })); 44 | 45 | // Settings 46 | 47 | 48 | app.set("port", process.env.PORT); 49 | const ututor_net = path.join(__dirname,process.env.UTUTOR_NET_EC2_LOCATION); 50 | app.use(express.static(ututor_net)); 51 | 52 | app.get("/", function (req, res) { 53 | try { 54 | console.log("RUTA", req.url); 55 | res.sendFile(path.join(ututor_net, "index.html")); 56 | } catch (error) { 57 | res.status(404).sendFile(ututor_net_404); 58 | } 59 | }); 60 | app.get("/administrador/", function (req, res) { 61 | try { 62 | console.log("RUTA", req.url); 63 | res.sendFile(path.join(ututor_net, "index.html")); 64 | } catch (error) { 65 | res.status(404).sendFile(ututor_net_404); 66 | } 67 | }); 68 | app.get("/coordinador/", function (req, res) { 69 | try { 70 | res.sendFile(path.join(ututor_net, "index.html")); 71 | } catch (error) { 72 | res.status(404).sendFile(ututor_net_404); 73 | } 74 | }); 75 | app.get("/tutor/", function (req, res) { 76 | try { 77 | res.sendFile(path.join(ututor_net, "index.html")); 78 | } catch (error) { 79 | res.status(404).sendFile(ututor_net_404); 80 | } 81 | }); 82 | app.get("/alumno/", function (req, res) { 83 | try { 84 | res.sendFile(path.join(ututor_net, "index.html")); 85 | } catch (error) { 86 | res.status(404).sendFile(ututor_net_404); 87 | } 88 | }); 89 | 90 | //ADMIN 91 | app.get("/administrador/perfil", function (req, res) { 92 | try { 93 | res.sendFile(path.join(ututor_net, "index.html")); 94 | } catch (error) { 95 | res.status(404).sendFile(ututor_net_404); 96 | } 97 | }); 98 | app.get("/administrador/institucion", function (req, res) { 99 | try { 100 | res.sendFile(path.join(ututor_net, "index.html")); 101 | } catch (error) { 102 | res.status(404).sendFile(ututor_net_404); 103 | } 104 | }); 105 | app.get("/administrador/facultades", function (req, res) { 106 | try { 107 | res.sendFile(path.join(ututor_net, "index.html")); 108 | } catch (error) { 109 | res.status(404).sendFile(ututor_net_404); 110 | } 111 | }); 112 | app.get("/administrador/coordinadores", function (req, res) { 113 | try { 114 | res.sendFile(path.join(ututor_net, "index.html")); 115 | } catch (error) { 116 | res.status(404).sendFile(ututor_net_404); 117 | } 118 | }); 119 | app.get("/administrador/unidadesdeapoyo", function (req, res) { 120 | try { 121 | res.sendFile(path.join(ututor_net, "index.html")); 122 | } catch (error) { 123 | res.status(404).sendFile(ututor_net_404); 124 | } 125 | }); 126 | 127 | //COORDINADOR 128 | app.get("/coordinador/perfil", function (req, res) { 129 | try { 130 | res.sendFile(path.join(ututor_net, "index.html")); 131 | } catch (error) { 132 | res.status(404).sendFile(ututor_net_404); 133 | } 134 | }); 135 | app.get("/coordinador/facultades", function (req, res) { 136 | try { 137 | res.sendFile(path.join(ututor_net, "index.html")); 138 | } catch (error) { 139 | res.status(404).sendFile(ututor_net_404); 140 | } 141 | }); 142 | app.get("/coordinador/tutores", function (req, res) { 143 | try { 144 | res.sendFile(path.join(ututor_net, "index.html")); 145 | } catch (error) { 146 | res.status(404).sendFile(ututor_net_404); 147 | } 148 | }); 149 | app.get("/coordinador/alumnos", function (req, res) { 150 | try { 151 | res.sendFile(path.join(ututor_net, "index.html")); 152 | } catch (error) { 153 | res.status(404).sendFile(ututor_net_404); 154 | } 155 | }); 156 | app.get("/coordinador/asignaciondeTutor", function (req, res) { 157 | try { 158 | res.sendFile(path.join(ututor_net, "index.html")); 159 | } catch (error) { 160 | res.status(404).sendFile(ututor_net_404); 161 | } 162 | }); 163 | app.get("/coordinador/procesosdetutoria", function (req, res) { 164 | try { 165 | res.sendFile(path.join(ututor_net, "index.html")); 166 | } catch (error) { 167 | res.status(404).sendFile(ututor_net_404); 168 | } 169 | }); 170 | app.get("/coordinador/programas", function (req, res) { 171 | try { 172 | res.sendFile(path.join(ututor_net, "index.html")); 173 | } catch (error) { 174 | res.status(404).sendFile(ututor_net_404); 175 | } 176 | }); 177 | app.get("/coordinador/disponibilidades", function (req, res) { 178 | try { 179 | res.sendFile(path.join(ututor_net, "index.html")); 180 | } catch (error) { 181 | res.status(404).sendFile(ututor_net_404); 182 | } 183 | }); 184 | app.get("/coordinador/coordinadoresdeprograma", function (req, res) { 185 | try { 186 | res.sendFile(path.join(ututor_net, "index.html")); 187 | } catch (error) { 188 | res.status(404).sendFile(ututor_net_404); 189 | } 190 | }); 191 | app.get("/coordinador/reportes", function (req, res) { 192 | try { 193 | res.sendFile(path.join(ututor_net, "index.html")); 194 | } catch (error) { 195 | res.status(404).sendFile(ututor_net_404); 196 | } 197 | }); 198 | app.get("/coordinador/asignarroles", function (req, res) { 199 | try { 200 | res.sendFile(path.join(ututor_net, "index.html")); 201 | } catch (error) { 202 | res.status(404).sendFile(ututor_net_404); 203 | } 204 | }); 205 | app.get("/coordinador/alumno/:idAlumno/:fullname", function (req, res) { 206 | try { 207 | res.sendFile(path.join(ututor_net, "index.html")); 208 | } catch (error) { 209 | res.status(404).sendFile(ututor_net_404); 210 | } 211 | }); 212 | 213 | //TUTOR 214 | app.get("/tutor/perfil", function (req, res) { 215 | try { 216 | res.sendFile(path.join(ututor_net, "index.html")); 217 | } catch (error) { 218 | res.status(404).sendFile(ututor_net_404); 219 | } 220 | }); 221 | app.get("/tutor/misalumnos", function (req, res) { 222 | try { 223 | res.sendFile(path.join(ututor_net, "index.html")); 224 | } catch (error) { 225 | res.status(404).sendFile(ututor_net_404); 226 | } 227 | }); 228 | app.get("/tutor/midisponibilidad", function (req, res) { 229 | try { 230 | res.sendFile(path.join(ututor_net, "index.html")); 231 | } catch (error) { 232 | res.status(404).sendFile(ututor_net_404); 233 | } 234 | }); 235 | app.get("/tutor/sesiones", function (req, res) { 236 | try { 237 | res.sendFile(path.join(ututor_net, "index.html")); 238 | } catch (error) { 239 | res.status(404).sendFile(ututor_net_404); 240 | } 241 | }); 242 | app.get("/tutor/solicitudes", function (req, res) { 243 | try { 244 | res.sendFile(path.join(ututor_net, "index.html")); 245 | } catch (error) { 246 | res.status(404).sendFile(ututor_net_404); 247 | } 248 | }); 249 | app.get("/tutor/sesionesgrupales", function (req, res) { 250 | try { 251 | res.sendFile(path.join(ututor_net, "index.html")); 252 | } catch (error) { 253 | res.status(404).sendFile(ututor_net_404); 254 | } 255 | }); 256 | app.get("/tutor/misCitas", function (req, res) { 257 | try { 258 | res.sendFile(path.join(ututor_net, "index.html")); 259 | } catch (error) { 260 | res.status(404).sendFile(ututor_net_404); 261 | } 262 | }); 263 | app.get("/tutor/mialumno/:idAlumno/:fullname", function (req, res) { 264 | try { 265 | res.sendFile(path.join(ututor_net, "index.html")); 266 | } catch (error) { 267 | res.status(404).sendFile(ututor_net_404); 268 | } 269 | }); 270 | 271 | //ALUMNO 272 | app.get("/alumno/solicitarTutorFijo", function (req, res) { 273 | try { 274 | res.sendFile(path.join(ututor_net, "index.html")); 275 | } catch (error) { 276 | res.status(404).sendFile(ututor_net_404); 277 | } 278 | }); 279 | app.get("/alumno/perfil", function (req, res) { 280 | try { 281 | res.sendFile(path.join(ututor_net, "index.html")); 282 | } catch (error) { 283 | res.status(404).sendFile(ututor_net_404); 284 | } 285 | }); 286 | app.get("/alumno/agendarCita", function (req, res) { 287 | try { 288 | res.sendFile(path.join(ututor_net, "index.html")); 289 | } catch (error) { 290 | res.status(404).sendFile(ututor_net_404); 291 | } 292 | }); 293 | app.get("/alumno/misCitas", function (req, res) { 294 | try { 295 | res.sendFile(path.join(ututor_net, "index.html")); 296 | } catch (error) { 297 | res.status(404).sendFile(ututor_net_404); 298 | } 299 | }); 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | const dbName = process.env.DATABASE; 309 | mysql 310 | .createConnection({ 311 | host: process.env.HOST, 312 | port: Number(process.env.PORTDB), 313 | user: process.env.USR, 314 | password: process.env.PSSW, 315 | }) 316 | .then((connection) => { 317 | connection.query(`CREATE DATABASE IF NOT EXISTS ${dbName};`).then((res) => { 318 | console.info("Database create or successfully checked"); 319 | sequelize.sync().then(async (result) => { 320 | const datos = await institucion.findOne(); 321 | const tran = await sequelize.transaction(); 322 | try { 323 | if (!datos) { 324 | const nuevaInstitucion = await institucion.create( 325 | { 326 | NOMBRE: "", 327 | INICIALES: "", 328 | IMAGEN: "../Imagenes/Institucion/logo.jpeg", 329 | TELEFONO: "", 330 | PAGINA_WEB: "", 331 | UBICACION: "", 332 | DOMINIO: "", 333 | DOMINIO2: "", 334 | }, 335 | { transaction: tran } 336 | ); 337 | 338 | await rol.create( 339 | { 340 | ID_ROL: 1, 341 | DESCRIPCION: "Administrador", 342 | }, 343 | { transaction: tran } 344 | ); 345 | 346 | await rol.create( 347 | { 348 | ID_ROL: 2, 349 | DESCRIPCION: "Coordinador Programa", 350 | }, 351 | { transaction: tran } 352 | ); 353 | 354 | await rol.create( 355 | { 356 | ID_ROL: 3, 357 | DESCRIPCION: "Tutor", 358 | }, 359 | { transaction: tran } 360 | ); 361 | 362 | await rol.create( 363 | { 364 | ID_ROL: 4, 365 | DESCRIPCION: "Alumno", 366 | }, 367 | { transaction: tran } 368 | ); 369 | 370 | await rol.create( 371 | { 372 | ID_ROL: 5, 373 | DESCRIPCION: "Usuario de soporte", 374 | }, 375 | { transaction: tran } 376 | ); 377 | 378 | await rol.create( 379 | { 380 | ID_ROL: 6, 381 | DESCRIPCION: "Coordinador Facultad", 382 | }, 383 | { transaction: tran } 384 | ); 385 | 386 | await etiqueta.create( 387 | { 388 | ID_ETIQUETA: 1, 389 | DESCRIPCION: "Permanencia", 390 | }, 391 | { transaction: tran } 392 | ); 393 | 394 | await etiqueta.create( 395 | { 396 | ID_ETIQUETA: 2, 397 | DESCRIPCION: "Tercera matrícula", 398 | }, 399 | { transaction: tran } 400 | ); 401 | 402 | const admin = await usuario 403 | .create( 404 | { 405 | USUARIO: "luis.miguel", 406 | CONTRASENHA: "admin", 407 | NOMBRE: "Luis Miguel", 408 | APELLIDOS: "Guanira Contreras", 409 | CORREO: "luis.miguel@pucp.pe", 410 | CODIGO: "19996532", 411 | TELEFONO: "932147863", 412 | DIRECCION: "Jr. Las flores 131", 413 | IMAGEN: null, 414 | }, 415 | { transaction: tran } 416 | ) 417 | .then(async (result) => { 418 | const rolUsuario = await rolXUsuarioXPrograma.create( 419 | { 420 | ID_USUARIO: result.ID_USUARIO, 421 | ID_ROL: 1, 422 | ESTADO: 1, 423 | }, 424 | { transaction: tran } 425 | ); 426 | }); 427 | } 428 | await tran.commit(); 429 | } catch (error) { 430 | console.log(error.message); 431 | await tran.rollback(); 432 | } 433 | }); 434 | }); 435 | }); 436 | 437 | // relaciones que generan conflicto por el orden en el que se crean las tablas 438 | usuario.belongsToMany(rol, { 439 | through: { model: rolXUsuarioXPrograma, unique: false }, 440 | foreignKey: "ID_USUARIO", 441 | otherKey: "ID_ROL", 442 | }); 443 | usuario.belongsToMany(programa, { 444 | through: { model: rolXUsuarioXPrograma, unique: false }, 445 | foreignKey: "ID_USUARIO", 446 | otherKey: "ID_PROGRAMA", 447 | }); 448 | rol.belongsToMany(usuario, { 449 | through: { model: rolXUsuarioXPrograma, unique: false }, 450 | foreignKey: "ID_ROL", 451 | otherKey: "ID_USUARIO", 452 | }); 453 | rol.belongsToMany(programa, { 454 | through: { model: rolXUsuarioXPrograma, unique: false }, 455 | foreignKey: "ID_ROL", 456 | otherKey: "ID_PROGRAMA", 457 | }); 458 | programa.belongsToMany(usuario, { 459 | through: { model: rolXUsuarioXPrograma, unique: false }, 460 | foreignKey: "ID_PROGRAMA", 461 | otherKey: "ID_USUARIO", 462 | }); 463 | programa.belongsToMany(rol, { 464 | through: { model: rolXUsuarioXPrograma, unique: false }, 465 | foreignKey: "ID_PROGRAMA", 466 | otherKey: "ID_ROL", 467 | }); 468 | rolXUsuarioXPrograma.belongsTo(usuario, { foreignKey: "ID_USUARIO" }); 469 | rolXUsuarioXPrograma.belongsTo(rol, { foreignKey: "ID_ROL" }); 470 | rolXUsuarioXPrograma.belongsTo(programa, { foreignKey: "ID_PROGRAMA" }); 471 | usuario.hasMany(rolXUsuarioXPrograma, { foreignKey: "ID_USUARIO" }); 472 | programa.hasMany(rolXUsuarioXPrograma, { foreignKey: "ID_PROGRAMA" }); 473 | rol.hasMany(rolXUsuarioXPrograma, { foreignKey: "ID_ROL" }); 474 | etiqueta.belongsToMany(alumno, { 475 | through: etiquetaXAlumno, 476 | foreignKey: "ID_ETIQUETA", 477 | otherKey: "ID_ALUMNO", 478 | as: "ETIQUETA", 479 | }); 480 | alumno.belongsToMany(etiqueta, { 481 | through: etiquetaXAlumno, 482 | foreignKey: "ID_ALUMNO", 483 | otherKey: "ID_ETIQUETA", 484 | }); 485 | etiquetaXAlumno.belongsTo(etiqueta, { foreignKey: "ID_ETIQUETA" }); 486 | etiquetaXAlumno.belongsTo(alumno, { foreignKey: "ID_ALUMNO" }); 487 | etiqueta.hasMany(etiquetaXAlumno, { foreignKey: "ID_ETIQUETA" }); 488 | sesion.hasMany(areaApoyoXSesion, { foreignKey: "ID_SESION" }); 489 | tutor.hasMany(asignacionTutoria, { foreignKey: "ID_TUTOR" }); 490 | procesoTutoria.hasMany(asignacionTutoria, { foreignKey: "ID_PROCESO_TUTORIA" }); 491 | sesion.hasMany(alumnoXSesion, { foreignKey: "ID_SESION" }); 492 | usuario.hasOne(alumno, { foreignKey: "ID_ALUMNO" }); 493 | alumno.belongsTo(usuario, { foreignKey: { name: "ID_ALUMNO" } }); 494 | alumno.hasMany(etiquetaXAlumno, { foreignKey: { name: "ID_ALUMNO" } }); 495 | alumno.belongsToMany(sesion, { 496 | through: alumnoXSesion, 497 | foreignKey: "ID_ALUMNO", 498 | otherKey: "ID_SESION", 499 | }); 500 | sesion.belongsToMany(alumno, { 501 | through: alumnoXSesion, 502 | foreignKey: "ID_SESION", 503 | otherKey: "ID_ALUMNO", 504 | }); 505 | alumnoXSesion.belongsTo(alumno, { foreignKey: "ID_ALUMNO" }); 506 | alumnoXSesion.belongsTo(sesion, { foreignKey: "ID_SESION" }); 507 | areaApoyo.belongsToMany(sesion, { 508 | through: areaApoyoXSesion, 509 | foreignKey: "ID_AREA_APOYO", 510 | otherKey: "ID_SESION", 511 | }); 512 | areaApoyo.belongsToMany(alumno, { 513 | through: areaApoyoXSesion, 514 | foreignKey: "ID_AREA_APOYO", 515 | otherKey: "ID_ALUMNO", 516 | }); 517 | sesion.belongsToMany(areaApoyo, { 518 | through: areaApoyoXSesion, 519 | foreignKey: "ID_SESION", 520 | otherKey: "ID_AREA_APOYO", 521 | }); 522 | //sesion.belongsToMany(alumno, {through: areaApoyoXSesion, foreignKey: "ID_SESION", otherKey: "ID_ALUMNO"}) 523 | //alumno.belongsToMany(sesion, {through: areaApoyoXSesion, foreignKey: "ID_ALUMNO", otherKey: "ID_SESION"}) 524 | alumno.belongsToMany(areaApoyo, { 525 | through: areaApoyoXSesion, 526 | foreignKey: "ID_ALUMNO", 527 | otherKey: "ID_AREA_APOYO", 528 | }); 529 | areaApoyoXSesion.belongsTo(areaApoyo, { foreignKey: "ID_AREA_APOYO" }); 530 | areaApoyoXSesion.belongsTo(sesion, { foreignKey: "ID_SESION" }); 531 | areaApoyoXSesion.belongsTo(alumno, { foreignKey: "ID_ALUMNO" }); 532 | asignacionTutoria.belongsTo(tutor, { foreignKey: "ID_TUTOR" }); 533 | asignacionTutoria.belongsTo(procesoTutoria, { 534 | foreignKey: "ID_PROCESO_TUTORIA", 535 | as: "PROCESO_TUTORIA", 536 | }); 537 | alumno.belongsToMany(asignacionTutoria, { 538 | through: asignacionTutoriaXAlumno, 539 | foreignKey: "ID_ALUMNO", 540 | otherKey: "ID_ASIGNACION", 541 | }); 542 | asignacionTutoria.belongsToMany(alumno, { 543 | through: asignacionTutoriaXAlumno, 544 | foreignKey: "ID_ASIGNACION", 545 | otherKey: "ID_ALUMNO", 546 | as: "ALUMNOS", 547 | }); 548 | asignacionTutoriaXAlumno.belongsTo(alumno, { foreignKey: "ID_ALUMNO" }); 549 | asignacionTutoriaXAlumno.belongsTo(asignacionTutoria, { 550 | foreignKey: "ID_ASIGNACION", 551 | }); 552 | alumno.hasMany(asignacionTutoriaXAlumno, { foreignKey: "ID_ALUMNO" }); 553 | asignacionTutoria.hasMany(asignacionTutoriaXAlumno, { 554 | foreignKey: "ID_ASIGNACION", 555 | }); 556 | compromiso.belongsTo(sesion, { foreignKey: { name: "ID_SESION" } }); 557 | compromiso.belongsTo(alumno, { foreignKey: { name: "ID_ALUMNO" } }); 558 | sesion.hasMany(compromiso, { foreignKey: { name: "ID_SESION" } }); 559 | alumno.hasMany(compromiso, { foreignKey: { name: "ID_ALUMNO" } }); 560 | disponibilidad.belongsTo(tutor, { foreignKey: { name: "ID_TUTOR" } }); 561 | disponibilidad.belongsTo(programa, { foreignKey: { name: "ID_FACULTAD" } }); 562 | encuesta.belongsTo(alumnoXSesion, { foreignKey: "ID_SESION" }); 563 | encuesta.belongsTo(alumnoXSesion, { foreignKey: "ID_ALUMNO" }); 564 | etiqueta.belongsToMany(procesoTutoria, { 565 | through: etiquetaXTutoria, 566 | foreignKey: "ID_ETIQUETA", 567 | otherKey: "ID_PROCESO_TUTORIA", 568 | }); 569 | procesoTutoria.belongsToMany(etiqueta, { 570 | through: etiquetaXTutoria, 571 | foreignKey: "ID_PROCESO_TUTORIA", 572 | otherKey: "ID_ETIQUETA", 573 | }); 574 | etiquetaXTutoria.belongsTo(etiqueta, { foreignKey: "ID_ETIQUETA" }); 575 | etiquetaXTutoria.belongsTo(procesoTutoria, { 576 | foreignKey: "ID_PROCESO_TUTORIA", 577 | }); 578 | informacionRelevante.belongsTo(alumno, { foreignKey: { name: "ID_ALUMNO" } }); 579 | alumno.hasMany(informacionRelevante, { foreignKey: { name: "ID_ALUMNO" } }); 580 | notificacion.belongsTo(sesion, { foreignKey: "ID_SESION" }); 581 | notificacion.belongsTo(usuario, { as: "EMISOR", foreignKey: "ID_EMISOR" }); 582 | notificacion.belongsTo(usuario, { as: "RECEPTOR", foreignKey: "ID_RECEPTOR" }); 583 | programa.belongsTo(institucion, { foreignKey: { name: "ID_INSTITUCION" } }); 584 | programa.belongsTo(programa, { as: "FACULTAD", foreignKey: "ID_FACULTAD" }); 585 | procesoTutoria.belongsTo(programa, { foreignKey: { name: "ID_PROGRAMA" } }); 586 | sesion.belongsTo(procesoTutoria, { foreignKey: "ID_PROCESO_TUTORIA" }); 587 | sesion.belongsTo(tutor, { foreignKey: "ID_TUTOR" }); 588 | tutor.belongsTo(usuario, { foreignKey: { name: "ID_TUTOR" } }); 589 | 590 | app.use(morgan("dev")); 591 | //app.use(require("./src/routes/frontRoutes")); 592 | app.use(require("./src/routes/alumnoRoutes")); 593 | app.use(require("./src/routes/tutorRoutes")); 594 | app.use(require("./src/routes/coordinadorRoutes")); 595 | app.use(require("./src/routes/procesoTutoriaRoutes")); 596 | app.use(require("./src/routes/disponibilidadRoutes")); 597 | app.use(require("./src/routes/programaRoutes")); 598 | app.use(require("./src/routes/sesionRoutes")); 599 | app.use(require("./src/routes/etiquetaRoutes")); 600 | app.use(require("./src/routes/asignacionTutoriaRoutes")); 601 | app.use(require("./src/routes/institucionRoutes")); 602 | app.use(require("./src/routes/usuarioRoutes")); 603 | app.use(require("./src/routes/encuestaRoutes")); 604 | app.use(require("./src/routes/notificacionRoutes")); 605 | app.use(require("./src/routes/areaApoyoRoutes")); 606 | app.use(require("./src/routes/logRoutes")); 607 | app.use(require("./src/routes/buzonSugerenciasRoutes")); 608 | 609 | 610 | 611 | 612 | 613 | 614 | app.get("*", function (req, res) { 615 | res.status(404).sendFile(path.join(__dirname, "404", "index.html")); 616 | }); 617 | 618 | 619 | app.listen(app.get("port"), () => 620 | console.log(`Server running on port ${app.get("port")}`) 621 | ); 622 | -------------------------------------------------------------------------------- /src/controllers/alumnoController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | const Sequelize = require("sequelize"); 3 | let sequelize = require('../models/database'); 4 | let usuario = require('../models/usuario'); 5 | let alumno = require('../models/alumno'); 6 | //let rolXUsuario = require("../models/rolXUsuario"); 7 | let rol = require("../models/rol"); 8 | let alumnoXSesion = require("../models/alumnoXSesion"); 9 | let rolXUsuarioXPrograma = require("../models/rolXUsuarioXPrograma"); 10 | let asignacionTutoria = require("../models/asignacionTutoria"); 11 | let etiquetaXAlumno = require("../models/etiquetaXAlumno"); 12 | let programa = require("../models/programa"); 13 | let asignacionTutoriaXAlumno = require("../models/asignacionTutoriaXAlumno"); 14 | let etiqueta = require("../models/etiqueta"); 15 | let informacionRelevante = require("../models/informacionRelevante"); 16 | const fsPath = require('fs-path'); 17 | const fs = require('fs'); 18 | const path = require('path'); 19 | 20 | 21 | const Op = Sequelize.Op; 22 | 23 | controllers.listar = async (req, res) => { // fetch all all studenst from DB 24 | try { 25 | const alumnos = await alumno.findAll({ 26 | include: { 27 | model: usuario, 28 | include: { model: rolXUsuarioXPrograma, where: { 'ESTADO': 1 } }, 29 | } 30 | }); 31 | res.status(201).json({ alumnos: alumnos }); 32 | } 33 | catch (error) { 34 | res.json({ error: error.message }); 35 | } 36 | }; 37 | 38 | controllers.listarPorTutoria = async (req, res) => { // Lista a los alumnos de un tutor de una tutoria determinado 39 | try { 40 | const alumnos = await asignacionTutoria.findAll({ 41 | include: { 42 | model: asignacionTutoriaXAlumno, 43 | where: {SOLICITUD: 1}, 44 | required: true, 45 | include: [{ 46 | model: alumno, 47 | include: [{ 48 | model: usuario, 49 | include: [programa], 50 | required: true 51 | }], 52 | required: true 53 | }] 54 | }, 55 | where: { 56 | ESTADO: 1, 57 | ID_TUTOR: req.params.tutor, 58 | ID_PROCESO_TUTORIA: req.params.tutoria 59 | }, 60 | }); 61 | res.status(201).json({ alumnos: alumnos }); 62 | } 63 | catch (error) { 64 | res.json({ error: error.message }); 65 | } 66 | }; 67 | 68 | 69 | controllers.BuscarPorNombreTutoria = async (req, res) => { // Lista a los alumnos de un tutor de una tutoria determinado 70 | try { 71 | const alumnos = await asignacionTutoria.findAll({ 72 | include: { 73 | model: asignacionTutoriaXAlumno, 74 | where: {SOLICITUD: 1}, 75 | required: true, 76 | include: [{ 77 | model: alumno, 78 | include: [{ 79 | model: usuario, 80 | include: [programa], 81 | required: true, 82 | where: { 83 | [Op.or]: [{ NOMBRE: { [Op.like]: '%' + req.params.nombre + '%' } }, 84 | { APELLIDOS: { [Op.like]: '%' + req.params.nombre + '%' } }] 85 | }, 86 | }], 87 | required: true 88 | }] 89 | }, 90 | where: { 91 | ESTADO: 1, 92 | ID_TUTOR: req.params.tutor, 93 | ID_PROCESO_TUTORIA: req.params.tutoria 94 | }, 95 | }); 96 | res.status(201).json({ alumnos: alumnos }); 97 | } catch (error) { 98 | res.json({ error: error.message }); 99 | } 100 | }; 101 | 102 | controllers.listarPorPrograma = async (req, res) => { // Lista a los alumnos de un programa determinado 103 | try { 104 | const alumnos = await rolXUsuarioXPrograma.findAll({ 105 | include: [{ 106 | model: rol, 107 | where: { DESCRIPCION: "Alumno" } 108 | }, { 109 | model: usuario, 110 | required: true, 111 | include: { 112 | model: alumno, 113 | include: { 114 | model: etiquetaXAlumno, 115 | include: { 116 | model: etiqueta 117 | } 118 | } 119 | } 120 | }], 121 | where: { 122 | ID_PROGRAMA: req.params.programa, 123 | ESTADO: 1 124 | } 125 | }); 126 | 127 | for (let dis of alumnos){ 128 | if(dis.dataValues.USUARIO.IMAGEN){ 129 | dis.dataValues.USUARIO.IMAGEN = fs.readFileSync(dis.dataValues.USUARIO.IMAGEN, "base64") 130 | } 131 | } 132 | 133 | res.status(201).json({ alumnos: alumnos }); 134 | } 135 | catch (error) { 136 | res.json({ error: error.message }); 137 | } 138 | }; 139 | 140 | 141 | controllers.get = async (req, res) => { // devuelve los datos de un alumno 142 | try { 143 | const { id } = req.params; 144 | const data = await alumno.findOne({ 145 | where: { ID_ALUMNO: id }, 146 | include: [{ 147 | model: usuario, 148 | include: [rol, programa] 149 | }, etiqueta] 150 | }) 151 | /*const data = await usuario.findOne({ validar contrasena 152 | where: {ID_USUARIO: id} 153 | }) 154 | .then(async result => { 155 | console.log(await result.validPassword("contra")); 156 | })*/ 157 | 158 | res.status(201).json({ alumno: data }); 159 | } 160 | catch (error) { 161 | res.json({ error: error.message }); 162 | } 163 | } 164 | 165 | controllers.buscarPorCodigo = async (req, res) => { // devuelve los datos de un alumno segun su codigo 166 | try { 167 | const data = await alumno.findOne({ 168 | include: [{ 169 | model: usuario, 170 | where: { CODIGO: req.params.codigo }, 171 | include: [rol, programa] 172 | }, etiqueta] 173 | }) 174 | res.status(201).json({ alumno: data }); 175 | } 176 | catch (error) { 177 | res.json({ error: error.message }); 178 | } 179 | } 180 | 181 | /** 182 | * @returns El nuevo student creado en formato Json() 183 | * HTTP status code 201 significa que se creo exitosamente 184 | */ 185 | controllers.registrar = async (req, res) => { 186 | /** 187 | * Aqui deberia haber una validacion (un middleware) para validar 188 | * que se envio un "student" en el cuerpo ("body") del request ("req") 189 | * */ 190 | const transaccion = await sequelize.transaction(); 191 | const { NOMBRE, APELLIDOS, CODIGO, CORREO, TELEFONO, DIRECCION, USUARIO, CONTRASENHA, IMAGEN, PROGRAMA, ETIQUETA } = req.body.alumno; 192 | //console.log(">>>>>>GOT: ", req.body.alumno);//solo para asegurarme de que el objeto llego al backend 193 | try { 194 | const nuevoAlumno = await usuario.create({ 195 | USUARIO: USUARIO, 196 | CONTRASENHA: CONTRASENHA, 197 | NOMBRE: NOMBRE, 198 | APELLIDOS: APELLIDOS, 199 | CORREO: CORREO, 200 | CODIGO: CODIGO, 201 | TELEFONO: TELEFONO, 202 | DIRECCION: DIRECCION, 203 | IMAGEN: IMAGEN 204 | }, { transaction: transaccion }) 205 | .then(async result => { 206 | const validacionCodigo = await usuario.findOne({ 207 | where: { CODIGO: CODIGO }, 208 | include: [{ 209 | model: rolXUsuarioXPrograma, 210 | attributes: ["ESTADO"], 211 | include: [{ 212 | model: programa, 213 | attributes: ["ID_PROGRAMA", "NOMBRE"], 214 | include: { 215 | model: programa, 216 | as: "FACULTAD", 217 | attributes: ["ID_FACULTAD", "NOMBRE"] 218 | } 219 | }, rol] 220 | }] 221 | }) 222 | 223 | const validacionCorreo = await usuario.findOne({ 224 | where: { CORREO: CORREO } 225 | }) 226 | 227 | if (!validacionCodigo && !validacionCorreo) { 228 | const nuevo = await alumno.create({ 229 | ID_ALUMNO: result.ID_USUARIO 230 | }, { transaction: transaccion }) 231 | 232 | const idRol = await rol.findOne({ 233 | attributes: ["ID_ROL"], 234 | where: { DESCRIPCION: "Alumno" } 235 | }, { transaction: transaccion }) 236 | 237 | /* const rolDeUsuario = await rolXUsuario.create({ 238 | ID_USUARIO: result.ID_USUARIO, 239 | ID_ROL: idRol.ID_ROL 240 | }, {transaction: transaccion}) */ 241 | 242 | 243 | for (element of PROGRAMA) { 244 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 245 | ID_USUARIO: result.ID_USUARIO, 246 | ID_PROGRAMA: element, 247 | ID_ROL: idRol.ID_ROL, 248 | ESTADO: '1' 249 | }, { transaction: transaccion }) 250 | } 251 | 252 | for (element of ETIQUETA) { 253 | const etiquetaDeAlumno = await etiquetaXAlumno.create({ 254 | ID_ALUMNO: result.ID_USUARIO, 255 | ID_ETIQUETA: element 256 | }, { transaction: transaccion }) 257 | } 258 | await transaccion.commit(); 259 | res.status(201).json({ alumno: result }); 260 | } else { 261 | await transaccion.rollback(); 262 | if (validacionCodigo && validacionCorreo) { 263 | res.json({ error: "Codigo y correo repetido", usuario: validacionCodigo }) 264 | } else if (validacionCodigo) { 265 | res.json({ error: "Codigo repetido", usuario: validacionCodigo }) 266 | } else if (validacionCorreo) { 267 | res.json({ error: "Correo repetido", usuario: validacionCorreo }) 268 | } 269 | } 270 | }); 271 | } catch (error) { 272 | await transaccion.rollback(); 273 | res.json({ error: error.message }) 274 | } 275 | 276 | }; 277 | 278 | controllers.modificar = async (req, res) => { 279 | 280 | const transaccion = await sequelize.transaction(); 281 | const { ID, NOMBRE, APELLIDOS, CODIGO, CORREO, TELEFONO, DIRECCION, USUARIO, IMAGEN, PROGRAMA, ETIQUETA } = req.body.alumno; 282 | // console.log(">>>>>>GOT: ", req.body.alumno);//solo para asegurarme de que el objeto llego al backend 283 | try { 284 | const nuevoAlumno = await usuario.update({ 285 | USUARIO: USUARIO, 286 | NOMBRE: NOMBRE, 287 | APELLIDOS: APELLIDOS, 288 | CORREO: CORREO, 289 | CODIGO: CODIGO, 290 | TELEFONO: TELEFONO, 291 | DIRECCION: DIRECCION, 292 | IMAGEN: IMAGEN 293 | }, { 294 | where: { ID_USUARIO: ID }, 295 | transaction: transaccion 296 | }) 297 | 298 | const validacionCodigo = await usuario.findOne({ 299 | where: { ID_USUARIO: { [Op.not]: ID }, CODIGO: CODIGO }, 300 | include: [{ 301 | model: rolXUsuarioXPrograma, 302 | attributes: ["ESTADO"], 303 | include: [{ 304 | model: programa, 305 | attributes: ["ID_PROGRAMA", "NOMBRE"], 306 | include: { 307 | model: programa, 308 | as: "FACULTAD", 309 | attributes: ["ID_FACULTAD", "NOMBRE"] 310 | } 311 | }, rol] 312 | }] 313 | }) 314 | 315 | const validacionCorreo = await usuario.findOne({ 316 | where: { ID_USUARIO: { [Op.not]: ID }, CORREO: CORREO } 317 | }) 318 | 319 | if (!validacionCodigo && !validacionCorreo) { 320 | await etiquetaXAlumno.destroy({ 321 | where: { ID_ALUMNO: ID }, 322 | transaction: transaccion 323 | }) 324 | 325 | const idRol = await rol.findOne({ 326 | attributes: ["ID_ROL"], 327 | where: { DESCRIPCION: "Alumno" } 328 | }, { transaction: transaccion }) 329 | 330 | await rolXUsuarioXPrograma.destroy({ 331 | where: { ID_USUARIO: ID }, 332 | transaction: transaccion 333 | }) 334 | 335 | for (element of PROGRAMA) { 336 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 337 | ID_USUARIO: ID, 338 | ID_PROGRAMA: element, 339 | ID_ROL: idRol.ID_ROL, 340 | ESTADO: 1 341 | }, { transaction: transaccion }) 342 | } 343 | 344 | for (element of ETIQUETA) { 345 | const etiquetaDeAlumno = await etiquetaXAlumno.create({ 346 | ID_ALUMNO: ID, 347 | ID_ETIQUETA: element 348 | }, { transaction: transaccion }) 349 | } 350 | await transaccion.commit(); 351 | res.status(201).json({ alumno: req.body.alumno }); 352 | } else { 353 | await transaccion.rollback(); 354 | if (validacionCodigo && validacionCorreo) { 355 | res.json({ error: "Codigo y correo repetido", usuario: validacionCodigo }) 356 | } else if (validacionCodigo) { 357 | res.json({ error: "Codigo repetido", usuario: validacionCodigo }) 358 | } else if (validacionCorreo) { 359 | res.json({ error: "Correo repetido", usuario: validacionCorreo }) 360 | } 361 | } 362 | } catch (error) { 363 | await transaccion.rollback(); 364 | res.json({ error: error.message }) 365 | } 366 | }; 367 | 368 | controllers.eliminar = async (req, res) => { 369 | 370 | const transaccion = await sequelize.transaction(); 371 | try { 372 | const idRol = await rol.findOne({ 373 | attributes: ["ID_ROL"], 374 | where: { DESCRIPCION: "Alumno" } 375 | }, { transaction: transaccion }) 376 | 377 | const sesiones = await alumnoXSesion.findAll({ 378 | where: { ID_ALUMNO: req.params.id, ASISTENCIA_ALUMNO: null } 379 | }, { transaction: transaccion }).then(async result =>{ 380 | if(result.length != 0){ 381 | let message = "El alumno tiene citas pendientes, no se puede eliminar"; 382 | res.status(400).json({message: message}); 383 | return; 384 | }else{ 385 | const coordinadorModificado = await rolXUsuarioXPrograma.update({ 386 | ESTADO: 0 387 | }, { 388 | where: { 389 | ID_USUARIO: req.params.id, 390 | ID_ROL: idRol.ID_ROL 391 | } 392 | }, { transaction: transaccion }) 393 | } 394 | }) 395 | await transaccion.commit() 396 | res.status(201).json({ status: "success" }) 397 | } catch (error) { 398 | await transaccion.rollback(); 399 | res.json({ error: error.message }) 400 | } 401 | 402 | }; 403 | 404 | controllers.registrarInformacionRelevante = async (req, res) => { 405 | 406 | const transaccion = await sequelize.transaction(); 407 | const { ID_ALUMNO, ARCHIVO, DESCRIPCION, EXTENSION } = req.body.archivo; 408 | try { 409 | let nombreArchivo = DESCRIPCION.split(".")[0] + "." + EXTENSION 410 | let archivos = await informacionRelevante.findOne({ 411 | where: { 412 | ID_ALUMNO: ID_ALUMNO, 413 | DESCRIPCION: nombreArchivo 414 | } 415 | }) 416 | if (archivos) { 417 | res.status(201).json({ error: "Nombre de archivo repetido" }); 418 | return; 419 | } 420 | 421 | let ruta = ARCHIVO ? path.join("..", "Archivos", "Alumnos", ID_ALUMNO.toString(), DESCRIPCION + "." + EXTENSION) : null; 422 | if (ARCHIVO) { 423 | let data = new Buffer.from(ARCHIVO.split(";base64,")[1], "base64"); 424 | fsPath.writeFile(ruta, data, function (err) { 425 | if (err) { 426 | return console.log(err); 427 | } 428 | }) 429 | } 430 | //console.log("ruta: ", ruta); 431 | 432 | const nuevaInformacionRelevante = await informacionRelevante.create({ 433 | ID_ALUMNO: ID_ALUMNO, 434 | DESCRIPCION: nombreArchivo, 435 | ARCHIVO: ruta 436 | }, { transaction: transaccion }) 437 | res.status(201).json({ informacionRelevante: nuevaInformacionRelevante }); 438 | await transaccion.commit(); 439 | } catch (error) { 440 | await transaccion.rollback(); 441 | res.json({ error: error.message }) 442 | } 443 | 444 | }; 445 | 446 | controllers.listarArchivosInfoRelevante = async (req, res) => { // lista los archivos relevantes de un alumno 447 | try { 448 | const infoRelevante = await informacionRelevante.findAll({ 449 | where: { ID_ALUMNO: req.params.idAlumno }, 450 | attributes: ["ID_INFORMACION_RELEVANTE", "DESCRIPCION"] 451 | }) 452 | res.status(201).json({ informacionRelevante: infoRelevante }); 453 | } catch (error) { 454 | res.json({ error: error.message }) 455 | } 456 | 457 | }; 458 | 459 | controllers.devolverArchivoInfoRelevante = async (req, res) => { // lista los archivos relevantes de un alumno 460 | try { 461 | const infoRelevante = await informacionRelevante.findOne({ 462 | where: {ID_INFORMACION_RELEVANTE: req.params.idArchivo}, 463 | attributes: ["DESCRIPCION", "ARCHIVO"] 464 | }) 465 | //console.log(infoRelevante.ARCHIVO) 466 | if (infoRelevante.ARCHIVO){ 467 | infoRelevante.ARCHIVO = fs.readFileSync(infoRelevante.ARCHIVO, "base64") 468 | } 469 | res.status(201).json({informacionRelevante: infoRelevante}); 470 | }catch (error) { 471 | res.json({error: error.message}) 472 | } 473 | 474 | 475 | }; 476 | 477 | controllers.listarNoAsignadosPorProgramaYTutoria = async (req, res) => { // Lista a los alumnos de un programa determinado 478 | try { 479 | const { QueryTypes } = require('sequelize'); 480 | const alumnos = await sequelize.query("SELECT USUARIO.ID_USUARIO, USUARIO.NOMBRE,APELLIDOS, CORREO, CODIGO from USUARIO, ALUMNO, ROL_X_USUARIO_X_PROGRAMA, PROCESO_TUTORIA " + 481 | " WHERE USUARIO.ID_USUARIO NOT IN (SELECT ID_ALUMNO FROM ASIGNACION_TUTORIA_X_ALUMNO, ASIGNACION_TUTORIA " + 482 | " WHERE ASIGNACION_TUTORIA.ID_ASIGNACION = ASIGNACION_TUTORIA_X_ALUMNO.ID_ASIGNACION AND ASIGNACION_TUTORIA.ID_PROCESO_TUTORIA = " + req.params.idTutoria + 483 | " AND SOLICITUD = 1 AND ESTADO = 1) AND USUARIO.ID_USUARIO = ID_ALUMNO " + 484 | " AND ROL_X_USUARIO_X_PROGRAMA.ID_USUARIO = USUARIO.ID_USUARIO AND ID_ROL = 4 " + 485 | " AND ROL_X_USUARIO_X_PROGRAMA.ID_PROGRAMA = PROCESO_TUTORIA.ID_PROGRAMA " + 486 | " AND ROL_X_USUARIO_X_PROGRAMA.ESTADO = 1" + 487 | " AND PROCESO_TUTORIA.ID_PROCESO_TUTORIA = " + req.params.idTutoria ,{ type: QueryTypes.SELECT }); 488 | res.status(201).json({ alumnos: alumnos }); 489 | } 490 | catch (error) { 491 | res.json({ error: error.message }); 492 | } 493 | }; 494 | 495 | controllers.registroMasivo = async (req, res) => { 496 | /** 497 | * Aqui deberia haber una validacion (un middleware) para validar 498 | * que se envio un "student" en el cuerpo ("body") del request ("req") 499 | * */ 500 | const transaccion = await sequelize.transaction(); 501 | //console.log(">>>>>>GOT: ", req.body.alumnos);//solo para asegurarme de que el objeto llego al backend 502 | try { 503 | let repetidos = [] 504 | let errores = false 505 | for(registro of req.body.alumnos){ 506 | const validacionCodigo = await usuario.findOne({ 507 | where: { CODIGO: registro.CODIGO } 508 | }) 509 | 510 | const validacionCorreo = await usuario.findOne({ 511 | where: { CORREO: registro.CORREO } 512 | }) 513 | 514 | if(validacionCodigo && validacionCorreo){ 515 | repetidos.push("Código y correo repetidos"); 516 | errores = true; 517 | }else if(validacionCodigo){ 518 | repetidos.push("Código repetido"); 519 | errores = true; 520 | }else if(validacionCorreo){ 521 | repetidos.push("Correo repetido"); 522 | errores = true; 523 | }else{ 524 | repetidos.push("Sin errores"); 525 | const nuevoAlumno = await usuario.create({ 526 | USUARIO: registro.USUARIO, 527 | CONTRASENHA: registro.CONTRASENHA, 528 | NOMBRE: registro.NOMBRE, 529 | APELLIDOS: registro.APELLIDOS, 530 | CORREO: registro.CORREO, 531 | CODIGO: registro.CODIGO, 532 | TELEFONO: registro.TELEFONO, 533 | DIRECCION: registro.DIRECCION, 534 | IMAGEN: registro.IMAGEN 535 | }, { transaction: transaccion }) 536 | .then(async result => { 537 | 538 | const nuevo = await alumno.create({ 539 | ID_ALUMNO: result.ID_USUARIO 540 | }, { transaction: transaccion }) 541 | 542 | const idRol = await rol.findOne({ 543 | attributes: ["ID_ROL"], 544 | where: { DESCRIPCION: "Alumno" } 545 | }, { transaction: transaccion }) 546 | 547 | 548 | for (element of registro.PROGRAMA) { 549 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 550 | ID_USUARIO: result.ID_USUARIO, 551 | ID_PROGRAMA: element, 552 | ID_ROL: idRol.ID_ROL, 553 | ESTADO: '1' 554 | }, { transaction: transaccion }) 555 | } 556 | 557 | for (element of registro.ETIQUETA) { 558 | const etiquetaDeAlumno = await etiquetaXAlumno.create({ 559 | ID_ALUMNO: result.ID_USUARIO, 560 | ID_ETIQUETA: element 561 | }, { transaction: transaccion }) 562 | } 563 | }); 564 | } 565 | } 566 | if (errores) { 567 | await transaccion.rollback(); 568 | res.json({ errores: repetidos}) 569 | } else{ 570 | await transaccion.commit(); 571 | res.status(201).json({ mensaje: "Alumnos registrados satisfactoriamente" }); 572 | } 573 | } catch (error) { 574 | await transaccion.rollback(); 575 | res.json({ error: error.message }) 576 | } 577 | 578 | }; 579 | 580 | controllers.listarNoAsignadosConTutorPorPrograma = async (req, res) => { // Lista a los alumnos de un programa determinado que no están asignados en ese proceso con otro tutor 581 | try { 582 | let alumnos = await rolXUsuarioXPrograma.findAll({ 583 | include: [{ 584 | model: rol, 585 | where: { DESCRIPCION: "Alumno" }, 586 | required: true 587 | }, { 588 | model: usuario, 589 | required: true, 590 | include: { 591 | model: alumno, 592 | required: true, 593 | include: [{ 594 | model: etiquetaXAlumno, 595 | include: { 596 | model: etiqueta 597 | } 598 | },{ 599 | model: asignacionTutoriaXAlumno, 600 | where: {SOLICITUD: 1}, 601 | include: { 602 | model: asignacionTutoria, 603 | where: {ID_TUTOR: req.params.idTutor, ID_PROCESO_TUTORIA: req.params.idTutoria, ESTADO: 1}, 604 | attributes: [], 605 | required: true 606 | }, 607 | attributes: [], 608 | required: true 609 | }] 610 | } 611 | }], 612 | where: { 613 | ID_PROGRAMA: req.params.programa, 614 | ESTADO: 1 615 | }, 616 | required: true 617 | }); 618 | 619 | const alumnos2 = await rolXUsuarioXPrograma.findAll({ 620 | include: [{ 621 | model: rol, 622 | where: { DESCRIPCION: "Alumno" }, 623 | required: true 624 | }, { 625 | model: usuario, 626 | required: true, 627 | include: { 628 | model: alumno, 629 | required: true, 630 | include: [{ 631 | model: etiquetaXAlumno, 632 | include: { 633 | model: etiqueta 634 | } 635 | }] 636 | } 637 | }], 638 | where: { 639 | ID_PROGRAMA: req.params.programa, 640 | ESTADO: 1, 641 | ID_USUARIO: {[Op.notIn]: [sequelize.literal(`(SELECT ID_ALUMNO FROM 642 | ASIGNACION_TUTORIA_X_ALUMNO, ASIGNACION_TUTORIA 643 | WHERE ASIGNACION_TUTORIA_X_ALUMNO.ID_ASIGNACION = ASIGNACION_TUTORIA.ID_ASIGNACION 644 | AND ESTADO = 1 AND ID_PROCESO_TUTORIA = ` + req.params.idTutoria + `)`)]} 645 | }, 646 | required: true 647 | }); 648 | 649 | alumnos = alumnos = alumnos.concat(alumnos2); 650 | res.status(201).json({ alumnos: alumnos }); 651 | } 652 | catch (error) { 653 | res.json({ error: error.message }); 654 | } 655 | }; 656 | 657 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/areaApoyoController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | const Sequelize = require('sequelize') 3 | let sequelize = require('../models/database'); 4 | let areaApoyo = require('../models/areaApoyo'); 5 | 6 | Op = Sequelize.Op; 7 | 8 | 9 | controllers.listar = async (req, res) => { 10 | try{ 11 | const areasApoyo = await areaApoyo.findAll(); 12 | res.status(201).json({areasApoyo:areasApoyo}); 13 | } 14 | catch (error) { 15 | res.json({error: error.message}); 16 | } 17 | }; 18 | 19 | 20 | /** 21 | * @returns La nueva tutoria creado en formato Json() 22 | * HTTP status code 201 significa que se creo exitosamente 23 | */ 24 | controllers.registrar = async (req, res) => { 25 | const transaccion = await sequelize.transaction(); 26 | const {NOMBRE, TELEFONO, CORREO, CONTACTO} = req.body.areaApoyo; 27 | try { 28 | const nombreRepetido = await areaApoyo.findOne({ 29 | where: {NOMBRE: NOMBRE} 30 | }) 31 | if(nombreRepetido){ 32 | res.json({error: "Nombre repetido"}) 33 | return; 34 | } 35 | 36 | const correoRepetido = await areaApoyo.findOne({ 37 | where: {CORREO: CORREO} 38 | }) 39 | if(correoRepetido){ 40 | res.json({error: "Correo repetido"}) 41 | return; 42 | } 43 | 44 | const nuevaAreaApoyo = await areaApoyo.create({ 45 | NOMBRE: NOMBRE, 46 | TELEFONO: TELEFONO, 47 | CORREO: CORREO, 48 | CONTACTO: CONTACTO 49 | }, {transaction: transaccion}) 50 | 51 | await transaccion.commit(); 52 | res.status(201).json({areaApoyo: nuevaAreaApoyo}); 53 | }catch (error) { 54 | await transaccion.rollback(); 55 | res.json({error: error.message}) 56 | } 57 | 58 | }; 59 | 60 | 61 | controllers.modificar = async (req, res) => { 62 | 63 | const transaccion = await sequelize.transaction(); 64 | const {ID_AREA_APOYO, NOMBRE, TELEFONO, CORREO, CONTACTO} = req.body.areaApoyo; 65 | try { 66 | const repetido = await areaApoyo.findOne({ 67 | where: {NOMBRE: NOMBRE, ID_AREA_APOYO: {[Op.not]: ID_AREA_APOYO}} 68 | }) 69 | if(repetido){ 70 | res.json({error: "Área de apoyo repetida"}) 71 | return; 72 | } 73 | 74 | const correoRepetido = await areaApoyo.findOne({ 75 | where: {CORREO: CORREO, ID_AREA_APOYO: {[Op.not]: ID_AREA_APOYO}} 76 | }) 77 | if(correoRepetido){ 78 | res.json({error: "Correo repetido"}) 79 | return; 80 | } 81 | 82 | const etiquetaModificada = await areaApoyo.update({ 83 | NOMBRE: NOMBRE, 84 | TELEFONO: TELEFONO, 85 | CORREO: CORREO, 86 | CONTACTO: CONTACTO 87 | }, { 88 | where: {ID_AREA_APOYO: ID_AREA_APOYO}, 89 | transaction: transaccion 90 | }) 91 | 92 | await transaccion.commit(); 93 | res.status(201).json({areaApoyo: req.body.areaApoyo}); 94 | }catch (error) { 95 | await transaccion.rollback(); 96 | res.json({error: error.message}) 97 | } 98 | 99 | }; 100 | 101 | 102 | controllers.eliminar = async (req, res) => { 103 | 104 | const transaccion = await sequelize.transaction(); 105 | try { 106 | await areaApoyo.destroy({ 107 | where: {ID_AREA_APOYO: req.params.id} 108 | }, {transaction: transaccion}) 109 | 110 | await transaccion.commit(); 111 | res.status(201).json({resultado: "registro eliminado"}); 112 | }catch (error) { 113 | await transaccion.rollback(); 114 | res.json({error: error.message}) 115 | } 116 | 117 | }; 118 | 119 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/asignacionTutoriaController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | const Sequelize = require("sequelize"); 3 | let sequelize = require('../models/database'); 4 | let asignacionTutoria = require('../models/asignacionTutoria'); 5 | let tutor = require('../models/tutor'); 6 | let alumno = require('../models/alumno'); 7 | let usuario = require('../models/usuario'); 8 | let procesoTutoria = require('../models/procesoTutoria'); 9 | let asignacionTutoriaXAlumno = require('../models/asignacionTutoriaXAlumno'); 10 | const notificacion = require("../models/notificacion"); 11 | 12 | controllers.listarPorTutoria = async (req, res) => { 13 | const idTutoria = req.query.tutoria; 14 | try { 15 | const dataAsignaciones = await asignacionTutoria.findAll({ 16 | include: [{ 17 | model: tutor, 18 | include: [{ 19 | model: usuario, 20 | attributes: ["ID_USUARIO", "NOMBRE", "APELLIDOS"] 21 | }] 22 | }, 23 | { 24 | model: alumno, 25 | as: "ALUMNOS", 26 | include: [{ 27 | model: usuario, 28 | attributes: ["ID_USUARIO", "NOMBRE", "APELLIDOS"] 29 | }], 30 | through: { 31 | attributes: [] 32 | } 33 | }, { 34 | model: asignacionTutoriaXAlumno, 35 | where: { SOLICITUD: 1 }, // aceptada 36 | attributes: [] 37 | }, { 38 | model: procesoTutoria, 39 | as: "PROCESO_TUTORIA", 40 | attributes: ["ID_PROCESO_TUTORIA", "NOMBRE"] 41 | }], 42 | where: { 43 | ESTADO: 1, 44 | ID_PROCESO_TUTORIA: idTutoria 45 | } 46 | }); 47 | res.status(201).json({ asignaciones: dataAsignaciones }); 48 | } 49 | catch (error) { 50 | res.json({ error: error.message }); 51 | } 52 | }; 53 | 54 | controllers.get = async (req, res) => { // devuelve los datos de una asignacion 55 | try { 56 | const idAsignacion = req.params.id; 57 | const dataAsignacion = await asignacionTutoria.findOne({ 58 | where: { 59 | ID_ASIGNACION: idAsignacion, 60 | ESTADO: 1 61 | }, 62 | include: [tutor, 63 | { 64 | model: alumno, 65 | as: "ALUMNOS" 66 | }, 67 | { 68 | model: procesoTutoria, 69 | as: "PROCESO_TUTORIA" 70 | } 71 | ] 72 | }) 73 | res.status(201).json({ asignacion: dataAsignacion }); 74 | } 75 | catch (error) { 76 | res.json({ error: error.message }); 77 | } 78 | } 79 | 80 | controllers.lista = async (req, res) => { // devuelve los datos de todas las asignaciones 81 | try { 82 | const dataAsignacion = await asignacionTutoria.findAll({ 83 | where: { 84 | ESTADO: 1 85 | }, 86 | include: [tutor, 87 | { 88 | model: alumno, 89 | as: "ALUMNOS" 90 | }, 91 | { 92 | model: procesoTutoria, 93 | as: "PROCESO_TUTORIA" 94 | }, 95 | { 96 | model: asignacionTutoriaXAlumno, 97 | where: { SOLICITUD: 1 } // aceptada 98 | } 99 | ] 100 | }) 101 | res.status(201).json({ asignaciones: dataAsignacion }); 102 | } 103 | catch (error) { 104 | res.json({ error: error.message }); 105 | } 106 | } 107 | 108 | 109 | controllers.listarSolicitudesXTutor = async (req, res) => { // devuelve las solicitudes pendientes de un tutor 110 | try { 111 | const dataSolicitud = await asignacionTutoriaXAlumno.findAll({ 112 | where: { SOLICITUD: 2 }, //pendiente 113 | include: [ 114 | { 115 | model: alumno, 116 | as: "ALUMNO", 117 | include: { 118 | model: usuario, 119 | attributes: ["NOMBRE", "APELLIDOS"] 120 | } 121 | }, 122 | { 123 | model: asignacionTutoria, 124 | where: { 125 | ID_TUTOR: req.params.idTutor, 126 | ID_PROCESO_TUTORIA: req.params.idTutoria 127 | }, 128 | attributes: ["ID_TUTOR"] 129 | }], 130 | attributes: ["ID_ASIGNACION"] 131 | }) 132 | res.status(201).json({ solicitudes: dataSolicitud }); 133 | } 134 | catch (error) { 135 | res.json({ error: error.message }); 136 | } 137 | } 138 | 139 | 140 | controllers.responderSolicitud = async (req, res) => { 141 | 142 | const transaccion = await sequelize.transaction(); 143 | const { ID_ASIGNACION, ID_ALUMNO, RESPUESTA } = req.body.solicitud; 144 | try { 145 | let date = new Date() 146 | const solicitudModificada = await asignacionTutoriaXAlumno.update({ 147 | SOLICITUD: RESPUESTA 148 | }, { 149 | where: { 150 | ID_ASIGNACION: ID_ASIGNACION, 151 | ID_ALUMNO: ID_ALUMNO 152 | }, 153 | transaction: transaccion 154 | }) 155 | 156 | await asignacionTutoria.update({ 157 | ESTADO: 1, 158 | FECHA_ASIGNACION: date + date.getTimezoneOffset(), 159 | }, { 160 | where: { ID_ASIGNACION: ID_ASIGNACION }, 161 | transaction: transaccion 162 | }) 163 | 164 | let tut = await asignacionTutoria.findOne({ 165 | where: { ID_ASIGNACION: ID_ASIGNACION }, 166 | include: { 167 | model: tutor, 168 | include: { 169 | model: usuario, 170 | attributes: ["NOMBRE", "APELLIDOS"] 171 | } 172 | }, 173 | attributes: [] 174 | }) 175 | 176 | let mensaje = "El tutor " + tut.TUTOR.USUARIO.NOMBRE + " " + tut.TUTOR.USUARIO.APELLIDOS + " ha " + (RESPUESTA ? "aceptado" : "rechazado") + " su solicitud de tutoría"; 177 | 178 | await notificacion.create({ 179 | ID_EMISOR: tut.TUTOR.ID_TUTOR, 180 | ID_RECEPTOR: ID_ALUMNO, 181 | MENSAJE: mensaje, 182 | ESTADO: 1 183 | }, { transaction: transaccion }) 184 | 185 | await transaccion.commit(); 186 | // console.log(date + date.getTimezoneOffset()) 187 | res.status(201).json({ solicitud: req.body.solicitud }); 188 | } catch (error) { 189 | await transaccion.rollback(); 190 | res.json({ error: error.message }) 191 | } 192 | 193 | }; 194 | 195 | 196 | controllers.mandarSolicitudTutoria = async (req, res) => { 197 | const transaccion = await sequelize.transaction(); 198 | const { ID_PROCESO_TUTORIA, ID_TUTOR, ID_ALUMNO } = req.body.solicitud; 199 | try { 200 | const nuevaSolicitud = await asignacionTutoria.create({ 201 | ID_PROCESO_TUTORIA: ID_PROCESO_TUTORIA, 202 | ID_TUTOR: ID_TUTOR, 203 | ESTADO: 0 // todavia no se ha aceptado la asignacion 204 | }, { transaction: transaccion }) 205 | .then(async result => { 206 | await asignacionTutoriaXAlumno.create({ 207 | ID_ASIGNACION: result.ID_ASIGNACION, 208 | ID_ALUMNO: ID_ALUMNO, 209 | SOLICITUD: 2 // pendiente 210 | }, { transaction: transaccion }) 211 | 212 | let al = await usuario.findOne({ 213 | where: { ID_USUARIO: ID_ALUMNO }, 214 | attributes: ["NOMBRE", "APELLIDOS"] 215 | }) 216 | 217 | let proceso = await procesoTutoria.findOne({ 218 | where: { ID_PROCESO_TUTORIA: ID_PROCESO_TUTORIA }, 219 | attributes: ["NOMBRE"] 220 | }) 221 | 222 | let mensaje = "El alumno " + al.NOMBRE + " " + al.APELLIDOS + " le ha mandado una solicitud de tutoría para el proceso " + proceso.NOMBRE; 223 | 224 | await notificacion.create({ 225 | ID_EMISOR: ID_ALUMNO, 226 | ID_RECEPTOR: ID_TUTOR, 227 | MENSAJE: mensaje, 228 | ESTADO: 1 229 | }, { transaction: transaccion }) 230 | await transaccion.commit(); 231 | res.status(201).json({ solicitud: result }); 232 | }) 233 | } catch (error) { 234 | await transaccion.rollback(); 235 | res.json({ error: error.message }) 236 | } 237 | 238 | }; 239 | 240 | 241 | /** 242 | * @returns La nueva asignacion creado en formato Json() 243 | * HTTP status code 201 significa que se creo exitosamente 244 | */ 245 | controllers.registrar = async (req, res) => { 246 | /** 247 | * Aqui deberia haber una validacion (un middleware) para validar 248 | * que se envio una "asignacion" en el cuerpo ("body") del request ("req") 249 | * */ 250 | const transaccion = await sequelize.transaction(); 251 | const { PROCESO_TUTORIA, TUTOR, ALUMNOS, FECHA_ASIGNACION } = req.body.asignacionTutoria; 252 | //console.log("GOT: ", req.body.asignacion); //solo para asegurarme de que el objeto llego al backend 253 | try { 254 | const nuevaAsignacionTutoria = await asignacionTutoria.create({ 255 | ID_PROCESO_TUTORIA: PROCESO_TUTORIA, 256 | ID_TUTOR: TUTOR, 257 | FECHA_ASIGNACION: FECHA_ASIGNACION, 258 | ESTADO: 1 259 | }, { transaction: transaccion }) 260 | .then(async result => { 261 | for (element of ALUMNOS) { 262 | const nuevaAsignacionTutoriaXAlumno = await asignacionTutoriaXAlumno.create({ 263 | ID_ALUMNO: element, 264 | ID_ASIGNACION: result.ID_ASIGNACION, 265 | SOLICITUD: 1 // aceptada 266 | }, { transaction: transaccion }) 267 | }; 268 | await transaccion.commit(); 269 | res.status(201).json({ asignacion: result }); 270 | }) 271 | } catch (error) { 272 | await transaccion.rollback(); 273 | res.json({ error: error.message }) 274 | } 275 | 276 | }; 277 | 278 | controllers.modificar = async (req, res) => { 279 | 280 | const transaccion = await sequelize.transaction(); 281 | const { ID, PROCESO_TUTORIA, TUTOR, ALUMNOS, FECHA_ASIGNACION } = req.body.asignacionTutoria; 282 | //console.log("GOT: ", req.body.asignacionTutoria);//solo para asegurarme de que el objeto llego al backend 283 | try { 284 | const asignacionTutoriaModificada = await asignacionTutoria.update( 285 | { 286 | ID_PROCESO_TUTORIA: PROCESO_TUTORIA, 287 | ID_TUTOR: TUTOR, 288 | FECHA_ASIGNACION: FECHA_ASIGNACION, 289 | ESTADO: 1 290 | }, 291 | { 292 | where: { ID_ASIGNACION: ID } 293 | }, 294 | { transaction: transaccion } 295 | ).then(async result => { 296 | await asignacionTutoriaXAlumno.destroy({ 297 | where: { ID_ASIGNACION: ID } 298 | }, { transaction: transaccion }); 299 | 300 | for (element of ALUMNOS) { 301 | const nuevaAsignacionTutoriaXAlumno = await asignacionTutoriaXAlumno.create({ 302 | ID_ALUMNO: element, 303 | ID_ASIGNACION: ID, 304 | SOLICITUD: 1 305 | }, { transaction: transaccion }) 306 | }; 307 | 308 | }) 309 | 310 | await transaccion.commit(); 311 | res.status(201).json({ modificacion: 1 }); 312 | } catch (error) { 313 | await transaccion.rollback(); 314 | res.json({ error: error.message }) 315 | } 316 | 317 | }; 318 | 319 | controllers.eliminar = async (req, res) => { 320 | 321 | const transaccion = await sequelize.transaction(); 322 | try { 323 | const asignacionTutoriaEliminada = await asignacionTutoria.update( 324 | { 325 | ESTADO: 0 326 | }, 327 | { 328 | where: { ID_ASIGNACION: req.params.id } 329 | }, 330 | { 331 | transaction: transaccion 332 | } 333 | ); 334 | await transaccion.commit(); 335 | res.status(201).json({ resultado: "success" }); 336 | } catch (error) { 337 | await transaccion.rollback(); 338 | res.json({ error: error.message }) 339 | } 340 | 341 | }; 342 | 343 | controllers.listarPorTutoriaYTutor = async (req, res) => { 344 | try { 345 | const dataAsignaciones = await asignacionTutoria.findAll({ 346 | include: [{ 347 | model: tutor, 348 | include: [{ 349 | model: usuario, 350 | attributes: ["ID_USUARIO", "NOMBRE", "APELLIDOS"] 351 | }] 352 | }, 353 | { 354 | model: alumno, 355 | as: "ALUMNOS", 356 | include: [{ 357 | model: usuario, 358 | attributes: ["ID_USUARIO", "NOMBRE", "APELLIDOS"] 359 | }], 360 | through: { 361 | attributes: [] 362 | } 363 | }, { 364 | model: asignacionTutoriaXAlumno, 365 | where: { SOLICITUD: 1 }, // aceptada 366 | attributes: [] 367 | }, { 368 | model: procesoTutoria, 369 | as: "PROCESO_TUTORIA", 370 | attributes: ["ID_PROCESO_TUTORIA", "NOMBRE"] 371 | }], 372 | where: { 373 | ESTADO: 1, 374 | ID_PROCESO_TUTORIA: req.params.idTutoria, 375 | ID_TUTOR: req.params.idTutor 376 | } 377 | }); 378 | res.status(201).json({ asignaciones: dataAsignaciones }); 379 | } 380 | catch (error) { 381 | res.json({ error: error.message }); 382 | } 383 | }; 384 | 385 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/buzonSugerenciasController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | const Sequelize = require('sequelize') 3 | let sequelize = require('../models/database'); 4 | let buzon = require('../models/buzonSugerencias'); 5 | 6 | Op = Sequelize.Op; 7 | 8 | 9 | controllers.listar = async (req, res) => { 10 | try{ 11 | const sugerencias = await buzon.findAll(); 12 | res.status(201).json({sugerencias:sugerencias}); 13 | } 14 | catch (error) { 15 | res.json({error: error.message}); 16 | } 17 | }; 18 | 19 | 20 | /** 21 | * @returns La nueva tutoria creado en formato Json() 22 | * HTTP status code 201 significa que se creo exitosamente 23 | */ 24 | controllers.registrar = async (req, res) => { 25 | const transaccion = await sequelize.transaction(); 26 | try { 27 | const nuevaSugerencia = await buzon.create({ 28 | SUGERENCIA: req.body.sugerencia 29 | }, {transaction: transaccion}) 30 | 31 | await transaccion.commit(); 32 | res.status(201).json({sugerencia: nuevaSugerencia}); 33 | }catch (error) { 34 | await transaccion.rollback(); 35 | res.json({error: error.message}) 36 | } 37 | 38 | }; 39 | 40 | 41 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/coordinadorController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | const Sequelize = require("sequelize"); 3 | let sequelize = require('../models/database'); 4 | let coordinador = require('../models/usuario'); 5 | //let rolXUsuario = require("../models/rolXUsuario"); 6 | let rol = require("../models/rol"); 7 | let rolXUsuarioXPrograma = require("../models/rolXUsuarioXPrograma"); 8 | let programa = require("../models/programa"); 9 | 10 | 11 | const Op = Sequelize.Op; 12 | 13 | controllers.listarCoordinadoresFacultad = async (req, res) => { // lista a todos los coordinadores de facultad 14 | try{ 15 | const coordinadores = await coordinador.findAll({ 16 | include: [{ 17 | model: rolXUsuarioXPrograma, 18 | where: {ESTADO: 1}, 19 | include:[{ 20 | model: rol, 21 | where: {DESCRIPCION: "Coordinador Facultad"} 22 | }, programa] 23 | }], 24 | }); 25 | res.status(201).json({coordinadores:coordinadores}); 26 | } 27 | catch (error) { 28 | res.json({error: error.message}); 29 | } 30 | }; 31 | 32 | 33 | controllers.listarCoordinadoresPrograma = async (req, res) => { 34 | try{ // lista a todos los coordinadores de programa de una facultad en especifico 35 | const coordinadores = await coordinador.findAll({ 36 | include: [{ 37 | model: rolXUsuarioXPrograma, 38 | where: {ESTADO: 1}, 39 | include:[{ 40 | model: rol, 41 | where: {DESCRIPCION: "Coordinador Programa"} 42 | }, { 43 | model: programa, 44 | where: {ID_FACULTAD: req.params.idFacultad}, 45 | required: true 46 | }], 47 | attributes: ["ESTADO"] 48 | }], 49 | }); 50 | res.status(201).json({coordinadores:coordinadores}); 51 | } 52 | catch (error) { 53 | res.json({error: error.message}); 54 | } 55 | }; 56 | 57 | controllers.listarPorPrograma = async (req, res) => { // lista a todos los coordinadores por programa 58 | try{ 59 | const coordinadores = await rolXUsuarioXPrograma.findAll({ 60 | include: [{ 61 | model: rol, 62 | where: {DESCRIPCION: {[Op.like]: "%Coordinador%"}}, 63 | required: true 64 | },{ 65 | model:coordinador, 66 | required: true 67 | }], 68 | where: { 69 | ID_PROGRAMA: req.params.id, 70 | ESTADO: 1 // activo 71 | } 72 | }); 73 | res.status(201).json({coordinadores:coordinadores}); 74 | } 75 | catch (error) { 76 | res.json({error: error.message}); 77 | } 78 | }; 79 | 80 | controllers.get = async (req, res) =>{ // devuelve los datos de un coordinador 81 | try{ 82 | const {id} = req.params; 83 | const data = await coordinador.findOne({ 84 | include: [rol, programa], 85 | where: {ID_USUARIO: id} 86 | }) 87 | res.status(201).json({coordinador:data}); 88 | } 89 | catch(error){ 90 | res.json({error: error.message}); 91 | } 92 | } 93 | 94 | controllers.buscarPorCodigo = async (req, res) =>{ // devuelve los datos de un alumno segun su codigo 95 | try{ 96 | const data = await coordinador.findOne({ 97 | where: {CODIGO: req.params.codigo}, 98 | include: [rol, programa] 99 | }) 100 | res.status(201).json({coordinador:data}); 101 | } 102 | catch(error){ 103 | res.json({error: error.message}); 104 | } 105 | } 106 | 107 | /** 108 | * @returns El nuevo coordinador creado en formato Json() 109 | * HTTP status code 201 significa que se creo exitosamente 110 | */ 111 | controllers.registrarCoordinadorPrograma = async (req, res) => { 112 | /** 113 | * Aqui deberia haber una validacion (un middleware) para validar 114 | * que se envio un "coordinador" en el cuerpo ("body") del request ("req") 115 | * */ 116 | const transaccion = await sequelize.transaction(); 117 | const {NOMBRE, APELLIDOS, CODIGO, CORREO, TELEFONO, DIRECCION, USUARIO, CONTRASENHA, IMAGEN, PROGRAMA} = req.body.coordinador; 118 | //console.log("GOT: ", req.body.alumno);//solo para asegurarme de que el objeto llego al backend 119 | try { 120 | const nuevoCoordinador = await coordinador.create({ 121 | USUARIO: USUARIO, 122 | CONTRASENHA: CONTRASENHA, 123 | NOMBRE: NOMBRE, 124 | APELLIDOS: APELLIDOS, 125 | CORREO: CORREO, 126 | CODIGO: CODIGO, 127 | TELEFONO: TELEFONO, 128 | DIRECCION: DIRECCION, 129 | IMAGEN: IMAGEN 130 | }, {transaction: transaccion}) 131 | .then(async result => { 132 | const validacionCodigo = await coordinador.findOne({ 133 | where: {CODIGO: CODIGO}, 134 | include:[{ 135 | model: rolXUsuarioXPrograma, 136 | attributes: ["ESTADO"], 137 | where: {ESTADO: 1}, 138 | include: [{ 139 | model:programa, 140 | attributes: ["ID_PROGRAMA", "NOMBRE"], 141 | include: { 142 | model: programa, 143 | as: "FACULTAD", 144 | attributes: ["ID_FACULTAD", "NOMBRE"] 145 | } 146 | }, rol] 147 | }] 148 | }) 149 | 150 | const validacionCorreo = await coordinador.findOne({ 151 | where:{CORREO: CORREO}, 152 | include:[{ 153 | model: rolXUsuarioXPrograma, 154 | attributes: ["ESTADO"], 155 | where: {ESTADO: 1}, 156 | include: [{ 157 | model:programa, 158 | attributes: ["ID_PROGRAMA", "NOMBRE"], 159 | include: { 160 | model: programa, 161 | as: "FACULTAD", 162 | attributes: ["ID_FACULTAD", "NOMBRE"] 163 | } 164 | }, rol] 165 | }] 166 | }) 167 | 168 | if (!validacionCodigo && !validacionCorreo){ 169 | const idRol = await rol.findOne({ 170 | attributes:["ID_ROL"], 171 | where: {DESCRIPCION: "Coordinador Programa"} 172 | }, {transaction: transaccion}) 173 | 174 | 175 | for(element of PROGRAMA){ 176 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 177 | ID_USUARIO: result.ID_USUARIO, 178 | ID_PROGRAMA: element, 179 | ID_ROL: idRol.ID_ROL, 180 | ESTADO: '1' 181 | }, {transaction: transaccion}) 182 | } 183 | await transaccion.commit(); 184 | res.status(201).json({coordinador: result}); 185 | }else{ 186 | await transaccion.rollback(); 187 | if(validacionCodigo && validacionCorreo){ 188 | res.json({error: "Codigo y correo repetido", usuario: validacionCodigo}) 189 | }else if(validacionCodigo){ 190 | res.json({error: "Codigo repetido", usuario: validacionCodigo}) 191 | }else if(validacionCorreo){ 192 | res.json({error: "Correo repetido", usuario: validacionCorreo}) 193 | } 194 | } 195 | }) 196 | } catch (error) { 197 | await transaccion.rollback(); 198 | res.json({error: error.message}) 199 | } 200 | }; 201 | 202 | controllers.registrarCoordinadorFacultad = async (req, res) => { 203 | /** 204 | * Aqui deberia haber una validacion (un middleware) para validar 205 | * que se envio un "coordinador" en el cuerpo ("body") del request ("req") 206 | * */ 207 | const transaccion = await sequelize.transaction(); 208 | const {NOMBRE, APELLIDOS, CODIGO, CORREO, TELEFONO, DIRECCION, USUARIO, CONTRASENHA, IMAGEN, FACULTAD} = req.body.coordinador; 209 | //console.log("GOT: ", req.body.alumno);//solo para asegurarme de que el objeto llego al backend 210 | try { 211 | const nuevoCoordinador = await coordinador.create({ 212 | USUARIO: USUARIO, 213 | CONTRASENHA: CONTRASENHA, 214 | NOMBRE: NOMBRE, 215 | APELLIDOS: APELLIDOS, 216 | CORREO: CORREO, 217 | CODIGO: CODIGO, 218 | TELEFONO: TELEFONO, 219 | DIRECCION: DIRECCION, 220 | IMAGEN: IMAGEN 221 | }, {transaction: transaccion}) 222 | .then(async result => { 223 | const validacionCodigo = await coordinador.findOne({ 224 | where: {CODIGO: CODIGO}, 225 | include:[{ 226 | model: rolXUsuarioXPrograma, 227 | attributes: ["ESTADO"], 228 | where: {ESTADO: 1}, 229 | include: [{ 230 | model:programa, 231 | attributes: ["ID_PROGRAMA", "NOMBRE"], 232 | include: { 233 | model: programa, 234 | as: "FACULTAD", 235 | attributes: ["ID_FACULTAD", "NOMBRE"] 236 | } 237 | }, rol] 238 | }] 239 | }) 240 | 241 | const validacionCorreo = await coordinador.findOne({ 242 | where:{CORREO: CORREO}, 243 | include:[{ 244 | model: rolXUsuarioXPrograma, 245 | attributes: ["ESTADO"], 246 | where: {ESTADO: 1}, 247 | include: [{ 248 | model:programa, 249 | attributes: ["ID_PROGRAMA", "NOMBRE"], 250 | include: { 251 | model: programa, 252 | as: "FACULTAD", 253 | attributes: ["ID_FACULTAD", "NOMBRE"] 254 | } 255 | }, rol] 256 | }] 257 | }) 258 | 259 | if (!validacionCodigo && !validacionCorreo){ 260 | const idRol = await rol.findOne({ 261 | attributes:["ID_ROL"], 262 | where: {DESCRIPCION: "Coordinador Facultad"} 263 | }, {transaction: transaccion}) 264 | 265 | 266 | for(element of FACULTAD){ 267 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 268 | ID_USUARIO: result.ID_USUARIO, 269 | ID_PROGRAMA: element, 270 | ID_ROL: idRol.ID_ROL, 271 | ESTADO: '1' 272 | }, {transaction: transaccion}) 273 | } 274 | await transaccion.commit(); 275 | res.status(201).json({coordinador: result}); 276 | }else{ 277 | await transaccion.rollback(); 278 | if(validacionCodigo && validacionCorreo){ 279 | res.json({error: "Codigo y correo repetido", usuario: validacionCodigo}) 280 | }else if(validacionCodigo){ 281 | res.json({error: "Codigo repetido", usuario: validacionCodigo}) 282 | }else if(validacionCorreo){ 283 | res.json({error: "Correo repetido", usuario: validacionCorreo}) 284 | } 285 | } 286 | }) 287 | } catch (error) { 288 | await transaccion.rollback(); 289 | res.json({error: error.message}) 290 | } 291 | }; 292 | 293 | controllers.modificarCoordinadorPrograma = async (req, res) => { 294 | /** 295 | * Aqui deberia haber una validacion (un middleware) para validar 296 | * que se envio un "coordinador" en el cuerpo ("body") del request ("req") 297 | * */ 298 | const transaccion = await sequelize.transaction(); 299 | const {ID, NOMBRE, APELLIDOS, CODIGO, CORREO, TELEFONO, DIRECCION, USUARIO, IMAGEN, PROGRAMA} = req.body.coordinador; 300 | //console.log("GOT: ", req.body.alumno);//solo para asegurarme de que el objeto llego al backend 301 | try { 302 | const coordinadorModificado = await coordinador.update({ 303 | USUARIO: USUARIO, 304 | NOMBRE: NOMBRE, 305 | APELLIDOS: APELLIDOS, 306 | CORREO: CORREO, 307 | CODIGO: CODIGO, 308 | TELEFONO: TELEFONO, 309 | DIRECCION: DIRECCION, 310 | IMAGEN: IMAGEN 311 | },{ 312 | where: {ID_USUARIO: ID}, 313 | transaction: transaccion 314 | }) 315 | .then(async result => { 316 | const validacionCodigo = await coordinador.findOne({ 317 | where: {ID_USUARIO: {[Op.not]: ID}, CODIGO: CODIGO}, 318 | include:[{ 319 | model: rolXUsuarioXPrograma, 320 | attributes: ["ESTADO"], 321 | where: {ESTADO: 1}, 322 | include: [{ 323 | model:programa, 324 | attributes: ["ID_PROGRAMA", "NOMBRE"], 325 | include: { 326 | model: programa, 327 | as: "FACULTAD", 328 | attributes: ["ID_FACULTAD", "NOMBRE"] 329 | } 330 | }, rol] 331 | }] 332 | }) 333 | 334 | const validacionCorreo = await coordinador.findOne({ 335 | where:{ID_USUARIO: {[Op.not]: ID}, CORREO: CORREO}, 336 | include:[{ 337 | model: rolXUsuarioXPrograma, 338 | attributes: ["ESTADO"], 339 | where: {ESTADO: 1}, 340 | include: [{ 341 | model:programa, 342 | attributes: ["ID_PROGRAMA", "NOMBRE"], 343 | include: { 344 | model: programa, 345 | as: "FACULTAD", 346 | attributes: ["ID_FACULTAD", "NOMBRE"] 347 | } 348 | }, rol] 349 | }] 350 | }) 351 | 352 | if (!validacionCodigo && !validacionCorreo){ 353 | const idRol = await rol.findOne({ 354 | attributes:["ID_ROL"], 355 | where: {DESCRIPCION: "Coordinador Programa"} 356 | }, {transaction: transaccion}) 357 | 358 | await rolXUsuarioXPrograma.destroy({ 359 | where:{ID_USUARIO: ID, ID_ROL: idRol.ID_ROL}, 360 | transaction: transaccion 361 | }) 362 | 363 | for(element of PROGRAMA){ 364 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 365 | ID_USUARIO: ID, 366 | ID_PROGRAMA: element, 367 | ID_ROL: idRol.ID_ROL 368 | }, {transaction: transaccion}) 369 | } 370 | await transaccion.commit(); 371 | res.status(201).json({coordinador: req.body.coordinador}); 372 | }else{ 373 | await transaccion.rollback(); 374 | if(validacionCodigo && validacionCorreo){ 375 | res.json({error: "Codigo y correo repetido", usuario: validacionCodigo}) 376 | }else if(validacionCodigo){ 377 | res.json({error: "Codigo repetido", usuario: validacionCodigo}) 378 | }else if(validacionCorreo){ 379 | res.json({error: "Correo repetido", usuario: validacionCorreo}) 380 | } 381 | } 382 | }) 383 | } catch (error) { 384 | await transaccion.rollback(); 385 | res.json({error: error.message}) 386 | } 387 | 388 | }; 389 | 390 | controllers.modificarCoordinadorFacultad = async (req, res) => { 391 | /** 392 | * Aqui deberia haber una validacion (un middleware) para validar 393 | * que se envio un "coordinador" en el cuerpo ("body") del request ("req") 394 | * */ 395 | const transaccion = await sequelize.transaction(); 396 | const {ID, NOMBRE, APELLIDOS, CODIGO, CORREO, TELEFONO, DIRECCION, USUARIO, IMAGEN, FACULTAD} = req.body.coordinador; 397 | //console.log("GOT: ", req.body.alumno);//solo para asegurarme de que el objeto llego al backend 398 | try { 399 | const coordinadorModificado = await coordinador.update({ 400 | USUARIO: USUARIO, 401 | NOMBRE: NOMBRE, 402 | APELLIDOS: APELLIDOS, 403 | CORREO: CORREO, 404 | CODIGO: CODIGO, 405 | TELEFONO: TELEFONO, 406 | DIRECCION: DIRECCION, 407 | IMAGEN: IMAGEN 408 | },{ 409 | where: {ID_USUARIO: ID}, 410 | transaction: transaccion 411 | }) 412 | .then(async result => { 413 | const validacionCodigo = await coordinador.findOne({ 414 | where: {ID_USUARIO: {[Op.not]: ID}, CODIGO: CODIGO}, 415 | include:[{ 416 | model: rolXUsuarioXPrograma, 417 | attributes: ["ESTADO"], 418 | where: {ESTADO: 1}, 419 | include: [{ 420 | model:programa, 421 | attributes: ["ID_PROGRAMA", "NOMBRE"], 422 | include: { 423 | model: programa, 424 | as: "FACULTAD", 425 | attributes: ["ID_FACULTAD", "NOMBRE"] 426 | } 427 | }, rol] 428 | }] 429 | }) 430 | 431 | const validacionCorreo = await coordinador.findOne({ 432 | where:{ID_USUARIO: {[Op.not]: ID}, CORREO: CORREO}, 433 | include:[{ 434 | model: rolXUsuarioXPrograma, 435 | attributes: ["ESTADO"], 436 | where: {ESTADO: 1}, 437 | include: [{ 438 | model:programa, 439 | attributes: ["ID_PROGRAMA", "NOMBRE"], 440 | include: { 441 | model: programa, 442 | as: "FACULTAD", 443 | attributes: ["ID_FACULTAD", "NOMBRE"] 444 | } 445 | }, rol] 446 | }] 447 | }) 448 | 449 | if (!validacionCodigo && !validacionCorreo){ 450 | const idRol = await rol.findOne({ 451 | attributes:["ID_ROL"], 452 | where: {DESCRIPCION: "Coordinador Facultad"} 453 | }, {transaction: transaccion}) 454 | 455 | await rolXUsuarioXPrograma.destroy({ 456 | where:{ID_USUARIO: ID, ID_ROL: idRol.ID_ROL}, 457 | transaction: transaccion 458 | }) 459 | 460 | for(element of FACULTAD){ 461 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 462 | ID_USUARIO: ID, 463 | ID_PROGRAMA: element, 464 | ID_ROL: idRol.ID_ROL 465 | }, {transaction: transaccion}) 466 | } 467 | await transaccion.commit(); 468 | res.status(201).json({coordinador: req.body.coordinador}); 469 | }else{ 470 | await transaccion.rollback(); 471 | if(validacionCodigo && validacionCorreo){ 472 | res.json({error: "Codigo y correo repetido", usuario: validacionCodigo}) 473 | }else if(validacionCodigo){ 474 | res.json({error: "Codigo repetido", usuario: validacionCodigo}) 475 | }else if(validacionCorreo){ 476 | res.json({error: "Correo repetido", usuario: validacionCorreo}) 477 | } 478 | } 479 | }) 480 | } catch (error) { 481 | await transaccion.rollback(); 482 | res.json({error: error.message}) 483 | } 484 | 485 | }; 486 | 487 | controllers.eliminarCoordinadorPrograma = async (req, res) => { 488 | 489 | const transaccion = await sequelize.transaction(); 490 | try { 491 | const idRol = await rol.findOne({ 492 | attributes:["ID_ROL"], 493 | where: {DESCRIPCION: "Coordinador Programa"} 494 | }, {transaction: transaccion}) 495 | 496 | const coordinadorModificado = await rolXUsuarioXPrograma.update({ 497 | ESTADO: 0 498 | },{ 499 | where: { 500 | ID_USUARIO: req.params.id, 501 | ID_ROL: idRol.ID_ROL 502 | } 503 | }, {transaction: transaccion}) 504 | await transaccion.commit() 505 | res.status(201).json({status: "success"}) 506 | } catch (error) { 507 | await transaccion.rollback(); 508 | res.json({error: error.message}) 509 | } 510 | 511 | }; 512 | 513 | controllers.eliminarCoordinadorFacultad = async (req, res) => { 514 | 515 | const transaccion = await sequelize.transaction(); 516 | try { 517 | const idRol = await rol.findOne({ 518 | attributes:["ID_ROL"], 519 | where: {DESCRIPCION: "Coordinador Facultad"} 520 | }) 521 | 522 | const coordinadorModificado = await rolXUsuarioXPrograma.update({ 523 | ESTADO: 0 524 | },{ 525 | where: { 526 | ID_USUARIO: req.params.id, 527 | ID_ROL: idRol.ID_ROL 528 | }, 529 | transaction: transaccion 530 | }) 531 | await transaccion.commit() 532 | res.status(201).json({status: "success"}) 533 | } catch (error) { 534 | await transaccion.rollback(); 535 | res.json({error: error.message}) 536 | } 537 | 538 | }; 539 | 540 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/encuestaController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | 3 | let sequelize = require('../models/database'); 4 | let encuesta = require('../models/encuesta'); 5 | const alumnoXSesion = require('../models/alumnoXSesion'); 6 | const sesion = require('../models/sesion'); 7 | const { Sequelize } = require('sequelize'); 8 | const procesoTutoria = require('../models/procesoTutoria'); 9 | const programa = require('../models/programa'); 10 | const { QueryTypes } = require('sequelize'); 11 | 12 | 13 | controllers.listarPorTutoria = async (req, res) => { 14 | try{ // devuelve el promedio de c/campo de las encuestas wn cada proceso de tutoria de un programa 15 | 16 | const encuestas = await sequelize.query("SELECT PROCESO_TUTORIA.NOMBRE PROCESO_TUTORIA, AVG(SATISFACCION) SATISFACCION, AVG(UTILIDAD) UTILIDAD, SUM(UTILIZO_RECOMENDACIONES) UTILIZO_RECOMENDACIONES," + 17 | "SUM(SOLUCIONO_SITUACION) SOLUCIONO_SITUACION, SUM(RECOMENDARIA) RECOMENDARIA, COUNT(*) CANTIDAD" + 18 | " FROM ENCUESTA, ALUMNO_X_SESION, SESION, PROCESO_TUTORIA " + 19 | "WHERE ENCUESTA.ID_ALUMNO = ALUMNO_X_SESION.ID_ALUMNO AND ENCUESTA.ID_SESION = ALUMNO_X_SESION.ID_SESION " + 20 | "AND SESION.ID_SESION = ENCUESTA.ID_SESION AND ALUMNO_X_SESION.ID_SESION = SESION.ID_SESION AND PROCESO_TUTORIA.ID_PROCESO_TUTORIA = SESION.ID_PROCESO_TUTORIA " + 21 | "AND PROCESO_TUTORIA.ID_PROGRAMA = " + req.params.idPrograma + 22 | " GROUP BY PROCESO_TUTORIA. ID_PROCESO_TUTORIA", { type: QueryTypes.SELECT }); 23 | 24 | res.status(201).json({encuestas:encuestas}); 25 | } 26 | catch (error) { 27 | res.json({error: error.message}); 28 | } 29 | }; 30 | 31 | controllers.listarPorPrograma = async (req, res) => { 32 | try{ // devuelve las encuestas de un programa 33 | const encuestas = await sequelize.query("SELECT CODIGO, CONCAT(USUARIO.NOMBRE,' ',USUARIO.APELLIDOS) NOMBRE, " + 34 | " UTILIDAD,CASE WHEN UTILIZO_RECOMENDACIONES=1 THEN 'SI' ELSE 'NO' END UTILIZO_RECOMENDACIONES, " + 35 | " CASE WHEN SOLUCIONO_SITUACION=1 THEN 'SI' ELSE 'NO' END SOLUCIONO_SITUACION," + 36 | " CASE WHEN RECOMENDARIA=1 THEN 'SI' ELSE 'NO' END RECOMENDARIA, " + 37 | " PROCESO_TUTORIA.NOMBRE PROCESO, PROGRAMA.NOMBRE PROGRAMA FROM ENCUESTA, SESION, PROCESO_TUTORIA, PROGRAMA, USUARIO " + 38 | " WHERE ENCUESTA.ID_SESION = SESION.ID_SESION AND SESION.ID_PROCESO_TUTORIA = PROCESO_TUTORIA.ID_PROCESO_TUTORIA " + 39 | " AND ID_USUARIO = ID_ALUMNO " + 40 | " AND PROCESO_TUTORIA.ID_PROGRAMA = PROGRAMA.ID_PROGRAMA AND PROGRAMA.ID_PROGRAMA = " + req.params.idPrograma , { type: QueryTypes.SELECT }); 41 | 42 | res.status(201).json({encuestas:encuestas}); 43 | } 44 | catch (error) { 45 | res.json({error: error.message}); 46 | } 47 | }; 48 | 49 | controllers.get = async (req, res) =>{ // devuelve los datos de una encuesta 50 | try{ 51 | const data = await encuesta.findOne({ 52 | where: { 53 | ID_SESION: req.params.idSesion, 54 | ID_ALUMNO: req.params.idAlumno 55 | } 56 | }) 57 | 58 | res.status(201).json({encuesta:data}); 59 | } 60 | catch(error){ 61 | res.json({error: error.message}); 62 | } 63 | } 64 | 65 | /** 66 | * @returns La nueva tutoria creado en formato Json() 67 | * HTTP status code 201 significa que se creo exitosamente 68 | */ 69 | controllers.registrar = async (req, res) => { 70 | /** 71 | * Aqui deberia haber una validacion (un middleware) para validar 72 | * que se envio una "tutoria" en el cuerpo ("body") del request ("req") 73 | * */ 74 | const transaccion = await sequelize.transaction(); 75 | const {ID_ALUMNO, ID_SESION, SATISFACCION, UTILIDAD, UTILIZO_RECOMENDACIONES, SOLUCIONO_SITUACION, RECOMENDARIA} = req.body.encuesta; 76 | // console.log("GOT: ", PROGRAMA);//solo para asegurarme de que el objeto llego al backend 77 | try { 78 | const nuevaEncuesta = await encuesta.create({ 79 | ID_ALUMNO: ID_ALUMNO, 80 | ID_SESION: ID_SESION, 81 | SATISFACCION: SATISFACCION, 82 | UTILIDAD: UTILIDAD, 83 | UTILIZO_RECOMENDACIONES: UTILIZO_RECOMENDACIONES, 84 | SOLUCIONO_SITUACION: SOLUCIONO_SITUACION, 85 | RECOMENDARIA: RECOMENDARIA 86 | }, {transaction: transaccion}) 87 | 88 | await transaccion.commit(); 89 | res.status(201).json({encuesta: nuevaEncuesta}); 90 | }catch (error) { 91 | await transaccion.rollback(); 92 | res.json({error: error.message}) 93 | } 94 | 95 | }; 96 | 97 | 98 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/etiquetaController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | 3 | let sequelize = require('../models/database'); 4 | let etiqueta = require('../models/etiqueta'); 5 | 6 | controllers.listar = async (req, res) => { 7 | try{ 8 | const etiquetas = await etiqueta.findAll(); 9 | res.status(201).json({etiquetas:etiquetas}); 10 | } 11 | catch (error) { 12 | res.json({error: error.message}); 13 | } 14 | }; 15 | 16 | controllers.get = async (req, res) =>{ // devuelve los datos de un alumno 17 | try{ 18 | const data = await etiqueta.findOne({ 19 | where: {ID_ETIQUETA: req.params.id} 20 | }) 21 | 22 | res.status(201).json({etiqueta:data}); 23 | } 24 | catch(error){ 25 | res.json({error: error.message}); 26 | } 27 | } 28 | 29 | /** 30 | * @returns La nueva tutoria creado en formato Json() 31 | * HTTP status code 201 significa que se creo exitosamente 32 | */ 33 | controllers.registrar = async (req, res) => { 34 | /** 35 | * Aqui deberia haber una validacion (un middleware) para validar 36 | * que se envio una "tutoria" en el cuerpo ("body") del request ("req") 37 | * */ 38 | const transaccion = await sequelize.transaction(); 39 | const {DESCRIPCION} = req.body.etiqueta; 40 | // console.log("GOT: ", PROGRAMA);//solo para asegurarme de que el objeto llego al backend 41 | try { 42 | const nuevaEtiqueta = await etiqueta.create({ 43 | DESCRIPCION: DESCRIPCION 44 | }, {transaction: transaccion}) 45 | 46 | await transaccion.commit(); 47 | res.status(201).json({etiqueta: nuevaEtiqueta}); 48 | }catch (error) { 49 | await transaccion.rollback(); 50 | res.json({error: error.message}) 51 | } 52 | 53 | }; 54 | 55 | 56 | controllers.modificar = async (req, res) => { 57 | 58 | const transaccion = await sequelize.transaction(); 59 | const {ID, DESCRIPCION} = req.body.etiqueta; 60 | try { 61 | const etiquetaModificada = await etiqueta.update({ 62 | DESCRIPCION: DESCRIPCION 63 | }, { 64 | where: {ID_ETIQUETA: ID} 65 | }, {transaction: transaccion}) 66 | 67 | await transaccion.commit(); 68 | res.status(201).json({etiqueta: req.body.etiqueta}); 69 | }catch (error) { 70 | await transaccion.rollback(); 71 | res.json({error: error.message}) 72 | } 73 | 74 | }; 75 | 76 | controllers.eliminar = async (req, res) => { 77 | 78 | const transaccion = await sequelize.transaction(); 79 | try { 80 | await etiqueta.destroy({ 81 | where: {ID_ETIQUETA: req.params.id} 82 | }, {transaction: transaccion}) 83 | 84 | await transaccion.commit(); 85 | res.status(201).json({resultado: "success"}); 86 | }catch (error) { 87 | await transaccion.rollback(); 88 | res.json({error: error.message}) 89 | } 90 | 91 | }; 92 | 93 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/institucionController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | 3 | let sequelize = require('../models/database'); 4 | let institucion = require('../models/institucion'); 5 | const fsPath = require('fs-path'); 6 | const fs = require('fs'); 7 | const path = require('path'); 8 | 9 | 10 | controllers.guardarImagen = async (req, res) => { 11 | try{ 12 | 13 | fs.readFile('apple.png', function (err, data) { 14 | let id = 1; 15 | fsPath.writeFile(path.join(".","archivoImagenes",id.toString()+".png"), data, function (err) { 16 | // la funcion es la que maneja lo que sucede despues de termine el evento 17 | if (err) { 18 | return console.log(err); 19 | } 20 | // las funciones de javascript en nodejs son asincronicas 21 | // por lo tanto lo que se quiera hacer debe hacerse dentro de la funcion que maneja el evento 22 | // si uno declara una variable arriba de la funcion, la manipula dentro y la quiere usar 23 | // despues afuera, se corre el riezgo de que nunca se realice la manipulacion. 24 | 25 | // console.log(path.join(".","archivoImagenes",id.toString()+".png")); 26 | res.status(201).json({estado: "exito"}); 27 | }) 28 | }) 29 | } catch (error) { 30 | res.json({error: error.message}); 31 | } 32 | 33 | } 34 | 35 | controllers.listar = async (req, res) => { 36 | try{ 37 | const inst = await institucion.findOne(); 38 | if (inst.dataValues.IMAGEN){ 39 | let cadena = inst.dataValues.IMAGEN.split(".") 40 | inst.dataValues.IMAGEN = fs.readFileSync(inst.dataValues.IMAGEN, "base64") 41 | inst.dataValues.EXTENSION = cadena[cadena.length -1] 42 | } 43 | else{ 44 | inst.dataValues.EXTENSION = "" 45 | } 46 | res.status(201).json({institucion:inst}); 47 | } 48 | catch (error) { 49 | res.json({error: error.message}); 50 | } 51 | }; 52 | 53 | 54 | /** 55 | * @returns La nueva institucion creada en formato Json() 56 | * HTTP status code 201 significa que se creo exitosamente 57 | */ 58 | controllers.registrar = async (req, res) => { 59 | /** 60 | * Aqui deberia haber una validacion (un middleware) para validar 61 | * que se envio una "tutoria" en el cuerpo ("body") del request ("req") 62 | * */ 63 | const transaccion = await sequelize.transaction(); 64 | const {NOMBRE, INICIALES, IMAGEN, TELEFONO, PAGINA_WEB, UBICACION, DOMINIO, EXTENSION, DOMINIO2} = req.body.institucion; 65 | // console.log("GOT: ", PROGRAMA);//solo para asegurarme de que el objeto llego al backend 66 | try { 67 | let ruta = IMAGEN?path.join("..","Imagenes","Institucion","logo."+EXTENSION):null; 68 | if(IMAGEN){ 69 | let data = new Buffer(IMAGEN, "base64"); 70 | fsPath.writeFile(ruta, data, function (err) { 71 | if (err) { 72 | return console.log(err); 73 | } 74 | }) 75 | 76 | } 77 | const nuevaInstitucion = await institucion.create({ 78 | NOMBRE: NOMBRE, 79 | INICIALES: INICIALES, 80 | IMAGEN: ruta, 81 | TELEFONO: TELEFONO, 82 | PAGINA_WEB: PAGINA_WEB, 83 | UBICACION: UBICACION, 84 | DOMINIO: DOMINIO, 85 | DOMINIO2: DOMINIO2 86 | }, {transaction: transaccion}) 87 | 88 | await transaccion.commit(); 89 | res.status(201).json({institucion: nuevaInstitucion}); 90 | }catch (error) { 91 | await transaccion.rollback(); 92 | res.json({error: error.message}) 93 | } 94 | 95 | }; 96 | 97 | 98 | controllers.modificar = async (req, res) => { 99 | 100 | const transaccion = await sequelize.transaction(); 101 | const {ID, NOMBRE, INICIALES, IMAGEN, TELEFONO, PAGINA_WEB, UBICACION, DOMINIO, EXTENSION, DOMINIO2} = req.body.institucion; 102 | try { 103 | let ruta = IMAGEN?path.join("..","Imagenes","Institucion","logo."+EXTENSION):null; 104 | if(IMAGEN){ 105 | let data = new Buffer(IMAGEN, "base64"); 106 | fsPath.writeFile(ruta, data, function (err) { 107 | if (err) { 108 | return console.log(err); 109 | } 110 | }) 111 | } 112 | const institucionModificada = await institucion.update({ 113 | NOMBRE: NOMBRE, 114 | INICIALES: INICIALES, 115 | IMAGEN: ruta, 116 | TELEFONO: TELEFONO, 117 | PAGINA_WEB: PAGINA_WEB, 118 | UBICACION: UBICACION, 119 | DOMINIO: DOMINIO, 120 | DOMINIO2: DOMINIO2 121 | }, { 122 | where: {ID_INSTITUCION: ID} 123 | }, {transaction: transaccion}) 124 | 125 | await transaccion.commit(); 126 | inst = {...req.body.institucion}; 127 | inst.IMAGEN = ruta; 128 | res.status(201).json({institucion: inst}); 129 | }catch (error) { 130 | await transaccion.rollback(); 131 | res.json({error: error.message}) 132 | } 133 | 134 | }; 135 | 136 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/logController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | 3 | const path = require('path'); 4 | const fsPath = require('fs-path'); 5 | const fs = require('fs'); 6 | 7 | controllers.logDeAuditoria = async (req, res) => { //registros de auditoria 8 | const {usuario, transaccion} = req.body.auditoria; 9 | try{ 10 | let dia=new Date(); 11 | let ruta = await path.join("..","Auditoria","Auditoria_"+dia.getDate()+"-"+dia.getMonth()+"-"+dia.getFullYear()+".txt"); 12 | let output = '' 13 | // console.log(transaccion) 14 | if (!fs.existsSync(path.join("..","Auditoria"))) { 15 | fs.mkdirSync(path.join("..","Auditoria")); 16 | } 17 | for (property in transaccion) { 18 | output += property + ": {" 19 | for(prop in transaccion[property]){ 20 | output += prop + ': ' + transaccion[property][prop]+', '; 21 | } 22 | } 23 | output+="}"; 24 | let data = await usuario + output+'\n'; 25 | 26 | fs.appendFile(ruta, data, function (err) { 27 | if (err) { 28 | return console.log(err); 29 | } 30 | }) 31 | res.status(201).json({estado: "Registro exitoso"}); 32 | } 33 | catch (error) { 34 | res.json({error: error.message}); 35 | } 36 | }; 37 | 38 | 39 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/notificacionController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | 3 | let sequelize = require('../models/database'); 4 | let notificacion = require('../models/notificacion'); 5 | const sesion = require('../models/sesion'); 6 | const usuario = require('../models/usuario'); 7 | 8 | controllers.listar = async (req, res) => { //lista las notificaciones activas de un usuario 9 | try{ 10 | const notificaciones = await notificacion.findAll({ 11 | where: {ID_RECEPTOR: req.params.idUsuario, ESTADO: 1}, 12 | include:[{ 13 | model: sesion 14 | }, { 15 | model: usuario, 16 | as: "EMISOR", 17 | attributes: ["NOMBRE", "APELLIDOS", "CORREO"] 18 | }], 19 | attributes: ["MENSAJE"] 20 | }); 21 | res.status(201).json({notificaciones:notificaciones}); 22 | } 23 | catch (error) { 24 | res.json({error: error.message}); 25 | } 26 | }; 27 | 28 | 29 | controllers.modificar = async (req, res) => { 30 | 31 | const transaccion = await sequelize.transaction(); 32 | try { 33 | const notificacionModificada = await notificacion.update({ 34 | ESTADO: 0 35 | }, { 36 | where: {ID_RECEPTOR: req.params.idUsuario} 37 | }, {transaction: transaccion}) 38 | 39 | await transaccion.commit(); 40 | res.status(201).json({notificacion: "notificacion actualizada"}); 41 | }catch (error) { 42 | await transaccion.rollback(); 43 | res.json({error: error.message}) 44 | } 45 | 46 | }; 47 | 48 | 49 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/procesoTutoriaController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | const Sequelize = require("sequelize"); 3 | let sequelize = require('../models/database'); 4 | let tutoria = require('../models/procesoTutoria'); 5 | let etiquetaXTutoria = require('../models/etiquetaXTutoria'); 6 | let etiqueta = require('../models/etiqueta'); 7 | let programa = require('../models/programa'); 8 | let asignacionTutoria = require('../models/asignacionTutoria'); 9 | let asignacionTutoriaXAlumno = require('../models/asignacionTutoriaXAlumno'); 10 | const tutor = require("../models/tutor"); 11 | const usuario = require("../models/usuario"); 12 | 13 | const Op = Sequelize.Op; 14 | 15 | 16 | controllers.listar = async (req, res) => { 17 | try{ 18 | const tutorias = await tutoria.findAll({ 19 | include: [etiqueta, programa], 20 | where: {ESTADO: 1} 21 | }); 22 | res.status(201).json({tutoria:tutorias}); 23 | } 24 | catch (error) { 25 | res.json({error: error.message}); 26 | } 27 | }; 28 | 29 | controllers.listarTutoriasFijasPorPrograma = async (req, res) => { 30 | try{ 31 | const tutorias = await tutoria.findAll({ 32 | include: [etiqueta], 33 | where: { 34 | ESTADO: 1, 35 | ID_PROGRAMA: req.params.idPrograma, 36 | [Op.or]: [{TUTOR_FIJO:1}, {TUTOR_FIJO:2}] 37 | } 38 | }); 39 | res.status(201).json({tutoria:tutorias}); 40 | } 41 | catch (error) { 42 | res.json({error: error.message}); 43 | } 44 | }; 45 | 46 | controllers.listarPorPrograma = async (req, res) => { 47 | try{ 48 | const tutorias = await tutoria.findAll({ 49 | include: [etiqueta], 50 | where: { 51 | ESTADO: 1, 52 | ID_PROGRAMA: req.params.id 53 | } 54 | }); 55 | res.status(201).json({tutoria:tutorias}); 56 | } 57 | catch (error) { 58 | res.json({error: error.message}); 59 | } 60 | }; 61 | 62 | controllers.listarPorProgramaYTutor = async (req, res) => { 63 | try{ 64 | const tutorias = await asignacionTutoria.findAll({ 65 | include: { 66 | model: tutoria, 67 | as: "PROCESO_TUTORIA", 68 | where: {ID_PROGRAMA:req.params.idPrograma} 69 | }, 70 | where: { 71 | ESTADO: 1, 72 | ID_TUTOR: req.params.idTutor 73 | }, 74 | attributes: [Sequelize.col("PROCESO_TUTORIA.*")], 75 | group: ["ID_PROCESO_TUTORIA"] 76 | }); 77 | res.status(201).json({tutoria:tutorias}); 78 | } 79 | catch (error) { 80 | res.json({error: error.message}); 81 | } 82 | }; 83 | 84 | controllers.get = async (req, res) =>{ // devuelve los datos de una tutoria 85 | try{ 86 | const {id} = req.params; 87 | const data = await tutoria.findOne({ 88 | where: {ID_PROCESO_TUTORIA: id}, 89 | include: [etiqueta,programa] 90 | }) 91 | res.status(201).json({tutoria:data}); 92 | } 93 | catch(error){ 94 | res.json({error: error.message}); 95 | } 96 | } 97 | 98 | 99 | /** 100 | * @returns La nueva tutoria creado en formato Json() 101 | * HTTP status code 201 significa que se creo exitosamente 102 | */ 103 | controllers.registrar = async (req, res) => { 104 | /** 105 | * Aqui deberia haber una validacion (un middleware) para validar 106 | * que se envio una "tutoria" en el cuerpo ("body") del request ("req") 107 | * */ 108 | const transaccion = await sequelize.transaction(); 109 | const {NOMBRE, DESCRIPCION, OBLIGATORIO, TUTOR_FIJO, GRUPAL, TUTOR_ASIGNADO, PERMANENTE, ETIQUETA, PROGRAMA, DURACION} = req.body.tutoria; 110 | // console.log("GOT: ", PROGRAMA);//solo para asegurarme de que el objeto llego al backend 111 | try { 112 | const repetido = await tutoria.findOne({ 113 | where: {NOMBRE: NOMBRE, ID_PROGRAMA: PROGRAMA} 114 | }) 115 | 116 | if(repetido){ 117 | res.json({error: "Nombre repetido"}); 118 | return; 119 | } 120 | 121 | const nuevaTutoria = await tutoria.create({ 122 | NOMBRE: NOMBRE, 123 | DESCRIPCION: DESCRIPCION, 124 | OBLIGATORIO: OBLIGATORIO, 125 | TUTOR_FIJO: TUTOR_FIJO, 126 | GRUPAL: GRUPAL, 127 | TUTOR_ASIGNADO: TUTOR_ASIGNADO, 128 | PERMANENTE: PERMANENTE, 129 | ID_PROGRAMA: PROGRAMA, 130 | DURACION: DURACION 131 | }, {transaction: transaccion}) 132 | .then(async result =>{ 133 | for(element of ETIQUETA){ 134 | const nuevaEtiquetaXTutoria = await etiquetaXTutoria.create({ 135 | ID_ETIQUETA: element, 136 | ID_PROCESO_TUTORIA: result.ID_PROCESO_TUTORIA 137 | }, {transaction: transaccion}) 138 | } 139 | await transaccion.commit(); 140 | res.status(201).json({tutoria: result}); 141 | }) 142 | }catch (error) { 143 | await transaccion.rollback(); 144 | res.json({error: error.message}) 145 | } 146 | 147 | }; 148 | 149 | 150 | controllers.modificar = async (req, res) => { 151 | 152 | const transaccion = await sequelize.transaction(); 153 | const {ID, NOMBRE, DESCRIPCION, OBLIGATORIO, TUTOR_FIJO, GRUPAL, TUTOR_ASIGNADO, PERMANENTE, ETIQUETA, PROGRAMA, DURACION} = req.body.tutoria; 154 | // console.log("GOT: ", PROGRAMA);//solo para asegurarme de que el objeto llego al backend 155 | try { 156 | 157 | const repetido = await tutoria.findOne({ 158 | where: {NOMBRE: NOMBRE, ID_PROGRAMA: PROGRAMA, ID_PROCESO_TUTORIA: {[Op.not]: ID}} 159 | }) 160 | 161 | if(repetido){ 162 | res.json({error: "Nombre repetido"}); 163 | return; 164 | } 165 | 166 | const tutoriaModificada = await tutoria.update({ 167 | NOMBRE: NOMBRE, 168 | DESCRIPCION: DESCRIPCION, 169 | OBLIGATORIO: OBLIGATORIO, 170 | TUTOR_FIJO: TUTOR_FIJO, 171 | GRUPAL: GRUPAL, 172 | TUTOR_ASIGNADO: TUTOR_ASIGNADO, 173 | PERMANENTE: PERMANENTE, 174 | ID_PROGRAMA: PROGRAMA, 175 | DURACION: DURACION 176 | }, { 177 | where: {ID_PROCESO_TUTORIA: ID} 178 | }, {transaction: transaccion}) 179 | .then(async result =>{ 180 | await etiquetaXTutoria.destroy({ 181 | where: {ID_PROCESO_TUTORIA: ID} 182 | }, {transaction: transaccion}) 183 | 184 | for(element of ETIQUETA){ 185 | const nuevaEtiquetaXTutoria = await etiquetaXTutoria.create({ 186 | ID_ETIQUETA: element, 187 | ID_PROCESO_TUTORIA: ID 188 | }, {transaction: transaccion}) 189 | } 190 | await transaccion.commit(); 191 | res.status(201).json({tutoria: req.body.tutoria}); 192 | }) 193 | }catch (error) { 194 | await transaccion.rollback(); 195 | res.json({error: error.message}) 196 | } 197 | 198 | }; 199 | 200 | controllers.eliminar = async (req, res) => { 201 | 202 | const transaccion = await sequelize.transaction(); 203 | try { 204 | const tutoriaEliminada = await tutoria.update({ 205 | ESTADO: 0 206 | }, { 207 | where: {ID_PROCESO_TUTORIA: req.params.id} 208 | }, {transaction: transaccion}) 209 | await transaccion.commit(); 210 | res.status(201).json({resultado: "success"}); 211 | }catch (error) { 212 | await transaccion.rollback(); 213 | res.json({error: error.message}) 214 | } 215 | 216 | }; 217 | 218 | controllers.listarTutoriasVariablesPorPrograma = async (req, res) => { 219 | try{ 220 | const tutorias = await tutoria.findAll({ 221 | include: [etiqueta], 222 | where: { 223 | ESTADO: 1, 224 | ID_PROGRAMA: req.params.idPrograma, 225 | TUTOR_FIJO:0 226 | } 227 | }); 228 | res.status(201).json({tutoria:tutorias}); 229 | } 230 | catch (error) { 231 | res.json({error: error.message}); 232 | } 233 | }; 234 | 235 | controllers.listarTutoriasFijasAsignadasAPorAlumno = async (req, res) => { 236 | try{ 237 | const tutorias = await tutoria.findAll({ 238 | include: [etiqueta,{ 239 | model: asignacionTutoria, 240 | where: {ESTADO: 1}, 241 | include:[{ 242 | model:asignacionTutoriaXAlumno, 243 | where: { 244 | ID_ALUMNO:req.params.idAlumno, 245 | SOLICITUD:1 246 | }, 247 | attributes: [] 248 | },{ 249 | model:tutor, 250 | include:{ 251 | model:usuario, 252 | attributes: ["NOMBRE", "APELLIDOS"] 253 | } 254 | }], 255 | attributes: ["ID_TUTOR"] 256 | }], 257 | where: { 258 | ESTADO: 1, 259 | ID_PROGRAMA: req.params.idPrograma, 260 | [Op.or]: [{TUTOR_FIJO:1}, {TUTOR_FIJO:2}] 261 | } 262 | }); 263 | res.status(201).json({tutoria:tutorias}); 264 | } 265 | catch (error) { 266 | res.json({error: error.message}); 267 | } 268 | }; 269 | 270 | controllers.listarTutoriasGrupalesPorPrograma = async (req, res) => { 271 | try{ 272 | const tutorias = await tutoria.findAll({ 273 | include: [etiqueta], 274 | where: { 275 | ESTADO: 1, 276 | ID_PROGRAMA: req.params.idPrograma, 277 | GRUPAL:1 278 | } 279 | }); 280 | res.status(201).json({tutoria:tutorias}); 281 | } 282 | catch (error) { 283 | res.json({error: error.message}); 284 | } 285 | }; 286 | 287 | controllers.listarTutoriasFijasYAsignadasPorPrograma = async (req, res) => { 288 | try{ 289 | const tutorias = await tutoria.findAll({ 290 | include: [etiqueta], 291 | where: { 292 | ESTADO: 1, 293 | ID_PROGRAMA: req.params.idPrograma, 294 | [Op.or]: [{TUTOR_FIJO:1}, {TUTOR_FIJO:2}], 295 | TUTOR_ASIGNADO: 1 296 | } 297 | }); 298 | res.status(201).json({tutoria:tutorias}); 299 | } 300 | catch (error) { 301 | res.json({error: error.message}); 302 | } 303 | }; 304 | 305 | controllers.listarTutoriasFijasYSolicitadasPorPrograma = async (req, res) => { 306 | try{ 307 | const tutorias = await tutoria.findAll({ 308 | include: [etiqueta], 309 | where: { 310 | ESTADO: 1, 311 | ID_PROGRAMA: req.params.idPrograma, 312 | [Op.or]: [{TUTOR_FIJO:1}, {TUTOR_FIJO:2}], 313 | TUTOR_ASIGNADO: 0 314 | } 315 | }); 316 | res.status(201).json({tutoria:tutorias}); 317 | } 318 | catch (error) { 319 | res.json({error: error.message}); 320 | } 321 | }; 322 | 323 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/tutorController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | 3 | var nodemailer = require('nodemailer'); 4 | 5 | let sequelize = require('../models/database'); 6 | let tutor = require('../models/tutor'); 7 | let usuario = require('../models/usuario'); 8 | //let rolXUsuario = require('../models/rolXUsuario'); 9 | let rol = require('../models/rol'); 10 | let rolXUsuarioXPrograma = require('../models/rolXUsuarioXPrograma'); 11 | let programa = require('../models/programa') 12 | let asignacionTutoria = require('../models/asignacionTutoria') 13 | let asignacionTutoriaXAlumno = require('../models/asignacionTutoriaXAlumno'); 14 | let notificacion = require('../models/notificacion'); 15 | const { Sequelize } = require('sequelize'); 16 | const fs = require('fs'); 17 | const sesion = require('../models/sesion'); 18 | 19 | //sequelize.sync(); 20 | 21 | 22 | 23 | controllers.listarTutorAsignado = async (req, res) => { // lista el tutor asignado a un alumno en cierto proceso de tutoria 24 | try{ 25 | const tutores = await tutor.findAll({ 26 | include: [{ 27 | model: usuario, 28 | include: { 29 | model: rolXUsuarioXPrograma, 30 | where: { 31 | ESTADO: 1 32 | }, 33 | include: { 34 | model: rol, 35 | where: {DESCRIPCION: "Tutor"}, 36 | attributes: [] 37 | }, 38 | attributes: [] 39 | } 40 | },{ 41 | model: asignacionTutoria, 42 | where: { 43 | ID_TUTOR: Sequelize.col("TUTOR.ID_TUTOR"), 44 | ID_PROCESO_TUTORIA: req.params.idTutoria, 45 | ESTADO: 1 46 | }, 47 | include: { 48 | model: asignacionTutoriaXAlumno, 49 | where: { 50 | ID_ALUMNO: req.params.idAlumno, 51 | SOLICITUD: 1 52 | }, 53 | attributes: [] 54 | }, 55 | attributes: [] 56 | }], 57 | }); 58 | res.status(201).json({tutor:tutores}); 59 | } 60 | catch (error) { 61 | res.json({error: error.message}); 62 | } 63 | }; 64 | 65 | 66 | controllers.list = async (req, res) => { // fetch all all tutors from DB 67 | try{ 68 | const tutores = await tutor.findAll({ 69 | include: { 70 | model: usuario, 71 | include: {model: rolXUsuarioXPrograma, where: {'ESTADO': 1}}, 72 | } 73 | }); 74 | res.status(201).json({tutores:tutores}); 75 | } 76 | catch (error) { 77 | res.json({error: error.message}); 78 | } 79 | }; 80 | 81 | 82 | controllers.listarPorPrograma = async (req, res) => { // fetch all all tutors from DB 83 | try{ 84 | const tutores = await tutor.findAll({ 85 | include: { 86 | model: usuario, 87 | required: true, 88 | include: [{ 89 | model: rolXUsuarioXPrograma, 90 | where: { 91 | ID_PROGRAMA: req.params.idPrograma, 92 | ESTADO: 1 93 | }, 94 | required: true, 95 | include:{ 96 | model: rol, 97 | where: {DESCRIPCION: "TUTOR"}, 98 | required: true 99 | } 100 | }] 101 | } 102 | }); 103 | 104 | for (let dis of tutores){ 105 | if(dis.dataValues.USUARIO.IMAGEN){ 106 | dis.dataValues.USUARIO.IMAGEN = fs.readFileSync(dis.dataValues.USUARIO.IMAGEN, "base64") 107 | } 108 | } 109 | 110 | res.status(201).json({tutores:tutores}); 111 | } 112 | catch (error) { 113 | res.json({error: error.message}); 114 | } 115 | }; 116 | 117 | controllers.get = async (req, res) =>{ // devuelve los datos de un tutor 118 | try{ 119 | const {id} = req.params; 120 | const data = await usuario.findOne({ 121 | where: {ID_USUARIO: id}, 122 | include: [{ 123 | model: rolXUsuarioXPrograma, 124 | attributes: ['ID_PROGRAMA'], 125 | include: [{ 126 | model: programa, 127 | attributes: ['NOMBRE'] 128 | }] 129 | }] 130 | }) 131 | res.status(201).json({data:data}); 132 | } 133 | catch(error){ 134 | res.json({error: error.message}); 135 | } 136 | 137 | } 138 | 139 | controllers.register = async (req, res) => { 140 | /** 141 | * Aqui deberia haber una validacion (un middleware) para validar 142 | * que se envio un "student" en el cuerpo ("body") del request ("req") 143 | * */ 144 | const transaccion = await sequelize.transaction(); 145 | const {NOMBRE, APELLIDOS, CODIGO, CORREO, TELEFONO, DIRECCION, USUARIO, CONTRASENHA, IMAGEN, PROGRAMA} = req.body.tutor; 146 | console.log("GOT: ", req.body.tutor);//solo para asegurarme de que el objeto llego al backend 147 | try { 148 | const newUser = await usuario.create({ 149 | USUARIO: USUARIO, 150 | CONTRASENHA: CONTRASENHA, 151 | NOMBRE: NOMBRE, 152 | APELLIDOS: APELLIDOS, 153 | CORREO: CORREO, 154 | CODIGO: CODIGO, 155 | TELEFONO: TELEFONO, 156 | DIRECCION: DIRECCION, 157 | IMAGEN: IMAGEN 158 | }, {transaction: transaccion}).then(async result => { 159 | const validacionCodigo = await usuario.findOne({ 160 | where: {CODIGO: CODIGO}, 161 | include:[{ 162 | model: rolXUsuarioXPrograma, 163 | attributes: ["ESTADO"], 164 | where: {ESTADO: 1}, 165 | include: [{ 166 | model:programa, 167 | attributes: ["ID_PROGRAMA", "NOMBRE"], 168 | include: { 169 | model: programa, 170 | as: "FACULTAD", 171 | attributes: ["ID_FACULTAD", "NOMBRE"] 172 | } 173 | }, rol] 174 | }] 175 | }) 176 | 177 | const validacionCorreo = await usuario.findOne({ 178 | where:{CORREO: CORREO}, 179 | include:[{ 180 | model: rolXUsuarioXPrograma, 181 | attributes: ["ESTADO"], 182 | where: {ESTADO: 1}, 183 | include: [{ 184 | model:programa, 185 | attributes: ["ID_PROGRAMA", "NOMBRE"], 186 | include: { 187 | model: programa, 188 | as: "FACULTAD", 189 | attributes: ["ID_FACULTAD", "NOMBRE"] 190 | } 191 | }, rol] 192 | }] 193 | }) 194 | 195 | if (!validacionCodigo && !validacionCorreo){ 196 | const newTutor = await tutor.create({ 197 | ID_TUTOR: result.ID_USUARIO 198 | }, {transaction: transaccion}) 199 | const idRol = await rol.findOne({ 200 | attributes:["ID_ROL"], 201 | where: {DESCRIPCION: "Tutor"} 202 | }) 203 | /* const newRolUsuario = await rolXUsuario.create({ 204 | ID_USUARIO: result.ID_USUARIO, 205 | ESTADO: '1', 206 | ID_ROL: idRol.ID_ROL 207 | }, {transaction: transaccion}) */ 208 | 209 | for(ele of PROGRAMA) { 210 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 211 | ID_USUARIO: result.ID_USUARIO, 212 | ID_PROGRAMA: ele, 213 | ESTADO: '1', 214 | ID_ROL: idRol.ID_ROL 215 | }, {transaction: transaccion}) 216 | } 217 | await transaccion.commit(); 218 | res.status(201).json({tutor: result}); 219 | }else{ 220 | await transaccion.rollback(); 221 | if(validacionCodigo && validacionCorreo){ 222 | res.json({error: "Codigo y correo repetido", usuario: validacionCodigo}) 223 | }else if(validacionCodigo){ 224 | res.json({error: "Codigo repetido", usuario: validacionCodigo}) 225 | }else if(validacionCorreo){ 226 | res.json({error: "Correo repetido", usuario: validacionCorreo}) 227 | } 228 | } 229 | }); 230 | } catch (error) { 231 | await transaccion.rollback(); 232 | res.json({error: error.message}) 233 | } 234 | 235 | }; 236 | 237 | controllers.modificar = async (req, res) => { 238 | const transaccion = await sequelize.transaction(); 239 | const {ID_TUTOR,NOMBRE, APELLIDOS, CODIGO, CORREO, TELEFONO, DIRECCION, USUARIO, IMAGEN, PROGRAMA} = req.body.tutor; 240 | // console.log("GOT: ", req.body.tutor);//solo para asegurarme de que el objeto llego al backend 241 | 242 | try { 243 | const modifTutor = await usuario.update({ 244 | USUARIO: USUARIO, 245 | NOMBRE: NOMBRE, 246 | APELLIDOS: APELLIDOS, 247 | CORREO: CORREO, 248 | CODIGO: CODIGO, 249 | TELEFONO: TELEFONO, 250 | DIRECCION: DIRECCION, 251 | IMAGEN: IMAGEN 252 | },{ 253 | where: {ID_USUARIO: ID_TUTOR} 254 | }, {transaction: transaccion}) 255 | .then(async result => { 256 | const validacionCodigo = await usuario.findOne({ 257 | where: {ID_USUARIO: {[Op.not]: ID_TUTOR}, CODIGO: CODIGO}, 258 | include:[{ 259 | model: rolXUsuarioXPrograma, 260 | attributes: ["ESTADO"], 261 | where: {ESTADO: 1}, 262 | include: [{ 263 | model:programa, 264 | attributes: ["ID_PROGRAMA", "NOMBRE"], 265 | include: { 266 | model: programa, 267 | as: "FACULTAD", 268 | attributes: ["ID_FACULTAD", "NOMBRE"] 269 | } 270 | }, rol] 271 | }] 272 | }) 273 | 274 | const validacionCorreo = await usuario.findOne({ 275 | where:{ID_USUARIO: {[Op.not]: ID_TUTOR}, CORREO: CORREO}, 276 | include:[{ 277 | model: rolXUsuarioXPrograma, 278 | attributes: ["ESTADO"], 279 | where: {ESTADO: 1}, 280 | include: [{ 281 | model:programa, 282 | attributes: ["ID_PROGRAMA", "NOMBRE"], 283 | include: { 284 | model: programa, 285 | as: "FACULTAD", 286 | attributes: ["ID_FACULTAD", "NOMBRE"] 287 | } 288 | }, rol] 289 | }] 290 | }) 291 | 292 | if (!validacionCodigo && !validacionCorreo){ 293 | 294 | const idRol = await rol.findOne({ 295 | attributes:["ID_ROL"], 296 | where: {DESCRIPCION: "Tutor"} 297 | }) 298 | 299 | await rolXUsuarioXPrograma.destroy({ 300 | where:{ID_USUARIO: ID_TUTOR} 301 | }, {transaction: transaccion}) 302 | 303 | for(element of PROGRAMA){ 304 | const programaDeUsuario = await rolXUsuarioXPrograma.create({ 305 | ID_USUARIO: ID_TUTOR, 306 | ID_PROGRAMA: element, 307 | ESTADO: '1', 308 | ID_ROL: idRol.ID_ROL 309 | }, {transaction: transaccion}) 310 | } 311 | 312 | await transaccion.commit(); 313 | res.status(201).json({alumno: req.body.alumno}); 314 | }else{ 315 | await transaccion.rollback(); 316 | if(validacionCodigo && validacionCorreo){ 317 | res.json({error: "Codigo y correo repetido", usuario: validacionCodigo}) 318 | }else if(validacionCodigo){ 319 | res.json({error: "Codigo repetido", usuario: validacionCodigo}) 320 | }else if(validacionCorreo){ 321 | res.json({error: "Correo repetido", usuario: validacionCorreo}) 322 | } 323 | } 324 | }); 325 | } catch (error) { 326 | await transaccion.rollback(); 327 | res.json({error: error.message}) 328 | } 329 | 330 | }; 331 | 332 | controllers.listarEstadoSolicitudTutorFijo = async (req, res) => { // lista el tutor asignado a un alumno en cierto proceso de tutoria 333 | try{ 334 | const tutores = await tutor.findAll({ 335 | include: [{ 336 | model: usuario, 337 | include: { 338 | model: rolXUsuarioXPrograma, 339 | where: { 340 | ESTADO: 1 341 | }, 342 | include: { 343 | model: rol, 344 | where: {DESCRIPCION: "Tutor"}, 345 | attributes: [] 346 | }, 347 | attributes: [] 348 | } 349 | },{ 350 | model: asignacionTutoria, 351 | where: { 352 | ID_TUTOR: Sequelize.col("TUTOR.ID_TUTOR"), 353 | ID_PROCESO_TUTORIA: req.params.idTutoria 354 | }, 355 | include: { 356 | model: asignacionTutoriaXAlumno, 357 | where: { 358 | ID_ALUMNO: req.params.idAlumno, 359 | ID_ASIGNACION: Sequelize.col("ASIGNACION_TUTORIA.ID_ASIGNACION") 360 | }, 361 | attributes: ["SOLICITUD"] 362 | }, 363 | //attributes: [] 364 | }], 365 | }); 366 | let mensaje = "Sin tutor asignado"; 367 | let tutorAsignado = null; 368 | let estado = 0 369 | if(tutores){ 370 | for (element of tutores){ 371 | for(element2 of element.ASIGNACION_TUTORIA){ 372 | for (element3 of element2.ASIGNACION_TUTORIA_X_ALUMNOs){ 373 | if(element3.SOLICITUD === 1){ 374 | // console.log("entree") 375 | mensaje = "Ya tiene un tutor asignado en este proceso de tutoria"; 376 | tutorAsignado = element; 377 | estado = 1 378 | break; 379 | }else if(element3.SOLICITUD === 2){ 380 | // console.log("entree") 381 | mensaje = "Tiene una solicitud pendiente de respuesta"; 382 | tutorAsignado = element; 383 | estado = 1 384 | break; 385 | } 386 | } 387 | if(tutorAsignado){ 388 | break; 389 | } 390 | } 391 | if(tutorAsignado){ 392 | break; 393 | } 394 | } 395 | } 396 | res.status(201).json({estado: estado, mensaje: mensaje, tutor: tutorAsignado}); 397 | } 398 | catch (error) { 399 | res.json({error: error.message}); 400 | } 401 | }; 402 | 403 | controllers.citarAlumno = async (req, res) => { 404 | const transaccion = await sequelize.transaction(); 405 | const {EMISOR, RAZON, RECEPTOR} = req.body.cita; 406 | // console.log("GOT: ", req.body.cita);//solo para asegurarme de que el objeto llego al backend 407 | 408 | try { 409 | const tut = await usuario.findOne({ 410 | where: {ID_USUARIO: EMISOR} 411 | }) 412 | 413 | const alum = await usuario.findOne({ 414 | where: {ID_USUARIO: RECEPTOR} 415 | }) 416 | 417 | const newNotif = await notificacion.create({ 418 | ID_EMISOR: EMISOR, 419 | ID_RECEPTOR: RECEPTOR, 420 | ESTADO: 1, 421 | MENSAJE: RAZON 422 | }, { transaction: transaccion }) 423 | 424 | await transaccion.commit(); 425 | 426 | res.status(201).json({cita: newNotif}); 427 | 428 | var correo = `Sr(a). ${alum.NOMBRE} ${alum.APELLIDOS}, ha recibido un mensaje del tutor ${tut.NOMBRE} ${tut.APELLIDOS}: 429 | 430 | ${RAZON} 431 | 432 | Contacto: ${tut.CORREO} 433 | ` 434 | 435 | var transporter = nodemailer.createTransport({ 436 | service: 'gmail', 437 | auth: { 438 | user: 'ututor2020@gmail.com', 439 | pass: 'SeniorMito' 440 | } 441 | }); 442 | 443 | var mailOptions = { 444 | from: `${tut.CORREO}`, 445 | to: `${alum.CORREO}`, 446 | subject: 'Mensaje Sistema uTutor', 447 | text: correo 448 | }; 449 | 450 | transporter.sendMail(mailOptions, function(error, info){ 451 | if (error) { 452 | console.log(error); 453 | } else { 454 | console.log('Email sent: ' + info.response); 455 | } 456 | }); 457 | } catch (error) { 458 | await transaccion.rollback(); 459 | res.json({error: error.message}) 460 | } 461 | 462 | }; 463 | 464 | controllers.eliminar = async (req, res) => { 465 | 466 | const transaccion = await sequelize.transaction(); 467 | try { 468 | const idRol = await rol.findOne({ 469 | attributes: ["ID_ROL"], 470 | where: { DESCRIPCION: "Tutor" } 471 | }, { transaction: transaccion }) 472 | 473 | const sesiones = await sesion.findAll({ 474 | where: { ID_TUTOR: req.params.id, ESTADO: "04-futura" } 475 | }, { transaction: transaccion }).then(async result =>{ 476 | if(result.length != 0){ 477 | let message = "El tutor tiene citas pendientes, no se puede eliminar"; 478 | res.status(400).json({message: message}); 479 | return; 480 | }else{ 481 | const tutorEliminado = await rolXUsuarioXPrograma.update({ 482 | ESTADO: 0 483 | }, { 484 | where: { 485 | ID_USUARIO: req.params.id, 486 | ID_ROL: idRol.ID_ROL 487 | } 488 | }, { transaction: transaccion }) 489 | } 490 | }) 491 | await transaccion.commit() 492 | res.status(201).json({ status: "success" }) 493 | } catch (error) { 494 | await transaccion.rollback(); 495 | res.json({ error: error.message }) 496 | } 497 | 498 | }; 499 | 500 | 501 | module.exports = controllers; -------------------------------------------------------------------------------- /src/controllers/usuarioController.js: -------------------------------------------------------------------------------- 1 | const controllers = {} 2 | const Sequelize = require("sequelize"); 3 | let sequelize = require('../models/database'); 4 | let usuario = require('../models/usuario'); 5 | let rolXUsuarioXPrograma = require('../models/rolXUsuarioXPrograma') 6 | let programa = require('../models/programa') 7 | let rol = require('../models/rol'); 8 | const alumno = require("../models/alumno"); 9 | const tutor = require("../models/tutor"); 10 | const fsPath = require('fs-path'); 11 | const fs = require('fs'); 12 | const path = require('path'); 13 | 14 | const Op = Sequelize.Op; 15 | 16 | controllers.buscarPorCorreo = async (req, res) => { 17 | try{ 18 | const user = await usuario.findOne({ 19 | where: {CORREO: req.params.correo}, 20 | include: [{ 21 | model: rolXUsuarioXPrograma, 22 | where: {ESTADO: 1}, 23 | include: [{ 24 | model:programa, 25 | include: [{ 26 | model: programa, 27 | as: 'FACULTAD', 28 | attributes: ["NOMBRE"] 29 | }] 30 | }, rol] 31 | }] 32 | }) 33 | if(user){ 34 | if (user.IMAGEN){ 35 | let cadena = user.IMAGEN.split(".") 36 | user.IMAGEN = fs.readFileSync(user.IMAGEN, "base64") 37 | } 38 | } 39 | 40 | res.status(201).json({usuario:user, idRol:user.ROL_X_USUARIO_X_PROGRAMAs[0].ROL.ID_ROL,rol:user.ROL_X_USUARIO_X_PROGRAMAs[0].ROL.DESCRIPCION}); 41 | }catch (error){ 42 | res.json({error: error.message}); 43 | } 44 | } 45 | 46 | controllers.buscarPorCodigo = async (req, res) => { 47 | try{ 48 | const user = await usuario.findOne({ 49 | where: {CODIGO: req.params.codigo}, 50 | include: [{ 51 | model: rolXUsuarioXPrograma, 52 | include: [programa, rol] 53 | }] 54 | }) 55 | res.status(201).json({usuario:user}); 56 | }catch (error){ 57 | res.json({error: error.message}); 58 | } 59 | } 60 | 61 | controllers.validarUsuarioUnico = async (req, res) => { 62 | try{ 63 | const user = await usuario.findOne({ 64 | where: {USUARIO: req.params.usuario} 65 | }) 66 | res.status(201).json({usuario:user}); 67 | }catch (error){ 68 | res.json({error: error.message}); 69 | } 70 | } 71 | 72 | 73 | controllers.listarRolesPorPrograma = async (req,res) => { 74 | try { 75 | const roles = await rolXUsuarioXPrograma.findAll({ 76 | where: { 77 | ID_USUARIO: req.params.idUsuario, 78 | ID_PROGRAMA: req.params.idPrograma 79 | }, 80 | include: [rol], 81 | attributes: [] 82 | }) 83 | res.status(201).json({roles: roles}); 84 | }catch (error) { 85 | res.json({error: error.message}) 86 | } 87 | } 88 | 89 | 90 | controllers.asignarRol = async (req,res) => { 91 | const transaccion = await sequelize.transaction(); 92 | const {ID_USUARIO, ID_ROLES, ID_PROGRAMA} = req.body.asignacion; 93 | try { 94 | 95 | await rolXUsuarioXPrograma.destroy({ 96 | where:{ID_USUARIO: ID_USUARIO, ID_PROGRAMA: ID_PROGRAMA}, 97 | transaction: transaccion 98 | }) 99 | 100 | for (role of ID_ROLES){ 101 | await rolXUsuarioXPrograma.create({ 102 | ID_USUARIO: ID_USUARIO, 103 | ID_ROL: role, 104 | ID_PROGRAMA: ID_PROGRAMA, 105 | ESTADO: 1 106 | }, {transaction: transaccion}) 107 | 108 | let descripcionRol = await rol.findOne({ 109 | where:{ID_ROL: role} 110 | }) 111 | if(descripcionRol.DESCRIPCION==="Alumno"){ 112 | let alu = await alumno.findOne({ 113 | where: {ID_ALUMNO: ID_USUARIO} 114 | }) 115 | if (!alu){ 116 | await alumno.create({ 117 | ID_ALUMNO: ID_USUARIO 118 | }, {transaction: transaccion}) 119 | } 120 | } else if(descripcionRol.DESCRIPCION==="Tutor"){ 121 | let tut = await tutor.findOne({ 122 | where: {ID_TUTOR: ID_USUARIO} 123 | }) 124 | console.log("tut: ", tut) 125 | if(!tut){ 126 | await tutor.create({ 127 | ID_TUTOR: ID_USUARIO 128 | }, {transaction: transaccion}) 129 | } 130 | } 131 | } 132 | 133 | await transaccion.commit(); 134 | res.status(201).json({nuevaAsignacion: req.body.asignacion}); 135 | }catch (error) { 136 | await transaccion.rollback(); 137 | res.json({error: error.message}) 138 | } 139 | } 140 | 141 | controllers.guardarImagen = async (req,res) => { 142 | const transaccion = await sequelize.transaction(); 143 | const {ID_USUARIO, IMAGEN} = req.body.imagen; 144 | try { 145 | let ruta = IMAGEN?path.join("..","Imagenes","Usuarios",ID_USUARIO.toString(),"perfil.jpeg"):null; 146 | if(IMAGEN){ 147 | let data = new Buffer(IMAGEN, "base64"); 148 | fsPath.writeFile(ruta, data, function (err) { 149 | if (err) { 150 | return console.log(err); 151 | } 152 | }) 153 | } 154 | const usuarioModificado = await usuario.update({ 155 | IMAGEN: ruta 156 | }, { 157 | where: {ID_USUARIO: ID_USUARIO}, 158 | transaction: transaccion 159 | }) 160 | await transaccion.commit(); 161 | res.status(201).json({estado: "registro exitoso"}); 162 | }catch(error) { 163 | await transaccion.rollback(); 164 | res.json({error: error.message}) 165 | } 166 | } 167 | 168 | controllers.modificarPerfil = async (req,res) => { 169 | const transaccion = await sequelize.transaction(); 170 | const {ID_USUARIO, TELEFONO, DIRECCION} = req.body.usuario; 171 | try { 172 | 173 | const usuarioModificado = await usuario.update({ 174 | TELEFONO: TELEFONO, 175 | DIRECCION: DIRECCION 176 | }, { 177 | where: {ID_USUARIO: ID_USUARIO} 178 | }, {transaction: transaccion}) 179 | 180 | await transaccion.commit(); 181 | res.status(201).json({usuario: req.body.usuario}); 182 | }catch (error) { 183 | await transaccion.rollback(); 184 | res.json({error: error.message}) 185 | } 186 | } 187 | 188 | controllers.login = async (req, res) => { 189 | const {USUARIO, CONTRASENHA} = req.body.usuario; 190 | try{ 191 | const data = await usuario.findOne({ 192 | where: {[Op.or]: {USUARIO: USUARIO, CORREO:USUARIO}}, 193 | include:{ 194 | model: rolXUsuarioXPrograma, 195 | where: {ESTADO: 1} 196 | } 197 | }) 198 | .then(async result => { 199 | let user = null 200 | if(result){ 201 | if(await result.validPassword(CONTRASENHA)){ 202 | // console.log("correcto") 203 | user = await usuario.findOne({ 204 | where: {[Op.or]: {USUARIO: USUARIO, CORREO:USUARIO}}, 205 | include: [{ 206 | model: rolXUsuarioXPrograma, 207 | include: [{ 208 | model:programa, 209 | include: [{ 210 | model: programa, 211 | as: 'FACULTAD', 212 | attributes: ["NOMBRE"] 213 | }] 214 | }, rol], 215 | where: {ESTADO: 1} 216 | }] 217 | }) 218 | if(user){ 219 | if (user.IMAGEN){ 220 | let cadena = user.IMAGEN.split(".") 221 | user.IMAGEN = fs.readFileSync(user.IMAGEN, "base64") 222 | } 223 | } 224 | } 225 | } 226 | res.status(201).json({usuario:user, idRol:user.ROL_X_USUARIO_X_PROGRAMAs[0].ROL.ID_ROL,rol:user.ROL_X_USUARIO_X_PROGRAMAs[0].ROL.DESCRIPCION}); 227 | }) 228 | }catch (error){ 229 | res.json({error: error.message}); 230 | } 231 | } 232 | 233 | 234 | module.exports = controllers; -------------------------------------------------------------------------------- /src/models/alumno.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let usuario = require("./usuario") 4 | let etiquetaXAlumno = require('./etiquetaXAlumno'); 5 | let etiqueta = require("./etiqueta"); 6 | 7 | let nametable = 'ALUMNO'; 8 | 9 | let alumno = sequelize.define(nametable,{ 10 | 11 | ID_ALUMNO:{ 12 | type: Sequelize.INTEGER, 13 | primaryKey: true, 14 | references: { 15 | model: "USUARIO", 16 | key: "ID_USUARIO" 17 | } 18 | } 19 | }, 20 | { 21 | timestamps :false, 22 | freezeTableName: true 23 | }); 24 | 25 | 26 | 27 | // alumno.belongsTo(usuario, {foreignKey:{name:"ID_ALUMNO"}}); 28 | // alumno.hasMany(etiquetaXAlumno, {foreignKey:{name: "ID_ALUMNO"}}); 29 | 30 | module.exports = alumno; -------------------------------------------------------------------------------- /src/models/alumnoXSesion.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let alumno = require("./alumno"); 4 | let sesion = require("./sesion"); 5 | 6 | let nametable = 'ALUMNO_X_SESION'; 7 | 8 | let alumnoXSesion = sequelize.define(nametable,{ 9 | ASISTENCIA_ALUMNO: Sequelize.TINYINT, 10 | RESULTADO: Sequelize.STRING 11 | }, 12 | { 13 | timestamps :false, 14 | freezeTableName: true 15 | }); 16 | 17 | 18 | // alumno.belongsToMany(sesion, {through: alumnoXSesion, foreignKey: "ID_ALUMNO", otherKey: "ID_SESION"}) 19 | // sesion.belongsToMany(alumno, {through: alumnoXSesion, foreignKey: "ID_SESION", otherKey: "ID_ALUMNO"}) 20 | // alumnoXSesion.belongsTo(alumno,{foreignKey: "ID_ALUMNO"}); 21 | // alumnoXSesion.belongsTo(sesion,{foreignKey: "ID_SESION"}); 22 | 23 | module.exports = alumnoXSesion; -------------------------------------------------------------------------------- /src/models/areaApoyo.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | 4 | let nametable = 'AREA_APOYO'; 5 | 6 | let areaApoyo = sequelize.define(nametable,{ 7 | 8 | ID_AREA_APOYO:{ 9 | type: Sequelize.INTEGER, 10 | primaryKey: true, 11 | autoIncrement: true 12 | }, 13 | NOMBRE: Sequelize.STRING, 14 | TELEFONO: Sequelize.STRING, 15 | CORREO: Sequelize.STRING, 16 | CONTACTO: Sequelize.STRING 17 | }, 18 | { 19 | timestamps :false, 20 | freezeTableName: true 21 | }); 22 | 23 | module.exports = areaApoyo; -------------------------------------------------------------------------------- /src/models/areaApoyoXSesion.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let areaApoyo = require("./areaApoyo"); 4 | let sesion = require("./sesion"); 5 | 6 | let nametable = 'AREA_APOYO_X_SESION'; 7 | 8 | let areaApoyoXSesion = sequelize.define(nametable,{ 9 | }, 10 | { 11 | timestamps :false, 12 | freezeTableName: true 13 | }); 14 | 15 | /* areaApoyo.belongsToMany(sesion, {through: areaApoyoXSesion, foreignKey: "ID_AREA_APOYO", otherKey: "ID_SESION"}) 16 | areaApoyo.belongsToMany(alumno, {through: areaApoyoXSesion, foreignKey: "ID_AREA_APOYO", otherKey: "ID_ALUMNO"}) 17 | sesion.belongsToMany(areaApoyo, {through: areaApoyoXSesion, foreignKey: "ID_SESION", otherKey: "ID_AREA_APOYO"}) 18 | sesion.belongsToMany(alumno, {through: areaApoyoXSesion, foreignKey: "ID_SESION", otherKey: "ID_ALUMNO"}) 19 | alumno.belongsToMany(sesion, {through: areaApoyoXSesion, foreignKey: "ID_ALUMNO", otherKey: "ID_SESION"}) 20 | alumno.belongsToMany(areaApoyo, {through: areaApoyoXSesion, foreignKey: "ID_ALUMNO", otherKey: "ID_AREA_APOYO"}) 21 | areaApoyoXSesion.belongsTo(areaApoyo,{foreignKey: "ID_AREA_APOYO"}); 22 | areaApoyoXSesion.belongsTo(sesion,{foreignKey: "ID_SESION"}); 23 | areaApoyoXSesion.belongsTo(alumno,{foreignKey: "ID_ALUMNO"}); */ 24 | 25 | module.exports = areaApoyoXSesion; -------------------------------------------------------------------------------- /src/models/asignacionTutoria.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | const alumno = require('./alumno'); 4 | const procesoTutoria = require('./procesoTutoria'); 5 | const tutor = require('./tutor'); 6 | 7 | 8 | let nametable = 'ASIGNACION_TUTORIA'; 9 | 10 | let asignacionTutoria = sequelize.define(nametable, 11 | { 12 | ID_ASIGNACION:{ 13 | type: Sequelize.INTEGER, 14 | primaryKey: true, 15 | autoIncrement: true 16 | }, 17 | ID_TUTOR:{ 18 | type: Sequelize.INTEGER, 19 | references: { 20 | model: "TUTOR", 21 | key: "ID_TUTOR" 22 | }}, 23 | ID_PROCESO_TUTORIA:{ 24 | type: Sequelize.INTEGER, 25 | references: { 26 | model: "PROCESO_TUTORIA", 27 | key: "ID_PROCESO_TUTORIA" 28 | }}, 29 | FECHA_ASIGNACION: Sequelize.DATE, 30 | ESTADO: Sequelize.TINYINT 31 | }, 32 | { 33 | timestamps: false, 34 | freezeTableName: true, 35 | } 36 | ); 37 | 38 | 39 | // asignacionTutoria.belongsTo(tutor,{foreignKey: "ID_TUTOR"}); 40 | // asignacionTutoria.belongsTo(procesoTutoria,{foreignKey: "ID_PROCESO_TUTORIA", as: "PROCESO_TUTORIA"}); 41 | 42 | 43 | module.exports = asignacionTutoria; -------------------------------------------------------------------------------- /src/models/asignacionTutoriaXAlumno.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | const alumno = require('./alumno'); 4 | const asignacionTutoria = require('./asignacionTutoria'); 5 | 6 | let nametable = 'ASIGNACION_TUTORIA_X_ALUMNO'; 7 | 8 | let asignacionTutoriaXAlumno = sequelize.define(nametable,{ 9 | SOLICITUD: Sequelize.INTEGER 10 | }, 11 | { 12 | timestamps :false, 13 | freezeTableName: true, 14 | }); 15 | 16 | // alumno.belongsToMany(asignacionTutoria, {through: asignacionTutoriaXAlumno, foreignKey: "ID_ALUMNO", otherKey: "ID_ASIGNACION"}); 17 | // asignacionTutoria.belongsToMany(alumno, {through: asignacionTutoriaXAlumno, foreignKey: "ID_ASIGNACION", otherKey: "ID_ALUMNO", as: "ALUMNOS"}); 18 | // asignacionTutoriaXAlumno.belongsTo(alumno,{foreignKey: "ID_ALUMNO"}); 19 | // asignacionTutoriaXAlumno.belongsTo(asignacionTutoria,{foreignKey: "ID_ASIGNACION"}); 20 | // alumno.hasMany(asignacionTutoriaXAlumno, {foreignKey: "ID_ALUMNO"}); 21 | // asignacionTutoria.hasMany(asignacionTutoriaXAlumno, {foreignKey: "ID_ASIGNACION"}); 22 | 23 | module.exports = asignacionTutoriaXAlumno; -------------------------------------------------------------------------------- /src/models/buzonSugerencias.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | 4 | let nametable = 'BUZON_SUGERENCIAS'; 5 | 6 | let buzon = sequelize.define(nametable,{ 7 | 8 | ID_SUGERENCIA:{ 9 | type: Sequelize.INTEGER, 10 | primaryKey: true, 11 | autoIncrement: true 12 | }, 13 | SUGERENCIA: Sequelize.STRING 14 | }, 15 | { 16 | timestamps :false, 17 | freezeTableName: true 18 | }); 19 | 20 | 21 | module.exports = buzon; -------------------------------------------------------------------------------- /src/models/compromiso.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let sesion = require("./sesion"); 4 | 5 | let nametable = 'COMPROMISO'; 6 | 7 | let compromiso = sequelize.define(nametable,{ 8 | 9 | ID_COMPROMISO:{ 10 | type: Sequelize.INTEGER, 11 | primaryKey: true, 12 | autoIncrement: true 13 | }, 14 | ID_SESION:{ 15 | type: Sequelize.INTEGER, 16 | primaryKey: true, 17 | references: { 18 | model: "SESION", 19 | key: "ID_SESION" 20 | } 21 | }, 22 | ID_ALUMNO:{ 23 | type: Sequelize.INTEGER, 24 | primaryKey: true, 25 | references: { 26 | model: "ALUMNO", 27 | key: "ID_ALUMNO" 28 | } 29 | }, 30 | DESCRIPCION: Sequelize.STRING, 31 | ESTADO: Sequelize.INTEGER 32 | }, 33 | { 34 | timestamps :false, 35 | freezeTableName: true 36 | }); 37 | 38 | /* compromiso.belongsTo(sesion, { foreignKey: { name: "ID_SESION" } }); 39 | compromiso.belongsTo(alumno, { foreignKey: { name: "ID_ALUMNO" } }); 40 | sesion.hasMany(compromiso, { foreignKey: { name: "ID_SESION" } }); 41 | alumno.hasMany(compromiso, { foreignKey: { name: "ID_ALUMNO" } }); */ 42 | 43 | module.exports = compromiso; -------------------------------------------------------------------------------- /src/models/database.js: -------------------------------------------------------------------------------- 1 | var Sequelize = require('sequelize'); 2 | require('dotenv').config(); 3 | 4 | const sequelize = new Sequelize( 5 | {username: process.env.USR, 6 | password: process.env.PSSW, 7 | database: process.env.DATABASE, 8 | host: process.env.HOST, 9 | port: Number(process.env.PORTDB), 10 | dialect: "mysql" 11 | } 12 | ); 13 | 14 | module.exports = sequelize; -------------------------------------------------------------------------------- /src/models/disponibilidad.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let tutor = require('../models/tutor'); 4 | let programa = require('./programa'); 5 | 6 | let nametable = 'DISPONIBILIDAD'; 7 | 8 | let disponibilidad = sequelize.define(nametable,{ 9 | 10 | ID_DISPONIBILIDAD:{ 11 | type: Sequelize.INTEGER, 12 | primaryKey: true, 13 | autoIncrement: true 14 | }, 15 | ID_TUTOR:{ 16 | type: Sequelize.INTEGER, 17 | primaryKey: true, 18 | references: { 19 | model: "TUTOR", 20 | key: "ID_TUTOR" 21 | } 22 | }, 23 | ID_FACULTAD:{ 24 | type: Sequelize.INTEGER, 25 | primaryKey: true, 26 | references: { 27 | model: "PROGRAMA", 28 | key: "ID_PROGRAMA" 29 | } 30 | }, 31 | HORA_INICIO: Sequelize.STRING, 32 | HORA_FIN: Sequelize.STRING, 33 | FECHA: Sequelize.DATEONLY, 34 | ESTADO: Sequelize.INTEGER, 35 | LUGAR: Sequelize.STRING 36 | }, 37 | { 38 | timestamps :false, 39 | freezeTableName: true 40 | }); 41 | 42 | // disponibilidad.belongsTo(tutor, {foreignKey:{name:"ID_TUTOR"}}); 43 | // disponibilidad.belongsTo(programa, {foreignKey:{name:"ID_FACULTAD"}}); 44 | 45 | module.exports = disponibilidad; -------------------------------------------------------------------------------- /src/models/encuesta.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let alumnoXSesion = require("./alumnoXSesion"); 4 | 5 | let nametable = 'ENCUESTA'; 6 | 7 | let encuesta = sequelize.define(nametable,{ 8 | ID_ALUMNO:{ 9 | type: Sequelize.INTEGER, 10 | primaryKey: true, 11 | foreignKey: true, 12 | references: { 13 | model: "ALUMNO_X_SESION", 14 | key: "ID_ALUMNO" 15 | } 16 | }, 17 | ID_SESION:{ 18 | type: Sequelize.INTEGER, 19 | primaryKey: true, 20 | foreignKey: true, 21 | references: { 22 | model: "ALUMNO_X_SESION", 23 | key: "ID_SESION" 24 | } 25 | }, 26 | SATISFACCION: Sequelize.INTEGER, 27 | UTILIDAD: Sequelize.INTEGER, 28 | UTILIZO_RECOMENDACIONES: Sequelize.INTEGER, 29 | SOLUCIONO_SITUACION: Sequelize.INTEGER, 30 | RECOMENDARIA: Sequelize.INTEGER 31 | }, 32 | { 33 | timestamps :false, 34 | freezeTableName: true 35 | }); 36 | 37 | 38 | // encuesta.belongsTo(alumnoXSesion,{foreignKey: "ID_SESION"}); 39 | // encuesta.belongsTo(alumnoXSesion,{foreignKey:"ID_ALUMNO"}); 40 | 41 | 42 | module.exports = encuesta; -------------------------------------------------------------------------------- /src/models/etiqueta.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | 4 | let nametable = 'ETIQUETA'; 5 | 6 | let etiqueta = sequelize.define(nametable,{ 7 | 8 | ID_ETIQUETA:{ 9 | type: Sequelize.INTEGER, 10 | primaryKey: true, 11 | autoIncrement: true 12 | }, 13 | DESCRIPCION: Sequelize.STRING 14 | }, 15 | { 16 | timestamps :false, 17 | freezeTableName: true, 18 | }); 19 | 20 | 21 | module.exports = etiqueta; -------------------------------------------------------------------------------- /src/models/etiquetaXAlumno.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | const etiqueta = require('./etiqueta'); 4 | const alumno = require('./alumno'); 5 | 6 | 7 | let nametable = 'ETIQUETA_X_ALUMNO'; 8 | 9 | let etiquetaXAlumno = sequelize.define(nametable, 10 | {}, 11 | { 12 | timestamps :false, 13 | freezeTableName: true, 14 | }); 15 | 16 | // etiqueta.belongsToMany(alumno, {through: etiquetaXAlumno, foreignKey: "ID_ETIQUETA", otherKey: "ID_ALUMNO"}) 17 | // alumno.belongsToMany(etiqueta, {through: etiquetaXAlumno, foreignKey: "ID_ALUMNO", otherKey: "ID_ETIQUETA"}) 18 | // etiquetaXAlumno.belongsTo(etiqueta,{foreignKey: "ID_ETIQUETA"}); 19 | // etiquetaXAlumno.belongsTo(alumno,{foreignKey: "ID_ALUMNO"}); 20 | // etiqueta.hasMany(etiquetaXAlumno,{foreignKey: "ID_ETIQUETA"}) 21 | 22 | module.exports = etiquetaXAlumno; -------------------------------------------------------------------------------- /src/models/etiquetaXTutoria.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | const etiqueta = require('./etiqueta'); 4 | const procesoTutoria = require('./procesoTutoria'); 5 | 6 | 7 | let nametable = 'ETIQUETA_X_PROCESO_TUTORIA'; 8 | 9 | let etiquetaXTutoria = sequelize.define(nametable, 10 | {}, 11 | { 12 | timestamps :false, 13 | freezeTableName: true, 14 | }); 15 | 16 | // etiqueta.belongsToMany(procesoTutoria, {through: etiquetaXTutoria, foreignKey: "ID_ETIQUETA", otherKey: "ID_PROCESO_TUTORIA"}) 17 | // procesoTutoria.belongsToMany(etiqueta, {through: etiquetaXTutoria, foreignKey: "ID_PROCESO_TUTORIA", otherKey: "ID_ETIQUETA"}) 18 | // etiquetaXTutoria.belongsTo(etiqueta,{foreignKey: "ID_ETIQUETA"}); 19 | // etiquetaXTutoria.belongsTo(procesoTutoria,{foreignKey: "ID_PROCESO_TUTORIA"}); 20 | 21 | module.exports = etiquetaXTutoria; -------------------------------------------------------------------------------- /src/models/informacionRelevante.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let alumno = require("./alumno") 4 | 5 | let nametable = 'INFORMACION_RELEVANTE'; 6 | 7 | let informacionRelevante = sequelize.define(nametable,{ 8 | ID_INFORMACION_RELEVANTE:{ 9 | type: Sequelize.INTEGER, 10 | primaryKey: true, 11 | autoIncrement: true 12 | }, 13 | ID_ALUMNO:{ 14 | type: Sequelize.INTEGER, 15 | references: { 16 | model: "USUARIO", 17 | key: "ID_USUARIO" 18 | } 19 | }, 20 | DESCRIPCION:{ 21 | type: Sequelize.STRING 22 | }, 23 | ARCHIVO: Sequelize.STRING, 24 | PARTES: Sequelize.INTEGER 25 | }, 26 | { 27 | timestamps :false, 28 | freezeTableName: true 29 | }); 30 | 31 | 32 | 33 | // informacionRelevante.belongsTo(alumno, {foreignKey:{name:"ID_ALUMNO"}}); 34 | // alumno.hasMany(informacionRelevante, {foreignKey:{name: "ID_ALUMNO"}}); 35 | 36 | module.exports = informacionRelevante; -------------------------------------------------------------------------------- /src/models/institucion.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | 4 | let nametable = 'INSTITUCION'; 5 | 6 | let institucion = sequelize.define( 7 | nametable, 8 | { 9 | ID_INSTITUCION: { 10 | type: Sequelize.INTEGER, 11 | primaryKey: true, 12 | autoIncrement: true 13 | }, 14 | NOMBRE: Sequelize.STRING, 15 | INICIALES: Sequelize.STRING, 16 | IMAGEN: Sequelize.STRING, 17 | TELEFONO: Sequelize.STRING, 18 | PAGINA_WEB: Sequelize.STRING, 19 | DOMINIO: Sequelize.STRING, 20 | DOMINIO2: Sequelize.STRING, 21 | UBICACION: Sequelize.STRING 22 | }, 23 | { 24 | timestamps: false, 25 | freezeTableName: true 26 | } 27 | ); 28 | 29 | module.exports = institucion; -------------------------------------------------------------------------------- /src/models/notificacion.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let usuario = require("./usuario"); 4 | let sesion = require("./sesion"); 5 | 6 | let nametable = 'NOTIFICACION'; 7 | 8 | let notificacion = sequelize.define(nametable,{ 9 | ID_NOTIFICACION: { 10 | type: Sequelize.INTEGER, 11 | primaryKey: true, 12 | autoIncrement: true 13 | }, 14 | ID_SESION: { 15 | type: Sequelize.INTEGER, 16 | references: { 17 | model: "SESION", 18 | key: "ID_SESION" 19 | } 20 | }, 21 | ESTADO: Sequelize.INTEGER, 22 | MENSAJE: Sequelize.STRING 23 | }, 24 | { 25 | timestamps :false, 26 | freezeTableName: true 27 | }); 28 | 29 | // notificacion.belongsTo(sesion,{foreignKey: "ID_SESION"}); 30 | // notificacion.belongsTo(usuario,{as: 'EMISOR',foreignKey: "ID_EMISOR"}); 31 | // notificacion.belongsTo(usuario,{as: 'RECEPTOR',foreignKey: "ID_RECEPTOR"}); 32 | 33 | module.exports = notificacion; -------------------------------------------------------------------------------- /src/models/procesoTutoria.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let programa = require("./programa"); 4 | 5 | let nametable = 'PROCESO_TUTORIA'; 6 | 7 | let procesoTutoria = sequelize.define(nametable,{ 8 | 9 | ID_PROCESO_TUTORIA:{ 10 | type: Sequelize.INTEGER, 11 | primaryKey: true, 12 | autoIncrement: true 13 | }, 14 | ID_PROGRAMA:{ 15 | type: Sequelize.INTEGER, 16 | primaryKey: true, 17 | references: { 18 | model: "PROGRAMA", 19 | key: "ID_PROGRAMA" 20 | } 21 | }, 22 | NOMBRE: Sequelize.STRING, 23 | DESCRIPCION: Sequelize.STRING, 24 | OBLIGATORIO:Sequelize.TINYINT, 25 | TUTOR_FIJO: Sequelize.TINYINT, 26 | GRUPAL: Sequelize.TINYINT, 27 | TUTOR_ASIGNADO: Sequelize.TINYINT, 28 | PERMANENTE: Sequelize.TINYINT, 29 | DURACION: Sequelize.INTEGER, 30 | ESTADO: { 31 | type: Sequelize.TINYINT, 32 | defaultValue: 1 33 | } 34 | }, 35 | { 36 | timestamps :false, 37 | freezeTableName: true, 38 | }); 39 | 40 | // procesoTutoria.belongsTo(programa, {foreignKey:{name:"ID_PROGRAMA"}}); 41 | 42 | module.exports = procesoTutoria; -------------------------------------------------------------------------------- /src/models/programa.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | const institucion = require('./institucion'); 4 | 5 | let nametable = 'PROGRAMA'; 6 | 7 | let programa = sequelize.define( 8 | nametable, 9 | { 10 | ID_PROGRAMA: { 11 | type: Sequelize.INTEGER, 12 | primaryKey: true, 13 | autoIncrement: true 14 | }, 15 | ID_FACULTAD: Sequelize.INTEGER, 16 | ID_INSTITUCION: { 17 | type: Sequelize.INTEGER, 18 | primaryKey: true 19 | }, 20 | NOMBRE: Sequelize.STRING, 21 | IMAGEN: Sequelize.BLOB, 22 | ANTICIPACION_DISPONIBILIDAD: { 23 | type: Sequelize.INTEGER, 24 | defaultValue: 0 25 | }, 26 | ANTICIPACION_CANCELAR_CITA: { 27 | type: Sequelize.INTEGER, 28 | defaultValue: 0 29 | }, 30 | ESTADO: { 31 | type: Sequelize.TINYINT, 32 | defaultValue: 1 33 | } 34 | }, 35 | { 36 | timestamps: false, 37 | freezeTableName: true 38 | } 39 | ); 40 | 41 | // programa.belongsTo(institucion, {foreignKey:{name:"ID_INSTITUCION"}}); 42 | // programa.belongsTo(programa, {as: 'FACULTAD', foreignKey:'ID_FACULTAD'}) 43 | module.exports = programa; -------------------------------------------------------------------------------- /src/models/rol.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | 4 | let nametable = 'ROL'; 5 | 6 | let rol = sequelize.define(nametable,{ 7 | 8 | ID_ROL:{ 9 | type: Sequelize.INTEGER, 10 | primaryKey: true, 11 | autoIncrement: true 12 | }, 13 | DESCRIPCION: Sequelize.STRING 14 | }, 15 | { 16 | timestamps :false, 17 | freezeTableName: true 18 | }); 19 | 20 | 21 | 22 | 23 | module.exports = rol; -------------------------------------------------------------------------------- /src/models/rolXUsuarioXPrograma.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let usuario = require("./usuario"); 4 | let rol = require("./rol"); 5 | let programa = require("./programa"); 6 | 7 | let nametable = 'ROL_X_USUARIO_X_PROGRAMA'; 8 | 9 | let rolXUsuarioXPrograma = sequelize.define(nametable,{ 10 | 11 | ID_ROL_X_USUARIO_X_PROGRAMA:{ 12 | type: Sequelize.INTEGER, 13 | primaryKey: true, 14 | autoIncrement: true 15 | }, 16 | ID_USUARIO: { 17 | type: Sequelize.INTEGER, 18 | foreignKey: true, 19 | primaryKey: true, 20 | references: { 21 | model: "USUARIO", 22 | key: "ID_USUARIO" 23 | } 24 | }, 25 | ID_ROL: { 26 | type: Sequelize.INTEGER, 27 | foreignKey: true, 28 | primaryKey: true, 29 | references: { 30 | model: "ROL", 31 | key: "ID_ROL" 32 | } 33 | }, 34 | ID_PROGRAMA: { 35 | type: Sequelize.INTEGER, 36 | foreignKey: true, 37 | references: { 38 | model: "PROGRAMA", 39 | key: "ID_PROGRAMA" 40 | } 41 | }, 42 | ESTADO: { 43 | type: Sequelize.TINYINT, 44 | defaultValue: 1 45 | } 46 | }, 47 | { 48 | timestamps :false, 49 | freezeTableName: true 50 | }); 51 | 52 | // usuario.belongsToMany(rol, {through: rolXUsuarioXPrograma, foreignKey: "ID_USUARIO", otherKey: "ID_ROL"}); 53 | // usuario.belongsToMany(programa, {through: rolXUsuarioXPrograma, foreignKey: "ID_USUARIO", otherKey: "ID_PROGRAMA"}); 54 | // rol.belongsToMany(usuario, {through: rolXUsuarioXPrograma, foreignKey: "ID_ROL", otherKey: "ID_USUARIO"}); 55 | // rol.belongsToMany(programa, {through: rolXUsuarioXPrograma, foreignKey: "ID_ROL", otherKey: "ID_PROGRAMA"}); 56 | // programa.belongsToMany(usuario, {through: rolXUsuarioXPrograma, foreignKey: "ID_PROGRAMA", otherKey: "ID_USUARIO"}); 57 | // programa.belongsToMany(rol, {through: rolXUsuarioXPrograma, foreignKey: "ID_PROGRAMA", otherKey: "ID_ROL"}); 58 | 59 | // rolXUsuarioXPrograma.belongsTo(usuario,{foreignKey: "ID_USUARIO"}); 60 | // rolXUsuarioXPrograma.belongsTo(rol,{foreignKey: "ID_ROL"}); 61 | // rolXUsuarioXPrograma.belongsTo(programa,{foreignKey: "ID_PROGRAMA"}); 62 | 63 | // usuario.hasMany(rolXUsuarioXPrograma, {foreignKey: "ID_USUARIO"}); 64 | // programa.hasMany(rolXUsuarioXPrograma, {foreignKey: "ID_PROGRAMA"}); 65 | // rol.hasMany(rolXUsuarioXPrograma, {foreignKey: "ID_ROL"}); 66 | 67 | module.exports = rolXUsuarioXPrograma; -------------------------------------------------------------------------------- /src/models/sesion.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let tutor = require("./tutor"); 4 | let procesoTutoria = require("./procesoTutoria"); 5 | const areaApoyoXSesion = require('./areaApoyoXSesion'); 6 | 7 | let nametable = 'SESION'; 8 | 9 | let sesion = sequelize.define(nametable,{ 10 | 11 | ID_SESION:{ 12 | type: Sequelize.INTEGER, 13 | primaryKey: true, 14 | autoIncrement: true 15 | }, 16 | ID_PROCESO_TUTORIA:{ 17 | type: Sequelize.INTEGER, 18 | primaryKey: true, 19 | references: { 20 | model: "PROCESO_TUTORIA", 21 | key: "ID_PROCESO_TUTORIA" 22 | } 23 | }, 24 | ID_TUTOR:{ 25 | type: Sequelize.INTEGER, 26 | references: { 27 | model: "TUTOR", 28 | key: "ID_TUTOR" 29 | } 30 | }, 31 | LUGAR: Sequelize.STRING, 32 | MOTIVO: Sequelize.STRING, 33 | DESCRIPCION: Sequelize.STRING, 34 | HORA_INICIO: Sequelize.STRING, 35 | HORA_FIN: Sequelize.STRING, 36 | ESTADO: Sequelize.STRING, 37 | FECHA: Sequelize.DATEONLY, 38 | RAZON_MANTENIMIENTO: Sequelize.STRING 39 | }, 40 | { 41 | timestamps :false, 42 | freezeTableName: true 43 | }); 44 | 45 | // sesion.belongsTo(procesoTutoria,{foreignKey: "ID_PROCESO_TUTORIA"}); 46 | // sesion.belongsTo(tutor,{foreignKey: "ID_TUTOR"}); 47 | 48 | 49 | module.exports = sesion; -------------------------------------------------------------------------------- /src/models/tutor.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | let usuario = require('../models/usuario'); 4 | 5 | let nametable = 'TUTOR'; 6 | 7 | let tutor = sequelize.define(nametable,{ 8 | 9 | ID_TUTOR:{ 10 | type: Sequelize.INTEGER, 11 | primaryKey: true, 12 | references: { 13 | model: "USUARIO", 14 | key: "ID_USUARIO" 15 | } 16 | }, 17 | 18 | }, 19 | { 20 | timestamps :false, 21 | freezeTableName: true 22 | }); 23 | 24 | // tutor.belongsTo(usuario, {foreignKey:{name:"ID_TUTOR"}}); 25 | 26 | module.exports = tutor; -------------------------------------------------------------------------------- /src/models/usuario.js: -------------------------------------------------------------------------------- 1 | const Sequelize = require('sequelize'); 2 | let sequelize = require("./database"); 3 | const bcrypt = require("bcrypt"); 4 | 5 | let nametable = 'USUARIO'; 6 | 7 | let usuario = sequelize.define(nametable,{ 8 | 9 | ID_USUARIO:{ 10 | type: Sequelize.INTEGER, 11 | primaryKey: true, 12 | autoIncrement: true 13 | }, 14 | USUARIO: Sequelize.STRING, 15 | CONTRASENHA: Sequelize.STRING, 16 | NOMBRE: Sequelize.STRING, 17 | APELLIDOS: Sequelize.STRING, 18 | CORREO:Sequelize.STRING, 19 | CODIGO: Sequelize.STRING, 20 | TELEFONO: Sequelize.STRING, 21 | DIRECCION: Sequelize.STRING, 22 | IMAGEN: Sequelize.STRING 23 | }, 24 | { 25 | timestamps :false, 26 | freezeTableName: true, 27 | hooks:{ 28 | beforeCreate: async (user, options) => { 29 | const salt = await bcrypt.genSalt(10); 30 | user.CONTRASENHA = await bcrypt.hash(user.CONTRASENHA, salt); 31 | } 32 | } 33 | }); 34 | 35 | usuario.prototype.validPassword = async function(password) { 36 | return bcrypt.compare(password, this.CONTRASENHA); 37 | } 38 | 39 | module.exports = usuario; -------------------------------------------------------------------------------- /src/routes/alumnoRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const alumnoController = require('../controllers/alumnoController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/alumno", alumnoController.listar); 12 | 13 | router.get("/api/alumno/buscar/:codigo", alumnoController.buscarPorCodigo); 14 | 15 | router.get("/api/alumno/buscar/:tutor/:tutoria/:nombre", alumnoController.BuscarPorNombreTutoria); 16 | 17 | router.get("/api/alumno/lista/:programa", alumnoController.listarPorPrograma); 18 | 19 | router.get("/api/alumno/lista/:tutor/:tutoria", alumnoController.listarPorTutoria); 20 | 21 | router.post("/api/alumno", alumnoController.registrar); 22 | 23 | router.post("/api/alumno/modificar", alumnoController.modificar); 24 | 25 | router.post("/api/alumno/eliminar/:id", alumnoController.eliminar); 26 | 27 | router.get("/api/alumno/:id", alumnoController.get); 28 | 29 | router.post("/api/alumno/informacionrelevante", alumnoController.registrarInformacionRelevante); 30 | 31 | router.get("/api/alumno/informacionrelevante/:idAlumno", alumnoController.listarArchivosInfoRelevante); 32 | 33 | router.get("/api/alumno/informacionrelevante/descargar/:idArchivo", alumnoController.devolverArchivoInfoRelevante); 34 | 35 | router.get("/api/alumno/noasignados/:idTutoria", alumnoController.listarNoAsignadosPorProgramaYTutoria); 36 | 37 | router.post("/api/alumno/registromasivo", alumnoController.registroMasivo); 38 | 39 | router.get("/api/alumno/listar/:idTutor/:idTutoria/:programa", alumnoController.listarNoAsignadosConTutorPorPrograma); 40 | 41 | 42 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/areaApoyoRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const areaApoyoController = require('../controllers/areaApoyoController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/areaApoyo", areaApoyoController.listar); 12 | 13 | router.post("/api/areaApoyo", areaApoyoController.registrar); 14 | 15 | router.post("/api/areaApoyo/modificar", areaApoyoController.modificar); 16 | 17 | router.post("/api/areaApoyo/eliminar/:id", areaApoyoController.eliminar); 18 | 19 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/asignacionTutoriaRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | 5 | router.use(express.json()); 6 | const asignacionTutoriaController = require('../controllers/asignacionTutoriaController'); 7 | 8 | 9 | router.get("/",(req, res)=>{ 10 | res.end(`express running on the server ${app.get("port")}`); 11 | }) 12 | 13 | router.get("/api/asignacion/lista", asignacionTutoriaController.listarPorTutoria); 14 | 15 | router.get("/api/asignacion", asignacionTutoriaController.lista); 16 | 17 | router.get("/api/solicitud/:idTutor/:idTutoria", asignacionTutoriaController.listarSolicitudesXTutor); 18 | 19 | router.post("/api/solicitud/modificar", asignacionTutoriaController.responderSolicitud); 20 | 21 | router.post("/api/solicitud/enviar", asignacionTutoriaController.mandarSolicitudTutoria); 22 | 23 | router.get("/api/asignacion/:id", asignacionTutoriaController.get); 24 | 25 | router.post("/api/asignacion", asignacionTutoriaController.registrar); 26 | 27 | router.post("/api/asignacion/modificar", asignacionTutoriaController.modificar); 28 | 29 | router.post("/api/asignacion/eliminar/:id", asignacionTutoriaController.eliminar); 30 | 31 | router.get("/api/asignacion/tutoria/tutor/:idTutoria/:idTutor", asignacionTutoriaController.listarPorTutoriaYTutor); 32 | 33 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/buzonSugerenciasRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const buzonSugerenciasController = require('../controllers/buzonSugerenciasController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/sugerencia", buzonSugerenciasController.listar); 12 | 13 | router.post("/api/sugerencia", buzonSugerenciasController.registrar); 14 | 15 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/coordinadorRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const coordinadorController = require('../controllers/coordinadorController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/coordinador", coordinadorController.listarCoordinadoresFacultad); 12 | 13 | router.get("/api/coordinadorprograma/:idFacultad", coordinadorController.listarCoordinadoresPrograma); 14 | 15 | router.get("/api/coordinador/lista/:id", coordinadorController.listarPorPrograma); 16 | 17 | router.get("/api/coordinador/:id", coordinadorController.get); 18 | 19 | router.get("/api/coordinador/buscar/:codigo", coordinadorController.buscarPorCodigo); 20 | 21 | router.post("/api/coordinador", coordinadorController.registrarCoordinadorPrograma); 22 | 23 | router.post("/api/coordinadorfacultad", coordinadorController.registrarCoordinadorFacultad); 24 | 25 | router.post("/api/coordinador/modificar", coordinadorController.modificarCoordinadorPrograma); 26 | 27 | router.post("/api/coordinadorfacultad/modificar", coordinadorController.modificarCoordinadorFacultad); 28 | 29 | router.post("/api/coordinador/eliminar/:id", coordinadorController.eliminarCoordinadorPrograma); 30 | 31 | router.post("/api/coordinadorfacultad/eliminar/:id", coordinadorController.eliminarCoordinadorFacultad); 32 | 33 | 34 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/disponibilidadRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const morgan = require('morgan'); 3 | const router = express.Router(); 4 | 5 | router.use(express.json()); 6 | const disponibilidadController = require('../controllers/disponibilidadController'); 7 | 8 | 9 | router.get("/",(req, res)=>{ 10 | res.end(`express running on the server ${app.get("port")}`); 11 | }) 12 | router.get("/api/disponibilidad/:idtutor", disponibilidadController.listarPorTutor); 13 | 14 | router.get("/api/disponibilidad/", disponibilidadController.listar); 15 | 16 | router.get("/api/disponibilidad/listarDia/:fecha/:idtutor", disponibilidadController.listarPorTutorFecha); 17 | 18 | router.get("/api/disponibilidad/listarPrograma/:idprograma/:fecha/:idtutor/", disponibilidadController.listarPorProgramaTutorFecha); 19 | 20 | router.get("/api/disponibilidad/listarDia/:fecha", disponibilidadController.listarPorFecha); 21 | 22 | router.get("/api/disponibilidad/listarPrograma/:idprograma/:fecha", disponibilidadController.listarPorProgramaFecha); 23 | 24 | router.post("/api/disponibilidad", disponibilidadController.register); 25 | 26 | router.get("/api/disponibilidad/:idtutor/:id", disponibilidadController.get); 27 | 28 | router.post("/api/disponibilidad/modificar", disponibilidadController.modificar); 29 | 30 | router.post("/api/disponibilidad/eliminar/:idDisp", disponibilidadController.eliminar); 31 | 32 | router.get("/api/disponibilidadporfacultad/:idtutor/:idFacultad", disponibilidadController.listarPorTutorYFacultad); 33 | 34 | router.post("/api/disponibilidad/listarPrograma/:idprograma/:fecha", disponibilidadController.listarPorProgramaMultipleTutorFecha); 35 | 36 | router.get("/api/disponibilidadacumulada/:idPrograma", disponibilidadController.listarDisponibilidadAcumulada); 37 | 38 | router.get("/api/disponibilidadvssesiones/:idPrograma", disponibilidadController.listarDisponibilidadVSSesiones); 39 | 40 | router.post("/api/disponibilidadIntervalos", disponibilidadController.intervalos); 41 | 42 | 43 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/encuestaRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const encuestaController = require('../controllers/encuestaController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/encuesta/tutoria/:idPrograma", encuestaController.listarPorTutoria); 12 | 13 | router.get("/api/encuesta/:id", encuestaController.get); 14 | 15 | router.post("/api/encuesta", encuestaController.registrar); 16 | 17 | router.get("/api/encuesta/programa/:idPrograma", encuestaController.listarPorPrograma); 18 | 19 | 20 | 21 | 22 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/etiquetaRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const etiquetaController = require('../controllers/etiquetaController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/etiqueta", etiquetaController.listar); 12 | 13 | router.post("/api/etiqueta", etiquetaController.registrar); 14 | 15 | router.post("/api/etiqueta/modificar", etiquetaController.modificar); 16 | 17 | router.post("/api/etiqueta/eliminar/:id", etiquetaController.eliminar); 18 | 19 | router.get("/api/etiqueta/:id", etiquetaController.get); 20 | 21 | 22 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/frontRoutes.js: -------------------------------------------------------------------------------- 1 | const rutasSSJ= [ 2 | //ORIGEN 3 | "/", 4 | 5 | //PRINCIPALES 6 | "/administrador/", 7 | "/coordinador/", 8 | "/tutor/", 9 | "/alumno/", 10 | 11 | // ADMIN 12 | "/administrador/perfil", 13 | "/administrador/institucion", 14 | "/administrador/facultades", 15 | "/administrador/coordinadores", 16 | "/administrador/unidadesdeapoyo", 17 | 18 | //COORDINADOR 19 | "/coordinador/perfil", 20 | "/coordinador/facultades", 21 | "/coordinador/tutores", 22 | "/coordinador/alumnos", 23 | "/coordinador/asignaciondeTutor", 24 | "/coordinador/procesosdetutoria", 25 | "/coordinador/programas", 26 | "/coordinador/disponibilidades", 27 | "/coordinador/coordinadoresdeprograma", 28 | "/coordinador/reportes", 29 | "/coordinador/asignarroles", 30 | "/coordinador/alumno/:idAlumno/:fullname", 31 | 32 | // TUTOR 33 | "/tutor/perfil", 34 | "/tutor/misalumnos", 35 | "/tutor/midisponibilidad", 36 | "/tutor/sesiones", 37 | "/tutor/solicitudes", 38 | "/tutor/sesionesgrupales", 39 | "/tutor/misCitas", 40 | "/tutor/mialumno/:idAlumno/:fullname", 41 | 42 | // ALUMNO 43 | "/alumno/solicitarTutorFijo", 44 | "/alumno/perfil", 45 | "/alumno/agendarCita", 46 | "/alumno/misCitas", 47 | ]; 48 | module.exports = rutasSSJ; -------------------------------------------------------------------------------- /src/routes/institucionRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const morgan = require('morgan'); 3 | const router = express.Router(); 4 | 5 | router.use(express.json()); 6 | const institucionController = require('../controllers/institucionController'); 7 | 8 | 9 | router.get("/",(req, res)=>{ 10 | res.end(`express running on the server ${app.get("port")}`); 11 | }) 12 | 13 | router.get("/api/institucion/imagen", institucionController.guardarImagen); 14 | 15 | router.get("/api/institucion", institucionController.listar); 16 | 17 | router.post("/api/institucion", institucionController.registrar); 18 | 19 | router.post("/api/institucion/modificar", institucionController.modificar); 20 | 21 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/logRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const logController = require('../controllers/logController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.post("/api/auditoria", logController.logDeAuditoria); 12 | 13 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/notificacionRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const notificacionController = require('../controllers/notificacionController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/notificacion/lista/:idUsuario", notificacionController.listar); 12 | 13 | router.get("/api/notificacion/actualizar/:idUsuario", notificacionController.modificar); 14 | 15 | 16 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/procesoTutoriaRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const tutoriaController = require('../controllers/procesoTutoriaController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/tutoria", tutoriaController.listar); 12 | 13 | router.get("/api/tutoria/lista/:id", tutoriaController.listarPorPrograma); 14 | 15 | router.get("/api/tutoria/lista/:idTutor/:idPrograma", tutoriaController.listarPorProgramaYTutor); 16 | 17 | router.post("/api/tutoria", tutoriaController.registrar); 18 | 19 | router.post("/api/tutoria/modificar", tutoriaController.modificar); 20 | 21 | router.post("/api/tutoria/eliminar/:id", tutoriaController.eliminar); 22 | 23 | router.get("/api/tutoria/:id", tutoriaController.get); 24 | 25 | router.get("/api/tutoriafija/:idPrograma", tutoriaController.listarTutoriasFijasPorPrograma); 26 | 27 | router.get("/api/tutoriavariable/:idPrograma", tutoriaController.listarTutoriasVariablesPorPrograma); 28 | 29 | router.get("/api/tutoriaasignada/:idPrograma/:idAlumno", tutoriaController.listarTutoriasFijasAsignadasAPorAlumno); 30 | 31 | router.get("/api/tutoriagrupal/:idPrograma", tutoriaController.listarTutoriasGrupalesPorPrograma); 32 | 33 | router.get("/api/tutoriafijasolicitada/:idPrograma", tutoriaController.listarTutoriasFijasYSolicitadasPorPrograma); 34 | 35 | router.get("/api/tutoriafijaasignada/:idPrograma", tutoriaController.listarTutoriasFijasYAsignadasPorPrograma); 36 | 37 | 38 | 39 | 40 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/programaRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const morgan = require('morgan'); 3 | const router = express.Router(); 4 | 5 | router.use(express.json()); 6 | const programaController = require('../controllers/programaController'); 7 | 8 | router.get("/", (req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | 12 | router.get("/api/programa", programaController.listar); 13 | 14 | router.get("/api/programa&facultad", programaController.listarProgramasYFacultades); 15 | 16 | router.get("/api/programa/lista/:idCoordinador/:idFacultad", programaController.listarProgramasDeUnCoordinador); 17 | 18 | router.get("/api/facultad/coordinador/:idCoordinador", programaController.listarFacultadesDeUnCoordinador); 19 | 20 | router.get("/api/facultad/tutor/:idTutor", programaController.listarFacultadesDeUnTutor); 21 | 22 | router.get("/api/facultad", programaController.listarFacultad); 23 | 24 | router.get("/api/facultad/:id", programaController.getFacultad); 25 | 26 | router.get("/api/programa/lista/:id", programaController.listarPorFacultad); 27 | 28 | router.get("/api/programa&facultad/coordinador/:id", programaController.listarProgramasYFacultadesPorCoordinador); 29 | 30 | router.get("/api/programa/coordinador/:id", programaController.listarProgramasPorCoordinadorConFormato); 31 | 32 | router.get("/api/facultad/lista/:idCoordinador", programaController.listarFacultadesDeUnCoordinadorPrograma); 33 | 34 | router.post("/api/facultad", programaController.registrarFacultad); 35 | 36 | router.post("/api/programa", programaController.registrarPrograma); 37 | 38 | router.post("/api/programa/modificar", programaController.modificarPrograma); 39 | 40 | router.post("/api/facultad/modificar", programaController.modificarFacultad); 41 | 42 | router.get("/api/programa/tutor/:idTutor", programaController.listarProgramasDeUnTutor); 43 | 44 | router.get("/api/programa/alumno/:idAlumno", programaController.listarProgramasDeUnAlumno); 45 | 46 | router.get("/api/facultad/politicas/:idFacultad", programaController.listarPoliticasPorFacultad); 47 | 48 | router.get("/api/programa/lista/tutor/:idTutor/:idFacultad", programaController.listarProgramasDeUnTutorSegunFacultad); 49 | 50 | router.post("/api/facultad/eliminar/:id", programaController.eliminarFacultad); 51 | 52 | router.post("/api/programa/eliminar/:id", programaController.eliminarPrograma); 53 | 54 | router.get("/api/facultad/alumno/:idAlumno", programaController.listarFacultadesDeUnAlumno); 55 | 56 | router.get("/api/programas/alumno/:idAlumno/:idFacultad", programaController.listarProgramasDeUnAlumnoSegunFacultad); 57 | 58 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/sesionRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const morgan = require('morgan'); 3 | const router = express.Router(); 4 | 5 | router.use(express.json()); 6 | const sesionController = require('../controllers/sesionController'); 7 | 8 | 9 | router.get("/",(req, res)=>{ 10 | res.end(`express running on the server ${app.get("port")}`); 11 | }) 12 | router.get("/api/listaSesiones/:idtutor", sesionController.listar); 13 | 14 | router.post("/api/registrarSesion", sesionController.registrarSesionInesperada); 15 | 16 | router.post("/api/registrarCita", sesionController.registrarCita); 17 | 18 | router.post("/api/registrarResultadoCita", sesionController.registrarResultados); 19 | 20 | router.get("/api/sesion/:idSesion", sesionController.get); 21 | 22 | router.post("/api/posponerCita", sesionController.posponerCita); 23 | 24 | router.post("/api/cancelarCita", sesionController.cancelarCita); 25 | 26 | router.get("/api/listaSesiones/:idtutor/:fecha", sesionController.listarPorFecha); 27 | 28 | router.get("/api/listaCompromisos/:idsesion", sesionController.listarCompromisos); 29 | 30 | router.get("/api/listaSesionAlumnoProcesoTutoria/:idAlumno/:idProcesoTutoria", sesionController.listarSesionesPorAlumnoYProcesoTutoria); 31 | 32 | router.get("/api/listaCompromisosAlumnoProcesoTutoria/:idAlumno/:idProcesoTutoria", sesionController.listarCompromisosPorAlumnoYProcesoTutoria); 33 | 34 | router.get("/api/listaAreasApoyo/", sesionController.listarAreasApoyo); 35 | 36 | router.get("/api/listaSesionAlumno/:idalumno", sesionController.listarPorAlumno); 37 | 38 | router.get("/api/listaSesionRealizada/:idalumno", sesionController.listarPorAlumnoRealizadas); 39 | 40 | router.post("/api/compromiso/modificar", sesionController.modificarCompromiso); 41 | 42 | router.get("/api/sesion/motivosolicitud/:idPrograma", sesionController.listarMotivosSolicitud); 43 | 44 | router.get("/api/sesion/horastutoria/:idPrograma", sesionController.listarTiempoTutoriasAcumulada); 45 | 46 | router.get("/api/sesion/estado/:idPrograma", sesionController.listarEstadoSesiones); 47 | 48 | router.get("/api/listaSesionRealizadaAlumnoProcesoTutoria/:idAlumno/:idProcesoTutoria", sesionController.listarSesionesRealizadasPorAlumnoYProcesoTutoria); 49 | 50 | router.post("/api/crearSesionGrupal", sesionController.crearSesionGrupal); 51 | 52 | router.get("/api/listaSesionAlumnosinfoto/:idalumno", sesionController.listarPorAlumnoSinImagen); 53 | 54 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/tutorRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const morgan = require('morgan'); 3 | const router = express.Router(); 4 | 5 | router.use(express.json()); 6 | const tutorController = require('../controllers/tutorController'); 7 | 8 | 9 | router.get("/",(req, res)=>{ 10 | res.end(`express running on the server ${app.get("port")}`); 11 | }) 12 | router.get("/api/tutor", tutorController.list); 13 | 14 | router.get("/api/tutorasignado/:idAlumno/:idTutoria", tutorController.listarTutorAsignado); 15 | 16 | router.get("/api/tutor/lista/:idPrograma", tutorController.listarPorPrograma); 17 | 18 | router.post("/api/tutor", tutorController.register); 19 | 20 | router.get("/api/tutor/:id", tutorController.get); 21 | 22 | router.post("/api/tutor/modificar", tutorController.modificar); 23 | 24 | router.get("/api/tutor/estadosolicitud/:idAlumno/:idTutoria", tutorController.listarEstadoSolicitudTutorFijo); 25 | 26 | router.post("/api/citarAlumno", tutorController.citarAlumno); 27 | 28 | router.get("/api/tutor/eliminar/:id", tutorController.eliminar); 29 | 30 | module.exports = router; -------------------------------------------------------------------------------- /src/routes/usuarioRoutes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.use(express.json()); 5 | const usuarioController = require('../controllers/usuarioController'); 6 | 7 | 8 | router.get("/",(req, res)=>{ 9 | res.end(`express running on the server ${app.get("port")}`); 10 | }) 11 | router.get("/api/usuario/:correo", usuarioController.buscarPorCorreo); 12 | 13 | router.get("/api/usuario/buscar/:codigo", usuarioController.buscarPorCodigo); 14 | 15 | router.get("/api/usuario/validar/:usuario", usuarioController.validarUsuarioUnico); 16 | 17 | router.get("/api/usuario/rol/:idUsuario/:idPrograma", usuarioController.listarRolesPorPrograma); 18 | 19 | router.post("/api/usuario/login", usuarioController.login); 20 | 21 | router.post("/api/usuario/actualizarperfil", usuarioController.modificarPerfil); 22 | 23 | router.post("/api/usuario/asignarrol", usuarioController.asignarRol); 24 | 25 | router.post("/api/usuario/guardarimagen", usuarioController.guardarImagen); 26 | 27 | 28 | module.exports = router; --------------------------------------------------------------------------------