Compare commits
119 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cc6b5373c7 | |||
| e1632827f2 | |||
| 1cda2206f8 | |||
| a265f0dede | |||
| 1b1cdb9da9 | |||
| c73121f7df | |||
| 1a0af95c4e | |||
| 313bc7e632 | |||
| 29b0f2b3e5 | |||
| 017e6836e9 | |||
| 1155735d9d | |||
| 02dd974fd6 | |||
| f50ce6d5f9 | |||
| 7933605cb1 | |||
| 963ec5a765 | |||
| 308f910bee | |||
| 29fdbee734 | |||
| ea14bfc96c | |||
| 9c677fa479 | |||
| 77f685e8d3 | |||
| 757fa541d8 | |||
| 0ee2f86c75 | |||
| 9d8c59d5ca | |||
| 592acee975 | |||
| c33817ace3 | |||
| bcb14ddeba | |||
| 0cf0c54879 | |||
| eb787c21e6 | |||
| 141afc824a | |||
| 617f4fe5bb | |||
| ad7fd3b513 | |||
| 71a24ca189 | |||
| ed5b64afb8 | |||
| c0178301ae | |||
| f70aa0f92e | |||
| 8762b51240 | |||
| c9cd073101 | |||
| 688e13b30c | |||
| 086af154cf | |||
| 400bffa254 | |||
| 61c164225c | |||
| 151d2e8718 | |||
| 62b71060be | |||
| 43abc72a38 | |||
| 04ad4923a5 | |||
| c40c82e7ba | |||
| 050c2b225c | |||
| ccd3781152 | |||
| 6a5d39d122 | |||
| 53c53d62a0 | |||
| 53ba7d45ff | |||
| 0ede1e8372 | |||
| 197b18910d | |||
| cafbce392d | |||
| a6efe25aa3 | |||
| 7b6b29b75f | |||
| 672f3579ac | |||
| 786f56442c | |||
| 90d791347e | |||
| 0aa5180154 | |||
| d6f5f645b8 | |||
| 115265381b | |||
| a851d31d3b | |||
| 29e4b4a7ad | |||
| cadb15a9cf | |||
| 83bbcee4ad | |||
| 8fac3a823a | |||
| b7d22cc07e | |||
| bba0aa12cc | |||
| ff6096f603 | |||
| 53b7d23007 | |||
| 8f68aadd8a | |||
| 9386fbc88d | |||
| 7686e26324 | |||
| 8f575aa662 | |||
| 19303178aa | |||
| 7d3a8ee5ed | |||
| 3aaf9ba0ed | |||
| af28549a04 | |||
| 50487e4859 | |||
| 6c22cfeeba | |||
| bf2367b366 | |||
| 0cb91d8b9e | |||
| 2ed657caf2 | |||
| 016297760f | |||
| 5f7ba5ff69 | |||
| bc4146a07d | |||
| 5567a26ed6 | |||
| 7a260169cc | |||
| 3e67102878 | |||
| 1c40eca428 | |||
| f62a868b97 | |||
| 65e0773337 | |||
| 671f989976 | |||
| 71e5ca35f9 | |||
| 6c0e263bf4 | |||
| aff3a44c09 | |||
| 083cefe84a | |||
| 340c0d59fd | |||
| 1b80de961b | |||
| 995a3a4e5e | |||
| a9b9b39285 | |||
| f25b60eccf | |||
| 0e6d6be3bb | |||
| 324ab9d35a | |||
| a6ee9decec | |||
| 75f55ba918 | |||
| e5a455bbb1 | |||
| 7b8514468f | |||
| 9d9df020db | |||
| 4770e95420 | |||
| c9c0a531f2 | |||
| cea20f387f | |||
| 373b99a57a | |||
| 6a871d8fa1 | |||
| 09e12161bd | |||
| b771ca2e57 | |||
| 4427804865 | |||
| f06decdc43 |
@@ -12,6 +12,8 @@ yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
|
||||
/initdb/init.sql
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
|
||||
@@ -19,6 +21,9 @@ lerna-debug.log*
|
||||
/coverage
|
||||
/.nyc_output
|
||||
|
||||
# Ignorar credenciales sensibles
|
||||
cred.json
|
||||
|
||||
# IDEs and editors
|
||||
/.idea
|
||||
.project
|
||||
|
||||
+11
-26
@@ -1,33 +1,18 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
mysql:
|
||||
database:
|
||||
image: mariadb:latest
|
||||
container_name: Iris_db
|
||||
restart: always
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
MYSQL_DATABASE: Iris
|
||||
MYSQL_USER: user_crud
|
||||
MYSQL_PASSWORD: root
|
||||
MARIADB_ROOT_PASSWORD: root
|
||||
MARIADB_DATABASE: Iris_testDB
|
||||
MARIADB_USER: root
|
||||
MARIADB_PASSWORD: root
|
||||
ports:
|
||||
- '3306:3306'
|
||||
volumes:
|
||||
- ./mysql:/var/lib/mysql
|
||||
ports:
|
||||
- "3307:3306"
|
||||
- mariadb_data:/var/lib/mysql
|
||||
- ./initdb2:/docker-entrypoint-initdb.dP
|
||||
|
||||
nest-app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
container_name: Iris_app
|
||||
restart: always
|
||||
depends_on:
|
||||
- mysql
|
||||
environment:
|
||||
DATABASE_HOST: mysql
|
||||
DATABASE_PORT: 3306
|
||||
DATABASE_USER: user_crud
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_NAME: Iris
|
||||
ports:
|
||||
- "3000:3000"
|
||||
volumes:
|
||||
mariadb_data:
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
DB_USERNAME=
|
||||
DB_DATABASE=
|
||||
DB_PASSWORD=
|
||||
DB_PORT=
|
||||
DB_HOST=
|
||||
PORT=
|
||||
JWT=
|
||||
CARPETA=
|
||||
MAIL_URL=
|
||||
MAIL_TOKEN=
|
||||
ESCOLARES=
|
||||
ESCOLARES_PASS=
|
||||
File diff suppressed because one or more lines are too long
Generated
+924
-1048
File diff suppressed because it is too large
Load Diff
+3
-1
@@ -8,7 +8,7 @@
|
||||
"scripts": {
|
||||
"build": "nest build",
|
||||
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
||||
"start": "nest start",
|
||||
"start": "source ~/.nvm/nvm.sh && nvm use 22.10.0 && npm install && nest start",
|
||||
"start:dev": "nest start --watch",
|
||||
"start:debug": "nest start --debug --watch",
|
||||
"start:prod": "node dist/main",
|
||||
@@ -28,6 +28,7 @@
|
||||
"@nestjs/mapped-types": "*",
|
||||
"@nestjs/passport": "^11.0.5",
|
||||
"@nestjs/platform-express": "^11.1.6",
|
||||
"@nestjs/schedule": "^6.1.0",
|
||||
"@nestjs/typeorm": "^11.0.0",
|
||||
"argon2": "^0.44.0",
|
||||
"axios": "^1.12.2",
|
||||
@@ -59,6 +60,7 @@
|
||||
"@swc/core": "^1.13.5",
|
||||
"@types/express": "^5.0.3",
|
||||
"@types/jest": "^30.0.0",
|
||||
"@types/moment": "^2.11.29",
|
||||
"@types/multer": "^2.0.0",
|
||||
"@types/node": "^24.5.2",
|
||||
"@types/supertest": "^6.0.3",
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
||||
numeroCuenta,nombre,licenciatura,correo,fechaLiberacion
|
||||
318194514,MUÑOZ JIMENEZ ALEXA JUDITH,LIC. EN RELACIONES INTERNACIONALES,eleccion16@pcpuma.acatlan.unam.mx,13/1/2026
|
||||
318563963,MEJIA BUSTOS REBECA,LIC. EN RELACIONES INTERNACIONALES,eleccion5@pcpuma.acatlan.unam.mx,14/1/2026
|
||||
316207375,BAUTISTA CARMONA KEVIN YAIR,LIC. EN HISTORIA,eleccion5@pcpuma.acatlan.unam.mx,14/1/2026
|
||||
318585585,ORDAZ OLVERA THELMA GUADALUPE,LIC. EN DISEÑO GRAFICO,424018289@pcpuma.acatlan.unam.mx,24/1/2026
|
||||
317126765,LUNA MOLINA JENNIFER LIZETTE,LIC. EN COMUNICACION,eleccion6@pcpuma.acatlan.unam.mx,2/3/2026
|
||||
|
@@ -0,0 +1,21 @@
|
||||
numeroCuenta,nombre,licenciatura,correo,fechaInicio,fechaFin,fechaLiberacion,AcatlanContigo,programaInterno,responsable,institucion,dependencia,programa,profesor,clave,status
|
||||
315040357,RAMIREZ AVILA MELANY BETSABE,LIC. EN HISTORIA,424018289@pcpuma.acatlan.unam.mx,1/1/2025,1/1/2026,"",No,"",RAMIREZ AVILA MELANY BETSABE,Instituto Nacional De Antropologia E Historia,Museo Nacional De Antropologia,"Investigación, conservación y difusión del patrimonio arqueológico y etnográfico de México","",2024-21/7-1471,Pre-Termino
|
||||
318194514,MUÑOZ JIMENEZ ALEXA JUDITH,LIC. EN RELACIONES INTERNACIONALES,eleccion16@pcpuma.acatlan.unam.mx,1/6/2025,8/12/2025,13/1/2026,No,"",MUÑOZ JIMENEZ ALEXA JUDITH,Secretaria De Relaciones Exteriores,Dirección De Servicios Al Personal,APOYO INTEGRAL A LA SECRETARÍA DE RELACIONES EXTERIORES,"",2025-2/2-1107,Liberación
|
||||
320313259,ROMERO ARRIAGA VALERIA YANIN,LIC. EN ACTUARIA,eleccion13@pcpuma.acatlan.unam.mx,1/6/2025,9/12/2025,"",Sí,DE APOYO PROPEDEUTICO EN MATERIAS CON ALTOS INDICES DE REPROBACION,ROMERO ARRIAGA VALERIA YANIN,UNAM,FES ACATLAN,Acatlán Contigo,Act. Jorge Carmona Mendoza ,2025-12/145-24,Registro
|
||||
319224719,SANTIAGO GARCIA JESUS ENRIQUE,LIC. EN ACTUARIA,eleccion13@pcpuma.acatlan.unam.mx,1/6/2025,9/12/2025,"",Sí,ANÁLISIS Y EVALUACIÓN DE LA TRAYECTORIA ACADÉMICA,SANTIAGO GARCIA JESUS ENRIQUE,UNAM,FES ACATLAN,Acatlán Contigo,Act. Jorge Carmona Mendoza,2025-12/145-24,Registro
|
||||
319096992,GONZALEZ CASTRO JADE,LIC. EN ACTUARIA,424018289@pcpuma.acatlan.unam.mx,1/6/2025,9/12/2025,"",Sí,ANÁLISIS Y EVALUACIÓN DE LA TRAYECTORIA ACADÉMICA,GONZALEZ CASTRO JADE,UNAM,FES ACATLAN,Acatlán Contigo,Act. Jorge Carmona Mendoza,2025-12/145-24,Pre-Termino
|
||||
318563963,MEJIA BUSTOS REBECA,LIC. EN RELACIONES INTERNACIONALES,eleccion5@pcpuma.acatlan.unam.mx,1/6/2025,8/12/2025,14/1/2026,No,"",MEJIA BUSTOS REBECA,Organizaciones Sociales Sin Fines De Lucro,"Inroads De México, A.c.",Gestión de Proyectos / Project Manager,"",2025-5/92-1617,Liberación
|
||||
316207375,BAUTISTA CARMONA KEVIN YAIR,LIC. EN HISTORIA,eleccion5@pcpuma.acatlan.unam.mx,1/6/2025,8/12/2025,14/1/2026,No,"",BAUTISTA CARMONA KEVIN YAIR,Instituto Nacional De Antropologia E Historia,Museo Nacional De Antropologia,"Investigación, conservación y difusión del patrimonio arqueológico y etnográfico de México","",2025-18/4-1574,Liberación
|
||||
319021745,GUTIERREZ GONZALEZ JAVIER,LIC. EN ACTUARIA,eleccion9@pcpuma.acatlan.unam.mx,16/6/2025,16/12/2025,"",Sí,ANÁLISIS Y EVALUACIÓN DE LA TRAYECTORIA ACADÉMICA,GUTIERREZ GONZALEZ JAVIER,UNAM,FES ACATLAN,Acatlán Contigo,Act. Jorge Carmona Mendoza,2025-12/145-24,Pre-Termino
|
||||
317126765,LUNA MOLINA JENNIFER LIZETTE,LIC. EN COMUNICACION,eleccion6@pcpuma.acatlan.unam.mx,1/8/2025,28/2/2026,2/3/2026,Sí,CEC Creativo ,LUNA MOLINA JENNIFER LIZETTE,UNAM,FES ACATLAN,Acatlán Contigo,LIC. FABIOLA VIRGINIA LARA TREVIÑO,2024-12/20-530,Liberación
|
||||
423027361,RANGEL BLANCAS AXEL,LIC. EN MATEMATICAS APLICADAS Y COMP.,eleccion4@pcpuma.acatlan.unam.mx,7/8/2025,28/2/2026,"",No,"",RANGEL BLANCAS AXEL,Secretaria De La Defensa Nacional,Direccion General De Ingenieros,DIRECCION GENERAL DE INGENIEROS,"",2026-63/14-1685,Pre-Termino
|
||||
307042219,GUEVARA MOYSEN JORGE ISAAC,LIC. EN MATEMATICAS APLICADAS Y COMP.,eleccion5@pcpuma.acatlan.unam.mx,7/8/2025,28/2/2026,"",Sí,SI,GUEVARA MOYSEN JORGE ISAAC,UNAM,FES ACATLAN,Acatlan Contigo,MARCELA MTZ,2026-12/145-1,Pre-Termino
|
||||
319302187,PEREZ CENTENO JORGE,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,pcentenojorge15@gmail.com,1/12/2025,8/12/2025,"",Sí,"Instituciones, Democracia y Participación Política en el gobierno de Andrés Manuel López Obrador",PEREZ CENTENO JORGE,UNAM,FES ACATLAN,Acatlán Contigo,Antonio Faustino Torres,2025-12/145-24,Pre-Registro
|
||||
413076379,JIMENEZ GONZALEZ JAZMIN ALEJANDRA,LIC. EN MATEMATICAS APLICADAS Y COMP.,lucel21@hotmail.com,1/12/2025,4/12/2025,"",Sí,xxxx,JIMENEZ GONZALEZ JAZMIN ALEJANDRA,UNAM,FES ACATLAN,Acatlán Contigo,xxxx,2025-12/145-24,Pre-Registro
|
||||
421162888,DREW IBARRA EDUARDO CARLOS,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),424018289@pcpuma.acatlan.unam.mx,17/12/2025,11/12/2025,"",No,"",DREW IBARRA EDUARDO CARLOS,UNIVERSIDAD NACIONAL AUTONOMA DE MEXICO,ESCUELA DE EXTENSIÓN EN CHICAGO,Enseñanza de Español como Lengua Extranjera,"",2024-12/226-2509,Pre-Termino
|
||||
419089577,GUTIERREZ GUTIERREZ DIANA ANGELICA,LIC. EN ARQUITECTURA,320154041@pcpuma.acatlan.unam.mx,19/12/2025,18/6/2026,"",Sí,"Propuesta de sistemas urbanos y arquitectónicos sostenibles en la zona de consolidación y mejoramiento de Atizapán para el corredor urbano ""Los Jardines""",GUTIERREZ GUTIERREZ DIANA ANGELICA,UNAM,FES ACATLAN,Titulación por servicio social,LIC. MARCELA MARTÍNEZ RANGEL,2023-12/20-222,Cancelado
|
||||
422116468,CONTRERAS GONZALEZ ANA CRISTINA,LIC. EN ECONOMIA,424018289@pcpuma.acatlan.unam.mx,28/12/2025,19/3/2026,"",No,"",CONTRERAS GONZALEZ ANA CRISTINA,Secretaria De Agricultura Y Desarrollo Rural,Liconsa. S.a De C.v.,SERVICIO SOCIAL LICONSA OFICINA CENTRAL,"",2025-192/1-2689,Pre-Registro
|
||||
422016698,GARCIA VAZQUEZ FATIMA,LIC. EN PEDAGOGÍA,424018289@pcpuma.acatlan.unam.mx,1/1/2026,"","",Sí,FES Acatlán,GARCIA VAZQUEZ FATIMA,UNAM,FES ACATLAN,Acatlán Contigo,Lic. Bertha Hurtado Jacinto,2024-12/20-530,Pre-Termino
|
||||
316710570,AGUILAR GALINDO VALERIA,LIC. EN RELACIONES INTERNACIONALES,eleccion15@pcpuma.acatlan.unam.mx,12/1/2026,12/7/2026,"",No,"",AGUILAR GALINDO VALERIA,Secretaria De Relaciones Exteriores,Dirección De Servicios Al Personal,APOYO INTEGRAL A LA SECRETARÍA DE RELACIONES EXTERIORES,"",2025-2/2-1107,Pre-Termino
|
||||
423046391,VAZQUEZ SARABIA ALEJANDRA MARIANA,LIC. EN ECONOMIA,eleccion10@pcpuma.acatlan.unam.mx,16/1/2026,16/7/2026,"",No,"",VAZQUEZ SARABIA ALEJANDRA MARIANA,Secretaria De La Defensa Nacional,Test1,Desarrrollo,"",2026-63/157-2,Cancelado
|
||||
423046391,VAZQUEZ SARABIA ALEJANDRA MARIANA,LIC. EN ECONOMIA,424018289@pcpuma.acatlan.unam.mx,16/1/2026,16/7/2026,"",No,"",VAZQUEZ SARABIA ALEJANDRA MARIANA,Secretaria De La Defensa Nacional,Test1,Desarrrollo,"",2026-63/157-2,Registro
|
||||
|
@@ -0,0 +1,425 @@
|
||||
idCasoEspecial,fechaInicio,fechaFin,fechaCreacion,num_cuenta,carrera,status
|
||||
325,0000-00-00,0000-00-00,Mon May 27 2024 20:38:27 GMT+0100 (hora de verano de Europa occidental),316094346,LIC. EN DERECHO,Liberación Articulo 91
|
||||
162,0000-00-00,0000-00-00,Thu Aug 04 2022 14:16:48 GMT+0100 (hora de verano de Europa occidental),417076278,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
389,0000-00-00,0000-00-00,Mon Jan 06 2025 18:00:22 GMT+0000 (hora estándar de Europa occidental),315014318,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
2,0000-00-00,0000-00-00,Mon Apr 05 2021 23:53:09 GMT+0100 (hora de verano de Europa occidental),310283926,LIC. EN DERECHO,Liberación Articulo 91
|
||||
227,0000-00-00,0000-00-00,Wed Apr 12 2023 17:57:01 GMT+0100 (hora de verano de Europa occidental),314021946,LIC. EN DERECHO,Liberación Articulo 91
|
||||
66,0000-00-00,0000-00-00,Mon Nov 01 2021 22:03:41 GMT+0000 (hora estándar de Europa occidental),314030564,LIC. EN DERECHO,Liberación Articulo 91
|
||||
293,0000-00-00,0000-00-00,Mon Dec 11 2023 18:45:55 GMT+0000 (hora estándar de Europa occidental),311252617,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
130,0000-00-00,0000-00-00,Thu Apr 21 2022 17:04:17 GMT+0100 (hora de verano de Europa occidental),096565865,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
357,0000-00-00,0000-00-00,Mon Sep 09 2024 17:28:12 GMT+0100 (hora de verano de Europa occidental),318058795,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
194,0000-00-00,0000-00-00,Tue Jan 10 2023 19:04:04 GMT+0000 (hora estándar de Europa occidental),092343553,LIC. EN DERECHO,Liberación Articulo 91
|
||||
421,0000-00-00,0000-00-00,Wed May 28 2025 17:31:16 GMT+0100 (hora de verano de Europa occidental),304312676,LIC. EN DERECHO,Liberación Articulo 91
|
||||
34,0000-00-00,0000-00-00,Thu Jul 29 2021 12:12:33 GMT+0100 (hora de verano de Europa occidental),417068516,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
261,0000-00-00,0000-00-00,Thu Aug 17 2023 12:26:53 GMT+0100 (hora de verano de Europa occidental),420157832,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
98,0000-00-00,0000-00-00,Thu Jan 13 2022 13:07:17 GMT+0000 (hora estándar de Europa occidental),415018371,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
159,0000-00-00,0000-00-00,Mon Aug 01 2022 12:18:32 GMT+0100 (hora de verano de Europa occidental),419079615,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
386,0000-00-00,0000-00-00,Wed Nov 27 2024 16:03:24 GMT+0000 (hora estándar de Europa occidental),314292254,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
224,0000-00-00,0000-00-00,Thu Mar 30 2023 20:32:47 GMT+0100 (hora de verano de Europa occidental),420087638,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
63,0000-00-00,0000-00-00,Thu Oct 07 2021 23:04:47 GMT+0100 (hora de verano de Europa occidental),313280632,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
290,0000-00-00,0000-00-00,Thu Nov 23 2023 14:38:36 GMT+0000 (hora estándar de Europa occidental),420095280,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
127,0000-00-00,0000-00-00,Mon Apr 04 2022 12:04:08 GMT+0100 (hora de verano de Europa occidental),416017920,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
354,0000-00-00,0000-00-00,Tue Sep 03 2024 16:28:59 GMT+0100 (hora de verano de Europa occidental),312315056,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
191,0000-00-00,0000-00-00,Thu Dec 08 2022 20:30:17 GMT+0000 (hora estándar de Europa occidental),314077613,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
418,0000-00-00,0000-00-00,Fri May 02 2025 13:52:59 GMT+0100 (hora de verano de Europa occidental),421061561,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
31,0000-00-00,0000-00-00,Mon Jun 28 2021 22:10:46 GMT+0100 (hora de verano de Europa occidental),312353559,LIC. EN DERECHO,Liberación Articulo 91
|
||||
258,0000-00-00,0000-00-00,Wed Aug 09 2023 19:55:11 GMT+0100 (hora de verano de Europa occidental),309005733,LIC. EN DERECHO,Liberación Articulo 91
|
||||
95,0000-00-00,0000-00-00,Wed Dec 15 2021 17:42:53 GMT+0000 (hora estándar de Europa occidental),310339061,LIC. EN DERECHO,Liberación Articulo 91
|
||||
322,0000-00-00,0000-00-00,Mon Apr 29 2024 15:49:31 GMT+0100 (hora de verano de Europa occidental),078057461,LIC. EN COMUNICACION,Liberación Articulo 52
|
||||
383,0000-00-00,0000-00-00,Mon Nov 25 2024 18:01:30 GMT+0000 (hora estándar de Europa occidental),306168046,LIC. EN DERECHO,Liberación Articulo 91
|
||||
221,0000-00-00,0000-00-00,Tue Mar 28 2023 20:14:29 GMT+0100 (hora de verano de Europa occidental),314156765,LIC. EN DERECHO,Liberación Articulo 91
|
||||
60,0000-00-00,0000-00-00,Mon Sep 27 2021 22:29:58 GMT+0100 (hora de verano de Europa occidental),088166715,LIC. EN DERECHO,Liberación Articulo 91
|
||||
287,0000-00-00,0000-00-00,Wed Nov 15 2023 17:52:16 GMT+0000 (hora estándar de Europa occidental),416022320,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
124,0000-00-00,0000-00-00,Tue Mar 29 2022 19:51:12 GMT+0100 (hora de verano de Europa occidental),419145622,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
351,0000-00-00,0000-00-00,Tue Aug 13 2024 21:29:28 GMT+0100 (hora de verano de Europa occidental),313339754,LIC. EN DERECHO,Liberación Articulo 91
|
||||
188,0000-00-00,0000-00-00,Tue Dec 06 2022 16:08:06 GMT+0000 (hora estándar de Europa occidental),308240322,LIC. EN DERECHO,Liberación Articulo 91
|
||||
415,0000-00-00,0000-00-00,Mon Apr 21 2025 12:04:20 GMT+0100 (hora de verano de Europa occidental),314198479,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
28,0000-00-00,0000-00-00,Wed Jun 23 2021 21:03:54 GMT+0100 (hora de verano de Europa occidental),416142897,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
255,0000-00-00,0000-00-00,Wed Aug 09 2023 13:33:45 GMT+0100 (hora de verano de Europa occidental),418129425,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
92,0000-00-00,0000-00-00,Mon Dec 13 2021 17:46:29 GMT+0000 (hora estándar de Europa occidental),314197252,LIC. EN DERECHO,Liberación Articulo 91
|
||||
319,0000-00-00,0000-00-00,Wed Apr 24 2024 15:53:27 GMT+0100 (hora de verano de Europa occidental),080078003,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 52
|
||||
156,0000-00-00,0000-00-00,Tue Jul 26 2022 18:39:09 GMT+0100 (hora de verano de Europa occidental),400002044,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
380,0000-00-00,0000-00-00,Mon Nov 11 2024 12:23:04 GMT+0000 (hora estándar de Europa occidental),308340130,LIC. EN DERECHO,Liberación Articulo 91
|
||||
218,0000-00-00,0000-00-00,Tue Mar 28 2023 18:08:25 GMT+0100 (hora de verano de Europa occidental),420090890,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
57,0000-00-00,0000-00-00,Thu Sep 23 2021 23:08:26 GMT+0100 (hora de verano de Europa occidental),315274554,LIC. EN DERECHO,Liberación Articulo 91
|
||||
284,0000-00-00,0000-00-00,Thu Nov 09 2023 20:27:25 GMT+0000 (hora estándar de Europa occidental),313140547,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
121,0000-00-00,0000-00-00,Tue Mar 29 2022 14:25:32 GMT+0100 (hora de verano de Europa occidental),312261018,LIC. EN DERECHO,Liberación Articulo 91
|
||||
348,0000-00-00,0000-00-00,Tue Aug 06 2024 18:45:47 GMT+0100 (hora de verano de Europa occidental),315270738,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
185,0000-00-00,0000-00-00,Thu Nov 17 2022 12:19:08 GMT+0000 (hora estándar de Europa occidental),410023848,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
412,0000-00-00,0000-00-00,Wed Apr 02 2025 14:31:38 GMT+0100 (hora de verano de Europa occidental),418240913,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
25,0000-00-00,0000-00-00,Tue Jun 01 2021 15:33:06 GMT+0100 (hora de verano de Europa occidental),304238268,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
252,0000-00-00,0000-00-00,Thu Aug 03 2023 15:40:14 GMT+0100 (hora de verano de Europa occidental),077025506,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
89,0000-00-00,0000-00-00,Sat Dec 04 2021 01:18:49 GMT+0000 (hora estándar de Europa occidental),415126999,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
316,0000-00-00,0000-00-00,Mon Apr 22 2024 21:10:48 GMT+0100 (hora de verano de Europa occidental),315033939,LIC. EN DERECHO,Liberación Articulo 91
|
||||
153,0000-00-00,0000-00-00,Wed Jun 22 2022 19:51:35 GMT+0100 (hora de verano de Europa occidental),098129742,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
215,0000-00-00,0000-00-00,Mon Mar 13 2023 17:02:33 GMT+0000 (hora estándar de Europa occidental),317199121,LIC. EN DERECHO,Liberación Articulo 91
|
||||
54,0000-00-00,0000-00-00,Thu Sep 23 2021 17:50:13 GMT+0100 (hora de verano de Europa occidental),314047339,LIC. EN INGENIERIA CIVIL,Liberación Articulo 91
|
||||
281,0000-00-00,0000-00-00,Tue Oct 31 2023 15:32:49 GMT+0000 (hora estándar de Europa occidental),417127820,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
118,0000-00-00,0000-00-00,Tue Mar 08 2022 13:34:16 GMT+0000 (hora estándar de Europa occidental),416045853,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
345,0000-00-00,0000-00-00,Fri Jul 26 2024 14:24:48 GMT+0100 (hora de verano de Europa occidental),080083063,LIC. EN MAT. APLICADAS Y COMPUTACION,Liberación Articulo 52
|
||||
182,0000-00-00,0000-00-00,Tue Oct 25 2022 14:52:00 GMT+0100 (hora de verano de Europa occidental),316156596,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
409,0000-00-00,0000-00-00,Tue Mar 25 2025 13:39:22 GMT+0000 (hora estándar de Europa occidental),310245038,LIC. EN DERECHO,Liberación Articulo 91
|
||||
22,0000-00-00,0000-00-00,Fri May 21 2021 15:03:58 GMT+0100 (hora de verano de Europa occidental),098029453,LIC. EN DERECHO,Liberación Articulo 91
|
||||
249,0000-00-00,0000-00-00,Thu Jun 15 2023 11:14:51 GMT+0100 (hora de verano de Europa occidental),315321658,LIC. EN DERECHO,Liberación Articulo 91
|
||||
86,0000-00-00,0000-00-00,Wed Dec 01 2021 00:02:13 GMT+0000 (hora estándar de Europa occidental),315200397,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
313,0000-00-00,0000-00-00,Thu Mar 21 2024 15:49:34 GMT+0000 (hora estándar de Europa occidental),417084332,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
150,0000-00-00,0000-00-00,Mon Jun 20 2022 19:04:53 GMT+0100 (hora de verano de Europa occidental),313183193,LIC. EN DERECHO,Liberación Articulo 91
|
||||
377,0000-00-00,0000-00-00,Tue Oct 15 2024 18:35:20 GMT+0100 (hora de verano de Europa occidental),307312606,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
51,0000-00-00,0000-00-00,Sat Sep 04 2021 00:05:10 GMT+0100 (hora de verano de Europa occidental),312122339,LIC. EN DERECHO,Liberación Articulo 91
|
||||
278,0000-00-00,0000-00-00,Tue Oct 03 2023 16:06:08 GMT+0100 (hora de verano de Europa occidental),309219972,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
115,0000-00-00,0000-00-00,Wed Feb 23 2022 19:32:17 GMT+0000 (hora estándar de Europa occidental),311340686,LIC. EN DERECHO,Liberación Articulo 91
|
||||
342,0000-00-00,0000-00-00,Tue Jul 23 2024 15:36:09 GMT+0100 (hora de verano de Europa occidental),077069379,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
179,0000-00-00,0000-00-00,Fri Oct 14 2022 11:10:10 GMT+0100 (hora de verano de Europa occidental),309259754,LIC. EN DERECHO,Liberación Articulo 91
|
||||
406,0000-00-00,0000-00-00,Wed Mar 19 2025 15:34:18 GMT+0000 (hora estándar de Europa occidental),419150974,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
19,0000-00-00,0000-00-00,Thu May 06 2021 23:06:59 GMT+0100 (hora de verano de Europa occidental),416034035,LIC. EN DERECHO,Liberación Articulo 91
|
||||
246,0000-00-00,0000-00-00,Sat Jun 03 2023 11:12:26 GMT+0100 (hora de verano de Europa occidental),416114029,LIC. EN HISTORIA,Liberación Articulo 91
|
||||
83,0000-00-00,0000-00-00,Thu Nov 25 2021 20:29:30 GMT+0000 (hora estándar de Europa occidental),418141494,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
310,0000-00-00,0000-00-00,Fri Mar 08 2024 13:35:44 GMT+0000 (hora estándar de Europa occidental),420082176,LIC. EN DERECHO,Liberación Articulo 91
|
||||
147,0000-00-00,0000-00-00,Tue Jun 14 2022 19:21:38 GMT+0100 (hora de verano de Europa occidental),310227311,LIC. EN DERECHO,Liberación Articulo 91
|
||||
374,0000-00-00,0000-00-00,Fri Oct 04 2024 12:20:58 GMT+0100 (hora de verano de Europa occidental),313155064,LIC. EN DERECHO,Liberación Articulo 91
|
||||
212,0000-00-00,0000-00-00,Thu Mar 02 2023 19:06:40 GMT+0000 (hora estándar de Europa occidental),418076738,LIC. EN DERECHO,Liberación Articulo 91
|
||||
48,0000-00-00,0000-00-00,Tue Aug 31 2021 15:24:27 GMT+0100 (hora de verano de Europa occidental),313088988,LIC. EN DERECHO,Liberación Articulo 91
|
||||
275,0000-00-00,0000-00-00,Tue Sep 19 2023 15:25:10 GMT+0100 (hora de verano de Europa occidental),416114531,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
112,0000-00-00,0000-00-00,Tue Feb 08 2022 13:00:38 GMT+0000 (hora estándar de Europa occidental),415153753,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
339,0000-00-00,0000-00-00,Wed Jun 26 2024 20:35:32 GMT+0100 (hora de verano de Europa occidental),402027539,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
176,0000-00-00,0000-00-00,Thu Sep 08 2022 11:40:14 GMT+0100 (hora de verano de Europa occidental),418149524,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
403,0000-00-00,0000-00-00,Tue Feb 25 2025 15:12:04 GMT+0000 (hora estándar de Europa occidental),421123797,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
16,0000-00-00,0000-00-00,Thu Apr 29 2021 12:50:17 GMT+0100 (hora de verano de Europa occidental),412039571,LIC. EN DERECHO,Liberación Articulo 91
|
||||
243,0000-00-00,0000-00-00,Wed May 31 2023 19:38:20 GMT+0100 (hora de verano de Europa occidental),312271736,LIC. EN DERECHO,Liberación Articulo 91
|
||||
80,0000-00-00,0000-00-00,Fri Nov 19 2021 14:44:36 GMT+0000 (hora estándar de Europa occidental),312090920,LIC. EN DERECHO,Liberación Articulo 91
|
||||
307,0000-00-00,0000-00-00,Wed Feb 28 2024 15:43:19 GMT+0000 (hora estándar de Europa occidental),311118885,LIC. EN DERECHO,Liberación Articulo 91
|
||||
144,0000-00-00,0000-00-00,Thu Jun 09 2022 15:04:11 GMT+0100 (hora de verano de Europa occidental),311083640,LIC. EN DERECHO,Liberación Articulo 91
|
||||
371,0000-00-00,0000-00-00,Wed Sep 25 2024 19:44:22 GMT+0100 (hora de verano de Europa occidental),313096987,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
209,0000-00-00,0000-00-00,Mon Feb 20 2023 13:15:45 GMT+0000 (hora estándar de Europa occidental),313279742,LIC. EN DERECHO,Liberación Articulo 91
|
||||
272,0000-00-00,0000-00-00,Wed Sep 06 2023 13:10:11 GMT+0100 (hora de verano de Europa occidental),421096369,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 52
|
||||
109,0000-00-00,0000-00-00,Wed Feb 02 2022 20:22:12 GMT+0000 (hora estándar de Europa occidental),406075453,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
336,0000-00-00,0000-00-00,Mon Jun 24 2024 20:32:29 GMT+0100 (hora de verano de Europa occidental),072377491,LIC. EN PERIODISMO Y COMUNICACION COL.,Liberación Articulo 91
|
||||
173,0000-00-00,0000-00-00,Wed Sep 07 2022 13:51:35 GMT+0100 (hora de verano de Europa occidental),098025709,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
400,0000-00-00,0000-00-00,Mon Feb 17 2025 17:59:15 GMT+0000 (hora estándar de Europa occidental),410050808,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
13,0000-00-00,0000-00-00,Tue Apr 27 2021 11:51:27 GMT+0100 (hora de verano de Europa occidental),414141612,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
240,0000-00-00,0000-00-00,Wed May 24 2023 13:50:17 GMT+0100 (hora de verano de Europa occidental),412125340,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
77,0000-00-00,0000-00-00,Thu Nov 18 2021 20:13:05 GMT+0000 (hora estándar de Europa occidental),312177061,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
304,0000-00-00,0000-00-00,Thu Feb 22 2024 20:36:50 GMT+0000 (hora estándar de Europa occidental),300046577,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
141,0000-00-00,0000-00-00,Wed May 25 2022 16:32:51 GMT+0100 (hora de verano de Europa occidental),312164603,LIC. EN DERECHO,Liberación Articulo 91
|
||||
368,0000-00-00,0000-00-00,Tue Sep 24 2024 19:06:23 GMT+0100 (hora de verano de Europa occidental),419133797,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
206,0000-00-00,0000-00-00,Thu Feb 16 2023 20:55:55 GMT+0000 (hora estándar de Europa occidental),083104378,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
45,0000-00-00,0000-00-00,Fri Aug 27 2021 15:41:11 GMT+0100 (hora de verano de Europa occidental),418146303,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
106,0000-00-00,0000-00-00,Tue Feb 01 2022 13:31:34 GMT+0000 (hora estándar de Europa occidental),087380985,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
333,0000-00-00,0000-00-00,Mon Jun 10 2024 16:16:19 GMT+0100 (hora de verano de Europa occidental),317123757,LIC. EN DERECHO,Liberación Articulo 91
|
||||
170,0000-00-00,0000-00-00,Wed Aug 24 2022 19:15:46 GMT+0100 (hora de verano de Europa occidental),317300424,LIC. EN COMUNICACION,Liberación Articulo 52
|
||||
397,0000-00-00,0000-00-00,Tue Feb 11 2025 13:20:57 GMT+0000 (hora estándar de Europa occidental),413117203,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
10,0000-00-00,0000-00-00,Mon Apr 19 2021 21:54:56 GMT+0100 (hora de verano de Europa occidental),076935437,LIC. EN ARQUITECTURA,Liberación Articulo 52
|
||||
237,0000-00-00,0000-00-00,Thu May 18 2023 23:30:02 GMT+0100 (hora de verano de Europa occidental),416045217,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
74,0000-00-00,0000-00-00,Wed Nov 10 2021 12:44:48 GMT+0000 (hora estándar de Europa occidental),312291859,LIC. EN DERECHO,Liberación Articulo 91
|
||||
301,0000-00-00,0000-00-00,Thu Feb 08 2024 15:08:33 GMT+0000 (hora estándar de Europa occidental),416060933,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
138,0000-00-00,0000-00-00,Tue May 24 2022 13:26:50 GMT+0100 (hora de verano de Europa occidental),077990677,LIC. EN DERECHO,Liberación Articulo 52
|
||||
365,0000-00-00,0000-00-00,Thu Sep 12 2024 19:15:01 GMT+0100 (hora de verano de Europa occidental),310089144,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
203,0000-00-00,0000-00-00,Tue Feb 07 2023 20:44:27 GMT+0000 (hora estándar de Europa occidental),083519006,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
42,0000-00-00,0000-00-00,Mon Aug 16 2021 18:47:54 GMT+0100 (hora de verano de Europa occidental),418146671,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
269,0000-00-00,0000-00-00,Wed Aug 30 2023 20:39:15 GMT+0100 (hora de verano de Europa occidental),315123342,LIC. EN DERECHO,Liberación Articulo 91
|
||||
103,0000-00-00,0000-00-00,Wed Jan 26 2022 17:19:56 GMT+0000 (hora estándar de Europa occidental),075688707,LIC. EN DERECHO,Liberación Articulo 52
|
||||
330,0000-00-00,0000-00-00,Thu Jun 06 2024 19:12:33 GMT+0100 (hora de verano de Europa occidental),416052831,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
167,0000-00-00,0000-00-00,Mon Aug 22 2022 11:42:55 GMT+0100 (hora de verano de Europa occidental),311010648,LIC. EN DERECHO,Liberación Articulo 91
|
||||
394,0000-00-00,0000-00-00,Fri Jan 24 2025 13:23:52 GMT+0000 (hora estándar de Europa occidental),313328802,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
7,0000-00-00,0000-00-00,Tue Apr 13 2021 01:43:22 GMT+0100 (hora de verano de Europa occidental),314199586,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
233,0000-00-00,0000-00-00,Fri May 05 2023 14:56:13 GMT+0100 (hora de verano de Europa occidental),417116923,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
71,0000-00-00,0000-00-00,Tue Nov 09 2021 14:04:48 GMT+0000 (hora estándar de Europa occidental),416111248,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
298,0000-00-00,0000-00-00,Tue Jan 23 2024 15:50:50 GMT+0000 (hora estándar de Europa occidental),315207554,LIC. EN DERECHO,Liberación Articulo 91
|
||||
135,0000-00-00,0000-00-00,Fri May 06 2022 10:50:50 GMT+0100 (hora de verano de Europa occidental),316119612,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
362,0000-00-00,0000-00-00,Thu Sep 12 2024 17:40:13 GMT+0100 (hora de verano de Europa occidental),314290102,LIC. EN DERECHO,Liberación Articulo 91
|
||||
200,0000-00-00,0000-00-00,Tue Jan 31 2023 18:00:23 GMT+0000 (hora estándar de Europa occidental),312204073,LIC. EN DERECHO,Liberación Articulo 91
|
||||
428,0000-00-00,0000-00-00,Thu Jan 29 2026 09:28:45 GMT+0000 (hora estándar de Europa occidental),413109778,LIC. EN INGENIERIA CIVIL,Liberación Articulo 91
|
||||
39,0000-00-00,0000-00-00,Wed Aug 11 2021 13:39:22 GMT+0100 (hora de verano de Europa occidental),416081493,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
266,0000-00-00,0000-00-00,Wed Aug 30 2023 15:02:27 GMT+0100 (hora de verano de Europa occidental),419082080,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
327,0000-00-00,0000-00-00,Thu Jun 06 2024 14:57:24 GMT+0100 (hora de verano de Europa occidental),310093509,LIC. EN DERECHO,Liberación Articulo 91
|
||||
164,0000-00-00,0000-00-00,Thu Aug 04 2022 17:22:37 GMT+0100 (hora de verano de Europa occidental),085084333,LIC. EN PERIODISMO Y COMUNICACION COL.,Liberación Articulo 91
|
||||
391,0000-00-00,0000-00-00,Tue Jan 07 2025 13:07:43 GMT+0000 (hora estándar de Europa occidental),309133852,LIC. EN DERECHO,Liberación Articulo 91
|
||||
4,0000-00-00,0000-00-00,Thu Apr 08 2021 00:03:41 GMT+0100 (hora de verano de Europa occidental),315149601,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
230,0000-00-00,0000-00-00,Tue Apr 18 2023 14:53:42 GMT+0100 (hora de verano de Europa occidental),312200556,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
68,0000-00-00,0000-00-00,Tue Nov 02 2021 21:18:19 GMT+0000 (hora estándar de Europa occidental),311137633,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
295,0000-00-00,0000-00-00,Tue Jan 16 2024 18:46:36 GMT+0000 (hora estándar de Europa occidental),311223385,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
132,0000-00-00,0000-00-00,Tue Apr 26 2022 19:54:17 GMT+0100 (hora de verano de Europa occidental),300073805,LIC. EN DERECHO,Liberación Articulo 91
|
||||
359,0000-00-00,0000-00-00,Wed Sep 11 2024 12:45:55 GMT+0100 (hora de verano de Europa occidental),413043207,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
197,0000-00-00,0000-00-00,Mon Jan 23 2023 19:22:29 GMT+0000 (hora estándar de Europa occidental),309006541,LIC. EN DERECHO,Liberación Articulo 91
|
||||
423,0000-00-00,0000-00-00,Tue Jun 10 2025 14:26:47 GMT+0100 (hora de verano de Europa occidental),082069522,LIC. EN DERECHO,Liberación Articulo 52
|
||||
36,0000-00-00,0000-00-00,Wed Aug 04 2021 00:39:05 GMT+0100 (hora de verano de Europa occidental),314013033,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
263,0000-00-00,0000-00-00,Mon Aug 21 2023 14:22:48 GMT+0100 (hora de verano de Europa occidental),085318908,LIC. EN PERIODISMO Y COMUNICACION COL.,Liberación Articulo 91
|
||||
100,0000-00-00,0000-00-00,Tue Jan 25 2022 22:42:37 GMT+0000 (hora estándar de Europa occidental),405111145,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 52
|
||||
161,0000-00-00,0000-00-00,Thu Aug 04 2022 13:24:09 GMT+0100 (hora de verano de Europa occidental),314210830,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
388,0000-00-00,0000-00-00,Tue Dec 10 2024 17:13:22 GMT+0000 (hora estándar de Europa occidental),419086882,LIC. EN FILOSOFIA,Liberación Articulo 91
|
||||
1,0000-00-00,0000-00-00,Mon Apr 05 2021 18:23:35 GMT+0100 (hora de verano de Europa occidental),418091447,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
226,0000-00-00,0000-00-00,Wed Apr 12 2023 17:39:13 GMT+0100 (hora de verano de Europa occidental),300184929,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
65,0000-00-00,0000-00-00,Tue Oct 26 2021 14:12:52 GMT+0100 (hora de verano de Europa occidental),311666630,LIC. EN DERECHO,Liberación Articulo 91
|
||||
292,0000-00-00,0000-00-00,Thu Nov 30 2023 13:49:31 GMT+0000 (hora estándar de Europa occidental),315104518,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
129,0000-00-00,0000-00-00,Wed Apr 20 2022 18:25:20 GMT+0100 (hora de verano de Europa occidental),312237750,LIC. EN DERECHO,Liberación Articulo 91
|
||||
356,0000-00-00,0000-00-00,Fri Sep 06 2024 14:57:36 GMT+0100 (hora de verano de Europa occidental),110001708,LIC. EN DERECHO,Liberación Articulo 91
|
||||
193,0000-00-00,0000-00-00,Tue Jan 10 2023 12:19:10 GMT+0000 (hora estándar de Europa occidental),314353562,LIC. EN DERECHO,Liberación Articulo 91
|
||||
420,0000-00-00,0000-00-00,Mon May 19 2025 16:47:26 GMT+0100 (hora de verano de Europa occidental),313263981,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
33,0000-00-00,0000-00-00,Tue Jul 27 2021 18:16:54 GMT+0100 (hora de verano de Europa occidental),304272385,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
260,0000-00-00,0000-00-00,Mon Aug 14 2023 20:58:26 GMT+0100 (hora de verano de Europa occidental),315534560,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
97,0000-00-00,0000-00-00,Tue Jan 11 2022 20:43:05 GMT+0000 (hora estándar de Europa occidental),300052644,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
324,0000-00-00,0000-00-00,Tue May 14 2024 13:01:18 GMT+0100 (hora de verano de Europa occidental),093561806,LIC. ENSEÑANZA DE ALEMÁN (LENG. EXTRANJS,Liberación Articulo 91
|
||||
158,0000-00-00,0000-00-00,Tue Jul 26 2022 19:38:24 GMT+0100 (hora de verano de Europa occidental),305141770,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
385,0000-00-00,0000-00-00,Mon Nov 25 2024 20:02:10 GMT+0000 (hora estándar de Europa occidental),311534795,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
223,0000-00-00,0000-00-00,Thu Mar 30 2023 20:20:22 GMT+0100 (hora de verano de Europa occidental),310004633,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
62,0000-00-00,0000-00-00,Thu Oct 07 2021 13:09:24 GMT+0100 (hora de verano de Europa occidental),097260972,LIC. EN DERECHO,Liberación Articulo 91
|
||||
289,0000-00-00,0000-00-00,Thu Nov 23 2023 14:04:24 GMT+0000 (hora estándar de Europa occidental),402086437,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
126,0000-00-00,0000-00-00,Tue Mar 29 2022 20:26:51 GMT+0100 (hora de verano de Europa occidental),313025903,LIC. EN DERECHO,Liberación Articulo 91
|
||||
353,0000-00-00,0000-00-00,Thu Aug 22 2024 19:17:49 GMT+0100 (hora de verano de Europa occidental),408101691,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 52
|
||||
190,0000-00-00,0000-00-00,Thu Dec 08 2022 20:25:37 GMT+0000 (hora estándar de Europa occidental),418145973,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
417,0000-00-00,0000-00-00,Wed Apr 30 2025 17:15:43 GMT+0100 (hora de verano de Europa occidental),419088312,LIC. EN DERECHO,Liberación Articulo 91
|
||||
30,0000-00-00,0000-00-00,Fri Jun 25 2021 20:31:11 GMT+0100 (hora de verano de Europa occidental),311215427,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
257,0000-00-00,0000-00-00,Wed Aug 09 2023 19:47:46 GMT+0100 (hora de verano de Europa occidental),418139356,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
94,0000-00-00,0000-00-00,Tue Dec 14 2021 13:02:56 GMT+0000 (hora estándar de Europa occidental),309085043,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
321,0000-00-00,0000-00-00,Mon Apr 29 2024 12:57:41 GMT+0100 (hora de verano de Europa occidental),316185907,LIC. EN DERECHO,Liberación Articulo 91
|
||||
382,0000-00-00,0000-00-00,Wed Nov 13 2024 14:47:25 GMT+0000 (hora estándar de Europa occidental),093127822,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
220,0000-00-00,0000-00-00,Tue Mar 28 2023 18:37:43 GMT+0100 (hora de verano de Europa occidental),077397708,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
59,0000-00-00,0000-00-00,Fri Sep 24 2021 01:52:36 GMT+0100 (hora de verano de Europa occidental),309086411,LIC. EN DERECHO,Liberación Articulo 91
|
||||
286,0000-00-00,0000-00-00,Wed Nov 15 2023 17:47:38 GMT+0000 (hora estándar de Europa occidental),421081952,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
123,0000-00-00,0000-00-00,Tue Mar 29 2022 19:38:54 GMT+0100 (hora de verano de Europa occidental),312330538,LIC. EN DERECHO,Liberación Articulo 91
|
||||
350,0000-00-00,0000-00-00,Mon Aug 12 2024 20:21:44 GMT+0100 (hora de verano de Europa occidental),421050578,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
187,0000-00-00,0000-00-00,Mon Dec 05 2022 14:34:07 GMT+0000 (hora estándar de Europa occidental),088156509,LIC. EN DERECHO,Liberación Articulo 52
|
||||
414,0000-00-00,0000-00-00,Tue Apr 08 2025 15:09:10 GMT+0100 (hora de verano de Europa occidental),419161077,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
27,0000-00-00,0000-00-00,Mon Jun 14 2021 12:18:20 GMT+0100 (hora de verano de Europa occidental),313300549,LIC. EN DERECHO,Liberación Articulo 91
|
||||
254,0000-00-00,0000-00-00,Wed Aug 09 2023 12:08:07 GMT+0100 (hora de verano de Europa occidental),417006916,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
91,0000-00-00,0000-00-00,Mon Dec 13 2021 15:49:04 GMT+0000 (hora estándar de Europa occidental),311160956,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
318,0000-00-00,0000-00-00,Tue Apr 23 2024 18:31:47 GMT+0100 (hora de verano de Europa occidental),316216656,LIC. EN DISEÑO GRAFICO,Liberación Articulo 91
|
||||
155,0000-00-00,0000-00-00,Tue Jul 26 2022 18:25:17 GMT+0100 (hora de verano de Europa occidental),417069630,LIC. EN DERECHO,Liberación Articulo 91
|
||||
217,0000-00-00,0000-00-00,Wed Mar 22 2023 19:31:17 GMT+0000 (hora estándar de Europa occidental),310273363,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
56,0000-00-00,0000-00-00,Thu Sep 23 2021 22:36:16 GMT+0100 (hora de verano de Europa occidental),417003915,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
283,0000-00-00,0000-00-00,Thu Nov 09 2023 20:01:03 GMT+0000 (hora estándar de Europa occidental),314104182,LIC. EN DERECHO,Liberación Articulo 91
|
||||
120,0000-00-00,0000-00-00,Wed Mar 16 2022 16:40:03 GMT+0000 (hora estándar de Europa occidental),082570792,LIC. EN DERECHO,Liberación Articulo 52
|
||||
347,0000-00-00,0000-00-00,Tue Aug 06 2024 15:20:54 GMT+0100 (hora de verano de Europa occidental),307014843,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
184,0000-00-00,0000-00-00,Wed Oct 26 2022 12:42:34 GMT+0100 (hora de verano de Europa occidental),311339150,LIC. EN DERECHO,Liberación Articulo 91
|
||||
411,0000-00-00,0000-00-00,Wed Apr 02 2025 14:04:19 GMT+0100 (hora de verano de Europa occidental),079386065,LIC. EN FILOSOFIA,Liberación Articulo 91
|
||||
24,0000-00-00,0000-00-00,Mon May 31 2021 21:02:21 GMT+0100 (hora de verano de Europa occidental),418080636,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
251,0000-00-00,0000-00-00,Tue Aug 01 2023 14:10:36 GMT+0100 (hora de verano de Europa occidental),407108161,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
88,0000-00-00,0000-00-00,Wed Dec 01 2021 20:25:45 GMT+0000 (hora estándar de Europa occidental),417007353,LIC. EN DERECHO,Liberación Articulo 91
|
||||
315,0000-00-00,0000-00-00,Thu Apr 18 2024 20:49:39 GMT+0100 (hora de verano de Europa occidental),308227662,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
152,0000-00-00,0000-00-00,Tue Jun 21 2022 19:34:54 GMT+0100 (hora de verano de Europa occidental),077362474,LIC. EN DERECHO,Liberación Articulo 52
|
||||
379,0000-00-00,0000-00-00,Fri Nov 08 2024 13:30:25 GMT+0000 (hora estándar de Europa occidental),312193083,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
214,0000-00-00,0000-00-00,Mon Mar 13 2023 16:21:40 GMT+0000 (hora estándar de Europa occidental),418156131,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
53,0000-00-00,0000-00-00,Thu Sep 23 2021 15:56:03 GMT+0100 (hora de verano de Europa occidental),415073604,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
280,0000-00-00,0000-00-00,Tue Oct 31 2023 14:54:42 GMT+0000 (hora estándar de Europa occidental),305056063,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
117,0000-00-00,0000-00-00,Mon Mar 07 2022 19:44:11 GMT+0000 (hora estándar de Europa occidental),096344899,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
344,0000-00-00,0000-00-00,Thu Jul 25 2024 13:04:59 GMT+0100 (hora de verano de Europa occidental),316068297,LIC. EN DERECHO,Liberación Articulo 91
|
||||
181,0000-00-00,0000-00-00,Tue Oct 18 2022 21:51:12 GMT+0100 (hora de verano de Europa occidental),312021603,LIC. EN DERECHO,Liberación Articulo 91
|
||||
408,0000-00-00,0000-00-00,Mon Mar 24 2025 10:55:19 GMT+0000 (hora estándar de Europa occidental),421111240,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
21,0000-00-00,0000-00-00,Fri May 14 2021 20:40:06 GMT+0100 (hora de verano de Europa occidental),094270749,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
248,0000-00-00,0000-00-00,Thu Jun 15 2023 10:59:37 GMT+0100 (hora de verano de Europa occidental),417040095,LIC. EN DERECHO,Liberación Articulo 91
|
||||
85,0000-00-00,0000-00-00,Mon Nov 29 2021 18:16:49 GMT+0000 (hora estándar de Europa occidental),303570190,LIC. EN DERECHO,Liberación Articulo 91
|
||||
312,0000-00-00,0000-00-00,Tue Mar 19 2024 16:02:04 GMT+0000 (hora estándar de Europa occidental),312288257,LIC. EN DERECHO,Liberación Articulo 91
|
||||
149,0000-00-00,0000-00-00,Thu Jun 16 2022 14:04:54 GMT+0100 (hora de verano de Europa occidental),416145324,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
376,0000-00-00,0000-00-00,Tue Oct 15 2024 15:02:34 GMT+0100 (hora de verano de Europa occidental),309273473,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
50,0000-00-00,0000-00-00,Thu Sep 02 2021 15:14:45 GMT+0100 (hora de verano de Europa occidental),305003689,LIC. EN DERECHO,Liberación Articulo 91
|
||||
277,0000-00-00,0000-00-00,Mon Oct 02 2023 17:15:57 GMT+0100 (hora de verano de Europa occidental),090280180,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
114,0000-00-00,0000-00-00,Wed Feb 23 2022 19:20:57 GMT+0000 (hora estándar de Europa occidental),418075906,LIC. EN HISTORIA,Liberación Articulo 52
|
||||
341,0000-00-00,0000-00-00,Mon Jul 22 2024 20:55:06 GMT+0100 (hora de verano de Europa occidental),090377200,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
178,0000-00-00,0000-00-00,Mon Sep 26 2022 18:15:59 GMT+0100 (hora de verano de Europa occidental),303135078,LIC. EN DERECHO,Liberación Articulo 91
|
||||
405,0000-00-00,0000-00-00,Wed Mar 12 2025 18:25:51 GMT+0000 (hora estándar de Europa occidental),419240545,LIC. EN DERECHO,Liberación Articulo 91
|
||||
18,0000-00-00,0000-00-00,Tue May 04 2021 20:16:57 GMT+0100 (hora de verano de Europa occidental),309260606,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
245,0000-00-00,0000-00-00,Sat Jun 03 2023 11:04:36 GMT+0100 (hora de verano de Europa occidental),311033906,LIC. EN DERECHO,Liberación Articulo 91
|
||||
82,0000-00-00,0000-00-00,Tue Nov 23 2021 20:56:40 GMT+0000 (hora estándar de Europa occidental),308100392,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
309,0000-00-00,0000-00-00,Tue Mar 05 2024 14:30:54 GMT+0000 (hora estándar de Europa occidental),313023071,LIC. EN DERECHO,Liberación Articulo 91
|
||||
146,0000-00-00,0000-00-00,Fri Jun 10 2022 13:11:42 GMT+0100 (hora de verano de Europa occidental),306020285,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
373,0000-00-00,0000-00-00,Fri Oct 04 2024 12:06:07 GMT+0100 (hora de verano de Europa occidental),077172033,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 52
|
||||
211,0000-00-00,0000-00-00,Mon Feb 27 2023 18:51:25 GMT+0000 (hora estándar de Europa occidental),310284404,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
47,0000-00-00,0000-00-00,Mon Aug 30 2021 21:58:16 GMT+0100 (hora de verano de Europa occidental),305202222,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
274,0000-00-00,0000-00-00,Tue Sep 19 2023 13:25:39 GMT+0100 (hora de verano de Europa occidental),418130449,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
111,0000-00-00,0000-00-00,Fri Feb 04 2022 14:57:09 GMT+0000 (hora estándar de Europa occidental),094045459,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
338,0000-00-00,0000-00-00,Tue Jun 25 2024 20:58:57 GMT+0100 (hora de verano de Europa occidental),076998852,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 52
|
||||
175,0000-00-00,0000-00-00,Wed Sep 07 2022 19:51:54 GMT+0100 (hora de verano de Europa occidental),418085143,LIC. EN DERECHO,Liberación Articulo 91
|
||||
402,0000-00-00,0000-00-00,Thu Feb 20 2025 17:36:22 GMT+0000 (hora estándar de Europa occidental),306316357,LIC. EN DERECHO,Liberación Articulo 91
|
||||
15,0000-00-00,0000-00-00,Tue Apr 27 2021 18:53:42 GMT+0100 (hora de verano de Europa occidental),314015893,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
242,0000-00-00,0000-00-00,Mon May 29 2023 20:36:34 GMT+0100 (hora de verano de Europa occidental),073276005,LIC. EN DERECHO,Liberación Articulo 52
|
||||
79,0000-00-00,0000-00-00,Thu Nov 18 2021 20:59:24 GMT+0000 (hora estándar de Europa occidental),068644170,LIC. EN DERECHO,Liberación Articulo 52
|
||||
306,0000-00-00,0000-00-00,Fri Feb 23 2024 13:14:56 GMT+0000 (hora estándar de Europa occidental),313257436,LIC. EN DERECHO,Liberación Articulo 91
|
||||
143,0000-00-00,0000-00-00,Tue Jun 07 2022 13:51:22 GMT+0100 (hora de verano de Europa occidental),314077156,LIC. EN DERECHO,Liberación Articulo 91
|
||||
370,0000-00-00,0000-00-00,Wed Sep 25 2024 18:28:50 GMT+0100 (hora de verano de Europa occidental),311120514,LIC. EN DERECHO,Liberación Articulo 91
|
||||
208,0000-00-00,0000-00-00,Fri Feb 17 2023 13:29:36 GMT+0000 (hora estándar de Europa occidental),418085796,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
271,0000-00-00,0000-00-00,Tue Sep 05 2023 20:20:09 GMT+0100 (hora de verano de Europa occidental),404008804,LIC. EN MAT. APLICADAS Y COMPUTACION,Liberación Articulo 91
|
||||
108,0000-00-00,0000-00-00,Wed Feb 02 2022 20:10:53 GMT+0000 (hora estándar de Europa occidental),088152831,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
335,0000-00-00,0000-00-00,Thu Jun 20 2024 20:49:22 GMT+0100 (hora de verano de Europa occidental),307046059,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
172,0000-00-00,0000-00-00,Thu Sep 01 2022 12:21:12 GMT+0100 (hora de verano de Europa occidental),418075724,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
399,0000-00-00,0000-00-00,Mon Feb 17 2025 12:01:55 GMT+0000 (hora estándar de Europa occidental),413074863,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
12,0000-00-00,0000-00-00,Fri Apr 23 2021 23:11:01 GMT+0100 (hora de verano de Europa occidental),404101008,LIC. EN DERECHO,Liberación Articulo 91
|
||||
239,0000-00-00,0000-00-00,Fri May 19 2023 01:14:24 GMT+0100 (hora de verano de Europa occidental),308061565,LIC. EN DERECHO,Liberación Articulo 91
|
||||
76,0000-00-00,0000-00-00,Fri Nov 12 2021 12:30:56 GMT+0000 (hora estándar de Europa occidental),304301229,LIC. EN DISEÑO GRAFICO,Liberación Articulo 91
|
||||
303,0000-00-00,0000-00-00,Thu Feb 22 2024 20:32:17 GMT+0000 (hora estándar de Europa occidental),314106739,LIC. EN DERECHO,Liberación Articulo 91
|
||||
140,0000-00-00,0000-00-00,Tue May 24 2022 18:46:39 GMT+0100 (hora de verano de Europa occidental),079074335,LIC. EN ARQUITECTURA,Liberación Articulo 52
|
||||
367,0000-00-00,0000-00-00,Tue Sep 17 2024 14:00:38 GMT+0100 (hora de verano de Europa occidental),314348038,LIC. EN DERECHO,Liberación Articulo 91
|
||||
205,0000-00-00,0000-00-00,Thu Feb 16 2023 20:52:27 GMT+0000 (hora estándar de Europa occidental),316320661,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
44,0000-00-00,0000-00-00,Sun Aug 22 2021 23:11:35 GMT+0100 (hora de verano de Europa occidental),096121609,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
105,0000-00-00,0000-00-00,Tue Feb 01 2022 12:45:50 GMT+0000 (hora estándar de Europa occidental),300229239,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
332,0000-00-00,0000-00-00,Mon Jun 10 2024 15:11:45 GMT+0100 (hora de verano de Europa occidental),316097316,LIC. EN DERECHO,Liberación Articulo 91
|
||||
169,0000-00-00,0000-00-00,Mon Aug 22 2022 13:42:54 GMT+0100 (hora de verano de Europa occidental),410070859,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
396,0000-00-00,0000-00-00,Thu Feb 06 2025 14:34:23 GMT+0000 (hora estándar de Europa occidental),302164730,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
9,0000-00-00,0000-00-00,Mon Apr 19 2021 19:38:26 GMT+0100 (hora de verano de Europa occidental),313080535,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
236,0000-00-00,0000-00-00,Thu May 11 2023 17:55:04 GMT+0100 (hora de verano de Europa occidental),418087886,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
73,0000-00-00,0000-00-00,Wed Nov 10 2021 12:10:06 GMT+0000 (hora estándar de Europa occidental),418087226,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
300,0000-00-00,0000-00-00,Thu Feb 08 2024 14:39:16 GMT+0000 (hora estándar de Europa occidental),420155027,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
137,0000-00-00,0000-00-00,Wed May 11 2022 16:40:51 GMT+0100 (hora de verano de Europa occidental),418146468,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
364,0000-00-00,0000-00-00,Thu Sep 12 2024 18:05:08 GMT+0100 (hora de verano de Europa occidental),302306046,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
202,0000-00-00,0000-00-00,Tue Feb 07 2023 20:34:57 GMT+0000 (hora estándar de Europa occidental),420083379,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
41,0000-00-00,0000-00-00,Mon Aug 16 2021 00:26:42 GMT+0100 (hora de verano de Europa occidental),417114682,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
268,0000-00-00,0000-00-00,Wed Aug 30 2023 19:59:44 GMT+0100 (hora de verano de Europa occidental),087365111,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
102,0000-00-00,0000-00-00,Wed Jan 26 2022 16:01:50 GMT+0000 (hora estándar de Europa occidental),410014536,LIC. EN DERECHO,Liberación Articulo 91
|
||||
329,0000-00-00,0000-00-00,Thu Jun 06 2024 19:00:44 GMT+0100 (hora de verano de Europa occidental),315146813,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
166,0000-00-00,0000-00-00,Fri Aug 19 2022 13:54:55 GMT+0100 (hora de verano de Europa occidental),309200952,LIC. EN DERECHO,Liberación Articulo 91
|
||||
393,0000-00-00,0000-00-00,Wed Jan 22 2025 19:15:08 GMT+0000 (hora estándar de Europa occidental),418153862,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
6,0000-00-00,0000-00-00,Tue Apr 13 2021 00:55:51 GMT+0100 (hora de verano de Europa occidental),304237223,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
232,0000-00-00,0000-00-00,Thu May 04 2023 16:50:50 GMT+0100 (hora de verano de Europa occidental),415115535,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
70,0000-00-00,0000-00-00,Thu Nov 04 2021 16:24:31 GMT+0000 (hora estándar de Europa occidental),311341724,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
297,0000-00-00,0000-00-00,Tue Jan 23 2024 13:40:56 GMT+0000 (hora estándar de Europa occidental),420087164,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
134,0000-00-00,0000-00-00,Tue Apr 26 2022 20:20:39 GMT+0100 (hora de verano de Europa occidental),311106754,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
361,0000-00-00,0000-00-00,Thu Sep 12 2024 17:03:02 GMT+0100 (hora de verano de Europa occidental),419133948,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
199,0000-00-00,0000-00-00,Mon Jan 30 2023 19:11:04 GMT+0000 (hora estándar de Europa occidental),314104632,LIC. EN DERECHO,Liberación Articulo 91
|
||||
427,0000-00-00,0000-00-00,Sat Jan 24 2026 18:33:15 GMT+0000 (hora estándar de Europa occidental),422016698,LIC. EN PEDAGOGÍA,Liberación Articulo 52
|
||||
38,0000-00-00,0000-00-00,Mon Aug 09 2021 15:27:00 GMT+0100 (hora de verano de Europa occidental),312201106,LIC. EN DERECHO,Liberación Articulo 91
|
||||
265,0000-00-00,0000-00-00,Mon Aug 28 2023 14:22:18 GMT+0100 (hora de verano de Europa occidental),415110231,LIC. EN DERECHO,Liberación Articulo 91
|
||||
326,0000-00-00,0000-00-00,Tue May 28 2024 21:00:48 GMT+0100 (hora de verano de Europa occidental),315115824,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
163,0000-00-00,0000-00-00,Thu Aug 04 2022 14:34:30 GMT+0100 (hora de verano de Europa occidental),312187064,LIC. EN DERECHO,Liberación Articulo 91
|
||||
390,0000-00-00,0000-00-00,Mon Jan 06 2025 19:11:05 GMT+0000 (hora estándar de Europa occidental),408052294,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
3,0000-00-00,0000-00-00,Wed Apr 07 2021 18:11:19 GMT+0100 (hora de verano de Europa occidental),413026996,LIC. EN DERECHO,Liberación Articulo 91
|
||||
228,0000-00-00,0000-00-00,Mon Apr 17 2023 19:46:46 GMT+0100 (hora de verano de Europa occidental),315016824,LIC. EN DERECHO,Liberación Articulo 91
|
||||
67,0000-00-00,0000-00-00,Mon Nov 01 2021 23:55:15 GMT+0000 (hora estándar de Europa occidental),098593495,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
294,0000-00-00,0000-00-00,Wed Dec 13 2023 20:19:33 GMT+0000 (hora estándar de Europa occidental),420095754,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
131,0000-00-00,0000-00-00,Fri Apr 22 2022 10:45:24 GMT+0100 (hora de verano de Europa occidental),094040117,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
358,0000-00-00,0000-00-00,Tue Sep 10 2024 15:46:37 GMT+0100 (hora de verano de Europa occidental),302282557,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
196,0000-00-00,0000-00-00,Tue Jan 10 2023 20:09:23 GMT+0000 (hora estándar de Europa occidental),413080442,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
422,0000-00-00,0000-00-00,Thu Jun 05 2025 11:49:00 GMT+0100 (hora de verano de Europa occidental),315014095,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
35,0000-00-00,0000-00-00,Mon Aug 02 2021 19:06:15 GMT+0100 (hora de verano de Europa occidental),312267797,LIC. EN DERECHO,Liberación Articulo 91
|
||||
262,0000-00-00,0000-00-00,Thu Aug 17 2023 13:38:23 GMT+0100 (hora de verano de Europa occidental),315153365,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
99,0000-00-00,0000-00-00,Fri Jan 21 2022 17:09:46 GMT+0000 (hora estándar de Europa occidental),307076632,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
160,0000-00-00,0000-00-00,Mon Aug 01 2022 14:02:53 GMT+0100 (hora de verano de Europa occidental),415002486,LIC. EN DERECHO,Liberación Articulo 91
|
||||
387,0000-00-00,0000-00-00,Mon Dec 02 2024 15:54:19 GMT+0000 (hora estándar de Europa occidental),080072836,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
225,0000-00-00,0000-00-00,Tue Apr 11 2023 20:51:56 GMT+0100 (hora de verano de Europa occidental),315201370,LIC. EN DERECHO,Liberación Articulo 91
|
||||
64,0000-00-00,0000-00-00,Mon Oct 18 2021 15:05:46 GMT+0100 (hora de verano de Europa occidental),313340998,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
291,0000-00-00,0000-00-00,Tue Nov 28 2023 18:56:55 GMT+0000 (hora estándar de Europa occidental),309277419,LIC. EN DERECHO,Liberación Articulo 91
|
||||
128,0000-00-00,0000-00-00,Wed Apr 20 2022 17:57:48 GMT+0100 (hora de verano de Europa occidental),418075528,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
355,0000-00-00,0000-00-00,Tue Sep 03 2024 16:33:56 GMT+0100 (hora de verano de Europa occidental),316155348,LIC. EN DERECHO,Liberación Articulo 91
|
||||
192,0000-00-00,0000-00-00,Thu Jan 05 2023 17:17:39 GMT+0000 (hora estándar de Europa occidental),414079672,LIC. EN INGENIERIA CIVIL,Liberación Articulo 91
|
||||
419,0000-00-00,0000-00-00,Tue May 13 2025 16:10:18 GMT+0100 (hora de verano de Europa occidental),317087440,LIC. EN DISEÑO GRAFICO,Liberación Articulo 91
|
||||
32,0000-00-00,0000-00-00,Tue Jul 27 2021 14:55:25 GMT+0100 (hora de verano de Europa occidental),416119938,LIC. EN DERECHO,Liberación Articulo 91
|
||||
259,0000-00-00,0000-00-00,Thu Aug 10 2023 14:28:25 GMT+0100 (hora de verano de Europa occidental),090110838,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
96,0000-00-00,0000-00-00,Tue Jan 11 2022 14:56:44 GMT+0000 (hora estándar de Europa occidental),069157567,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
323,0000-00-00,0000-00-00,Mon May 13 2024 19:22:31 GMT+0100 (hora de verano de Europa occidental),421017537,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
157,0000-00-00,0000-00-00,Tue Jul 26 2022 19:11:05 GMT+0100 (hora de verano de Europa occidental),414082315,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
384,0000-00-00,0000-00-00,Mon Nov 25 2024 18:45:54 GMT+0000 (hora estándar de Europa occidental),317022760,LIC. EN DERECHO,Liberación Articulo 91
|
||||
222,0000-00-00,0000-00-00,Tue Mar 28 2023 20:24:28 GMT+0100 (hora de verano de Europa occidental),417071826,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
61,0000-00-00,0000-00-00,Wed Sep 29 2021 13:50:56 GMT+0100 (hora de verano de Europa occidental),416101513,LIC. EN DERECHO,Liberación Articulo 91
|
||||
288,0000-00-00,0000-00-00,Thu Nov 16 2023 20:44:37 GMT+0000 (hora estándar de Europa occidental),418078048,LIC. EN DERECHO,Liberación Articulo 91
|
||||
125,0000-00-00,0000-00-00,Tue Mar 29 2022 20:06:25 GMT+0100 (hora de verano de Europa occidental),401032273,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
352,0000-00-00,0000-00-00,Fri Aug 16 2024 14:33:11 GMT+0100 (hora de verano de Europa occidental),315020997,LIC. EN DERECHO,Liberación Articulo 91
|
||||
189,0000-00-00,0000-00-00,Thu Dec 08 2022 20:16:26 GMT+0000 (hora estándar de Europa occidental),411092742,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
416,0000-00-00,0000-00-00,Mon Apr 21 2025 17:15:33 GMT+0100 (hora de verano de Europa occidental),415041412,LIC. EN DERECHO,Liberación Articulo 91
|
||||
29,0000-00-00,0000-00-00,Fri Jun 25 2021 15:00:41 GMT+0100 (hora de verano de Europa occidental),314100232,LIC. EN DERECHO,Liberación Articulo 91
|
||||
256,0000-00-00,0000-00-00,Wed Aug 09 2023 19:11:55 GMT+0100 (hora de verano de Europa occidental),315012967,LIC. EN INGENIERIA CIVIL,Liberación Articulo 91
|
||||
93,0000-00-00,0000-00-00,Mon Dec 13 2021 19:26:10 GMT+0000 (hora estándar de Europa occidental),071145680,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
320,0000-00-00,0000-00-00,Mon Apr 29 2024 12:32:58 GMT+0100 (hora de verano de Europa occidental),416113022,LIC. EN DERECHO,Liberación Articulo 91
|
||||
381,0000-00-00,0000-00-00,Tue Nov 12 2024 20:00:02 GMT+0000 (hora estándar de Europa occidental),313038921,LIC. EN DERECHO,Liberación Articulo 91
|
||||
219,0000-00-00,0000-00-00,Tue Mar 28 2023 18:15:50 GMT+0100 (hora de verano de Europa occidental),416085886,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
58,0000-00-00,0000-00-00,Thu Sep 23 2021 23:14:44 GMT+0100 (hora de verano de Europa occidental),094059601,LIC. EN PERIODISMO Y COMUNICACION COL.,Liberación Articulo 91
|
||||
285,0000-00-00,0000-00-00,Mon Nov 13 2023 20:36:18 GMT+0000 (hora estándar de Europa occidental),421014024,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
122,0000-00-00,0000-00-00,Tue Mar 29 2022 19:33:40 GMT+0100 (hora de verano de Europa occidental),313241132,LIC. EN DERECHO,Liberación Articulo 91
|
||||
349,0000-00-00,0000-00-00,Thu Aug 08 2024 20:11:46 GMT+0100 (hora de verano de Europa occidental),404065416,LIC. EN HISTORIA,Liberación Articulo 52
|
||||
186,0000-00-00,0000-00-00,Fri Dec 02 2022 12:05:30 GMT+0000 (hora estándar de Europa occidental),419082808,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
413,0000-00-00,0000-00-00,Tue Apr 08 2025 12:24:35 GMT+0100 (hora de verano de Europa occidental),095072670,LIC. EN DERECHO,Liberación Articulo 91
|
||||
26,0000-00-00,0000-00-00,Mon Jun 07 2021 23:56:55 GMT+0100 (hora de verano de Europa occidental),305328818,LIC. EN DERECHO,Liberación Articulo 91
|
||||
253,0000-00-00,0000-00-00,Thu Aug 03 2023 19:58:03 GMT+0100 (hora de verano de Europa occidental),312331607,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
90,0000-00-00,0000-00-00,Mon Dec 06 2021 13:47:46 GMT+0000 (hora estándar de Europa occidental),311340466,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
317,0000-00-00,0000-00-00,Tue Apr 23 2024 14:32:04 GMT+0100 (hora de verano de Europa occidental),418078330,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
154,0000-00-00,0000-00-00,Wed Jun 29 2022 13:21:21 GMT+0100 (hora de verano de Europa occidental),310156275,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
216,0000-00-00,0000-00-00,Thu Mar 16 2023 20:52:54 GMT+0000 (hora estándar de Europa occidental),314336024,LIC. EN DERECHO,Liberación Articulo 91
|
||||
55,0000-00-00,0000-00-00,Thu Sep 23 2021 21:21:59 GMT+0100 (hora de verano de Europa occidental),314138873,LIC. EN DERECHO,Liberación Articulo 91
|
||||
282,0000-00-00,0000-00-00,Mon Nov 06 2023 18:53:21 GMT+0000 (hora estándar de Europa occidental),417109268,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
119,0000-00-00,0000-00-00,Tue Mar 15 2022 13:00:21 GMT+0000 (hora estándar de Europa occidental),071051372,LIC. EN DERECHO,Liberación Articulo 52
|
||||
346,0000-00-00,0000-00-00,Fri Jul 26 2024 14:39:45 GMT+0100 (hora de verano de Europa occidental),082065782,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
183,0000-00-00,0000-00-00,Wed Oct 26 2022 12:31:15 GMT+0100 (hora de verano de Europa occidental),308200090,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
410,0000-00-00,0000-00-00,Tue Mar 25 2025 17:09:00 GMT+0000 (hora estándar de Europa occidental),314065379,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
23,0000-00-00,0000-00-00,Sat May 22 2021 23:23:36 GMT+0100 (hora de verano de Europa occidental),314123868,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
250,0000-00-00,0000-00-00,Thu Jun 15 2023 11:31:58 GMT+0100 (hora de verano de Europa occidental),301241414,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
87,0000-00-00,0000-00-00,Wed Dec 01 2021 00:11:30 GMT+0000 (hora estándar de Europa occidental),312138080,LIC. EN DERECHO,Liberación Articulo 91
|
||||
314,0000-00-00,0000-00-00,Mon Apr 01 2024 17:31:53 GMT+0100 (hora de verano de Europa occidental),414139622,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
151,0000-00-00,0000-00-00,Tue Jun 21 2022 19:23:06 GMT+0100 (hora de verano de Europa occidental),419078780,LIC. EN DERECHO,Liberación Articulo 91
|
||||
378,0000-00-00,0000-00-00,Mon Oct 21 2024 13:15:06 GMT+0100 (hora de verano de Europa occidental),318330134,LIC. EN DERECHO,Liberación Articulo 91
|
||||
213,0000-00-00,0000-00-00,Tue Mar 07 2023 16:13:39 GMT+0000 (hora estándar de Europa occidental),420087865,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
52,0000-00-00,0000-00-00,Tue Sep 14 2021 18:49:15 GMT+0100 (hora de verano de Europa occidental),305340351,LIC. EN DERECHO,Liberación Articulo 91
|
||||
279,0000-00-00,0000-00-00,Mon Oct 30 2023 15:01:00 GMT+0000 (hora estándar de Europa occidental),315198063,LIC. EN DERECHO,Liberación Articulo 91
|
||||
116,0000-00-00,0000-00-00,Wed Feb 23 2022 19:52:11 GMT+0000 (hora estándar de Europa occidental),417013949,LIC. EN DERECHO,Liberación Articulo 91
|
||||
343,0000-00-00,0000-00-00,Wed Jul 24 2024 18:45:29 GMT+0100 (hora de verano de Europa occidental),313126251,LIC. EN DERECHO,Liberación Articulo 91
|
||||
180,0000-00-00,0000-00-00,Fri Oct 14 2022 11:36:30 GMT+0100 (hora de verano de Europa occidental),312015457,LIC. EN DERECHO,Liberación Articulo 91
|
||||
407,0000-00-00,0000-00-00,Thu Mar 20 2025 11:46:49 GMT+0000 (hora estándar de Europa occidental),312056023,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
20,0000-00-00,0000-00-00,Thu May 13 2021 12:17:57 GMT+0100 (hora de verano de Europa occidental),415147552,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
247,0000-00-00,0000-00-00,Tue Jun 13 2023 12:09:23 GMT+0100 (hora de verano de Europa occidental),315261880,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
84,0000-00-00,0000-00-00,Thu Nov 25 2021 21:08:05 GMT+0000 (hora estándar de Europa occidental),314194536,LIC. EN DERECHO,Liberación Articulo 91
|
||||
311,0000-00-00,0000-00-00,Tue Mar 12 2024 18:03:36 GMT+0000 (hora estándar de Europa occidental),314142726,LIC. EN DERECHO,Liberación Articulo 91
|
||||
148,0000-00-00,0000-00-00,Tue Jun 14 2022 19:27:07 GMT+0100 (hora de verano de Europa occidental),311251885,LIC. EN DERECHO,Liberación Articulo 91
|
||||
375,0000-00-00,0000-00-00,Mon Oct 14 2024 19:46:31 GMT+0100 (hora de verano de Europa occidental),311303836,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
49,0000-00-00,0000-00-00,Wed Sep 01 2021 15:09:40 GMT+0100 (hora de verano de Europa occidental),078579394,LIC. EN DERECHO,Liberación Articulo 52
|
||||
276,0000-00-00,0000-00-00,Mon Oct 02 2023 14:30:32 GMT+0100 (hora de verano de Europa occidental),419157605,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
113,0000-00-00,0000-00-00,Wed Feb 09 2022 20:08:43 GMT+0000 (hora estándar de Europa occidental),314209627,LIC. EN DERECHO,Liberación Articulo 91
|
||||
340,0000-00-00,0000-00-00,Mon Jul 22 2024 13:26:18 GMT+0100 (hora de verano de Europa occidental),316316615,LIC. EN DERECHO,Liberación Articulo 91
|
||||
177,0000-00-00,0000-00-00,Thu Sep 08 2022 12:52:05 GMT+0100 (hora de verano de Europa occidental),310169585,LIC. EN DERECHO,Liberación Articulo 91
|
||||
404,0000-00-00,0000-00-00,Mon Mar 03 2025 13:16:11 GMT+0000 (hora estándar de Europa occidental),083491942,LIC. EN DERECHO,Liberación Articulo 52
|
||||
17,0000-00-00,0000-00-00,Thu Apr 29 2021 21:29:34 GMT+0100 (hora de verano de Europa occidental),314272571,LIC. EN DERECHO,Liberación Articulo 91
|
||||
244,0000-00-00,0000-00-00,Sat Jun 03 2023 09:23:13 GMT+0100 (hora de verano de Europa occidental),090105854,LIC. EN DERECHO,Liberación Articulo 91
|
||||
81,0000-00-00,0000-00-00,Fri Nov 19 2021 17:23:38 GMT+0000 (hora estándar de Europa occidental),417086082,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
308,0000-00-00,0000-00-00,Wed Feb 28 2024 16:03:56 GMT+0000 (hora estándar de Europa occidental),314178693,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
145,0000-00-00,0000-00-00,Fri Jun 10 2022 12:17:09 GMT+0100 (hora de verano de Europa occidental),086058122,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
372,0000-00-00,0000-00-00,Thu Sep 26 2024 19:51:28 GMT+0100 (hora de verano de Europa occidental),314288569,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
210,0000-00-00,0000-00-00,Mon Feb 20 2023 20:32:56 GMT+0000 (hora estándar de Europa occidental),310286044,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
273,0000-00-00,0000-00-00,Mon Sep 11 2023 17:36:02 GMT+0100 (hora de verano de Europa occidental),314273097,LIC. EN LENGUA Y LITERATURA HISPANICAS,Liberación Articulo 91
|
||||
110,0000-00-00,0000-00-00,Wed Feb 02 2022 20:30:45 GMT+0000 (hora estándar de Europa occidental),416061789,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
337,0000-00-00,0000-00-00,Tue Jun 25 2024 20:34:52 GMT+0100 (hora de verano de Europa occidental),300065875,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
174,0000-00-00,0000-00-00,Wed Sep 07 2022 14:06:35 GMT+0100 (hora de verano de Europa occidental),412069996,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
401,0000-00-00,0000-00-00,Mon Feb 17 2025 19:17:07 GMT+0000 (hora estándar de Europa occidental),099087450,LIC. EN DERECHO,Liberación Articulo 91
|
||||
14,0000-00-00,0000-00-00,Tue Apr 27 2021 14:04:54 GMT+0100 (hora de verano de Europa occidental),302088634,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
241,0000-00-00,0000-00-00,Wed May 24 2023 14:25:04 GMT+0100 (hora de verano de Europa occidental),314142355,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
78,0000-00-00,0000-00-00,Thu Nov 18 2021 20:27:47 GMT+0000 (hora estándar de Europa occidental),313025099,LIC. EN DERECHO,Liberación Articulo 91
|
||||
305,0000-00-00,0000-00-00,Fri Feb 23 2024 12:45:48 GMT+0000 (hora estándar de Europa occidental),308116964,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
142,0000-00-00,0000-00-00,Tue Jun 07 2022 13:23:25 GMT+0100 (hora de verano de Europa occidental),407083486,LIC. EN DERECHO,Liberación Articulo 91
|
||||
369,0000-00-00,0000-00-00,Tue Sep 24 2024 19:23:08 GMT+0100 (hora de verano de Europa occidental),099046200,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
207,0000-00-00,0000-00-00,Fri Feb 17 2023 13:21:21 GMT+0000 (hora estándar de Europa occidental),096537059,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
46,0000-00-00,0000-00-00,Sun Aug 29 2021 17:50:03 GMT+0100 (hora de verano de Europa occidental),313098228,LIC. EN DERECHO,Liberación Articulo 91
|
||||
270,0000-00-00,0000-00-00,Thu Aug 31 2023 19:55:18 GMT+0100 (hora de verano de Europa occidental),087264904,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
107,0000-00-00,0000-00-00,Wed Feb 02 2022 19:50:24 GMT+0000 (hora estándar de Europa occidental),415104140,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
334,0000-00-00,0000-00-00,Wed Jun 19 2024 18:27:49 GMT+0100 (hora de verano de Europa occidental),315035438,LIC. EN DERECHO,Liberación Articulo 91
|
||||
171,0000-00-00,0000-00-00,Fri Aug 26 2022 14:22:16 GMT+0100 (hora de verano de Europa occidental),313109809,LIC. EN DERECHO,Liberación Articulo 91
|
||||
398,0000-00-00,0000-00-00,Tue Feb 11 2025 19:34:02 GMT+0000 (hora estándar de Europa occidental),313276026,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
11,0000-00-00,0000-00-00,Fri Apr 23 2021 21:55:44 GMT+0100 (hora de verano de Europa occidental),416127573,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
238,0000-00-00,0000-00-00,Fri May 19 2023 00:36:46 GMT+0100 (hora de verano de Europa occidental),418132962,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
75,0000-00-00,0000-00-00,Thu Nov 11 2021 15:23:13 GMT+0000 (hora estándar de Europa occidental),415122616,LIC. EN DERECHO,Liberación Articulo 91
|
||||
302,0000-00-00,0000-00-00,Thu Feb 08 2024 16:42:40 GMT+0000 (hora estándar de Europa occidental),313134793,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
139,0000-00-00,0000-00-00,Tue May 24 2022 16:25:50 GMT+0100 (hora de verano de Europa occidental),309062668,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
366,0000-00-00,0000-00-00,Tue Sep 17 2024 13:30:38 GMT+0100 (hora de verano de Europa occidental),415126944,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
204,0000-00-00,0000-00-00,Thu Feb 09 2023 20:48:08 GMT+0000 (hora estándar de Europa occidental),302234910,LIC. EN DERECHO,Liberación Articulo 91
|
||||
43,0000-00-00,0000-00-00,Tue Aug 17 2021 16:16:01 GMT+0100 (hora de verano de Europa occidental),418133402,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 52
|
||||
104,0000-00-00,0000-00-00,Thu Jan 27 2022 20:37:29 GMT+0000 (hora estándar de Europa occidental),079548676,LIC. EN DERECHO,Liberación Articulo 52
|
||||
331,0000-00-00,0000-00-00,Thu Jun 06 2024 19:45:04 GMT+0100 (hora de verano de Europa occidental),420097215,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
168,0000-00-00,0000-00-00,Mon Aug 22 2022 12:25:40 GMT+0100 (hora de verano de Europa occidental),419139483,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
395,0000-00-00,0000-00-00,Thu Feb 06 2025 12:29:32 GMT+0000 (hora estándar de Europa occidental),316208200,LIC. EN DERECHO,Liberación Articulo 91
|
||||
8,0000-00-00,0000-00-00,Fri Apr 16 2021 00:05:33 GMT+0100 (hora de verano de Europa occidental),313302574,LIC. EN DERECHO,Liberación Articulo 91
|
||||
234,0000-00-00,0000-00-00,Fri May 05 2023 15:27:33 GMT+0100 (hora de verano de Europa occidental),300146938,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
72,0000-00-00,0000-00-00,Tue Nov 09 2021 16:29:53 GMT+0000 (hora estándar de Europa occidental),415154657,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
299,0000-00-00,0000-00-00,Tue Jan 30 2024 20:49:55 GMT+0000 (hora estándar de Europa occidental),316281834,LIC. EN DERECHO,Liberación Articulo 91
|
||||
136,0000-00-00,0000-00-00,Fri May 06 2022 13:26:46 GMT+0100 (hora de verano de Europa occidental),407096703,LIC. EN LENGUA Y LITERATURA HISPANICAS,Liberación Articulo 91
|
||||
363,0000-00-00,0000-00-00,Thu Sep 12 2024 17:50:46 GMT+0100 (hora de verano de Europa occidental),075695431,LIC. EN DERECHO,Liberación Articulo 52
|
||||
201,0000-00-00,0000-00-00,Tue Feb 07 2023 20:11:52 GMT+0000 (hora estándar de Europa occidental),313029846,LIC. EN DERECHO,Liberación Articulo 91
|
||||
429,0000-00-00,0000-00-00,Thu Jan 29 2026 09:36:15 GMT+0000 (hora estándar de Europa occidental),321120188,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 52
|
||||
40,0000-00-00,0000-00-00,Fri Aug 13 2021 14:41:57 GMT+0100 (hora de verano de Europa occidental),097438241,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
267,0000-00-00,0000-00-00,Wed Aug 30 2023 18:48:22 GMT+0100 (hora de verano de Europa occidental),303251925,LIC. EN HISTORIA,Liberación Articulo 91
|
||||
328,0000-00-00,0000-00-00,Thu Jun 06 2024 15:55:17 GMT+0100 (hora de verano de Europa occidental),315268810,LIC. EN DERECHO,Liberación Articulo 91
|
||||
165,0000-00-00,0000-00-00,Tue Aug 09 2022 18:26:51 GMT+0100 (hora de verano de Europa occidental),418079681,LIC. EN HISTORIA,Liberación Articulo 91
|
||||
392,0000-00-00,0000-00-00,Mon Jan 13 2025 19:38:19 GMT+0000 (hora estándar de Europa occidental),304299483,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
5,0000-00-00,0000-00-00,Tue Apr 13 2021 00:23:21 GMT+0100 (hora de verano de Europa occidental),313083608,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
231,0000-00-00,0000-00-00,Thu Apr 27 2023 15:07:15 GMT+0100 (hora de verano de Europa occidental),420094379,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
69,0000-00-00,0000-00-00,Tue Nov 02 2021 22:51:11 GMT+0000 (hora estándar de Europa occidental),097510789,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
296,0000-00-00,0000-00-00,Thu Jan 18 2024 18:28:57 GMT+0000 (hora estándar de Europa occidental),419160692,LIC. ENSEÑANZA DE ALEMÁN (LENG. EXTRANJS,Liberación Articulo 52
|
||||
133,0000-00-00,0000-00-00,Tue Apr 26 2022 20:04:19 GMT+0100 (hora de verano de Europa occidental),313354432,LIC. EN DERECHO,Liberación Articulo 91
|
||||
360,0000-00-00,0000-00-00,Wed Sep 11 2024 12:55:43 GMT+0100 (hora de verano de Europa occidental),309003423,LIC. EN HISTORIA,Liberación Articulo 91
|
||||
198,0000-00-00,0000-00-00,Mon Jan 30 2023 12:10:18 GMT+0000 (hora estándar de Europa occidental),420175494,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
424,0000-00-00,0000-00-00,Mon Jun 16 2025 16:51:16 GMT+0100 (hora de verano de Europa occidental),416099777,LIC. EN DERECHO,Liberación Articulo 91
|
||||
37,0000-00-00,0000-00-00,Wed Aug 04 2021 15:00:27 GMT+0100 (hora de verano de Europa occidental),416057173,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
264,0000-00-00,0000-00-00,Mon Aug 28 2023 14:06:00 GMT+0100 (hora de verano de Europa occidental),078110089,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
101,0000-00-00,0000-00-00,Wed Jan 26 2022 08:16:18 GMT+0000 (hora estándar de Europa occidental),300288223,LIC. EN DERECHO,Liberación Articulo 91
|
||||
|
@@ -0,0 +1,425 @@
|
||||
idCasoEspecial,fechaInicio,fechaFin,fechaCreacion,num_cuenta,carrera,status
|
||||
325,"","",27/5/2024,316094346,LIC. EN DERECHO,Liberación Articulo 91
|
||||
162,"","",4/8/2022,417076278,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
389,"","",6/1/2025,315014318,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
2,"","",5/4/2021,310283926,LIC. EN DERECHO,Liberación Articulo 91
|
||||
227,"","",12/4/2023,314021946,LIC. EN DERECHO,Liberación Articulo 91
|
||||
66,"","",1/11/2021,314030564,LIC. EN DERECHO,Liberación Articulo 91
|
||||
293,"","",11/12/2023,311252617,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
130,"","",21/4/2022,096565865,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
357,"","",9/9/2024,318058795,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
194,"","",10/1/2023,092343553,LIC. EN DERECHO,Liberación Articulo 91
|
||||
421,"","",28/5/2025,304312676,LIC. EN DERECHO,Liberación Articulo 91
|
||||
34,"","",29/7/2021,417068516,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
261,"","",17/8/2023,420157832,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
98,"","",13/1/2022,415018371,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
159,"","",1/8/2022,419079615,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
386,"","",27/11/2024,314292254,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
224,"","",30/3/2023,420087638,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
63,"","",7/10/2021,313280632,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
290,"","",23/11/2023,420095280,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
127,"","",4/4/2022,416017920,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
354,"","",3/9/2024,312315056,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
191,"","",8/12/2022,314077613,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
418,"","",2/5/2025,421061561,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
31,"","",28/6/2021,312353559,LIC. EN DERECHO,Liberación Articulo 91
|
||||
258,"","",9/8/2023,309005733,LIC. EN DERECHO,Liberación Articulo 91
|
||||
95,"","",15/12/2021,310339061,LIC. EN DERECHO,Liberación Articulo 91
|
||||
322,"","",29/4/2024,078057461,LIC. EN COMUNICACION,Liberación Articulo 52
|
||||
383,"","",25/11/2024,306168046,LIC. EN DERECHO,Liberación Articulo 91
|
||||
221,"","",28/3/2023,314156765,LIC. EN DERECHO,Liberación Articulo 91
|
||||
60,"","",27/9/2021,088166715,LIC. EN DERECHO,Liberación Articulo 91
|
||||
287,"","",15/11/2023,416022320,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
124,"","",29/3/2022,419145622,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
351,"","",13/8/2024,313339754,LIC. EN DERECHO,Liberación Articulo 91
|
||||
188,"","",6/12/2022,308240322,LIC. EN DERECHO,Liberación Articulo 91
|
||||
415,"","",21/4/2025,314198479,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
28,"","",23/6/2021,416142897,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
255,"","",9/8/2023,418129425,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
92,"","",13/12/2021,314197252,LIC. EN DERECHO,Liberación Articulo 91
|
||||
319,"","",24/4/2024,080078003,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 52
|
||||
156,"","",26/7/2022,400002044,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
380,"","",11/11/2024,308340130,LIC. EN DERECHO,Liberación Articulo 91
|
||||
218,"","",28/3/2023,420090890,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
57,"","",23/9/2021,315274554,LIC. EN DERECHO,Liberación Articulo 91
|
||||
284,"","",9/11/2023,313140547,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
121,"","",29/3/2022,312261018,LIC. EN DERECHO,Liberación Articulo 91
|
||||
348,"","",6/8/2024,315270738,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
185,"","",17/11/2022,410023848,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
412,"","",2/4/2025,418240913,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
25,"","",1/6/2021,304238268,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
252,"","",3/8/2023,077025506,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
89,"","",4/12/2021,415126999,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
316,"","",22/4/2024,315033939,LIC. EN DERECHO,Liberación Articulo 91
|
||||
153,"","",22/6/2022,098129742,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
215,"","",13/3/2023,317199121,LIC. EN DERECHO,Liberación Articulo 91
|
||||
54,"","",23/9/2021,314047339,LIC. EN INGENIERIA CIVIL,Liberación Articulo 91
|
||||
281,"","",31/10/2023,417127820,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
118,"","",8/3/2022,416045853,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
345,"","",26/7/2024,080083063,LIC. EN MAT. APLICADAS Y COMPUTACION,Liberación Articulo 52
|
||||
182,"","",25/10/2022,316156596,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
409,"","",25/3/2025,310245038,LIC. EN DERECHO,Liberación Articulo 91
|
||||
22,"","",21/5/2021,098029453,LIC. EN DERECHO,Liberación Articulo 91
|
||||
249,"","",15/6/2023,315321658,LIC. EN DERECHO,Liberación Articulo 91
|
||||
86,"","",1/12/2021,315200397,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
313,"","",21/3/2024,417084332,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
150,"","",20/6/2022,313183193,LIC. EN DERECHO,Liberación Articulo 91
|
||||
377,"","",15/10/2024,307312606,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
51,"","",4/9/2021,312122339,LIC. EN DERECHO,Liberación Articulo 91
|
||||
278,"","",3/10/2023,309219972,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
115,"","",23/2/2022,311340686,LIC. EN DERECHO,Liberación Articulo 91
|
||||
342,"","",23/7/2024,077069379,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
179,"","",14/10/2022,309259754,LIC. EN DERECHO,Liberación Articulo 91
|
||||
406,"","",19/3/2025,419150974,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
19,"","",6/5/2021,416034035,LIC. EN DERECHO,Liberación Articulo 91
|
||||
246,"","",3/6/2023,416114029,LIC. EN HISTORIA,Liberación Articulo 91
|
||||
83,"","",25/11/2021,418141494,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
310,"","",8/3/2024,420082176,LIC. EN DERECHO,Liberación Articulo 91
|
||||
147,"","",14/6/2022,310227311,LIC. EN DERECHO,Liberación Articulo 91
|
||||
374,"","",4/10/2024,313155064,LIC. EN DERECHO,Liberación Articulo 91
|
||||
212,"","",2/3/2023,418076738,LIC. EN DERECHO,Liberación Articulo 91
|
||||
48,"","",31/8/2021,313088988,LIC. EN DERECHO,Liberación Articulo 91
|
||||
275,"","",19/9/2023,416114531,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
112,"","",8/2/2022,415153753,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
339,"","",26/6/2024,402027539,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
176,"","",8/9/2022,418149524,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
403,"","",25/2/2025,421123797,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
16,"","",29/4/2021,412039571,LIC. EN DERECHO,Liberación Articulo 91
|
||||
243,"","",31/5/2023,312271736,LIC. EN DERECHO,Liberación Articulo 91
|
||||
80,"","",19/11/2021,312090920,LIC. EN DERECHO,Liberación Articulo 91
|
||||
307,"","",28/2/2024,311118885,LIC. EN DERECHO,Liberación Articulo 91
|
||||
144,"","",9/6/2022,311083640,LIC. EN DERECHO,Liberación Articulo 91
|
||||
371,"","",25/9/2024,313096987,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
209,"","",20/2/2023,313279742,LIC. EN DERECHO,Liberación Articulo 91
|
||||
272,"","",6/9/2023,421096369,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 52
|
||||
109,"","",2/2/2022,406075453,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
336,"","",24/6/2024,072377491,LIC. EN PERIODISMO Y COMUNICACION COL.,Liberación Articulo 91
|
||||
173,"","",7/9/2022,098025709,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
400,"","",17/2/2025,410050808,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
13,"","",27/4/2021,414141612,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
240,"","",24/5/2023,412125340,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
77,"","",18/11/2021,312177061,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
304,"","",22/2/2024,300046577,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
141,"","",25/5/2022,312164603,LIC. EN DERECHO,Liberación Articulo 91
|
||||
368,"","",24/9/2024,419133797,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
206,"","",16/2/2023,083104378,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
45,"","",27/8/2021,418146303,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
106,"","",1/2/2022,087380985,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
333,"","",10/6/2024,317123757,LIC. EN DERECHO,Liberación Articulo 91
|
||||
170,"","",24/8/2022,317300424,LIC. EN COMUNICACION,Liberación Articulo 52
|
||||
397,"","",11/2/2025,413117203,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
10,"","",19/4/2021,076935437,LIC. EN ARQUITECTURA,Liberación Articulo 52
|
||||
237,"","",18/5/2023,416045217,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
74,"","",10/11/2021,312291859,LIC. EN DERECHO,Liberación Articulo 91
|
||||
301,"","",8/2/2024,416060933,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
138,"","",24/5/2022,077990677,LIC. EN DERECHO,Liberación Articulo 52
|
||||
365,"","",12/9/2024,310089144,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
203,"","",7/2/2023,083519006,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
42,"","",16/8/2021,418146671,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
269,"","",30/8/2023,315123342,LIC. EN DERECHO,Liberación Articulo 91
|
||||
103,"","",26/1/2022,075688707,LIC. EN DERECHO,Liberación Articulo 52
|
||||
330,"","",6/6/2024,416052831,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
167,"","",22/8/2022,311010648,LIC. EN DERECHO,Liberación Articulo 91
|
||||
394,"","",24/1/2025,313328802,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
7,"","",13/4/2021,314199586,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
233,"","",5/5/2023,417116923,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
71,"","",9/11/2021,416111248,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
298,"","",23/1/2024,315207554,LIC. EN DERECHO,Liberación Articulo 91
|
||||
135,"","",6/5/2022,316119612,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
362,"","",12/9/2024,314290102,LIC. EN DERECHO,Liberación Articulo 91
|
||||
200,"","",31/1/2023,312204073,LIC. EN DERECHO,Liberación Articulo 91
|
||||
428,"","",29/1/2026,413109778,LIC. EN INGENIERIA CIVIL,Liberación Articulo 91
|
||||
39,"","",11/8/2021,416081493,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
266,"","",30/8/2023,419082080,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
327,"","",6/6/2024,310093509,LIC. EN DERECHO,Liberación Articulo 91
|
||||
164,"","",4/8/2022,085084333,LIC. EN PERIODISMO Y COMUNICACION COL.,Liberación Articulo 91
|
||||
391,"","",7/1/2025,309133852,LIC. EN DERECHO,Liberación Articulo 91
|
||||
4,"","",8/4/2021,315149601,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
230,"","",18/4/2023,312200556,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
68,"","",2/11/2021,311137633,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
295,"","",16/1/2024,311223385,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
132,"","",26/4/2022,300073805,LIC. EN DERECHO,Liberación Articulo 91
|
||||
359,"","",11/9/2024,413043207,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
197,"","",23/1/2023,309006541,LIC. EN DERECHO,Liberación Articulo 91
|
||||
423,"","",10/6/2025,082069522,LIC. EN DERECHO,Liberación Articulo 52
|
||||
36,"","",4/8/2021,314013033,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
263,"","",21/8/2023,085318908,LIC. EN PERIODISMO Y COMUNICACION COL.,Liberación Articulo 91
|
||||
100,"","",25/1/2022,405111145,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 52
|
||||
161,"","",4/8/2022,314210830,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
388,"","",10/12/2024,419086882,LIC. EN FILOSOFIA,Liberación Articulo 91
|
||||
1,"","",5/4/2021,418091447,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
226,"","",12/4/2023,300184929,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
65,"","",26/10/2021,311666630,LIC. EN DERECHO,Liberación Articulo 91
|
||||
292,"","",30/11/2023,315104518,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
129,"","",20/4/2022,312237750,LIC. EN DERECHO,Liberación Articulo 91
|
||||
356,"","",6/9/2024,110001708,LIC. EN DERECHO,Liberación Articulo 91
|
||||
193,"","",10/1/2023,314353562,LIC. EN DERECHO,Liberación Articulo 91
|
||||
420,"","",19/5/2025,313263981,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
33,"","",27/7/2021,304272385,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
260,"","",14/8/2023,315534560,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
97,"","",11/1/2022,300052644,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
324,"","",14/5/2024,093561806,LIC. ENSEÑANZA DE ALEMÁN (LENG. EXTRANJS,Liberación Articulo 91
|
||||
158,"","",26/7/2022,305141770,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
385,"","",25/11/2024,311534795,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
223,"","",30/3/2023,310004633,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
62,"","",7/10/2021,097260972,LIC. EN DERECHO,Liberación Articulo 91
|
||||
289,"","",23/11/2023,402086437,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
126,"","",29/3/2022,313025903,LIC. EN DERECHO,Liberación Articulo 91
|
||||
353,"","",22/8/2024,408101691,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 52
|
||||
190,"","",8/12/2022,418145973,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
417,"","",30/4/2025,419088312,LIC. EN DERECHO,Liberación Articulo 91
|
||||
30,"","",25/6/2021,311215427,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
257,"","",9/8/2023,418139356,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
94,"","",14/12/2021,309085043,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
321,"","",29/4/2024,316185907,LIC. EN DERECHO,Liberación Articulo 91
|
||||
382,"","",13/11/2024,093127822,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
220,"","",28/3/2023,077397708,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
59,"","",24/9/2021,309086411,LIC. EN DERECHO,Liberación Articulo 91
|
||||
286,"","",15/11/2023,421081952,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
123,"","",29/3/2022,312330538,LIC. EN DERECHO,Liberación Articulo 91
|
||||
350,"","",12/8/2024,421050578,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
187,"","",5/12/2022,088156509,LIC. EN DERECHO,Liberación Articulo 52
|
||||
414,"","",8/4/2025,419161077,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
27,"","",14/6/2021,313300549,LIC. EN DERECHO,Liberación Articulo 91
|
||||
254,"","",9/8/2023,417006916,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
91,"","",13/12/2021,311160956,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
318,"","",23/4/2024,316216656,LIC. EN DISEÑO GRAFICO,Liberación Articulo 91
|
||||
155,"","",26/7/2022,417069630,LIC. EN DERECHO,Liberación Articulo 91
|
||||
217,"","",22/3/2023,310273363,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
56,"","",23/9/2021,417003915,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
283,"","",9/11/2023,314104182,LIC. EN DERECHO,Liberación Articulo 91
|
||||
120,"","",16/3/2022,082570792,LIC. EN DERECHO,Liberación Articulo 52
|
||||
347,"","",6/8/2024,307014843,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
184,"","",26/10/2022,311339150,LIC. EN DERECHO,Liberación Articulo 91
|
||||
411,"","",2/4/2025,079386065,LIC. EN FILOSOFIA,Liberación Articulo 91
|
||||
24,"","",31/5/2021,418080636,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
251,"","",1/8/2023,407108161,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
88,"","",1/12/2021,417007353,LIC. EN DERECHO,Liberación Articulo 91
|
||||
315,"","",18/4/2024,308227662,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
152,"","",21/6/2022,077362474,LIC. EN DERECHO,Liberación Articulo 52
|
||||
379,"","",8/11/2024,312193083,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
214,"","",13/3/2023,418156131,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
53,"","",23/9/2021,415073604,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
280,"","",31/10/2023,305056063,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
117,"","",7/3/2022,096344899,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
344,"","",25/7/2024,316068297,LIC. EN DERECHO,Liberación Articulo 91
|
||||
181,"","",18/10/2022,312021603,LIC. EN DERECHO,Liberación Articulo 91
|
||||
408,"","",24/3/2025,421111240,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
21,"","",14/5/2021,094270749,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
248,"","",15/6/2023,417040095,LIC. EN DERECHO,Liberación Articulo 91
|
||||
85,"","",29/11/2021,303570190,LIC. EN DERECHO,Liberación Articulo 91
|
||||
312,"","",19/3/2024,312288257,LIC. EN DERECHO,Liberación Articulo 91
|
||||
149,"","",16/6/2022,416145324,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
376,"","",15/10/2024,309273473,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
50,"","",2/9/2021,305003689,LIC. EN DERECHO,Liberación Articulo 91
|
||||
277,"","",2/10/2023,090280180,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
114,"","",23/2/2022,418075906,LIC. EN HISTORIA,Liberación Articulo 52
|
||||
341,"","",22/7/2024,090377200,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
178,"","",26/9/2022,303135078,LIC. EN DERECHO,Liberación Articulo 91
|
||||
405,"","",12/3/2025,419240545,LIC. EN DERECHO,Liberación Articulo 91
|
||||
18,"","",4/5/2021,309260606,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
245,"","",3/6/2023,311033906,LIC. EN DERECHO,Liberación Articulo 91
|
||||
82,"","",23/11/2021,308100392,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
309,"","",5/3/2024,313023071,LIC. EN DERECHO,Liberación Articulo 91
|
||||
146,"","",10/6/2022,306020285,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
373,"","",4/10/2024,077172033,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 52
|
||||
211,"","",27/2/2023,310284404,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
47,"","",30/8/2021,305202222,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
274,"","",19/9/2023,418130449,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
111,"","",4/2/2022,094045459,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
338,"","",25/6/2024,076998852,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 52
|
||||
175,"","",7/9/2022,418085143,LIC. EN DERECHO,Liberación Articulo 91
|
||||
402,"","",20/2/2025,306316357,LIC. EN DERECHO,Liberación Articulo 91
|
||||
15,"","",27/4/2021,314015893,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
242,"","",29/5/2023,073276005,LIC. EN DERECHO,Liberación Articulo 52
|
||||
79,"","",18/11/2021,068644170,LIC. EN DERECHO,Liberación Articulo 52
|
||||
306,"","",23/2/2024,313257436,LIC. EN DERECHO,Liberación Articulo 91
|
||||
143,"","",7/6/2022,314077156,LIC. EN DERECHO,Liberación Articulo 91
|
||||
370,"","",25/9/2024,311120514,LIC. EN DERECHO,Liberación Articulo 91
|
||||
208,"","",17/2/2023,418085796,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
271,"","",5/9/2023,404008804,LIC. EN MAT. APLICADAS Y COMPUTACION,Liberación Articulo 91
|
||||
108,"","",2/2/2022,088152831,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
335,"","",20/6/2024,307046059,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
172,"","",1/9/2022,418075724,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
399,"","",17/2/2025,413074863,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
12,"","",23/4/2021,404101008,LIC. EN DERECHO,Liberación Articulo 91
|
||||
239,"","",19/5/2023,308061565,LIC. EN DERECHO,Liberación Articulo 91
|
||||
76,"","",12/11/2021,304301229,LIC. EN DISEÑO GRAFICO,Liberación Articulo 91
|
||||
303,"","",22/2/2024,314106739,LIC. EN DERECHO,Liberación Articulo 91
|
||||
140,"","",24/5/2022,079074335,LIC. EN ARQUITECTURA,Liberación Articulo 52
|
||||
367,"","",17/9/2024,314348038,LIC. EN DERECHO,Liberación Articulo 91
|
||||
205,"","",16/2/2023,316320661,LIC. EN ACTUARIA,Liberación Articulo 91
|
||||
44,"","",22/8/2021,096121609,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
105,"","",1/2/2022,300229239,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
332,"","",10/6/2024,316097316,LIC. EN DERECHO,Liberación Articulo 91
|
||||
169,"","",22/8/2022,410070859,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
396,"","",6/2/2025,302164730,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
9,"","",19/4/2021,313080535,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
236,"","",11/5/2023,418087886,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
73,"","",10/11/2021,418087226,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
300,"","",8/2/2024,420155027,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
137,"","",11/5/2022,418146468,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
364,"","",12/9/2024,302306046,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
202,"","",7/2/2023,420083379,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
41,"","",16/8/2021,417114682,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
268,"","",30/8/2023,087365111,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
102,"","",26/1/2022,410014536,LIC. EN DERECHO,Liberación Articulo 91
|
||||
329,"","",6/6/2024,315146813,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
166,"","",19/8/2022,309200952,LIC. EN DERECHO,Liberación Articulo 91
|
||||
393,"","",22/1/2025,418153862,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
6,"","",13/4/2021,304237223,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
232,"","",4/5/2023,415115535,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
70,"","",4/11/2021,311341724,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
297,"","",23/1/2024,420087164,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
134,"","",26/4/2022,311106754,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
361,"","",12/9/2024,419133948,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
199,"","",30/1/2023,314104632,LIC. EN DERECHO,Liberación Articulo 91
|
||||
427,"","",24/1/2026,422016698,LIC. EN PEDAGOGÍA,Liberación Articulo 52
|
||||
38,"","",9/8/2021,312201106,LIC. EN DERECHO,Liberación Articulo 91
|
||||
265,"","",28/8/2023,415110231,LIC. EN DERECHO,Liberación Articulo 91
|
||||
326,"","",28/5/2024,315115824,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
163,"","",4/8/2022,312187064,LIC. EN DERECHO,Liberación Articulo 91
|
||||
390,"","",6/1/2025,408052294,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
3,"","",7/4/2021,413026996,LIC. EN DERECHO,Liberación Articulo 91
|
||||
228,"","",17/4/2023,315016824,LIC. EN DERECHO,Liberación Articulo 91
|
||||
67,"","",1/11/2021,098593495,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
294,"","",13/12/2023,420095754,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
131,"","",22/4/2022,094040117,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
358,"","",10/9/2024,302282557,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
196,"","",10/1/2023,413080442,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
422,"","",5/6/2025,315014095,LIC. EN ECONOMIA,Liberación Articulo 91
|
||||
35,"","",2/8/2021,312267797,LIC. EN DERECHO,Liberación Articulo 91
|
||||
262,"","",17/8/2023,315153365,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
99,"","",21/1/2022,307076632,LIC. EN ARQUITECTURA,Liberación Articulo 91
|
||||
160,"","",1/8/2022,415002486,LIC. EN DERECHO,Liberación Articulo 91
|
||||
387,"","",2/12/2024,080072836,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
225,"","",11/4/2023,315201370,LIC. EN DERECHO,Liberación Articulo 91
|
||||
64,"","",18/10/2021,313340998,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
291,"","",28/11/2023,309277419,LIC. EN DERECHO,Liberación Articulo 91
|
||||
128,"","",20/4/2022,418075528,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
355,"","",3/9/2024,316155348,LIC. EN DERECHO,Liberación Articulo 91
|
||||
192,"","",5/1/2023,414079672,LIC. EN INGENIERIA CIVIL,Liberación Articulo 91
|
||||
419,"","",13/5/2025,317087440,LIC. EN DISEÑO GRAFICO,Liberación Articulo 91
|
||||
32,"","",27/7/2021,416119938,LIC. EN DERECHO,Liberación Articulo 91
|
||||
259,"","",10/8/2023,090110838,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 91
|
||||
96,"","",11/1/2022,069157567,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
323,"","",13/5/2024,421017537,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
157,"","",26/7/2022,414082315,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
384,"","",25/11/2024,317022760,LIC. EN DERECHO,Liberación Articulo 91
|
||||
222,"","",28/3/2023,417071826,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
61,"","",29/9/2021,416101513,LIC. EN DERECHO,Liberación Articulo 91
|
||||
288,"","",16/11/2023,418078048,LIC. EN DERECHO,Liberación Articulo 91
|
||||
125,"","",29/3/2022,401032273,LIC. EN PEDAGOGÍA,Liberación Articulo 91
|
||||
352,"","",16/8/2024,315020997,LIC. EN DERECHO,Liberación Articulo 91
|
||||
189,"","",8/12/2022,411092742,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
416,"","",21/4/2025,415041412,LIC. EN DERECHO,Liberación Articulo 91
|
||||
29,"","",25/6/2021,314100232,LIC. EN DERECHO,Liberación Articulo 91
|
||||
256,"","",9/8/2023,315012967,LIC. EN INGENIERIA CIVIL,Liberación Articulo 91
|
||||
93,"","",13/12/2021,071145680,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
320,"","",29/4/2024,416113022,LIC. EN DERECHO,Liberación Articulo 91
|
||||
381,"","",12/11/2024,313038921,LIC. EN DERECHO,Liberación Articulo 91
|
||||
219,"","",28/3/2023,416085886,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
58,"","",23/9/2021,094059601,LIC. EN PERIODISMO Y COMUNICACION COL.,Liberación Articulo 91
|
||||
285,"","",13/11/2023,421014024,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
122,"","",29/3/2022,313241132,LIC. EN DERECHO,Liberación Articulo 91
|
||||
349,"","",8/8/2024,404065416,LIC. EN HISTORIA,Liberación Articulo 52
|
||||
186,"","",2/12/2022,419082808,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
413,"","",8/4/2025,095072670,LIC. EN DERECHO,Liberación Articulo 91
|
||||
26,"","",7/6/2021,305328818,LIC. EN DERECHO,Liberación Articulo 91
|
||||
253,"","",3/8/2023,312331607,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
90,"","",6/12/2021,311340466,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
317,"","",23/4/2024,418078330,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
154,"","",29/6/2022,310156275,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
216,"","",16/3/2023,314336024,LIC. EN DERECHO,Liberación Articulo 91
|
||||
55,"","",23/9/2021,314138873,LIC. EN DERECHO,Liberación Articulo 91
|
||||
282,"","",6/11/2023,417109268,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
119,"","",15/3/2022,071051372,LIC. EN DERECHO,Liberación Articulo 52
|
||||
346,"","",26/7/2024,082065782,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
183,"","",26/10/2022,308200090,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
410,"","",25/3/2025,314065379,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
23,"","",22/5/2021,314123868,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
250,"","",15/6/2023,301241414,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
87,"","",1/12/2021,312138080,LIC. EN DERECHO,Liberación Articulo 91
|
||||
314,"","",1/4/2024,414139622,LIC. EN RELACIONES INTERNACIONALES (SUA),Liberación Articulo 91
|
||||
151,"","",21/6/2022,419078780,LIC. EN DERECHO,Liberación Articulo 91
|
||||
378,"","",21/10/2024,318330134,LIC. EN DERECHO,Liberación Articulo 91
|
||||
213,"","",7/3/2023,420087865,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
52,"","",14/9/2021,305340351,LIC. EN DERECHO,Liberación Articulo 91
|
||||
279,"","",30/10/2023,315198063,LIC. EN DERECHO,Liberación Articulo 91
|
||||
116,"","",23/2/2022,417013949,LIC. EN DERECHO,Liberación Articulo 91
|
||||
343,"","",24/7/2024,313126251,LIC. EN DERECHO,Liberación Articulo 91
|
||||
180,"","",14/10/2022,312015457,LIC. EN DERECHO,Liberación Articulo 91
|
||||
407,"","",20/3/2025,312056023,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
20,"","",13/5/2021,415147552,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
247,"","",13/6/2023,315261880,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
84,"","",25/11/2021,314194536,LIC. EN DERECHO,Liberación Articulo 91
|
||||
311,"","",12/3/2024,314142726,LIC. EN DERECHO,Liberación Articulo 91
|
||||
148,"","",14/6/2022,311251885,LIC. EN DERECHO,Liberación Articulo 91
|
||||
375,"","",14/10/2024,311303836,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
49,"","",1/9/2021,078579394,LIC. EN DERECHO,Liberación Articulo 52
|
||||
276,"","",2/10/2023,419157605,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
113,"","",9/2/2022,314209627,LIC. EN DERECHO,Liberación Articulo 91
|
||||
340,"","",22/7/2024,316316615,LIC. EN DERECHO,Liberación Articulo 91
|
||||
177,"","",8/9/2022,310169585,LIC. EN DERECHO,Liberación Articulo 91
|
||||
404,"","",3/3/2025,083491942,LIC. EN DERECHO,Liberación Articulo 52
|
||||
17,"","",29/4/2021,314272571,LIC. EN DERECHO,Liberación Articulo 91
|
||||
244,"","",3/6/2023,090105854,LIC. EN DERECHO,Liberación Articulo 91
|
||||
81,"","",19/11/2021,417086082,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
308,"","",28/2/2024,314178693,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
145,"","",10/6/2022,086058122,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
372,"","",26/9/2024,314288569,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
210,"","",20/2/2023,310286044,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
273,"","",11/9/2023,314273097,LIC. EN LENGUA Y LITERATURA HISPANICAS,Liberación Articulo 91
|
||||
110,"","",2/2/2022,416061789,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
337,"","",25/6/2024,300065875,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
174,"","",7/9/2022,412069996,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
401,"","",17/2/2025,099087450,LIC. EN DERECHO,Liberación Articulo 91
|
||||
14,"","",27/4/2021,302088634,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
241,"","",24/5/2023,314142355,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
78,"","",18/11/2021,313025099,LIC. EN DERECHO,Liberación Articulo 91
|
||||
305,"","",23/2/2024,308116964,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
142,"","",7/6/2022,407083486,LIC. EN DERECHO,Liberación Articulo 91
|
||||
369,"","",24/9/2024,099046200,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
207,"","",17/2/2023,096537059,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
46,"","",29/8/2021,313098228,LIC. EN DERECHO,Liberación Articulo 91
|
||||
270,"","",31/8/2023,087264904,LIC. EN CIENCIAS POLITICAS Y ADMON.PUBL.,Liberación Articulo 91
|
||||
107,"","",2/2/2022,415104140,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
334,"","",19/6/2024,315035438,LIC. EN DERECHO,Liberación Articulo 91
|
||||
171,"","",26/8/2022,313109809,LIC. EN DERECHO,Liberación Articulo 91
|
||||
398,"","",11/2/2025,313276026,LIC. EN RELACIONES INTERNACIONALES,Liberación Articulo 91
|
||||
11,"","",23/4/2021,416127573,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
238,"","",19/5/2023,418132962,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
75,"","",11/11/2021,415122616,LIC. EN DERECHO,Liberación Articulo 91
|
||||
302,"","",8/2/2024,313134793,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
139,"","",24/5/2022,309062668,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
366,"","",17/9/2024,415126944,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
204,"","",9/2/2023,302234910,LIC. EN DERECHO,Liberación Articulo 91
|
||||
43,"","",17/8/2021,418133402,LIC. ENSEÑANZA DE ESPAÑOL(LENG. EXTRANJ),Liberación Articulo 52
|
||||
104,"","",27/1/2022,079548676,LIC. EN DERECHO,Liberación Articulo 52
|
||||
331,"","",6/6/2024,420097215,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
168,"","",22/8/2022,419139483,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
395,"","",6/2/2025,316208200,LIC. EN DERECHO,Liberación Articulo 91
|
||||
8,"","",16/4/2021,313302574,LIC. EN DERECHO,Liberación Articulo 91
|
||||
234,"","",5/5/2023,300146938,LIC. EN COMUNICACION,Liberación Articulo 91
|
||||
72,"","",9/11/2021,415154657,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
299,"","",30/1/2024,316281834,LIC. EN DERECHO,Liberación Articulo 91
|
||||
136,"","",6/5/2022,407096703,LIC. EN LENGUA Y LITERATURA HISPANICAS,Liberación Articulo 91
|
||||
363,"","",12/9/2024,075695431,LIC. EN DERECHO,Liberación Articulo 52
|
||||
201,"","",7/2/2023,313029846,LIC. EN DERECHO,Liberación Articulo 91
|
||||
429,"","",29/1/2026,321120188,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 52
|
||||
40,"","",13/8/2021,097438241,LIC. EN SOCIOLOGIA,Liberación Articulo 91
|
||||
267,"","",30/8/2023,303251925,LIC. EN HISTORIA,Liberación Articulo 91
|
||||
328,"","",6/6/2024,315268810,LIC. EN DERECHO,Liberación Articulo 91
|
||||
165,"","",9/8/2022,418079681,LIC. EN HISTORIA,Liberación Articulo 91
|
||||
392,"","",13/1/2025,304299483,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
5,"","",13/4/2021,313083608,LIC. EN MATEMATICAS APLICADAS Y COMP.,Liberación Articulo 91
|
||||
231,"","",27/4/2023,420094379,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
69,"","",2/11/2021,097510789,LIC. ENSEÑANZA DE INGLÉS(LENG. EXTRANJE),Liberación Articulo 91
|
||||
296,"","",18/1/2024,419160692,LIC. ENSEÑANZA DE ALEMÁN (LENG. EXTRANJS,Liberación Articulo 52
|
||||
133,"","",26/4/2022,313354432,LIC. EN DERECHO,Liberación Articulo 91
|
||||
360,"","",11/9/2024,309003423,LIC. EN HISTORIA,Liberación Articulo 91
|
||||
198,"","",30/1/2023,420175494,LIC. EN DERECHO (SUA),Liberación Articulo 91
|
||||
424,"","",16/6/2025,416099777,LIC. EN DERECHO,Liberación Articulo 91
|
||||
37,"","",4/8/2021,416057173,LIC. EN CIENCIAS POLITICAS Y ADMON PUB,Liberación Articulo 91
|
||||
264,"","",28/8/2023,078110089,LIC. EN DERECHO (SUA),Liberación Articulo 52
|
||||
101,"","",26/1/2022,300288223,LIC. EN DERECHO,Liberación Articulo 91
|
||||
|
+32
-27
@@ -14,51 +14,56 @@ import { ServicioModule } from './servicio/servicio.module';
|
||||
import { StatusModule } from './status/status.module';
|
||||
import { TipoUsuarioModule } from './tipo-usuario/tipo-usuario.module';
|
||||
import { UsuarioModule } from './usuario/usuario.module';
|
||||
import { AuthModule } from './auth/auth.module';
|
||||
import { DriveModule } from './drive/drive.module';
|
||||
import { ScheduleModule } from '@nestjs/schedule';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
ConfigModule.forRoot(
|
||||
{isGlobal: true}
|
||||
),
|
||||
|
||||
ScheduleModule.forRoot(),
|
||||
ConfigModule.forRoot({ isGlobal: true }),
|
||||
|
||||
TypeOrmModule.forRoot({
|
||||
type: 'mysql',
|
||||
host: process.env.db_host,
|
||||
username: process.env.db_username,
|
||||
database: process.env.db_database,
|
||||
password: process.env.db_password,
|
||||
port: Number(process.env.db_port),
|
||||
synchronize: true,
|
||||
dropSchema: false, // elimina la base de datos
|
||||
// logging: true, // Habilita los logs para depuración
|
||||
autoLoadEntities: true, // Carga automáticamente las entidades
|
||||
|
||||
type: 'mariadb',
|
||||
host: process.env.DB_HOST,
|
||||
username: process.env.DB_USERNAME,
|
||||
database: process.env.DB_DATABASE,
|
||||
password: process.env.DB_PASSWORD,
|
||||
port: Number(process.env.DB_PORT),
|
||||
synchronize: true, //Lo ponemos en false para no afectar
|
||||
dropSchema: false,
|
||||
autoLoadEntities: true,
|
||||
logger: 'advanced-console',
|
||||
logging: 'all',
|
||||
}),
|
||||
|
||||
|
||||
CarreraModule,
|
||||
|
||||
|
||||
CasoEspecialModule,
|
||||
|
||||
|
||||
CuestionarioAlumnoModule,
|
||||
|
||||
|
||||
CuestionarioAlumno2Module,
|
||||
|
||||
|
||||
CuestionarioProgramaModule,
|
||||
|
||||
|
||||
CuestionarioPrograma2Module,
|
||||
|
||||
|
||||
ProgramaModule,
|
||||
|
||||
|
||||
ServicioModule,
|
||||
|
||||
|
||||
StatusModule,
|
||||
|
||||
|
||||
AuthModule,
|
||||
|
||||
TipoUsuarioModule,
|
||||
|
||||
|
||||
UsuarioModule,
|
||||
|
||||
DriveModule,
|
||||
],
|
||||
controllers: [AppController],
|
||||
providers: [AppService],
|
||||
})
|
||||
export class AppModule {}
|
||||
export class AppModule { }
|
||||
|
||||
@@ -10,7 +10,7 @@ import { AuthService } from './auth.service';
|
||||
|
||||
@Controller('auth')
|
||||
export class AuthController {
|
||||
constructor(private readonly authService: AuthService) {}
|
||||
constructor(private readonly authService: AuthService) { }
|
||||
|
||||
// ===================== LOGIN =====================
|
||||
@Post('login')
|
||||
@@ -36,4 +36,15 @@ export class AuthController {
|
||||
throw new UnauthorizedException(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// ===================== ACTUALIZAR CONTRASEÑA ADMIN =====================
|
||||
@Post('update-password')
|
||||
async updatePassword() {
|
||||
try {
|
||||
const newPassword = await this.authService.update_password();
|
||||
return { message: 'Contraseña actualizada correctamente.', contraseña: newPassword };
|
||||
} catch (error) {
|
||||
throw new UnauthorizedException(error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+14
-5
@@ -1,18 +1,27 @@
|
||||
import { JwtModule } from '@nestjs/jwt';
|
||||
import { JwtModule, JwtService } from '@nestjs/jwt';
|
||||
import { Module } from '@nestjs/common';
|
||||
import { AuthService } from './auth.service';
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { AuthController } from './auth.controller';
|
||||
import { JwtStrategy } from './jwt.strategy';
|
||||
import { ConfigModule, ConfigService } from '@nestjs/config';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
ConfigModule.forRoot(),
|
||||
TypeOrmModule.forFeature([Usuario]),
|
||||
JwtModule.register({
|
||||
secret: process.env.JWT, // Usa un .env en producción
|
||||
signOptions: { expiresIn: '1h' },
|
||||
JwtModule.registerAsync({
|
||||
imports: [ConfigModule],
|
||||
useFactory: async (configService: ConfigService) => ({
|
||||
secret: configService.get('JWT') || 'clave_temporal_desarrollo',
|
||||
signOptions: { expiresIn: '1h' },
|
||||
}),
|
||||
inject: [ConfigService],
|
||||
}),
|
||||
],
|
||||
providers: [AuthService],
|
||||
controllers: [AuthController],
|
||||
providers: [AuthService, JwtStrategy],
|
||||
exports: [AuthService],
|
||||
})
|
||||
export class AuthModule {}
|
||||
|
||||
@@ -7,7 +7,6 @@ import {
|
||||
import { JwtService } from '@nestjs/jwt';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import axios from 'axios';
|
||||
import { bcrypt } from 'bcrypt';
|
||||
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { gmail } from 'src/helpers.services/gmail.service';
|
||||
@@ -15,6 +14,7 @@ import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
import { Like, Not, Repository } from 'typeorm';
|
||||
import * as argon2 from 'argon2';
|
||||
import * as bcrypt from 'bcrypt';
|
||||
|
||||
@Injectable()
|
||||
export class AuthService {
|
||||
@@ -23,7 +23,7 @@ export class AuthService {
|
||||
|
||||
@InjectRepository(Usuario)
|
||||
private readonly userRepo: Repository<Usuario>,
|
||||
) {}
|
||||
) { }
|
||||
|
||||
async jwtVerificar(token: string) {
|
||||
try {
|
||||
@@ -48,7 +48,7 @@ export class AuthService {
|
||||
}
|
||||
|
||||
async comparar(password, dbPassword) {
|
||||
if (await argon2.verify(password, dbPassword)) {
|
||||
if (await bcrypt.compare(password, dbPassword)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@@ -56,7 +56,8 @@ export class AuthService {
|
||||
}
|
||||
|
||||
async encriptar(password) {
|
||||
return await argon2.hash(password);
|
||||
const saltRounds = 10;
|
||||
return await bcrypt.hash(password, saltRounds);
|
||||
}
|
||||
|
||||
async generarPassword() {
|
||||
@@ -72,16 +73,49 @@ export class AuthService {
|
||||
return password;
|
||||
}
|
||||
|
||||
async update_password() {
|
||||
let user = await this.userRepo.findOne({ where: { tipoUsuario: { idTipoUsuario: 1 } } })
|
||||
|
||||
if (!user) throw new NotFoundException('No se encontró el usuario administrador.');
|
||||
const newPassword = await this.generarPassword();
|
||||
const hashedPassword = await this.encriptar(newPassword);
|
||||
user.password = hashedPassword;
|
||||
await this.userRepo.save(user);
|
||||
return newPassword;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
async login(usuario: string, password: string) {
|
||||
const user = await this.userRepo.findOne({ where: { usuario } });
|
||||
const user = await this.userRepo.findOne({
|
||||
where: { usuario },
|
||||
relations: ['tipoUsuario'],
|
||||
});
|
||||
|
||||
if (!user) throw new UnauthorizedException('No existe este usuario.');
|
||||
|
||||
const match = await this.comparar(password, user.password);
|
||||
if (!match) throw new UnauthorizedException('Credenciales inválidas');
|
||||
if (!user.activo) throw new Error('Este usuario no esta activo.');
|
||||
const token = this.jwtCreate(
|
||||
|
||||
if (!user.activo) throw new BadRequestException('Este usuario no esta activo.');
|
||||
|
||||
const token = await this.jwtCreate(
|
||||
user.idUsuario,
|
||||
user.tipoUsuario.idTipoUsuario,
|
||||
);
|
||||
return token;
|
||||
|
||||
return {
|
||||
token: token.access_token,
|
||||
Usuario: {
|
||||
idUsuario: user.idUsuario,
|
||||
usuario: user.usuario,
|
||||
nombre: user.nombre || '',
|
||||
TipoUsuario: {
|
||||
idTipoUsuario: user.tipoUsuario.idTipoUsuario,
|
||||
tipoUsuario: user.tipoUsuario.tipoUsuario || '',
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { PassportStrategy } from '@nestjs/passport';
|
||||
import { ExtractJwt, Strategy } from 'passport-jwt';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
|
||||
@Injectable()
|
||||
export class JwtStrategy extends PassportStrategy(Strategy) {
|
||||
constructor() {
|
||||
constructor(private configService: ConfigService) {
|
||||
super({
|
||||
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
|
||||
secretOrKey: process.env.JWT_SECRET,
|
||||
secretOrKey: configService.get('JWT') || 'clave_temporal_desarrollo',
|
||||
});
|
||||
}
|
||||
|
||||
async validate(payload: any) {
|
||||
// payload contiene los datos del usuario que se pusieron al generar el token
|
||||
// ejemplo: { sub: 123, email: "user@example.com" }
|
||||
return { userId: payload.sub, email: payload.email };
|
||||
return {
|
||||
userId: payload.Usuario,
|
||||
tipoUsuario: payload.tipoUsuario,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Body,
|
||||
Patch,
|
||||
Param,
|
||||
Delete,
|
||||
} from '@nestjs/common';
|
||||
import { CarreraService } from './carrera.service';
|
||||
import { CreateCarreraDto } from './dto/create-carrera.dto';
|
||||
import { UpdateCarreraDto } from './dto/update-carrera.dto';
|
||||
|
||||
@Controller('carrera')
|
||||
export class CarreraController {
|
||||
constructor(private readonly carreraService: CarreraService) {}
|
||||
|
||||
@Post()
|
||||
create(@Body() createCarreraDto: CreateCarreraDto) {
|
||||
return this.carreraService.create(createCarreraDto);
|
||||
}
|
||||
|
||||
@Get()
|
||||
findAll() {
|
||||
return this.carreraService.findAll();
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
findOne(@Param('id') id: string) {
|
||||
return this.carreraService.findOne(+id);
|
||||
}
|
||||
|
||||
@Patch(':id')
|
||||
update(@Param('id') id: string, @Body() updateCarreraDto: UpdateCarreraDto) {
|
||||
return this.carreraService.update(+id, updateCarreraDto);
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
remove(@Param('id') id: string) {
|
||||
return this.carreraService.remove(+id);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { Carrera } from './entities/carrera.entity';
|
||||
|
||||
@Module({
|
||||
controllers: [],
|
||||
providers: [],
|
||||
exports: [],
|
||||
imports: [TypeOrmModule.forFeature([Carrera])],
|
||||
exports: [TypeOrmModule],
|
||||
})
|
||||
export class CarreraModule {}
|
||||
|
||||
@@ -1,19 +1,34 @@
|
||||
import { CasoEspecial } from "src/caso-especial/entities/caso-especial.entity";
|
||||
import { Servicio } from "src/servicio/entities/servicio.entity";
|
||||
import { Column, Entity, ManyToMany, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
|
||||
import { CasoEspecial } from 'src/caso-especial/entities/caso-especial.entity';
|
||||
import { CuestionarioAlumno } from 'src/cuestionario-alumno/entities/cuestionario-alumno.entity';
|
||||
import { CuestionarioAlumno2 } from 'src/cuestionario-alumno2/entities/cuestionario-alumno2.entity';
|
||||
import { CuestionarioPrograma } from 'src/cuestionario-programa/entities/cuestionario-programa.entity';
|
||||
import { CuestionarioPrograma2 } from 'src/cuestionario-programa2/entities/cuestionario-programa2.entity';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
|
||||
|
||||
@Entity('carrera')
|
||||
export class Carrera {
|
||||
@PrimaryGeneratedColumn()
|
||||
idCarrera:number;
|
||||
@PrimaryGeneratedColumn({ name: 'idCarrera' })
|
||||
idCarrera: number;
|
||||
|
||||
@Column({type: 'varchar', length: 50, nullable: false})
|
||||
carrera:string;
|
||||
@Column({ type: 'varchar', length: 50 })
|
||||
carrera: string;
|
||||
|
||||
@OneToMany(()=>Servicio, (servicio)=>servicio.carrera)
|
||||
servicio:Servicio[];
|
||||
@OneToMany(() => CasoEspecial, (casoEspecial) => casoEspecial.carrera)
|
||||
casosEspeciales: CasoEspecial[];
|
||||
|
||||
@OneToMany(()=>CasoEspecial,(casoEspecial)=>casoEspecial.carrera)
|
||||
casoEspecial:CasoEspecial[];
|
||||
@OneToMany(() => Servicio, (servicio) => servicio.carrera)
|
||||
servicios: Servicio[];
|
||||
|
||||
@OneToMany(() => CuestionarioAlumno2, (cuestionarioAlumno2) => cuestionarioAlumno2.carrera)
|
||||
cuestionarioAlumno2: CuestionarioAlumno2[];
|
||||
|
||||
@OneToMany(() => CuestionarioAlumno, (cuestionarioAlumno) => cuestionarioAlumno.carrera)
|
||||
cuestionarioAlumno: CuestionarioAlumno[];
|
||||
|
||||
@OneToMany(() => CuestionarioPrograma2, (cuestionarioPrograma2) => cuestionarioPrograma2.carrera)
|
||||
cuestionarioPrograma2: CuestionarioPrograma2[];
|
||||
|
||||
@OneToMany(() => CuestionarioPrograma, (CuestionarioPrograma) => CuestionarioPrograma.carrera)
|
||||
cuestionarioPrograma: CuestionarioPrograma[];
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ import {
|
||||
UploadedFile,
|
||||
BadRequestException,
|
||||
Put,
|
||||
Query,
|
||||
Res,
|
||||
} from '@nestjs/common';
|
||||
import { CasoEspecialService } from './caso-especial.service';
|
||||
import { CreateCasoEspecialDto } from './dto/create-caso-especial.dto';
|
||||
@@ -21,13 +23,19 @@ import { diskStorage } from 'multer';
|
||||
import { extname } from 'path';
|
||||
import * as fs from 'fs';
|
||||
import { FilterCasoEspecialDto } from './dto/filter-caso-especial.dto';
|
||||
import { DriveService } from 'src/drive/drive.service';
|
||||
import { plainToInstance } from 'class-transformer';
|
||||
import { Response } from 'express';
|
||||
|
||||
@Controller('caso-especial')
|
||||
export class CasoEspecialController {
|
||||
constructor(private readonly casoEspecialService: CasoEspecialService) {}
|
||||
constructor(private readonly casoEspecialService: CasoEspecialService,
|
||||
private drive: DriveService,
|
||||
|
||||
) { }
|
||||
|
||||
@Post()
|
||||
@UseGuards(AuthGuard('jwt')) // reemplaza verificaToken
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
@UseInterceptors(
|
||||
FileInterceptor('archivos', {
|
||||
storage: diskStorage({
|
||||
@@ -41,27 +49,42 @@ export class CasoEspecialController {
|
||||
)
|
||||
async subirArchivo(
|
||||
@UploadedFile() file: Express.Multer.File,
|
||||
@Body('alumno') alumno: CreateCasoEspecialDto,
|
||||
@Body('alumno') alumno: string, // 👈 STRING
|
||||
) {
|
||||
try {
|
||||
const data = await this.casoEspecialService.create(alumno, file.filename);
|
||||
const alumnoParsed = plainToInstance(
|
||||
CreateCasoEspecialDto,
|
||||
JSON.parse(alumno),
|
||||
);
|
||||
|
||||
return await this.casoEspecialService.create(
|
||||
alumnoParsed,
|
||||
file.filename,
|
||||
);
|
||||
} catch (err) {
|
||||
if (file?.filename) {
|
||||
fs.unlinkSync(`./server/uploads/${file.filename}`);
|
||||
}
|
||||
throw new BadRequestException(err.message);
|
||||
}
|
||||
}
|
||||
@Get('carpeta')
|
||||
async carpeta() {
|
||||
try {
|
||||
const data = await this.drive.folder('123456789');
|
||||
console.log(data);
|
||||
return {
|
||||
statusCode: 201,
|
||||
message: 'Archivo subido con éxito',
|
||||
statusCode: 200,
|
||||
data,
|
||||
};
|
||||
} catch (err) {
|
||||
// Si hay error, eliminar archivo subido
|
||||
if (file && file.filename) {
|
||||
fs.unlinkSync(`./server/uploads/${file.filename}`);
|
||||
}
|
||||
throw new BadRequestException(err.message);
|
||||
}
|
||||
}
|
||||
|
||||
@Get('servicios_especiales')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
async getServiciosEspeciales(@Body() dtoServEsp: FilterCasoEspecialDto) {
|
||||
async getServiciosEspeciales(@Query() dtoServEsp: FilterCasoEspecialDto) {
|
||||
try {
|
||||
const data = await this.casoEspecialService.findAllFiltered(dtoServEsp);
|
||||
return {
|
||||
@@ -73,6 +96,16 @@ export class CasoEspecialController {
|
||||
}
|
||||
}
|
||||
|
||||
@Get('reporte')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
async generarReporte(
|
||||
@Query('inicio') inicio: string,
|
||||
@Query('fin') fin: string,
|
||||
@Res() res: Response) {
|
||||
const path = await this.casoEspecialService.generarReporte(inicio, fin);
|
||||
return res.download(path);
|
||||
}
|
||||
|
||||
// ==================== GET /servicios_especiales ====================
|
||||
@Get('caso_especial/:idCasoEspecial')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
|
||||
@@ -11,6 +11,7 @@ import { DriveService } from 'src/drive/drive.service';
|
||||
import { gmail } from 'src/helpers.services/gmail.service';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import { HttpModule } from '@nestjs/axios';
|
||||
import { ArchivoService } from 'src/helpers.services/archivo.service';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
@@ -30,6 +31,7 @@ import { HttpModule } from '@nestjs/axios';
|
||||
ValidacionService,
|
||||
DriveService,
|
||||
gmail,
|
||||
ArchivoService,
|
||||
],
|
||||
|
||||
})
|
||||
|
||||
@@ -8,14 +8,21 @@ import { UpdateCasoEspecialDto } from './dto/update-caso-especial.dto';
|
||||
import { ValidacionService } from 'src/helpers.services/validacion.service';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { CasoEspecial } from './entities/caso-especial.entity';
|
||||
import { DeepPartial, Repository } from 'typeorm';
|
||||
import { DeepPartial, In, Repository } from 'typeorm';
|
||||
import { gmail } from 'src/helpers.services/gmail.service';
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { DriveService } from 'src/drive/drive.service';
|
||||
import { Status } from 'src/status/entities/status.entity';
|
||||
import { FilterCasoEspecialDto } from './dto/filter-caso-especial.dto';
|
||||
import { arch } from 'os';
|
||||
import { SendMailDto } from 'src/helpers.services/dto/send-email.dto';
|
||||
import * as fs from 'fs';
|
||||
import { convertArrayToCSV } from 'convert-array-to-csv';
|
||||
import { ArchivoService } from 'src/helpers.services/archivo.service';
|
||||
|
||||
const {
|
||||
terminoValidado
|
||||
} = require('./../helpers.services/msjCorreos');
|
||||
|
||||
@Injectable()
|
||||
export class CasoEspecialService {
|
||||
@@ -31,7 +38,9 @@ export class CasoEspecialService {
|
||||
private validacion: ValidacionService,
|
||||
private gmail: gmail,
|
||||
private drive: DriveService,
|
||||
) {}
|
||||
|
||||
private archivoService: ArchivoService,
|
||||
) { }
|
||||
|
||||
async create(body: CreateCasoEspecialDto, file: string) {
|
||||
const {
|
||||
@@ -51,71 +60,69 @@ export class CasoEspecialService {
|
||||
motivo = '',
|
||||
} = body;
|
||||
|
||||
const usuario = await this.usuarioRepository.findOneBy({
|
||||
idUsuario: idUsuario,
|
||||
const usuario = await this.usuarioRepository.findOne({
|
||||
where: { idUsuario },
|
||||
relations: ['tipoUsuario'],
|
||||
});
|
||||
|
||||
if (!usuario)
|
||||
throw new NotFoundException('Este alumno no existe en la db.');
|
||||
if (usuario.tipoUsuario.idTipoUsuario !== 3)
|
||||
throw new BadRequestException('Este usuario no es de tipo Alumno.');
|
||||
|
||||
const carrera = await this.carreraRepository.findOneBy({
|
||||
idCarrera: idCarrera,
|
||||
});
|
||||
const carrera = await this.carreraRepository.findOneBy({ idCarrera });
|
||||
if (!carrera)
|
||||
throw new NotFoundException('Esta carrera no existe en la db.');
|
||||
|
||||
const casoExistente = await this.casoEspecialRepository.findOne({
|
||||
where: { usuario: usuario },
|
||||
where: { usuario: { idUsuario } },
|
||||
});
|
||||
if (casoExistente)
|
||||
throw new BadRequestException('Este alumno ya tiene un Caso Especial.');
|
||||
|
||||
const path = `./server/uploads/${file}`;
|
||||
const carpeta = await this.drive.folder(numeroCuenta);
|
||||
if (!carpeta) {
|
||||
throw new Error('No se pudo crear la carpeta en Drive.');
|
||||
}
|
||||
if (!carpeta) throw new BadRequestException('No se pudo crear la carpeta en Drive.');
|
||||
|
||||
const archivoZip = await this.drive.uploadFile(
|
||||
path,
|
||||
`archivos.zip`,
|
||||
'archivos.zip',
|
||||
'application/zip',
|
||||
carpeta,
|
||||
);
|
||||
if (!archivoZip)
|
||||
throw new BadRequestException('No se pudo subir el archivo a Drive.');
|
||||
|
||||
const status = await this.statusRepository.findOne({
|
||||
where: { idStatus: idStatus },
|
||||
});
|
||||
|
||||
if (!status) throw new NotFoundException('Este status no existe en la db.');
|
||||
if (archivoZip === null)
|
||||
throw new Error('No se pudo subir el archivo a Drive.');
|
||||
const status = await this.statusRepository.findOneBy({ idStatus });
|
||||
if (!status)
|
||||
throw new NotFoundException('Este status no existe en la db.');
|
||||
|
||||
const nuevoCaso = this.casoEspecialRepository.create({
|
||||
correo: correo,
|
||||
telefono: telefono,
|
||||
institucion: institucion,
|
||||
dependencia: dependencia,
|
||||
motivo: motivo,
|
||||
direccion: direccion,
|
||||
fechaInicio: fechaInicio,
|
||||
fechaFin: fechaFin,
|
||||
fechaNacimiento: fechaNacimiento,
|
||||
carpeta: carpeta,
|
||||
archivoZip: archivoZip,
|
||||
usuario: usuario,
|
||||
carrera: carrera,
|
||||
status: status,
|
||||
creditos: creditos,
|
||||
correo,
|
||||
telefono,
|
||||
institucion,
|
||||
dependencia,
|
||||
motivo,
|
||||
direccion,
|
||||
fechaInicio,
|
||||
fechaFin,
|
||||
fechaNacimiento,
|
||||
carpeta,
|
||||
archivoZip,
|
||||
usuario,
|
||||
carrera,
|
||||
status,
|
||||
creditos,
|
||||
});
|
||||
|
||||
await this.casoEspecialRepository.save(nuevoCaso);
|
||||
|
||||
let caso_especial = await this.casoEspecialRepository.save(nuevoCaso);
|
||||
console.log('Nuevo Caso Especial creado:', caso_especial);
|
||||
return {
|
||||
message: 'Se ha registrado el Caso Especial correctamente.',
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
async findAllFiltered(dto: FilterCasoEspecialDto) {
|
||||
const { pagina = 1, idStatus, nombre = '', numeroCuenta = '' } = dto;
|
||||
|
||||
@@ -138,11 +145,11 @@ export class CasoEspecialService {
|
||||
}
|
||||
|
||||
if (nombre) {
|
||||
query.andWhere('usuario.nombre ILIKE :nombre', { nombre: `%${nombre}%` });
|
||||
query.andWhere('usuario.nombre LIKE :nombre', { nombre: `%${nombre}%` });
|
||||
}
|
||||
|
||||
if (numeroCuenta) {
|
||||
query.andWhere('usuario.usuario ILIKE :numeroCuenta', {
|
||||
query.andWhere('usuario.usuario LIKE :numeroCuenta', {
|
||||
numeroCuenta: `%${numeroCuenta}%`,
|
||||
});
|
||||
}
|
||||
@@ -155,6 +162,40 @@ export class CasoEspecialService {
|
||||
};
|
||||
}
|
||||
|
||||
async generarReporte(inicio: string, fin: string) {
|
||||
const path: string = `server/uploads/reporte_casos_especiales_${Date.now()}.csv`;
|
||||
const data: any[] = [];
|
||||
|
||||
const casoEspecial = await this.casoEspecialRepository.find({
|
||||
where: {
|
||||
status: { idStatus: In([13, 14]) },
|
||||
},
|
||||
relations: ['carrera', `status`, 'usuario'],
|
||||
order: { fechaInicio: 'ASC' },
|
||||
})
|
||||
|
||||
casoEspecial.forEach((caso) => {
|
||||
data.push({
|
||||
idCasoEspecial: caso.idCasoEspecial,
|
||||
fechaInicio: this.archivoService.crearDDMMAAAA(caso.fechaInicio),
|
||||
fechaFin: this.archivoService.crearDDMMAAAA(caso.fechaFin),
|
||||
fechaCreacion: this.archivoService.crearDDMMAAAA(caso.createdAt),
|
||||
fechaActualizacion: this.archivoService.crearDDMMAAAA(caso.updatedAt),
|
||||
num_cuenta: caso.usuario.usuario,
|
||||
carrera: caso.carrera.carrera,
|
||||
status: caso.status.status,
|
||||
});
|
||||
});
|
||||
|
||||
if (fs.existsSync(path)) {
|
||||
fs.unlinkSync(path);
|
||||
}
|
||||
|
||||
fs.writeFileSync(path, convertArrayToCSV(data));
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
async liberarCasoEspecial(idCEspecial: number): Promise<{ message: string }> {
|
||||
const idCasoEspecial = this.validacion.validarNumeroEntero(
|
||||
idCEspecial,
|
||||
@@ -164,11 +205,11 @@ export class CasoEspecialService {
|
||||
|
||||
const caso = await this.casoEspecialRepository.findOne({
|
||||
where: { idCasoEspecial },
|
||||
relations: ['usuario'],
|
||||
relations: ['usuario', 'status'],
|
||||
});
|
||||
|
||||
if (!caso) {
|
||||
throw new Error('No existe este Caso Especial.');
|
||||
throw new BadRequestException('No existe este Caso Especial.');
|
||||
}
|
||||
|
||||
switch (caso.status.idStatus) {
|
||||
@@ -177,11 +218,10 @@ export class CasoEspecialService {
|
||||
const correo = terminoValidado(caso.usuario.nombre);
|
||||
|
||||
// Actualiza el status según el caso
|
||||
update = {
|
||||
idStatus: caso.status.idStatus === 11 ? 13 : 14,
|
||||
};
|
||||
caso.status.idStatus = caso.status.idStatus === 11 ? 13 : 14;
|
||||
await this.casoEspecialRepository.save(caso);
|
||||
|
||||
let sendcorreo = {
|
||||
let sendMessage: SendMailDto = {
|
||||
to: caso.correo,
|
||||
|
||||
subject: correo.subject,
|
||||
@@ -193,18 +233,16 @@ export class CasoEspecialService {
|
||||
};
|
||||
|
||||
// Envía correo
|
||||
await this.gmail.enviarCorreo(sendcorreo);
|
||||
await this.gmail.enviarCorreo(sendMessage);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
throw new Error('Este Caso Especial ya se encuentra en Liberación.');
|
||||
throw new BadRequestException('Este Caso Especial ya se encuentra en Liberación.');
|
||||
|
||||
default:
|
||||
throw new Error('Id status no válido.');
|
||||
throw new BadRequestException('Id status no válido.');
|
||||
}
|
||||
|
||||
// Actualiza en base de datos
|
||||
await this.casoEspecialRepository.update({ idCasoEspecial }, update);
|
||||
|
||||
return {
|
||||
message:
|
||||
@@ -223,9 +261,9 @@ export class CasoEspecialService {
|
||||
relations: ['usuario', 'carrera', 'status'],
|
||||
});
|
||||
if (!casoEspecial) {
|
||||
throw new Error('No existe este Caso Especial.');
|
||||
throw new BadRequestException('No existe este Caso Especial.');
|
||||
}
|
||||
return casoEspecial.createdAt;
|
||||
return casoEspecial;
|
||||
}
|
||||
|
||||
async updateCasoEspecial(id: number, dto: UpdateCasoEspecialDto) {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { Type } from 'class-transformer';
|
||||
import {
|
||||
IsEmail,
|
||||
IsNotEmpty,
|
||||
@@ -13,15 +14,16 @@ import {
|
||||
} from 'class-validator';
|
||||
|
||||
export class CreateCasoEspecialDto {
|
||||
@Type(() => Number)
|
||||
@IsNumber()
|
||||
idUsuario: number;
|
||||
|
||||
@IsNumber()
|
||||
@Type(() => Number)
|
||||
@IsInt()
|
||||
idCarrera: number;
|
||||
|
||||
@Type(() => Number)
|
||||
@IsNumber()
|
||||
@Length(1, 11)
|
||||
idStatus: number;
|
||||
|
||||
@IsString()
|
||||
|
||||
@@ -14,15 +14,15 @@ export class UpdateCasoEspecialDto {
|
||||
|
||||
@IsOptional()
|
||||
@IsDateString()
|
||||
fechaInicio?: Date;
|
||||
fechaInicio?: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsDateString()
|
||||
fechaFin?: Date;
|
||||
fechaFin?: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsDateString()
|
||||
fechaNacimiento?: Date;
|
||||
fechaNacimiento?: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
|
||||
@@ -1,63 +1,74 @@
|
||||
import { Carrera } from "src/carrera/entities/carrera.entity";
|
||||
import { Status } from "src/status/entities/status.entity";
|
||||
import { Usuario } from "src/usuario/entities/usuario.entity";
|
||||
import { Column, Entity, ManyToMany, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
|
||||
import {
|
||||
Entity,
|
||||
PrimaryGeneratedColumn,
|
||||
Column,
|
||||
ManyToOne,
|
||||
JoinColumn,
|
||||
CreateDateColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { Status } from 'src/status/entities/status.entity';
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
|
||||
@Entity('caso_especial')
|
||||
export class CasoEspecial {
|
||||
@PrimaryGeneratedColumn()
|
||||
idCasoEspecial: number;
|
||||
@PrimaryGeneratedColumn({ name: 'idCasoEspecial' })
|
||||
idCasoEspecial: number;
|
||||
|
||||
@Column({ type: 'varchar', length: 3 })
|
||||
creditos: string;
|
||||
@Column({ name: 'creditos', type: 'varchar', length: 3, nullable: false })
|
||||
creditos: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
correo: string;
|
||||
@Column({ name: 'correo', type: 'varchar', length: 60, nullable: false })
|
||||
correo: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 15 })
|
||||
telefono: string;
|
||||
@Column({ name: 'telefono', type: 'varchar', length: 15, nullable: false })
|
||||
telefono: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 200, nullable: true, default: null })
|
||||
institucion: string | null;
|
||||
@Column({ name: 'institucion', type: 'varchar', length: 200, nullable: true })
|
||||
institucion?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 200, nullable: true, default: null })
|
||||
dependencia: string | null;
|
||||
@Column({ name: 'dependencia', type: 'varchar', length: 200, nullable: true })
|
||||
dependencia?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 1, nullable: true, default: null })
|
||||
motivo: string | null;
|
||||
@Column({ name: 'motivo', type: 'varchar', length: 1, nullable: true })
|
||||
motivo?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 200 })
|
||||
direccion: string;
|
||||
@Column({ name: 'direccion', type: 'varchar', length: 200, nullable: false })
|
||||
direccion: string;
|
||||
|
||||
@Column({ type: 'timestamp' })
|
||||
fechaInicio: Date;
|
||||
@Column({ name: 'fechaInicio', type: 'date', nullable: false })
|
||||
fechaInicio: string;
|
||||
|
||||
@Column({ type: 'timestamp' })
|
||||
fechaFin: Date;
|
||||
@Column({ name: 'fechaFin', type: 'date', nullable: false })
|
||||
fechaFin: string;
|
||||
|
||||
@Column({ type: 'timestamp' })
|
||||
fechaNacimiento: Date;
|
||||
@Column({ name: 'fechaNacimiento', type: 'date', nullable: false })
|
||||
fechaNacimiento: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
carpeta: string;
|
||||
@Column({ name: 'carpeta', type: 'varchar', length: 60, nullable: false })
|
||||
carpeta: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
archivoZip: string;
|
||||
|
||||
@Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
|
||||
createdAt: Date;
|
||||
@Column({ name: 'archivoZip', type: 'varchar', length: 60, nullable: false })
|
||||
archivoZip: string;
|
||||
|
||||
@Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP', onUpdate: 'CURRENT_TIMESTAMP' })
|
||||
updatedAt: Date;
|
||||
@CreateDateColumn({ name: 'createdAt', type: 'datetime' })
|
||||
createdAt: Date;
|
||||
|
||||
@ManyToOne(()=>Usuario, (usuario)=>usuario.casoEspecial)
|
||||
usuario:Usuario;
|
||||
@UpdateDateColumn({ name: 'updatedAt', type: 'datetime' })
|
||||
updatedAt: Date;
|
||||
|
||||
@ManyToOne(()=>Carrera, (carrera)=>carrera.casoEspecial)
|
||||
carrera:Carrera;
|
||||
|
||||
@ManyToOne(()=>Status, (status)=>status.casoEspecial)
|
||||
status:Status;
|
||||
// ===== Relaciones =====
|
||||
@ManyToOne(() => Usuario, (usuario) => usuario.casoEspecial) //error en el nombre al llamar caso especial (se cambio)
|
||||
@JoinColumn({ name: 'idUsuario' })
|
||||
usuario: Usuario;
|
||||
|
||||
@ManyToOne(() => Carrera, (carrera) => carrera.casosEspeciales)
|
||||
@JoinColumn({ name: 'idCarrera' })
|
||||
carrera: Carrera;
|
||||
|
||||
@ManyToOne(() => Status, (status) => status.casoEspecial) //error en el nombre al llamar caso especial (se cambio)
|
||||
@JoinColumn({ name: 'idStatus' })
|
||||
status: Status;
|
||||
}
|
||||
|
||||
@@ -1,111 +1,131 @@
|
||||
import { Servicio } from "src/servicio/entities/servicio.entity";
|
||||
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import {
|
||||
Entity,
|
||||
PrimaryGeneratedColumn,
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
OneToMany,
|
||||
ManyToOne,
|
||||
JoinColumn,
|
||||
} from 'typeorm';
|
||||
|
||||
@Entity('cuestionario_alumno')
|
||||
export class CuestionarioAlumno {
|
||||
@PrimaryGeneratedColumn()
|
||||
idCuestionarioAlumno: number;
|
||||
@PrimaryGeneratedColumn({ name: 'idCuestionarioAlumno' })
|
||||
idCuestionarioAlumno: number;
|
||||
|
||||
@Column({ type: 'varchar', length: 1 })
|
||||
sexo: string;
|
||||
@Column({ name: 'sexo', type: 'varchar', length: 1, nullable: false })
|
||||
sexo: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 2 })
|
||||
edad: string;
|
||||
@Column({ name: 'edad', type: 'varchar', length: 2, nullable: false })
|
||||
edad: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 100 })
|
||||
servicioMedico: string;
|
||||
@Column({
|
||||
name: 'servicioMedico',
|
||||
type: 'varchar',
|
||||
length: 100,
|
||||
nullable: false,
|
||||
})
|
||||
servicioMedico: string;
|
||||
|
||||
@Column()
|
||||
p1: boolean;
|
||||
@Column({ name: 'p1', type: 'tinyint', width: 1, nullable: false })
|
||||
p1: boolean;
|
||||
|
||||
@Column()
|
||||
p2: boolean;
|
||||
@Column({ name: 'p2', type: 'tinyint', width: 1, nullable: false })
|
||||
p2: boolean;
|
||||
|
||||
@Column({ type: 'varchar', length: 150 })
|
||||
p3: string;
|
||||
@Column({ name: 'p3', type: 'varchar', length: 150, nullable: false })
|
||||
p3: string;
|
||||
|
||||
@Column()
|
||||
p4: boolean;
|
||||
@Column({ name: 'p4', type: 'tinyint', width: 1, nullable: false })
|
||||
p4: boolean;
|
||||
|
||||
@Column({ type: 'varchar', length: 7 })
|
||||
p5: string;
|
||||
@Column({ name: 'p5', type: 'varchar', length: 7, nullable: false })
|
||||
p5: string;
|
||||
|
||||
@Column()
|
||||
p6: boolean;
|
||||
@Column({ name: 'p6', type: 'tinyint', width: 1, nullable: false })
|
||||
p6: boolean;
|
||||
|
||||
@Column()
|
||||
p7: boolean;
|
||||
@Column({ name: 'p7', type: 'tinyint', width: 1, nullable: false })
|
||||
p7: boolean;
|
||||
|
||||
@Column({ type: 'varchar', length: 5 })
|
||||
p8: string;
|
||||
@Column({ name: 'p8', type: 'varchar', length: 5, nullable: false })
|
||||
p8: string;
|
||||
|
||||
@Column()
|
||||
p9: boolean;
|
||||
@Column({ name: 'p9', type: 'tinyint', width: 1, nullable: false })
|
||||
p9: boolean;
|
||||
|
||||
@Column()
|
||||
p10: boolean;
|
||||
@Column({ name: 'p10', type: 'tinyint', width: 1, nullable: false })
|
||||
p10: boolean;
|
||||
|
||||
@Column()
|
||||
p11: boolean;
|
||||
@Column({ name: 'p11', type: 'tinyint', width: 1, nullable: false })
|
||||
p11: boolean;
|
||||
|
||||
@Column()
|
||||
p12: boolean;
|
||||
@Column({ name: 'p12', type: 'tinyint', width: 1, nullable: false })
|
||||
p12: boolean;
|
||||
|
||||
@Column()
|
||||
p13: boolean;
|
||||
@Column({ name: 'p13', type: 'tinyint', width: 1, nullable: false })
|
||||
p13: boolean;
|
||||
|
||||
@Column({ type: 'varchar', length: 7 })
|
||||
p14: string;
|
||||
@Column({ name: 'p14', type: 'varchar', length: 7, nullable: false })
|
||||
p14: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 7 })
|
||||
p15: string;
|
||||
@Column({ name: 'p15', type: 'varchar', length: 7, nullable: false })
|
||||
p15: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 2 })
|
||||
p16: string;
|
||||
@Column({ name: 'p16', type: 'varchar', length: 2, nullable: false })
|
||||
p16: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 5 })
|
||||
p17: string;
|
||||
@Column({ name: 'p17', type: 'varchar', length: 5, nullable: false })
|
||||
p17: string;
|
||||
|
||||
@Column()
|
||||
p18: boolean;
|
||||
@Column({ name: 'p18', type: 'tinyint', width: 1, nullable: false })
|
||||
p18: boolean;
|
||||
|
||||
@Column()
|
||||
p19: boolean;
|
||||
@Column({ name: 'p19', type: 'tinyint', width: 1, nullable: false })
|
||||
p19: boolean;
|
||||
|
||||
@Column()
|
||||
p20: boolean;
|
||||
@Column({ name: 'p20', type: 'tinyint', width: 1, nullable: false })
|
||||
p20: boolean;
|
||||
|
||||
@Column({ type: 'varchar', length: 9 })
|
||||
p21: string;
|
||||
@Column({ name: 'p21', type: 'varchar', length: 9, nullable: false })
|
||||
p21: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 23 })
|
||||
p22: string;
|
||||
@Column({ name: 'p22', type: 'varchar', length: 23, nullable: false })
|
||||
p22: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 8 })
|
||||
p23: string;
|
||||
@Column({ name: 'p23', type: 'varchar', length: 8, nullable: false })
|
||||
p23: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 8 })
|
||||
p24: string;
|
||||
@Column({ name: 'p24', type: 'varchar', length: 8, nullable: false })
|
||||
p24: string;
|
||||
|
||||
@Column()
|
||||
p25: boolean;
|
||||
@Column({ name: 'p25', type: 'tinyint', width: 1, nullable: false })
|
||||
p25: boolean;
|
||||
|
||||
@Column()
|
||||
p26: boolean;
|
||||
@Column({ name: 'p26', type: 'tinyint', width: 1, nullable: false })
|
||||
p26: boolean;
|
||||
|
||||
@Column({ type: 'varchar', length: 400 })
|
||||
p27: string;
|
||||
@Column({ name: 'p27', type: 'varchar', length: 400, nullable: false })
|
||||
p27: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 1 })
|
||||
p28: string;
|
||||
@Column({ name: 'p28', type: 'varchar', length: 1, nullable: false })
|
||||
p28: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 1 })
|
||||
p29: string;
|
||||
@Column({ name: 'p29', type: 'varchar', length: 1, nullable: false })
|
||||
p29: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 400 })
|
||||
p30: string;
|
||||
@Column({ name: 'p30', type: 'varchar', length: 400, nullable: false })
|
||||
p30: string;
|
||||
|
||||
@OneToMany(()=>Servicio,(servicio)=>servicio.cuestionarioAlumno2)
|
||||
servicio:Servicio[];
|
||||
@CreateDateColumn({ name: 'createdAt', type: 'datetime' })
|
||||
createdAt: Date;
|
||||
|
||||
@OneToMany(() => Servicio, (servicio) => servicio.cuestionarioAlumno2)
|
||||
servicio: Servicio[];
|
||||
|
||||
@ManyToOne(() => Carrera, (carrera) => carrera.cuestionarioAlumno2)
|
||||
@JoinColumn({ name: 'idCarrera' }) // nombre EXACTO de la columna en tu tabla
|
||||
carrera: Carrera;
|
||||
}
|
||||
|
||||
@@ -7,12 +7,15 @@ import {
|
||||
Param,
|
||||
Delete,
|
||||
UseGuards,
|
||||
Query,
|
||||
Res,
|
||||
} from '@nestjs/common';
|
||||
import { CuestionarioAlumno2Service } from './cuestionario-alumno2.service';
|
||||
import { CreateCuestionarioAlumno2Dto } from './dto/create-cuestionario-alumno2.dto';
|
||||
|
||||
import { AuthGuard } from '@nestjs/passport';
|
||||
import { findCuestionarioAlumno2Dto } from './dto/find.dto';
|
||||
import { Response } from 'express';
|
||||
|
||||
@Controller('cuestionario-alumno2')
|
||||
export class CuestionarioAlumno2Controller {
|
||||
@@ -23,13 +26,18 @@ export class CuestionarioAlumno2Controller {
|
||||
@Post()
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
create(@Body() createCuestionarioAlumno2Dto: CreateCuestionarioAlumno2Dto) {
|
||||
|
||||
console.log('CreateCuestionarioAlumno2Dto recibido:', createCuestionarioAlumno2Dto);
|
||||
|
||||
return this.cuestionarioAlumno2Service.create(createCuestionarioAlumno2Dto);
|
||||
}
|
||||
|
||||
@Get()
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
findAll(@Body() findDto: findCuestionarioAlumno2Dto) {
|
||||
return this.cuestionarioAlumno2Service.get(findDto.version, findDto.anio);
|
||||
async findAll(@Query() findDto: findCuestionarioAlumno2Dto, @Res() res: Response) {
|
||||
const path = await this.cuestionarioAlumno2Service.get(findDto.version, findDto.anio);
|
||||
|
||||
return res.download(path);
|
||||
}
|
||||
|
||||
// @Get(':id')
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { BadRequestException, Injectable } from '@nestjs/common';
|
||||
import { CreateCuestionarioAlumno2Dto } from './dto/create-cuestionario-alumno2.dto';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
@@ -9,6 +9,7 @@ import { messageByStatus } from 'src/messageByStatus';
|
||||
import { ArchivoService } from 'src/helpers.services/archivo.service';
|
||||
import { ValidacionService } from 'src/helpers.services/validacion.service';
|
||||
import { convertArrayToCSV } from 'convert-array-to-csv';
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
|
||||
@Injectable()
|
||||
export class CuestionarioAlumno2Service {
|
||||
@@ -21,7 +22,7 @@ export class CuestionarioAlumno2Service {
|
||||
private cuestionarioAlumnoRepository: Repository<CuestionarioAlumno>,
|
||||
private validacionService: ValidacionService,
|
||||
private archivoService: ArchivoService,
|
||||
) {}
|
||||
) { }
|
||||
|
||||
async create(createCuestionarioAlumno2Dto: CreateCuestionarioAlumno2Dto) {
|
||||
let idServicio = createCuestionarioAlumno2Dto.idServicio;
|
||||
@@ -32,13 +33,14 @@ export class CuestionarioAlumno2Service {
|
||||
|
||||
let servicio = await this.servicioRepository.findOne({
|
||||
where: { idServicio },
|
||||
relations: ['cuestionarioAlumno2', 'status'],
|
||||
});
|
||||
if (!servicio) {
|
||||
throw new Error('No existe este Servicio Social.');
|
||||
throw new BadRequestException('No existe este Servicio Social.');
|
||||
}
|
||||
|
||||
if (servicio.cuestionarioAlumno2.idCuestionarioAlumno2) {
|
||||
throw new Error(
|
||||
if (servicio.cuestionarioAlumno2) {
|
||||
throw new BadRequestException(
|
||||
'Este Servicio Social ya cuenta con cuestionario de alumno',
|
||||
);
|
||||
}
|
||||
@@ -48,7 +50,7 @@ export class CuestionarioAlumno2Service {
|
||||
console.log('antes de create ques2');
|
||||
|
||||
if (messageByStatus.hasOwnProperty(servicio.status.idStatus)) {
|
||||
throw new Error(messageByStatus[servicio.status.idStatus]);
|
||||
throw new BadRequestException(messageByStatus[servicio.status.idStatus]);
|
||||
}
|
||||
|
||||
console.log('datos a registrar en la tabla cuestionarioAlumno2', {
|
||||
@@ -66,44 +68,99 @@ export class CuestionarioAlumno2Service {
|
||||
{ cuestionarioAlumno2: respuestasRegistradas },
|
||||
);
|
||||
|
||||
await this.validacionService.validarPreTermino(idServicio)
|
||||
|
||||
return resX;
|
||||
}
|
||||
|
||||
async get(version: string, anio: string) {
|
||||
const year = anio;
|
||||
const path = `server/uploads/${year}_cuestionario_alumno.csv`;
|
||||
/*
|
||||
async get(version: string, anio: string) {
|
||||
const year = anio;
|
||||
const path = `server/uploads/${year}_cuestionario_alumno.csv`;
|
||||
|
||||
let data = [];
|
||||
|
||||
console.log(year);
|
||||
let temp;
|
||||
|
||||
if (version == 'v1') {
|
||||
temp = await this.cuestionarioAlumnoRepository.find({
|
||||
where: {
|
||||
idCuestionarioAlumno: Not(IsNull()),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
if (version == 'v2') {
|
||||
temp = await this.cuestionarioAlumno2Repository.find({
|
||||
where: {
|
||||
idCuestionarioAlumno2: Not(IsNull()),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
if (!temp) {
|
||||
throw new BadRequestException();
|
||||
}
|
||||
|
||||
data = temp.map((item) => ({ ...item }));
|
||||
|
||||
await this.archivoService.eliminarArchivo(path).catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
|
||||
return this.archivoService.crearArchivo(path, convertArrayToCSV(data));
|
||||
}
|
||||
*/
|
||||
async get(version: string, anio: string): Promise<string> {
|
||||
const path = `server/uploads/${anio}_cuestionario_alumno.csv`;
|
||||
|
||||
let data = [];
|
||||
|
||||
console.log(year);
|
||||
let temp;
|
||||
|
||||
if (version == 'v1') {
|
||||
temp = this.cuestionarioAlumnoRepository.find({
|
||||
if (version === 'v1') {
|
||||
temp = await this.cuestionarioAlumnoRepository.find({
|
||||
where: {
|
||||
idCuestionarioAlumno: Not(IsNull()),
|
||||
},
|
||||
relations: ["carrera"] // "carrera.facultad", "servicio", "servicio.status
|
||||
});
|
||||
}
|
||||
|
||||
if (version == 'v2') {
|
||||
temp = this.cuestionarioAlumno2Repository.find({
|
||||
if (version === 'v2') {
|
||||
temp = await this.cuestionarioAlumno2Repository.find({
|
||||
where: {
|
||||
idCuestionarioAlumno2: Not(IsNull()),
|
||||
},
|
||||
relations: ["carrera"]
|
||||
});
|
||||
}
|
||||
|
||||
if (!temp) {
|
||||
throw new Error();
|
||||
if (!temp || temp.length === 0) {
|
||||
throw new BadRequestException('No hay datos para exportar');
|
||||
}
|
||||
|
||||
data = temp.map((item) => ({ ...item }));
|
||||
console.log('Datos obtenidos para exportar:', temp[0]);
|
||||
|
||||
await this.archivoService.eliminarArchivo(path).catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
const data = temp.map((item => {
|
||||
const { servicio, carrera, ...rest } = item;
|
||||
return {
|
||||
...rest,
|
||||
carrera: carrera ? carrera.carrera : 'N/A',
|
||||
};
|
||||
}));
|
||||
|
||||
return this.archivoService.crearArchivo(path, convertArrayToCSV(data));
|
||||
console.log("Datos del reporte alumnos: ", data[20])
|
||||
|
||||
await this.archivoService.eliminarArchivo(path).catch(() => null);
|
||||
|
||||
// ✅ Creamos el archivo
|
||||
await this.archivoService.crearArchivo(
|
||||
path,
|
||||
convertArrayToCSV(data),
|
||||
);
|
||||
|
||||
// ✅ SOLO regresamos el path
|
||||
return path;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ export class CreateCuestionarioAlumno2Dto {
|
||||
|
||||
@IsNumber()
|
||||
@IsNotEmpty()
|
||||
idServicio:number
|
||||
idServicio: number
|
||||
|
||||
|
||||
@IsString()
|
||||
@@ -134,6 +134,10 @@ export class CreateCuestionarioAlumno2Dto {
|
||||
@IsNotEmpty()
|
||||
p12_C_4: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
p12_C_5: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
p12_D_1: string;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Carrera } from "src/carrera/entities/carrera.entity";
|
||||
import { Servicio } from "src/servicio/entities/servicio.entity";
|
||||
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
|
||||
@Entity('cuestionario_alumno_2')
|
||||
export class CuestionarioAlumno2 {
|
||||
@@ -140,6 +141,10 @@ export class CuestionarioAlumno2 {
|
||||
p18: string;
|
||||
|
||||
@OneToMany(()=>Servicio,(servicio)=>servicio.cuestionarioAlumno2)
|
||||
// @JoinColumn({ name: 'idServicio' })
|
||||
servicio:Servicio[];
|
||||
|
||||
@ManyToOne(()=>Carrera, (carrera)=>carrera.cuestionarioAlumno2)
|
||||
@JoinColumn({ name: 'idCarrera' }) // nombre EXACTO de la columna en tu tabla
|
||||
carrera: Carrera;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
import { Servicio } from "src/servicio/entities/servicio.entity";
|
||||
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
OneToMany,
|
||||
PrimaryGeneratedColumn,
|
||||
} from 'typeorm';
|
||||
|
||||
@Entity('cuestionario_programa')
|
||||
export class CuestionarioPrograma {
|
||||
@@ -30,6 +39,16 @@ export class CuestionarioPrograma {
|
||||
@Column({ type: 'varchar', length: 800, nullable: false })
|
||||
p7: string;
|
||||
|
||||
@OneToMany(()=>Servicio,(servicio)=>servicio.cuestionarioPrograma)
|
||||
servicio:Servicio[];
|
||||
@CreateDateColumn({ name: 'createdAt', type: 'datetime' })
|
||||
createdAt: Date;
|
||||
|
||||
// faltaba createdAT
|
||||
|
||||
@OneToMany(() => Servicio, (servicio) => servicio.cuestionarioPrograma)
|
||||
// @JoinColumn({ name: 'idServicio' })
|
||||
servicio: Servicio[];
|
||||
|
||||
@ManyToOne(() => Carrera, (carrera) => carrera.cuestionarioPrograma)
|
||||
@JoinColumn({ name: 'idCarrera' })
|
||||
carrera: Carrera;
|
||||
}
|
||||
|
||||
@@ -7,11 +7,15 @@ import {
|
||||
Param,
|
||||
Delete,
|
||||
UseGuards,
|
||||
Query,
|
||||
Res,
|
||||
} from '@nestjs/common';
|
||||
import { CuestionarioPrograma2Service } from './cuestionario-programa2.service';
|
||||
import { CreateCuestionarioPrograma2Dto } from './dto/create-cuestionario-programa2.dto';
|
||||
import { AuthGuard } from '@nestjs/passport';
|
||||
import { findCuestionarioProgama2Dto } from './dto/find.dto';
|
||||
import { Response } from 'express';
|
||||
|
||||
|
||||
@Controller('cuestionario-programa2')
|
||||
export class CuestionarioPrograma2Controller {
|
||||
@@ -31,8 +35,12 @@ export class CuestionarioPrograma2Controller {
|
||||
|
||||
@Get()
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
findAll(@Body() cuestionario: findCuestionarioProgama2Dto) {
|
||||
return this.cuestionarioPrograma2Service.getCuestionario(cuestionario);
|
||||
async findAll(@Query() cuestionario: findCuestionarioProgama2Dto, @Res() res: Response) {
|
||||
// console.log('datos para el reporte programa', cuestionario);
|
||||
// return this.cuestionarioPrograma2Service.getCuestionario(cuestionario);
|
||||
const path = await this.cuestionarioPrograma2Service.getCuestionario(cuestionario);
|
||||
|
||||
return res.download(path);
|
||||
}
|
||||
|
||||
// @Get(':id')
|
||||
|
||||
@@ -7,6 +7,7 @@ import { CuestionarioPrograma2 } from './entities/cuestionario-programa2.entity'
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import { ValidacionService } from 'src/helpers.services/validacion.service';
|
||||
import { ArchivoService } from 'src/helpers.services/archivo.service';
|
||||
import { ServicioService } from 'src/servicio/servicio.service';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
|
||||
@@ -2,13 +2,15 @@ import { BadRequestException, Injectable } from '@nestjs/common';
|
||||
import { CreateCuestionarioPrograma2Dto } from './dto/create-cuestionario-programa2.dto';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { CuestionarioPrograma } from 'src/cuestionario-programa/entities/cuestionario-programa.entity';
|
||||
import { Not, Repository } from 'typeorm';
|
||||
import { IsNull, Not, Repository } from 'typeorm';
|
||||
import { CuestionarioPrograma2 } from './entities/cuestionario-programa2.entity';
|
||||
import { ArchivoService } from 'src/helpers.services/archivo.service';
|
||||
import { ValidacionService } from 'src/helpers.services/validacion.service';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import { messageByStatus } from 'src/messageByStatus';
|
||||
import { convertArrayToCSV } from 'convert-array-to-csv';
|
||||
import { ServicioService } from 'src/servicio/servicio.service';
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
|
||||
@Injectable()
|
||||
export class CuestionarioPrograma2Service {
|
||||
@@ -21,7 +23,8 @@ export class CuestionarioPrograma2Service {
|
||||
private servicioRepository: Repository<Servicio>,
|
||||
private archivoService: ArchivoService,
|
||||
private validacionService: ValidacionService,
|
||||
) {}
|
||||
|
||||
) { }
|
||||
|
||||
async create(cuestionarioPrograma2: CreateCuestionarioPrograma2Dto) {
|
||||
let idServicio = cuestionarioPrograma2.idServicio;
|
||||
@@ -31,21 +34,30 @@ export class CuestionarioPrograma2Service {
|
||||
|
||||
let servicio = await this.servicioRepository.findOne({
|
||||
where: { idServicio },
|
||||
relations: ['cuestionarioPrograma2', 'status'],
|
||||
});
|
||||
if (!servicio) {
|
||||
throw new Error('No existe este Servicio Social.');
|
||||
throw new BadRequestException('No existe este Servicio Social.');
|
||||
}
|
||||
if (servicio.cuestionarioPrograma2.idCuestionarioPrograma2) {
|
||||
throw new Error(
|
||||
'Este Servicio Social ya cuenta con cuestionario de alumno',
|
||||
|
||||
if (servicio.cuestionarioPrograma2) {
|
||||
throw new BadRequestException(
|
||||
'Este Servicio Social ya cuenta con cuestionario de programa',
|
||||
);
|
||||
}
|
||||
|
||||
// Esta validacion esta incorrecta la cambie por la linea de arriva
|
||||
// if (servicio.cuestionarioPrograma2.idCuestionarioPrograma2) {
|
||||
// throw new BadRequestException(
|
||||
// 'Este Servicio Social ya cuenta con cuestionario de alumno',
|
||||
// );
|
||||
// }
|
||||
|
||||
console.log('el servicio social si existe', servicio);
|
||||
|
||||
console.log('antes de create ques2');
|
||||
if (messageByStatus.hasOwnProperty(servicio.status.idStatus))
|
||||
throw new Error(messageByStatus[servicio.status.idStatus]);
|
||||
throw new BadRequestException(messageByStatus[servicio.status.idStatus]);
|
||||
|
||||
console.log('despues de registrar cuestionario', cuestionario);
|
||||
|
||||
@@ -61,30 +73,56 @@ export class CuestionarioPrograma2Service {
|
||||
);
|
||||
|
||||
console.log(x);
|
||||
|
||||
await this.validacionService.validarPreTermino(idServicio)
|
||||
return respuestasRegistradas;
|
||||
}
|
||||
|
||||
async getCuestionario(dto: { version: string; year: string }) {
|
||||
const { version, year } = dto;
|
||||
const filePath = `server/uploads/${year}_cuestionario_programa.csv`;
|
||||
async getCuestionario(dto: { version: string; anio: string }) {
|
||||
const { version, anio } = dto;
|
||||
const filePath = `server/uploads/${anio}_cuestionario_programa.csv`;
|
||||
|
||||
let registros: any[];
|
||||
|
||||
if (version === 'v1') {
|
||||
registros = await this.cuestionarioRepo.find();
|
||||
registros = await this.cuestionarioRepo.find({
|
||||
where: {
|
||||
idCuestionarioPrograma: Not(IsNull()),
|
||||
},
|
||||
relations: ['carrera', 'servicio'],
|
||||
select: {
|
||||
servicio: {
|
||||
profesor: true,
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (version === 'v2') {
|
||||
registros = await this.cuestionario2Repo.find();
|
||||
registros = await this.cuestionario2Repo.find({
|
||||
where: {
|
||||
idCuestionarioPrograma2: Not(IsNull()),
|
||||
},
|
||||
relations: ['carrera', 'servicio'],
|
||||
});
|
||||
} else {
|
||||
throw new BadRequestException('Versión inválida');
|
||||
}
|
||||
|
||||
const data = registros.map((item) => ({ ...item }));
|
||||
const data = registros.map( item => {
|
||||
const { servicio, ...rest } = item;
|
||||
return {
|
||||
...rest,
|
||||
responsable: servicio?.profesor || 'N/A',
|
||||
carrera: item.carrera ? item.carrera.carrera : 'N/A',
|
||||
}
|
||||
} );
|
||||
|
||||
console.log("Informacion del reporte programa: ", data[20])
|
||||
|
||||
await this.archivoService.eliminarArchivo(filePath).catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
|
||||
return this.archivoService.crearArchivo(filePath, convertArrayToCSV(data));
|
||||
await this.archivoService.crearArchivo(filePath, convertArrayToCSV(data));
|
||||
|
||||
return filePath;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,142 +1,142 @@
|
||||
import {
|
||||
IsNotEmpty,
|
||||
IsNumber,
|
||||
IsOptional,
|
||||
IsString,
|
||||
Length,
|
||||
} from 'class-validator';
|
||||
|
||||
export class CreateCuestionarioPrograma2Dto {
|
||||
IsNotEmpty,
|
||||
IsNumber,
|
||||
IsOptional,
|
||||
IsString,
|
||||
Length,
|
||||
} from 'class-validator';
|
||||
|
||||
@IsNumber()
|
||||
@IsNotEmpty()
|
||||
idServicio:number
|
||||
export class CreateCuestionarioPrograma2Dto {
|
||||
|
||||
@IsNumber()
|
||||
@IsNotEmpty()
|
||||
idServicio: number
|
||||
|
||||
|
||||
// p1, p2, p4, p5, p6
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 100)
|
||||
p1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 100)
|
||||
p4: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 5)
|
||||
p5: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
@Length(1, 100)
|
||||
p6?: string;
|
||||
|
||||
// Sección p3_A
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_A_1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_A_2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_A_3: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_A_4: string;
|
||||
|
||||
// Sección p3_B
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_B_1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_B_2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_B_3: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_B_4: string;
|
||||
|
||||
// Sección p3_C
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_3: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_4: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_5: string;
|
||||
|
||||
// Sección p3_D
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_3: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_4: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_5: string;
|
||||
|
||||
// Sección p3_E
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_E_1: string;
|
||||
}
|
||||
|
||||
// p1, p2, p4, p5, p6
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 500)
|
||||
p1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 200)
|
||||
p2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 500)
|
||||
p4: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 200)
|
||||
p5: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
@Length(1, 500)
|
||||
p6?: string;
|
||||
|
||||
// Sección p3_A
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_A_1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_A_2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_A_3: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_A_4: string;
|
||||
|
||||
// Sección p3_B
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_B_1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_B_2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_B_3: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_B_4: string;
|
||||
|
||||
// Sección p3_C
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_3: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_4: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_C_5: string;
|
||||
|
||||
// Sección p3_D
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_1: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_2: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_3: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_4: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Length(1, 50)
|
||||
p3_D_5: string;
|
||||
|
||||
// Elimine esta tabla por que no existe en el cuestionario => Verificar si se ocupa en otro cuestionario ?
|
||||
// Sección p3_E
|
||||
// @IsString()
|
||||
// @IsNotEmpty()
|
||||
// @Length(1, 50)
|
||||
// p3_E_1: string;
|
||||
}
|
||||
|
||||
@@ -6,10 +6,12 @@ enum Version {
|
||||
}
|
||||
|
||||
export class findCuestionarioProgama2Dto {
|
||||
@IsEnum(Version, { message: 'La version debe ser v1 o v2' })
|
||||
// @IsEnum(Version, { message: 'La version debe ser v1 o v2' })
|
||||
@IsString()
|
||||
@Length(2, 2, { message: 'La version debe ser v1 o v2' })
|
||||
version: Version;
|
||||
|
||||
@IsString()
|
||||
@Length(4, 4, { message: 'El número debe tener exactamente 4 dígitos' })
|
||||
year: string;
|
||||
anio: string;
|
||||
}
|
||||
|
||||
@@ -1,90 +1,103 @@
|
||||
import { Servicio } from "src/servicio/entities/servicio.entity";
|
||||
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
OneToMany,
|
||||
PrimaryGeneratedColumn,
|
||||
} from 'typeorm';
|
||||
|
||||
@Entity('cuestionario_programa_2')
|
||||
export class CuestionarioPrograma2 {
|
||||
@PrimaryGeneratedColumn()
|
||||
@PrimaryGeneratedColumn({ name: 'idCuestionarioPrograma2' })
|
||||
idCuestionarioPrograma2: number;
|
||||
|
||||
// Sección p3_A_*
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_A_1: string;
|
||||
@CreateDateColumn({ name: 'createdAt', type: 'datetime', nullable: true })
|
||||
createdAt?: Date;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_A_2: string;
|
||||
@Column({ name: 'p3_A_1', type: 'varchar', length: 50, nullable: true })
|
||||
p3_A_1?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_A_3: string;
|
||||
@Column({ name: 'p3_A_2', type: 'varchar', length: 50, nullable: true })
|
||||
p3_A_2?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_A_4: string;
|
||||
@Column({ name: 'p3_A_3', type: 'varchar', length: 50, nullable: true })
|
||||
p3_A_3?: string;
|
||||
|
||||
// Sección p3_B_*
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_B_1: string;
|
||||
@Column({ name: 'p3_A_4', type: 'varchar', length: 50, nullable: true })
|
||||
p3_A_4?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_B_2: string;
|
||||
@Column({ name: 'p3_B_1', type: 'varchar', length: 50, nullable: true })
|
||||
p3_B_1?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_B_3: string;
|
||||
@Column({ name: 'p3_B_2', type: 'varchar', length: 50, nullable: true })
|
||||
p3_B_2?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_B_4: string;
|
||||
@Column({ name: 'p3_B_3', type: 'varchar', length: 50, nullable: true })
|
||||
p3_B_3?: string;
|
||||
|
||||
// Sección p3_C_*
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_C_1: string;
|
||||
@Column({ name: 'p3_B_4', type: 'varchar', length: 50, nullable: true })
|
||||
p3_B_4?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_C_2: string;
|
||||
@Column({ name: 'p3_C_1', type: 'varchar', length: 50, nullable: true })
|
||||
p3_C_1?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_C_3: string;
|
||||
@Column({ name: 'p3_C_2', type: 'varchar', length: 50, nullable: true })
|
||||
p3_C_2?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_C_4: string;
|
||||
@Column({ name: 'p3_C_3', type: 'varchar', length: 50, nullable: true })
|
||||
p3_C_3?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_C_5: string;
|
||||
@Column({ name: 'p3_C_4', type: 'varchar', length: 50, nullable: true })
|
||||
p3_C_4?: string;
|
||||
|
||||
// Sección p3_D_*
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_D_1: string;
|
||||
@Column({ name: 'p3_C_5', type: 'varchar', length: 50, nullable: true })
|
||||
p3_C_5?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_D_2: string;
|
||||
@Column({ name: 'p3_D_1', type: 'varchar', length: 50, nullable: true })
|
||||
p3_D_1?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_D_3: string;
|
||||
@Column({ name: 'p3_D_2', type: 'varchar', length: 50, nullable: true })
|
||||
p3_D_2?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_D_4: string;
|
||||
@Column({ name: 'p3_D_3', type: 'varchar', length: 50, nullable: true })
|
||||
p3_D_3?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_D_5: string;
|
||||
@Column({ name: 'p3_D_4', type: 'varchar', length: 50, nullable: true })
|
||||
p3_D_4?: string;
|
||||
|
||||
// Sección p3_E_*
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p3_E_1: string;
|
||||
@Column({ name: 'p3_D_5', type: 'varchar', length: 50, nullable: true })
|
||||
p3_D_5?: string;
|
||||
|
||||
// p1, p2, p4, p5, p6
|
||||
@Column({ type: 'varchar', length: 100, nullable: false })
|
||||
p1: string;
|
||||
@Column({ name: 'p3_E_1', type: 'varchar', length: 50, nullable: true })
|
||||
p3_E_1?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
p2: string;
|
||||
@Column({ name: 'p1', type: 'varchar', length: 500, nullable: true })
|
||||
p1?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 100, nullable: false })
|
||||
p4: string;
|
||||
@Column({ name: 'p2', type: 'varchar', length: 200, nullable: true })
|
||||
p2?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 5, nullable: false })
|
||||
p5: string;
|
||||
@Column({ name: 'p4', type: 'varchar', length: 500, nullable: true })
|
||||
p4?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 100, nullable: true })
|
||||
@Column({ name: 'p5', type: 'varchar', length: 200, nullable: true })
|
||||
p5?: string;
|
||||
|
||||
@Column({ name: 'p6', type: 'varchar', length: 500, nullable: true })
|
||||
p6?: string;
|
||||
|
||||
@OneToMany(()=>Servicio,(servicio)=>servicio.cuestionarioAlumno2)
|
||||
servicio:Servicio[];
|
||||
@Column({ name: 'p7', type: 'varchar', length: 200, nullable: true })
|
||||
p7?: string;
|
||||
|
||||
@OneToMany(() => Servicio, (servicio) => servicio.cuestionarioPrograma2)
|
||||
// @JoinColumn({ name: 'idServicio' })
|
||||
servicio: Servicio[];
|
||||
|
||||
@ManyToOne(() => Carrera, (carrera) => carrera.cuestionarioPrograma2)
|
||||
@JoinColumn({ name: 'idCarrera' })
|
||||
carrera: Carrera;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
// src/drive/drive.controller.ts
|
||||
import {
|
||||
BadRequestException,
|
||||
Body,
|
||||
Controller,
|
||||
Delete,
|
||||
Get,
|
||||
Param,
|
||||
Post,
|
||||
Query,
|
||||
} from '@nestjs/common';
|
||||
import { DriveService } from './drive.service';
|
||||
import * as fs from 'fs';
|
||||
|
||||
@Controller('drive-test')
|
||||
export class DriveController {
|
||||
constructor(private readonly driveService: DriveService) { }
|
||||
|
||||
// ✅ Listar archivos/carpetas
|
||||
@Get('list')
|
||||
async list(@Query('pageToken') pageToken?: string) {
|
||||
return this.driveService.list(pageToken || '');
|
||||
}
|
||||
|
||||
// ✅ Crear carpeta dentro de CARPETA
|
||||
@Post('mkdir')
|
||||
async createFolder(@Body('name') name: string) {
|
||||
if (!name) {
|
||||
throw new BadRequestException('El nombre es obligatorio');
|
||||
}
|
||||
const folderId = await this.driveService.mkDir(name);
|
||||
return { folderId };
|
||||
}
|
||||
|
||||
// ✅ Obtener carpeta (buscar o crear)
|
||||
@Get('folder/:numeroCuenta')
|
||||
async getOrCreateFolder(
|
||||
@Param('numeroCuenta') numeroCuenta: string,
|
||||
) {
|
||||
const folderId = await this.driveService.folder(numeroCuenta);
|
||||
return { folderId };
|
||||
}
|
||||
|
||||
// ✅ Subir archivo (archivo dummy para pruebas)
|
||||
@Post('upload')
|
||||
async uploadFile(
|
||||
@Body('parent') parent: string,
|
||||
) {
|
||||
if (!parent) {
|
||||
throw new BadRequestException('Parent es obligatorio');
|
||||
}
|
||||
|
||||
// Archivo temporal para prueba
|
||||
const tempPath = './temp-test.txt';
|
||||
fs.writeFileSync(tempPath, 'Archivo de prueba DriveService');
|
||||
|
||||
const fileId = await this.driveService.uploadFile(
|
||||
tempPath,
|
||||
'test-drive.txt',
|
||||
'text/plain',
|
||||
parent,
|
||||
);
|
||||
|
||||
return { fileId };
|
||||
}
|
||||
|
||||
// ✅ Mover archivo (update)
|
||||
@Post('update')
|
||||
async updateFile(
|
||||
@Body('fileId') fileId: string,
|
||||
@Body('addParents') addParents: string,
|
||||
@Body('removeParents') removeParents: string,
|
||||
) {
|
||||
if (!fileId || !addParents || !removeParents) {
|
||||
throw new BadRequestException('Datos incompletos');
|
||||
}
|
||||
|
||||
return this.driveService.update(fileId, addParents, removeParents);
|
||||
}
|
||||
|
||||
// ✅ Eliminar archivo
|
||||
@Delete('delete/:fileId')
|
||||
async deleteFile(@Param('fileId') fileId: string) {
|
||||
await this.driveService.deleteFile(fileId);
|
||||
return { message: 'Archivo eliminado correctamente' };
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
// src/drive/drive.module.ts
|
||||
import { Module } from '@nestjs/common';
|
||||
import { DriveService } from './drive.service';
|
||||
import { DriveController } from './drive.controller';
|
||||
|
||||
@Module({
|
||||
controllers: [DriveController],
|
||||
providers: [DriveService],
|
||||
exports: [DriveService],
|
||||
})
|
||||
export class DriveModule {}
|
||||
export class DriveModule { }
|
||||
|
||||
+76
-55
@@ -1,9 +1,11 @@
|
||||
// src/drive/drive.service.ts
|
||||
import { Injectable, InternalServerErrorException } from '@nestjs/common';
|
||||
import {
|
||||
BadRequestException,
|
||||
Injectable,
|
||||
InternalServerErrorException,
|
||||
} from '@nestjs/common';
|
||||
import { google } from 'googleapis';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import { error } from 'console';
|
||||
|
||||
@Injectable()
|
||||
export class DriveService {
|
||||
@@ -11,30 +13,32 @@ export class DriveService {
|
||||
|
||||
private loadCredentials() {
|
||||
try {
|
||||
const credenciales = JSON.parse(
|
||||
fs.readFileSync(path.resolve('./cred.json'), 'utf8'),
|
||||
const oAuth2Client = new google.auth.OAuth2(
|
||||
process.env.CLIENT_ID,
|
||||
process.env.CLIENT_SECRET,
|
||||
);
|
||||
credenciales.private_key = credenciales.private_key.replace(/\\n/g, '\n');
|
||||
return new google.auth.JWT({
|
||||
email: credenciales.client_email,
|
||||
key: credenciales.private_key,
|
||||
scopes: ['https://www.googleapis.com/auth/drive'],
|
||||
});
|
||||
|
||||
oAuth2Client.setCredentials({
|
||||
refresh_token: process.env.REFRESH_TOKEN,
|
||||
});
|
||||
|
||||
return oAuth2Client;
|
||||
} catch (err) {
|
||||
console.error('❌ Error cargando credenciales:', err);
|
||||
throw new InternalServerErrorException('Error al cargar credenciales');
|
||||
throw new InternalServerErrorException(
|
||||
'Error al cargar credenciales de Google Drive',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
async list(pageToken = '') {
|
||||
const authClient = await this.loadCredentials();
|
||||
const authClient = this.loadCredentials();
|
||||
const drive = google.drive({ version: 'v3', auth: authClient });
|
||||
|
||||
try {
|
||||
const res = await drive.files.list({
|
||||
corpora: 'user',
|
||||
supportsTeamDrives: true,
|
||||
includeTeamDriveItems: true,
|
||||
supportsAllDrives: true,
|
||||
includeItemsFromAllDrives: true,
|
||||
spaces: 'drive',
|
||||
pageSize: 1000,
|
||||
pageToken,
|
||||
@@ -50,28 +54,36 @@ export class DriveService {
|
||||
|
||||
async deleteFile(fileId: string) {
|
||||
if (fileId === process.env.CARPETA) {
|
||||
throw new Error('No se puede eliminar este archivo/carpeta.');
|
||||
throw new BadRequestException(
|
||||
'No se puede eliminar este archivo/carpeta.',
|
||||
);
|
||||
}
|
||||
const authClient = await this.loadCredentials();
|
||||
console.log('Eliminando archivo de Drive, ID:', fileId);
|
||||
const authClient = this.loadCredentials();
|
||||
const drive = google.drive({ version: 'v3', auth: authClient });
|
||||
|
||||
try {
|
||||
return await drive.files.delete({ fileId });
|
||||
} catch (err) {
|
||||
throw new InternalServerErrorException(
|
||||
'Error al eliminar archivo: ' + err.message,
|
||||
);
|
||||
console.error('Error al eliminar archivo de Drive:', err.message);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
async uploadFile(filePath: string, name: string, mimeType: string, parent: string) {
|
||||
const authClient = await this.loadCredentials();
|
||||
async uploadFile(
|
||||
filePath: string,
|
||||
name: string,
|
||||
mimeType: string,
|
||||
parent: string,
|
||||
) {
|
||||
const authClient = this.loadCredentials();
|
||||
const drive = google.drive({ version: 'v3', auth: authClient });
|
||||
|
||||
const requestBody = {
|
||||
name,
|
||||
parents: [parent],
|
||||
};
|
||||
|
||||
const media = {
|
||||
mimeType,
|
||||
body: fs.createReadStream(filePath),
|
||||
@@ -82,9 +94,12 @@ export class DriveService {
|
||||
requestBody,
|
||||
media,
|
||||
fields: 'id',
|
||||
supportsAllDrives: true,
|
||||
});
|
||||
|
||||
fs.unlinkSync(filePath);
|
||||
return res.data.id;
|
||||
console.log('Archivo subido a Drive, ID:', res.data.id);
|
||||
return res.data.id!;
|
||||
} catch (err) {
|
||||
throw new InternalServerErrorException(
|
||||
'Error al subir archivo: ' + err.message,
|
||||
@@ -93,36 +108,35 @@ export class DriveService {
|
||||
}
|
||||
|
||||
async mkDir(name: string): Promise<string> {
|
||||
const authClient = await this.loadCredentials();
|
||||
if (!name) {
|
||||
throw new BadRequestException('Nombre de carpeta inválido');
|
||||
}
|
||||
|
||||
if (!process.env.CARPETA) {
|
||||
throw new InternalServerErrorException('CARPETA no configurada');
|
||||
}
|
||||
|
||||
const authClient = this.loadCredentials();
|
||||
const drive = google.drive({ version: 'v3', auth: authClient });
|
||||
|
||||
|
||||
if(!name){
|
||||
throw new Error()
|
||||
}
|
||||
if(!process.env.CARPETA){
|
||||
throw new Error()
|
||||
}
|
||||
|
||||
const requestBody = {
|
||||
name,
|
||||
mimeType: 'application/vnd.google-apps.folder',
|
||||
parents: [process.env.CARPETA],
|
||||
};
|
||||
|
||||
|
||||
try {
|
||||
const res = await drive.files.create({
|
||||
requestBody,
|
||||
fields: 'id',
|
||||
supportsAllDrives: true,
|
||||
});
|
||||
|
||||
if(!res.data.id){
|
||||
throw new Error()
|
||||
}
|
||||
if (!res.data.id) {
|
||||
throw new BadRequestException('No se pudo crear la carpeta');
|
||||
}
|
||||
|
||||
return res.data.id;
|
||||
|
||||
} catch (err) {
|
||||
throw new InternalServerErrorException(
|
||||
'Error al crear carpeta: ' + err.message,
|
||||
@@ -131,7 +145,7 @@ export class DriveService {
|
||||
}
|
||||
|
||||
async update(fileId: string, addParents: string, removeParents: string) {
|
||||
const authClient = await this.loadCredentials();
|
||||
const authClient = this.loadCredentials();
|
||||
const drive = google.drive({ version: 'v3', auth: authClient });
|
||||
|
||||
try {
|
||||
@@ -139,6 +153,7 @@ export class DriveService {
|
||||
fileId,
|
||||
addParents,
|
||||
removeParents,
|
||||
supportsAllDrives: true,
|
||||
});
|
||||
return res.data;
|
||||
} catch (err) {
|
||||
@@ -148,24 +163,30 @@ export class DriveService {
|
||||
}
|
||||
}
|
||||
|
||||
async folder(numeroCuenta: string) {
|
||||
let pageToken = '';
|
||||
do {
|
||||
const res = await this.list(pageToken);
|
||||
if(!res.files){
|
||||
throw new Error()
|
||||
async folder(numeroCuenta: string): Promise<string> {
|
||||
if (!process.env.CARPETA) {
|
||||
throw new InternalServerErrorException('CARPETA no configurada');
|
||||
}
|
||||
|
||||
const authClient = this.loadCredentials();
|
||||
const drive = google.drive({ version: 'v3', auth: authClient });
|
||||
|
||||
const res = await drive.files.list({
|
||||
q: `
|
||||
mimeType='application/vnd.google-apps.folder'
|
||||
and name='${numeroCuenta}'
|
||||
and '${process.env.CARPETA}' in parents
|
||||
and trashed=false
|
||||
`,
|
||||
fields: 'files(id, name)',
|
||||
supportsAllDrives: true,
|
||||
includeItemsFromAllDrives: true,
|
||||
});
|
||||
|
||||
if (res.data.files?.length) {
|
||||
return res.data.files[0].id!;
|
||||
}
|
||||
for (const file of res.files) {
|
||||
if (
|
||||
file.name === numeroCuenta &&
|
||||
file.mimeType === 'application/vnd.google-apps.folder'
|
||||
) {
|
||||
return file.id;
|
||||
}
|
||||
}
|
||||
pageToken = res.nextPageToken || '';
|
||||
|
||||
} while (pageToken);
|
||||
return this.mkDir(numeroCuenta);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,19 @@ const preRegistro = (password, nombre) => {
|
||||
subject: 'Notificación de Pre-Registro.',
|
||||
msj: `Estimado(a) ${nombre}:
|
||||
|
||||
Te informamos que la dependencia en donde decidiste realizar tu servicio social ya te registró en nuestro sistema de servicio social, por lo que para completar el proceso debes ingresar en un periodo máximo de 10 días hábiles a partir de la recepción de este mensaje, a la página https://iris.acatlan.unam.mx/ con tu número de cuenta y contraseña: ${password}, para llenar un formulario con tus datos.
|
||||
|
||||
Te informamos que la dependencia en donde decidiste realizar tu servicio social
|
||||
ya te registró en nuestro sistema de servicio social, por lo que para completar
|
||||
el proceso deberás:
|
||||
|
||||
|
||||
-Ingresar en un periodo máximo de 10 días hábiles a partir de la recepción de este mensaje,
|
||||
a la página https://iris.acatlan.unam.mx/
|
||||
-Tu usuario será tu número de cuenta
|
||||
-Tu contraseña es: ${password}
|
||||
-Deberás llenar un formulario con tus datos
|
||||
|
||||
|
||||
|
||||
En caso de no realizar dicho registro, tu trámite queda inconcluso y no nos hacemos responsables por las horas de servicio social prestadas en cualquier dependencia.
|
||||
|
||||
@@ -272,6 +284,7 @@ ${atentamente}
|
||||
};
|
||||
};
|
||||
|
||||
// Quitamos el module para que podamos exportar normal anteriormente module.export
|
||||
module.exports = {
|
||||
preRegistro,
|
||||
preRegistroRechazadoAlumno,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Injectable } from "@nestjs/common";
|
||||
import { BadRequestException, Injectable } from "@nestjs/common";
|
||||
import { InjectRepository } from "@nestjs/typeorm";
|
||||
import moment from "moment";
|
||||
import { Servicio } from "src/servicio/entities/servicio.entity";
|
||||
@@ -8,49 +8,49 @@ import validator from "validator";
|
||||
|
||||
@Injectable()
|
||||
export class ValidacionService {
|
||||
constructor(
|
||||
@InjectRepository(Servicio)
|
||||
private servicioRepository:Repository<Servicio>,
|
||||
){}
|
||||
constructor(
|
||||
@InjectRepository(Servicio)
|
||||
private servicioRepository: Repository<Servicio>,
|
||||
) { }
|
||||
|
||||
caracterEspecial(char) {
|
||||
caracterEspecial(char) {
|
||||
const charset = [' ', '.', ',', ':', ';', '?', '¿', '!', '¡', '(', ')', '"', "'", '-', '_', '/', '#', '%', '\n'];
|
||||
return charset.includes(char);
|
||||
}
|
||||
|
||||
yaExiste(campo, m) {
|
||||
throw new Error(`Ya se encuentra en uso ${m ? 'el' : 'la'} ${campo}.`);
|
||||
yaExiste(campo, m) {
|
||||
throw new BadRequestException(`Ya se encuentra en uso ${m ? 'el' : 'la'} ${campo}.`);
|
||||
}
|
||||
|
||||
noValido(campo, m, razon) {
|
||||
throw new Error(`${m ? 'El' : 'La'} ${campo} no es valid${m ? 'o' : 'a'}, ${razon}.`);
|
||||
noValido(campo, m, razon) {
|
||||
throw new BadRequestException(`${m ? 'El' : 'La'} ${campo} no es valid${m ? 'o' : 'a'}, ${razon}.`);
|
||||
}
|
||||
|
||||
noHay(variable, campo, m) {
|
||||
if (!variable) throw new Error(`No se mando ${m ? 'el' : 'la'} ${campo}.`);
|
||||
noHay(variable, campo, m) {
|
||||
if (!variable) throw new BadRequestException(`No se mando ${m ? 'el' : 'la'} ${campo}.`);
|
||||
}
|
||||
|
||||
validacionBasicaStr(texto, campo, m, length) {
|
||||
validacionBasicaStr(texto, campo, m, length) {
|
||||
this.noHay(texto, campo, m);
|
||||
if (typeof texto !== 'string') this.noValido(campo, m, 'no se mando una string');
|
||||
if (length && texto.length > length) this.noValido(campo, m, 'tiene más caracteres de lo permitido');
|
||||
return texto;
|
||||
}
|
||||
|
||||
validarNumeroEntero(numero, campo, m: boolean = true) {
|
||||
validarNumeroEntero(numero, campo, m: boolean = true) {
|
||||
this.noHay(numero, campo, m);
|
||||
if (typeof numero === 'number') numero = numero.toString();
|
||||
if (!validator.isNumeric(numero, { no_symbols: true })) this.noValido(campo, m, 'no es un número entero válido');
|
||||
return Number(numero);
|
||||
}
|
||||
|
||||
validarCorreo(correo: any, length?: any, campo: string = 'correo', m: boolean = true) {
|
||||
validarCorreo(correo: any, length?: any, campo: string = 'correo', m: boolean = true) {
|
||||
this.validacionBasicaStr(correo, campo, m, length);
|
||||
if (!validator.isEmail(correo)) this.noValido(campo, m, 'no es un correo válido');
|
||||
return correo;
|
||||
}
|
||||
|
||||
validarTexto(texto, campo, m, length) {
|
||||
validarTexto(texto, campo, m, length) {
|
||||
this.validacionBasicaStr(texto, campo, m, length);
|
||||
for (const char of texto) {
|
||||
if (!validator.isAlpha(char, 'es-ES') && char !== ' ' && char !== '.') {
|
||||
@@ -60,7 +60,7 @@ export class ValidacionService {
|
||||
return texto;
|
||||
}
|
||||
|
||||
validarAlfanumerico(texto, campo, m, length) {
|
||||
validarAlfanumerico(texto, campo, m, length) {
|
||||
this.validacionBasicaStr(texto, campo, m, length);
|
||||
for (const char of texto) {
|
||||
if (!this.caracterEspecial(char) && !validator.isAlphanumeric(char, 'es-ES')) {
|
||||
@@ -70,7 +70,7 @@ export class ValidacionService {
|
||||
return texto;
|
||||
}
|
||||
|
||||
validarNumeroCuenta(numeroCuenta, campo = 'numero de cuenta', m = true) {
|
||||
validarNumeroCuenta(numeroCuenta, campo = 'numero de cuenta', m = true) {
|
||||
this.validacionBasicaStr(numeroCuenta, campo, m, 9);
|
||||
if (!validator.isNumeric(numeroCuenta, { no_symbols: true })) {
|
||||
this.noValido(campo, m, 'tiene caracteres que no son números');
|
||||
@@ -78,14 +78,14 @@ export class ValidacionService {
|
||||
return numeroCuenta;
|
||||
}
|
||||
|
||||
validarFecha(fecha, campo, m) {
|
||||
validarFecha(fecha, campo, m) {
|
||||
const fechaMoment = moment(fecha);
|
||||
this.noHay(fecha, campo, m);
|
||||
if (!fechaMoment.isValid()) this.noValido(campo, m, 'no es una fecha válida');
|
||||
return fechaMoment;
|
||||
}
|
||||
|
||||
validarNumero(numero, campo, m, length, no_symbols = true, makeNumber = false) {
|
||||
validarNumero(numero, campo, m, length, no_symbols = true, makeNumber = false) {
|
||||
this.validacionBasicaStr(numero, campo, m, length);
|
||||
if (!validator.isNumeric(numero, { no_symbols })) {
|
||||
this.noValido(campo, m, 'tiene caracteres que no son números');
|
||||
@@ -93,32 +93,53 @@ export class ValidacionService {
|
||||
return makeNumber ? Number(numero) : numero;
|
||||
}
|
||||
|
||||
validarObjetoVacio(obj) {
|
||||
validarObjetoVacio(obj) {
|
||||
return Object.keys(obj).length === 0;
|
||||
}
|
||||
|
||||
async validarPreTermino(idServicio) {
|
||||
const res = await this.servicioRepository.findOne({ where: { idServicio } });
|
||||
async validarPreTermino(idServicio: number) {
|
||||
const res = await this.servicioRepository.findOne({
|
||||
where: { idServicio },
|
||||
relations: [
|
||||
'cuestionarioPrograma',
|
||||
'cuestionarioPrograma2',
|
||||
'cuestionarioAlumno',
|
||||
'cuestionarioAlumno2',
|
||||
],
|
||||
});
|
||||
|
||||
if (!res) return '';
|
||||
|
||||
const tieneCuestionarioPrograma =
|
||||
!!res.cuestionarioPrograma?.idCuestionarioPrograma ||
|
||||
!!res.cuestionarioPrograma2?.idCuestionarioPrograma2;
|
||||
|
||||
const tieneCuestionarioAlumno =
|
||||
!!res.cuestionarioAlumno?.idCuestionarioAlumno ||
|
||||
!!res.cuestionarioAlumno2?.idCuestionarioAlumno2;
|
||||
|
||||
const tieneDocumentos =
|
||||
!!res.cartaTermino && !!res.informeGlobal;
|
||||
|
||||
if (tieneCuestionarioPrograma && tieneCuestionarioAlumno && tieneDocumentos) {
|
||||
await this.servicioRepository.update(idServicio, {
|
||||
status: { idStatus: 5 },
|
||||
});
|
||||
|
||||
if (
|
||||
(res?.cuestionarioPrograma.idCuestionarioPrograma || res?.cuestionarioPrograma2.idCuestionarioPrograma2) &&
|
||||
(res.cuestionarioAlumno.idCuestionarioAlumno || res.cuestionarioAlumno2.idCuestionarioAlumno2) &&
|
||||
res.cartaTermino &&
|
||||
res.informeGlobal
|
||||
) {
|
||||
await this.servicioRepository.update({ idServicio }, { status: {idStatus:5} });
|
||||
return 'Este Servicio Social pasó a Término, espera a que COESI autorice tu liberación.';
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
validarCuestionarioAlumno2(body) {
|
||||
|
||||
validarCuestionarioAlumno2(body) {
|
||||
const optionalKeys = ['p5', 'p8', 'p16', 'p18'];
|
||||
if (Array.isArray(body.p1)) body.p1 = body.p1.join(', ');
|
||||
|
||||
for (const [key, value] of Object.entries(body)) {
|
||||
if (!optionalKeys.includes(key) && (value === null || value === undefined || value === '')) {
|
||||
throw new Error(`El campo ${key} no puede estar vacío.`);
|
||||
throw new BadRequestException(`El campo ${key} no puede estar vacío.`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,20 +157,20 @@ export class ValidacionService {
|
||||
|
||||
for (const key of expectedKeys) {
|
||||
if (!(key in body)) {
|
||||
throw new Error(`Falta la respuesta para la pregunta ${key}.`);
|
||||
throw new BadRequestException(`Falta la respuesta para la pregunta ${key}.`);
|
||||
}
|
||||
}
|
||||
|
||||
return body;
|
||||
}
|
||||
|
||||
validarCuestionarioPrograma2(body) {
|
||||
validarCuestionarioPrograma2(body) {
|
||||
const camposOpcionales = ['p6'];
|
||||
if (Array.isArray(body.p1)) body.p1 = body.p1.join(', ');
|
||||
|
||||
for (const [key, value] of Object.entries(body)) {
|
||||
if (!camposOpcionales.includes(key) && (value === null || value === undefined || value === '')) {
|
||||
throw new Error(`El campo ${key} no puede estar vacío.`);
|
||||
throw new BadRequestException(`El campo ${key} no puede estar vacío.`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,10 +184,10 @@ export class ValidacionService {
|
||||
|
||||
for (const key of expectedKeys) {
|
||||
if (!(key in body)) {
|
||||
throw new Error(`Falta la respuesta para la pregunta ${key}.`);
|
||||
throw new BadRequestException(`Falta la respuesta para la pregunta ${key}.`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return body;
|
||||
}
|
||||
}
|
||||
+13
-2
@@ -1,12 +1,23 @@
|
||||
import { NestFactory } from '@nestjs/core';
|
||||
import { AppModule } from './app.module';
|
||||
import { ValidationPipe } from '@nestjs/common';
|
||||
|
||||
async function bootstrap() {
|
||||
const app = await NestFactory.create(AppModule);
|
||||
|
||||
app.useGlobalPipes(
|
||||
new ValidationPipe({
|
||||
whitelist: true, // elimina propiedades que no existan en el DTO
|
||||
transform: true, // permite que @Type() funcione
|
||||
transformOptions: { enableImplicitConversion: true }, // convierte strings → number/date
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
app.enableCors();
|
||||
await app.listen(process.env.PORT ?? 3000);
|
||||
console.log(`Aplicación corriendo en: http://localhost:${process.env.PORT ?? 3000}`);
|
||||
await app.listen(process.env.APP_PORT ?? 3000);
|
||||
console.log(
|
||||
`Aplicación corriendo en: http://localhost:${process.env.APP_PORT ?? 3000}`,
|
||||
);
|
||||
}
|
||||
bootstrap();
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
import { Servicio } from "src/servicio/entities/servicio.entity";
|
||||
import { Usuario } from "src/usuario/entities/usuario.entity";
|
||||
import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
import {
|
||||
Column,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
OneToMany,
|
||||
PrimaryGeneratedColumn,
|
||||
} from 'typeorm';
|
||||
|
||||
@Entity('programa')
|
||||
export class Programa {
|
||||
@@ -25,9 +32,10 @@ export class Programa {
|
||||
@Column({ type: 'boolean', default: true })
|
||||
activo: boolean;
|
||||
|
||||
@ManyToOne(()=>Usuario,(usuario)=>usuario.programa)
|
||||
usuario:Usuario;
|
||||
@ManyToOne(() => Usuario, (usuario) => usuario.programa)
|
||||
@JoinColumn({ name: 'idUsuario' })
|
||||
usuario: Usuario;
|
||||
|
||||
@OneToMany(()=>Servicio,(servicio)=>servicio.cuestionarioAlumno2)
|
||||
servicio:Servicio[];
|
||||
@OneToMany(() => Servicio, (servicio) => servicio.cuestionarioAlumno2)
|
||||
servicio: Servicio[];
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
UseInterceptors,
|
||||
BadRequestException,
|
||||
Param,
|
||||
ParseIntPipe,
|
||||
} from '@nestjs/common';
|
||||
import { FileInterceptor } from '@nestjs/platform-express';
|
||||
import { diskStorage } from 'multer';
|
||||
@@ -70,13 +71,18 @@ export class ProgramaController {
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
async reasignarProgramas(
|
||||
@Body() email: Email,
|
||||
@Param('idUsuario') idUsuario: number,
|
||||
@Param('idUsuario', ParseIntPipe) idUsuario: number,
|
||||
) {
|
||||
|
||||
console.log('BODY:', email);
|
||||
console.log('PARAM:', idUsuario);
|
||||
|
||||
try {
|
||||
const data = await this.programaService.reasignarProgramas(
|
||||
idUsuario,
|
||||
email.correo,
|
||||
);
|
||||
|
||||
return {
|
||||
statusCode: 200,
|
||||
message: 'Programas reasignados con éxito',
|
||||
|
||||
@@ -1,9 +1,27 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { ProgramaService } from './programa.service';
|
||||
import { ProgramaController } from './programa.controller';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { Programa } from './entities/programa.entity';
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
import { UsuarioModule } from 'src/usuario/usuario.module';
|
||||
import { ValidacionService } from 'src/helpers.services/validacion.service';
|
||||
import { AuthService } from 'src/auth/auth.service';
|
||||
import { gmail } from 'src/helpers.services/gmail.service';
|
||||
import { AuthModule } from 'src/auth/auth.module';
|
||||
import { JwtService } from '@nestjs/jwt';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Programa, Servicio]), UsuarioModule],
|
||||
controllers: [ProgramaController],
|
||||
providers: [ProgramaService],
|
||||
providers: [
|
||||
ProgramaService,
|
||||
AuthService,
|
||||
ValidacionService,
|
||||
gmail,
|
||||
JwtService,
|
||||
],
|
||||
exports: [TypeOrmModule],
|
||||
})
|
||||
export class ProgramaModule {}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { BadRequestException, Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Like, Repository } from 'typeorm';
|
||||
import * as csv from 'csvtojson';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
@@ -13,6 +13,8 @@ import { ValidacionService } from 'src/helpers.services/validacion.service';
|
||||
import { AuthService } from 'src/auth/auth.service';
|
||||
import { gmail } from 'src/helpers.services/gmail.service';
|
||||
import { SendMailDto } from 'src/helpers.services/dto/send-email.dto';
|
||||
const { enviarSec } = require('../helpers.services/msjCorreos');
|
||||
|
||||
|
||||
@Injectable()
|
||||
export class ProgramaService {
|
||||
@@ -24,7 +26,7 @@ export class ProgramaService {
|
||||
private validacionService: ValidacionService,
|
||||
private authService: AuthService,
|
||||
private gmail: gmail,
|
||||
) {}
|
||||
) { }
|
||||
|
||||
async cargaMasiva(nombreArchivo: string): Promise<{ message: string }> {
|
||||
const filePath = path.join('server/uploads', nombreArchivo);
|
||||
@@ -50,12 +52,14 @@ export class ProgramaService {
|
||||
|
||||
try {
|
||||
this.validacionService.validarCorreo(prog.correo);
|
||||
} catch {
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
mensaje += 'Correo inválido. Línea omitida.\n\n';
|
||||
continue;
|
||||
}
|
||||
|
||||
const acatlan = prog.clave.substr(4, 7) === '-12/20-';
|
||||
const acatlan = prog.clave.substr(4, 8) === '-12/145-';
|
||||
console.log("clave:", prog.clave.substr(4, 8))
|
||||
const activo = Number(prog.clave.substr(0, 4)) === today.year();
|
||||
|
||||
let responsable = await this.usuarioRepo.findOne({
|
||||
@@ -67,11 +71,18 @@ export class ProgramaService {
|
||||
},
|
||||
});
|
||||
|
||||
//Agregamos esta linea para verificar los logs
|
||||
console.log("prog:", prog);
|
||||
|
||||
|
||||
if (!responsable) {
|
||||
const password = await this.authService.encriptar(
|
||||
this.authService.generarPassword(),
|
||||
);
|
||||
const correoInfo = enviarSec(password, prog.correo, prog.nombre);
|
||||
|
||||
let contraseña = await this.authService.generarPassword();
|
||||
const password = await this.authService.encriptar(contraseña);
|
||||
|
||||
|
||||
|
||||
const correoInfo = enviarSec(contraseña, prog.correo, prog.nombre);
|
||||
|
||||
responsable = await this.usuarioRepo.create({
|
||||
usuario: prog.correo,
|
||||
@@ -92,10 +103,6 @@ export class ProgramaService {
|
||||
fecha_recibido: new Date(),
|
||||
};
|
||||
|
||||
if (!process.env.TOKEN_GMAIL) {
|
||||
throw new Error('No existe el token');
|
||||
}
|
||||
|
||||
try {
|
||||
responsable = await this.usuarioRepo.save(responsable);
|
||||
|
||||
@@ -167,6 +174,15 @@ export class ProgramaService {
|
||||
mensaje += `Error creando programa: ${err.message}\n`;
|
||||
}
|
||||
} else {
|
||||
await this.programaRepo.update(
|
||||
{ idPrograma: existente.idPrograma },
|
||||
{ institucion: prog.institucion, programa: prog.programa }
|
||||
)
|
||||
|
||||
await this.usuarioRepo.update(
|
||||
{ idUsuario: responsable.idUsuario },
|
||||
{ nombre: prog.nombre }
|
||||
)
|
||||
mensaje += `Programa ACATLÁN ya pertenece a ${responsable.usuario}\n`;
|
||||
}
|
||||
}
|
||||
@@ -189,17 +205,22 @@ export class ProgramaService {
|
||||
|
||||
const usuario = await this.usuarioRepo.findOne({
|
||||
where: { idUsuario },
|
||||
relations: ['tipoUsuario'],
|
||||
});
|
||||
|
||||
if (!usuario) {
|
||||
throw new Error('No existe este usuario.');
|
||||
throw new BadRequestException('No existe este usuario.');
|
||||
}
|
||||
|
||||
if (usuario.tipoUsuario.idTipoUsuario !== 2) {
|
||||
throw new Error('No es un usuario de tipo responsable');
|
||||
throw new BadRequestException('No es un usuario de tipo responsable');
|
||||
}
|
||||
return this.programaRepo.find({
|
||||
where: { usuario: { idUsuario } },
|
||||
const year = new Date().getFullYear().toString();
|
||||
|
||||
return await this.programaRepo.find({
|
||||
where: {
|
||||
usuario: { idUsuario }, clavePrograma: Like(`${year}%`),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -211,20 +232,23 @@ export class ProgramaService {
|
||||
|
||||
const usuario = await this.usuarioRepo.findOne({
|
||||
where: { idUsuario },
|
||||
relations: ['tipoUsuario'], // Se agrego la relacion con tipo de usuario
|
||||
});
|
||||
|
||||
if (!usuario) {
|
||||
throw new Error('No existe este usuario.');
|
||||
throw new BadRequestException('No existe este usuario.');
|
||||
}
|
||||
|
||||
if (usuario.tipoUsuario.idTipoUsuario !== 2) {
|
||||
throw new Error('No es un usuario de tipo responsable');
|
||||
throw new BadRequestException('No es un usuario de tipo responsable');
|
||||
}
|
||||
const year = new Date().getFullYear().toString();
|
||||
|
||||
return this.programaRepo.find({
|
||||
return await this.programaRepo.find({
|
||||
where: {
|
||||
usuario: { idUsuario },
|
||||
activo: true,
|
||||
clavePrograma: Like(`${year}%`)
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -240,19 +264,20 @@ export class ProgramaService {
|
||||
|
||||
let usuarioNuevo = await this.usuarioRepo.findOne({
|
||||
where: { idUsuario: idusuario },
|
||||
relations: ["tipoUsuario"],
|
||||
});
|
||||
|
||||
if (!usuarioNuevo) throw new Error('No existe este usuario.');
|
||||
if (!usuarioNuevo) throw new BadRequestException('No existe este usuario.');
|
||||
if (usuarioNuevo.tipoUsuario.idTipoUsuario != 2)
|
||||
throw new Error('No es un usuario de tipo responsable');
|
||||
throw new BadRequestException('No es un usuario de tipo responsable');
|
||||
if (usuarioNuevo.usuario === correoOtroResponsable)
|
||||
throw new Error('Son el mismo usuario.');
|
||||
throw new BadRequestException('Son el mismo usuario.');
|
||||
|
||||
let viejoResponsable = await this.usuarioRepo.findOne({
|
||||
where: { usuario: otroResponsable },
|
||||
});
|
||||
|
||||
if (!viejoResponsable) throw new Error('No existe este usuario.');
|
||||
if (!viejoResponsable) throw new BadRequestException('No existe este usuario.');
|
||||
|
||||
await this.programaRepo.update(
|
||||
{ usuario: viejoResponsable },
|
||||
|
||||
@@ -26,11 +26,11 @@ export class CrearServicioDto {
|
||||
@IsEmail()
|
||||
correo: string;
|
||||
|
||||
@IsDate()
|
||||
fechaInicio: Date;
|
||||
@IsDateString()
|
||||
fechaInicio: string; // Cambiado a string antes tenia Date
|
||||
|
||||
@IsDate()
|
||||
fechaFin: Date;
|
||||
@IsDateString()
|
||||
fechaFin: string; // Cambiado a string antes tenia Date
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
|
||||
@@ -12,7 +12,7 @@ export class RegistroValidadoDto {
|
||||
idServicio: number;
|
||||
|
||||
@IsOptional()
|
||||
fechaNacimiento?: Date;
|
||||
fechaNacimiento?: string; // Lo pasamos a string antes date
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
|
||||
@@ -19,15 +19,18 @@ export class UpdateServicioDto {
|
||||
|
||||
@IsOptional()
|
||||
@IsDateString({}, { message: 'fechaInicio debe ser una fecha válida' })
|
||||
fechaInicio?: Date;
|
||||
//@Type(() => Date)
|
||||
fechaInicio?: string; // Lo pasamos a string antes date
|
||||
|
||||
@IsOptional()
|
||||
@IsDateString({}, { message: 'fechaFin debe ser una fecha válida' })
|
||||
fechaFin?: Date;
|
||||
//@Type(() => Date)
|
||||
fechaFin?: string; // Lo pasamos a string antes date
|
||||
|
||||
@IsOptional()
|
||||
@IsDateString({}, { message: 'fechaNacimiento debe ser una fecha válida' })
|
||||
fechaNacimiento?: Date;
|
||||
//@Type(() => Date)
|
||||
fechaNacimiento?: string; // Lo pasamos a string antes date
|
||||
|
||||
@IsOptional()
|
||||
@IsString({ message: 'direccion debe ser texto' })
|
||||
|
||||
@@ -1,88 +1,120 @@
|
||||
import { Carrera } from "src/carrera/entities/carrera.entity";
|
||||
import { CuestionarioAlumno } from "src/cuestionario-alumno/entities/cuestionario-alumno.entity";
|
||||
import { CuestionarioAlumno2 } from "src/cuestionario-alumno2/entities/cuestionario-alumno2.entity";
|
||||
import { CuestionarioPrograma } from "src/cuestionario-programa/entities/cuestionario-programa.entity";
|
||||
import { CuestionarioPrograma2 } from "src/cuestionario-programa2/entities/cuestionario-programa2.entity";
|
||||
import { Programa } from "src/programa/entities/programa.entity";
|
||||
import { Status } from "src/status/entities/status.entity";
|
||||
import { Usuario } from "src/usuario/entities/usuario.entity";
|
||||
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { CuestionarioAlumno } from 'src/cuestionario-alumno/entities/cuestionario-alumno.entity';
|
||||
import { CuestionarioAlumno2 } from 'src/cuestionario-alumno2/entities/cuestionario-alumno2.entity';
|
||||
import { CuestionarioPrograma } from 'src/cuestionario-programa/entities/cuestionario-programa.entity';
|
||||
import { CuestionarioPrograma2 } from 'src/cuestionario-programa2/entities/cuestionario-programa2.entity';
|
||||
import { Programa } from 'src/programa/entities/programa.entity';
|
||||
import { Status } from 'src/status/entities/status.entity';
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
|
||||
@Entity('servicio')
|
||||
export class Servicio {
|
||||
@PrimaryGeneratedColumn()
|
||||
idServicio: number;
|
||||
|
||||
@PrimaryGeneratedColumn()
|
||||
idServicio: number;
|
||||
|
||||
@Column({ type: 'varchar', length: 3 })
|
||||
creditos: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
correo: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 15, nullable: true, default: null })
|
||||
telefono?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 200, nullable: true, default: null })
|
||||
direccion?: string;
|
||||
|
||||
@Column({ type: 'date' })
|
||||
fechaInicio: Date;
|
||||
|
||||
@Column({ type: 'date' })
|
||||
fechaFin: Date;
|
||||
|
||||
@Column({ type: 'date', nullable: true, default: null })
|
||||
fechaLiberacion?: Date;
|
||||
|
||||
@Column({ type: 'date', nullable: true, default: null })
|
||||
fechaNacimiento?: Date;
|
||||
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
carpeta: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
cartaAceptacion: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60, nullable: true, default: null })
|
||||
cartaTermino?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60, nullable: true, default: null })
|
||||
informeGlobal?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 250, nullable: true, default: null })
|
||||
programaInterno?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: true, default: null })
|
||||
profesor?: string;
|
||||
|
||||
@Column({ type: 'boolean', nullable: true, default: null })
|
||||
vistoBuenoAcatlan?: boolean;
|
||||
@Column({ type: 'varchar', length: 3 })
|
||||
creditos: string;
|
||||
|
||||
@ManyToOne(()=>Usuario,(usuario)=>usuario.servicio)
|
||||
usuario:Usuario
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
correo: string;
|
||||
|
||||
@ManyToOne(()=>CuestionarioAlumno2,(cuestionarioAlumno2)=>cuestionarioAlumno2.servicio)
|
||||
cuestionarioAlumno2:CuestionarioAlumno2;
|
||||
@Column({ type: 'varchar', length: 15, nullable: true, default: null })
|
||||
telefono?: string;
|
||||
|
||||
@ManyToOne(()=>CuestionarioPrograma2,(cuestionarioPrograma2)=>cuestionarioPrograma2.servicio)
|
||||
cuestionarioPrograma2:CuestionarioPrograma2;
|
||||
@Column({ type: 'varchar', length: 200, nullable: true, default: null })
|
||||
direccion?: string;
|
||||
|
||||
@ManyToOne(()=>CuestionarioPrograma,(cuestionarioPrograma)=>cuestionarioPrograma.servicio)
|
||||
cuestionarioPrograma:CuestionarioPrograma;
|
||||
|
||||
@ManyToOne(()=>CuestionarioAlumno,(cuestionarioAlumno)=>cuestionarioAlumno.servicio)
|
||||
cuestionarioAlumno:CuestionarioAlumno;
|
||||
@Column({ type: 'date' })
|
||||
fechaInicio: string; // Cambios a tipo string antes tenia date
|
||||
|
||||
@ManyToOne(()=>Status,(status)=>status.servicio)
|
||||
status:Status;
|
||||
@Column({ type: 'date' })
|
||||
fechaFin: string; // Cambios a tipo string antes tenia date
|
||||
|
||||
@ManyToOne(()=>Programa,(programa)=>programa.servicio)
|
||||
programa:Programa;
|
||||
@Column({ type: 'date', nullable: true, default: null })
|
||||
fechaLiberacion?: Date; // string Cambios a tipo string antes tenia date
|
||||
|
||||
@ManyToOne(()=>Carrera,(carrera)=>carrera.servicio)
|
||||
carrera:Carrera;
|
||||
@Column({ type: 'date', nullable: true, default: null })
|
||||
fechaNacimiento?: string; // Cambios a tipo string antes tenia date
|
||||
|
||||
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
carpeta: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60 })
|
||||
cartaAceptacion: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60, nullable: true, default: null })
|
||||
cartaTermino?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 60, nullable: true, default: null })
|
||||
informeGlobal?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 250, nullable: true, default: null })
|
||||
programaInterno?: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50, nullable: true, default: null })
|
||||
profesor?: string;
|
||||
|
||||
@Column({ type: 'boolean', nullable: true, default: null })
|
||||
vistoBuenoAcatlan?: boolean;
|
||||
|
||||
@CreateDateColumn({ name: 'createdAt', type: 'datetime' })
|
||||
createdAt: Date;
|
||||
|
||||
@UpdateDateColumn({ name: 'updatedAt', type: 'datetime' })
|
||||
updatedAt: Date;
|
||||
|
||||
// faltaba createdAT y updatedAT
|
||||
|
||||
@ManyToOne(() => Usuario, (usuario) => usuario.servicio)
|
||||
@JoinColumn({ name: 'idUsuario' })
|
||||
usuario: Usuario;
|
||||
|
||||
@ManyToOne(
|
||||
() => CuestionarioAlumno2,
|
||||
(cuestionarioAlumno2) => cuestionarioAlumno2.servicio,
|
||||
)
|
||||
@JoinColumn({ name: 'idCuestionarioAlumno2' })
|
||||
cuestionarioAlumno2: CuestionarioAlumno2;
|
||||
|
||||
@ManyToOne(
|
||||
() => CuestionarioPrograma2,
|
||||
(cuestionarioPrograma2) => cuestionarioPrograma2.servicio,
|
||||
)
|
||||
@JoinColumn({ name: 'idCuestionarioPrograma2' })
|
||||
cuestionarioPrograma2: CuestionarioPrograma2;
|
||||
|
||||
@ManyToOne(
|
||||
() => CuestionarioPrograma,
|
||||
(cuestionarioPrograma) => cuestionarioPrograma.servicio,
|
||||
)
|
||||
@JoinColumn({ name: 'idCuestionarioPrograma' })
|
||||
cuestionarioPrograma: CuestionarioPrograma;
|
||||
|
||||
@ManyToOne(
|
||||
() => CuestionarioAlumno,
|
||||
(cuestionarioAlumno) => cuestionarioAlumno.servicio,
|
||||
)
|
||||
@JoinColumn({ name: 'idCuestionarioAlumno' })
|
||||
cuestionarioAlumno: CuestionarioAlumno;
|
||||
|
||||
@ManyToOne(() => Status, (status) => status.servicio)
|
||||
@JoinColumn({ name: 'idStatus' })
|
||||
status: Status;
|
||||
|
||||
@ManyToOne(() => Programa, (programa) => programa.servicio)
|
||||
@JoinColumn({ name: 'idPrograma' })
|
||||
programa: Programa;
|
||||
|
||||
@ManyToOne(() => Carrera, (carrera) => carrera.servicios)
|
||||
@JoinColumn({ name: 'idCarrera' })
|
||||
carrera: Carrera;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import { diskStorage } from 'multer';
|
||||
import { extname } from 'path';
|
||||
|
||||
export const multerConfig = {
|
||||
storage: diskStorage({
|
||||
destination: './server/uploads',
|
||||
filename: (req, file, cb) => {
|
||||
const uniqueName =
|
||||
Date.now() + '-' + Math.round(Math.random() * 1e9);
|
||||
cb(null, uniqueName + extname(file.originalname));
|
||||
},
|
||||
}),
|
||||
};
|
||||
@@ -11,6 +11,8 @@ import {
|
||||
UseInterceptors,
|
||||
Res,
|
||||
ParseIntPipe,
|
||||
Param,
|
||||
Req,
|
||||
} from '@nestjs/common';
|
||||
import {
|
||||
FileInterceptor,
|
||||
@@ -20,30 +22,85 @@ import { ServicioService } from './servicio.service';
|
||||
import { AuthGuard } from '@nestjs/passport';
|
||||
import { CrearServicioDto } from './dto/create-servicio.dto';
|
||||
import { Response } from 'express';
|
||||
import { ServiciosAdminDto } from './dto/servicios-admin.dto';
|
||||
import { ServiciosResponsableDto } from './dto/servicios-responsable.dto';
|
||||
import { RegistroValidadoDto } from './dto/registro-validado.dto';
|
||||
import { multerConfig } from './multer';
|
||||
import { diskStorage } from 'multer';
|
||||
|
||||
@Controller('servicio')
|
||||
export class ServicioController {
|
||||
constructor(private readonly servicioService: ServicioService) {}
|
||||
constructor(private readonly servicioService: ServicioService) { }
|
||||
|
||||
// ------------------ POST ------------------
|
||||
|
||||
// Garegue un nuevo endpoint para hacer pruebas
|
||||
@Post('test-upload')
|
||||
@UseInterceptors(FileInterceptor('file'))
|
||||
uploadTest(
|
||||
@UploadedFile() file: Express.Multer.File,
|
||||
@Req() req: any,
|
||||
) {
|
||||
console.log('FILE:', file);
|
||||
console.log('FILES REQ:', req.file);
|
||||
console.log('FILES BODY:', req.body);
|
||||
return { ok: true };
|
||||
}
|
||||
|
||||
@Post('registro-validado')
|
||||
async registroValidado(
|
||||
@Body() dto: RegistroValidadoDto,
|
||||
): Promise<{ message: string }> {
|
||||
console.log('RegistroValidadoDto recibido:', dto);
|
||||
return this.servicioService.registroValidado(dto);
|
||||
}
|
||||
|
||||
@Post('nuevo')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
@UseInterceptors(FileInterceptor('cartaAceptacion'))
|
||||
@UseInterceptors(FileInterceptor('cartaAceptacion', {
|
||||
storage: diskStorage({
|
||||
destination: './server/uploads',
|
||||
filename: (req, file, cb) => {
|
||||
cb(null, Date.now() + '-' + file.originalname);
|
||||
},
|
||||
}),
|
||||
}),
|
||||
)
|
||||
async crearServicio(
|
||||
@UploadedFile() file: Express.Multer.File,
|
||||
@Body('alumno') alumnoJson: string,
|
||||
) {
|
||||
const dto: CrearServicioDto = JSON.parse(alumnoJson);
|
||||
|
||||
console.log('Archivo recibido:', file);
|
||||
|
||||
return await this.servicioService.registrarNuevoServicio(dto, file);
|
||||
}
|
||||
|
||||
// ------------------ GET ------------------
|
||||
|
||||
@Get('todos')
|
||||
//@UseGuards(AuthGuard('jwt'))
|
||||
async obtenerTodosLosServicios() {
|
||||
return this.servicioService.obtenerTodosLosServicios();
|
||||
}
|
||||
|
||||
@Get('admin')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
async obtenerAdmin(@Query() query: any) {
|
||||
return this.servicioService.obtenerDetalleServicio(query.idServicio);
|
||||
async obtenerServiciosAdmin(@Query() dto: ServiciosAdminDto) {
|
||||
return await this.servicioService.obtenerServiciosAdmin(dto);
|
||||
}
|
||||
|
||||
@Get('servicios_responsable')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
async obtenerServiciosResponsable(@Query() dto: ServiciosResponsableDto) {
|
||||
return await this.servicioService.obtenerServiciosResponsable(dto);
|
||||
}
|
||||
|
||||
@Get('admin/:idServicio')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
async obtenerAdmin(@Param('idServicio') idServicio: number) {
|
||||
return this.servicioService.obtenerDetalleServicio(idServicio);
|
||||
}
|
||||
|
||||
@Get('alumno')
|
||||
@@ -62,13 +119,17 @@ export class ServicioController {
|
||||
return res.download(path);
|
||||
}
|
||||
|
||||
// Corregi el endpoint tenia llamando a otrea funcion
|
||||
@Get('reporte')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
async generarReporte(@Query() query: any, @Res() res: Response) {
|
||||
const path = await this.servicioService.generarGustavoBazPrada(query.year);
|
||||
async generarReporte(
|
||||
@Query('inicio') inicio: string,
|
||||
@Query('fin') fin: string,
|
||||
@Res() res: Response) {
|
||||
const path = await this.servicioService.generarReporte(inicio, fin);
|
||||
return res.download(path);
|
||||
}
|
||||
|
||||
|
||||
// ------------------ PUT ------------------
|
||||
|
||||
@Put('cancelar')
|
||||
@@ -78,30 +139,59 @@ export class ServicioController {
|
||||
}
|
||||
|
||||
@Put('carta_aceptacion')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
@UseInterceptors(FileInterceptor('cartaAceptacion'))
|
||||
//@UseGuards(AuthGuard('jwt'))
|
||||
@UseInterceptors(
|
||||
FileInterceptor('cartaAceptacion', {
|
||||
storage: diskStorage({
|
||||
destination: './server/uploads',
|
||||
filename: (req, file, cb) => {
|
||||
cb(null, Date.now() + '-' + file.originalname);
|
||||
},
|
||||
}),
|
||||
}),
|
||||
)
|
||||
async subirCartaAceptacion(
|
||||
@UploadedFile() file: Express.Multer.File,
|
||||
@Body('data') dataJson: string,
|
||||
) {
|
||||
const body = JSON.parse(dataJson);
|
||||
return this.servicioService.cartaTermino(body.idServicio, file);
|
||||
console.log('file:', file)
|
||||
return this.servicioService.cartaTermino(body.idServicio, file.filename);
|
||||
}
|
||||
|
||||
@Put('carta_termino')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
@UseInterceptors(FileInterceptor('cartaTermino'))
|
||||
@UseInterceptors(
|
||||
FileInterceptor('cartaTermino', {
|
||||
storage: diskStorage({
|
||||
destination: './server/uploads',
|
||||
filename: (req, file, cb) => {
|
||||
cb(null, Date.now() + '-' + file.originalname);
|
||||
},
|
||||
}),
|
||||
}),
|
||||
)
|
||||
async subirCartaTermino(
|
||||
@UploadedFile() file: Express.Multer.File,
|
||||
@Body('data') dataJson: string,
|
||||
) {
|
||||
const body = JSON.parse(dataJson);
|
||||
console.log("file", file);
|
||||
return this.servicioService.subirCartaTermino(body.idServicio, file);
|
||||
}
|
||||
|
||||
@Put('informe_global')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
@UseInterceptors(FileInterceptor('informeGlobal'))
|
||||
@UseInterceptors(
|
||||
FileInterceptor('informeGlobal', {
|
||||
storage: diskStorage({
|
||||
destination: './server/uploads',
|
||||
filename: (req, file, cb) => {
|
||||
cb(null, Date.now() + '-' + file.originalname);
|
||||
},
|
||||
}),
|
||||
}),
|
||||
)
|
||||
async subirInformeGlobal(
|
||||
@UploadedFile() file: Express.Multer.File,
|
||||
@Body('data') dataJson: string,
|
||||
@@ -146,13 +236,26 @@ export class ServicioController {
|
||||
{ name: 'cartaAceptacion', maxCount: 1 },
|
||||
{ name: 'cartaTermino', maxCount: 1 },
|
||||
{ name: 'informeGlobal', maxCount: 1 },
|
||||
]),
|
||||
], multerConfig,),
|
||||
|
||||
)
|
||||
async actualizarServicio(
|
||||
@UploadedFiles() files: Record<string, Express.Multer.File[]>,
|
||||
@Body('data') dataJson: string,
|
||||
) {
|
||||
const data = JSON.parse(dataJson);
|
||||
|
||||
return this.servicioService.update(data, files);
|
||||
}
|
||||
|
||||
@Put('registro')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
async registro(@Body() body: { idServicio: number }) {
|
||||
try {
|
||||
return this.servicioService.registro(body.idServicio);
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,9 +8,24 @@ import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { Servicio } from './entities/servicio.entity';
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
import { ArchivoService } from 'src/helpers.services/archivo.service';
|
||||
import { UsuarioModule } from 'src/usuario/usuario.module';
|
||||
import { ProgramaModule } from 'src/programa/programa.module';
|
||||
import { Programa } from 'src/programa/entities/programa.entity';
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { Auth } from 'googleapis';
|
||||
import { AuthService } from 'src/auth/auth.service';
|
||||
import { AuthModule } from 'src/auth/auth.module';
|
||||
import { Status } from 'src/status/entities/status.entity';
|
||||
import { MulterModule } from '@nestjs/platform-express';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Servicio, Usuario])],
|
||||
imports: [
|
||||
TypeOrmModule.forFeature([Servicio, Usuario, Programa, Carrera, Status]),
|
||||
AuthModule,
|
||||
MulterModule.register({
|
||||
dest: './uploads',
|
||||
}),
|
||||
],
|
||||
controllers: [ServicioController],
|
||||
providers: [
|
||||
ServicioService,
|
||||
@@ -19,5 +34,6 @@ import { ArchivoService } from 'src/helpers.services/archivo.service';
|
||||
gmail,
|
||||
ArchivoService,
|
||||
],
|
||||
exports: [TypeOrmModule],
|
||||
})
|
||||
export class ServicioModule {}
|
||||
export class ServicioModule { }
|
||||
|
||||
+415
-182
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,11 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { StatusService } from './status.service';
|
||||
import { StatusController } from './status.controller';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { Status } from './entities/status.entity';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Status])],
|
||||
controllers: [StatusController],
|
||||
providers: [StatusService],
|
||||
})
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
import { Usuario } from "src/usuario/entities/usuario.entity";
|
||||
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { Usuario } from 'src/usuario/entities/usuario.entity';
|
||||
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm';
|
||||
|
||||
@Entity('tipo_usuario')
|
||||
export class TipoUsuario {
|
||||
@PrimaryGeneratedColumn()
|
||||
idTipoUsuario: number;
|
||||
|
||||
@PrimaryGeneratedColumn()
|
||||
idTipoUsuario: number;
|
||||
|
||||
@Column({ type: 'varchar', length: 15 })
|
||||
tipoUsuario: string;
|
||||
|
||||
@OneToMany(()=>Usuario, (usuario)=>usuario.tipoUsuario)
|
||||
usuario:Usuario;
|
||||
@Column({ type: 'varchar', length: 15 })
|
||||
tipoUsuario: string;
|
||||
|
||||
@OneToMany(() => Usuario, (usuario) => usuario.tipoUsuario)
|
||||
usuario: Usuario;
|
||||
}
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
|
||||
import { TipoUsuarioService } from './tipo-usuario.service';
|
||||
import { CreateTipoUsuarioDto } from './dto/create-tipo-usuario.dto';
|
||||
import { UpdateTipoUsuarioDto } from './dto/update-tipo-usuario.dto';
|
||||
|
||||
@Controller('tipo-usuario')
|
||||
export class TipoUsuarioController {
|
||||
constructor(private readonly tipoUsuarioService: TipoUsuarioService) {}
|
||||
|
||||
@Post()
|
||||
create(@Body() createTipoUsuarioDto: CreateTipoUsuarioDto) {
|
||||
return this.tipoUsuarioService.create(createTipoUsuarioDto);
|
||||
}
|
||||
|
||||
@Get()
|
||||
findAll() {
|
||||
return this.tipoUsuarioService.findAll();
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
findOne(@Param('id') id: string) {
|
||||
return this.tipoUsuarioService.findOne(+id);
|
||||
}
|
||||
|
||||
@Patch(':id')
|
||||
update(@Param('id') id: string, @Body() updateTipoUsuarioDto: UpdateTipoUsuarioDto) {
|
||||
return this.tipoUsuarioService.update(+id, updateTipoUsuarioDto);
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
remove(@Param('id') id: string) {
|
||||
return this.tipoUsuarioService.remove(+id);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { TipoUsuario } from './entities/tipo-usuario.entity';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([TipoUsuario])],
|
||||
controllers: [],
|
||||
providers: [],
|
||||
})
|
||||
|
||||
@@ -9,7 +9,6 @@ import {
|
||||
} from 'class-validator';
|
||||
|
||||
export class CreateUsuarioDto {
|
||||
@IsEmail()
|
||||
@IsString()
|
||||
@MaxLength(100)
|
||||
usuario: string;
|
||||
|
||||
@@ -1,13 +1,20 @@
|
||||
import { CasoEspecial } from "src/caso-especial/entities/caso-especial.entity";
|
||||
import { Programa } from "src/programa/entities/programa.entity";
|
||||
import { Servicio } from "src/servicio/entities/servicio.entity";
|
||||
import { TipoUsuario } from "src/tipo-usuario/entities/tipo-usuario.entity";
|
||||
import { Column, Entity, ManyToMany, ManyToOne, OneToMany, PrimaryGeneratedColumn, Unique } from "typeorm";
|
||||
import { CasoEspecial } from 'src/caso-especial/entities/caso-especial.entity';
|
||||
import { Programa } from 'src/programa/entities/programa.entity';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import { TipoUsuario } from 'src/tipo-usuario/entities/tipo-usuario.entity';
|
||||
import {
|
||||
Column,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
OneToMany,
|
||||
PrimaryGeneratedColumn,
|
||||
Unique,
|
||||
} from 'typeorm';
|
||||
|
||||
@Entity('usuario')
|
||||
@Unique(['usuario'])
|
||||
export class Usuario {
|
||||
|
||||
@PrimaryGeneratedColumn()
|
||||
idUsuario: number;
|
||||
|
||||
@@ -23,16 +30,16 @@ export class Usuario {
|
||||
@Column({ type: 'boolean', default: true })
|
||||
activo: boolean;
|
||||
|
||||
@ManyToOne(()=>TipoUsuario,(tipoUsuario)=>tipoUsuario.usuario)
|
||||
tipoUsuario:TipoUsuario;
|
||||
@ManyToOne(() => TipoUsuario, (tipoUsuario) => tipoUsuario.usuario)
|
||||
@JoinColumn({ name: 'idTipoUsuario' }) // Talvez faltaba que se llame idTipoUsuario
|
||||
tipoUsuario: TipoUsuario;
|
||||
|
||||
@OneToMany(()=>CasoEspecial,(casoEspecial)=>casoEspecial.usuario)
|
||||
casoEspecial:CasoEspecial[];
|
||||
@OneToMany(() => CasoEspecial, (casoEspecial) => casoEspecial.usuario)
|
||||
casoEspecial: CasoEspecial[];
|
||||
|
||||
@OneToMany(()=>Programa,(programa)=>programa.usuario)
|
||||
programa:Programa[];
|
||||
|
||||
@OneToMany(()=>Servicio,(servicio)=>servicio.usuario)
|
||||
servicio:Servicio[];
|
||||
@OneToMany(() => Programa, (programa) => programa.usuario)
|
||||
programa: Programa[];
|
||||
|
||||
@OneToMany(() => Servicio, (servicio) => servicio.usuario)
|
||||
servicio: Servicio[];
|
||||
}
|
||||
|
||||
@@ -8,6 +8,10 @@ import {
|
||||
Query,
|
||||
ParseIntPipe,
|
||||
UseGuards,
|
||||
UsePipes,
|
||||
ValidationPipe,
|
||||
HttpException,
|
||||
HttpStatus,
|
||||
} from '@nestjs/common';
|
||||
import { UsuarioService } from './usuario.service';
|
||||
import { CreateUsuarioDto } from './dto/create-usuario.dto';
|
||||
@@ -16,7 +20,26 @@ import { UpdateUsuarioDto } from './dto/update-usuario.dto';
|
||||
|
||||
@Controller('usuario')
|
||||
export class UsuarioController {
|
||||
constructor(private readonly usuarioService: UsuarioService) {}
|
||||
constructor(private readonly usuarioService: UsuarioService) { }
|
||||
|
||||
/*Get('todos')
|
||||
//@UseGuards(AuthGuard('jwt'))
|
||||
async obtenerTodosLosServicios() {
|
||||
return this.usuarioService.obtenerTodosLosUsuarios();
|
||||
}*/ //No subir en produccion
|
||||
|
||||
@Post('crearUsuario')
|
||||
@UsePipes(new ValidationPipe({ transform: true }))
|
||||
async create(@Body() createUsuarioDto: CreateUsuarioDto) {
|
||||
try {
|
||||
return await this.usuarioService.create(createUsuarioDto);
|
||||
} catch (error) {
|
||||
throw new HttpException(
|
||||
error.message || 'Error al crear usuario',
|
||||
HttpStatus.BAD_REQUEST,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Post('escolares/:numeroDeCuenta')
|
||||
async escolares(@Param('numeroDeCuenta') numeroDeCuenta: string) {
|
||||
@@ -24,7 +47,7 @@ export class UsuarioController {
|
||||
}
|
||||
|
||||
@Post('new-password-alumno/:idServicio')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
//@UseGuards(AuthGuard('jwt'))
|
||||
async newPasswordAlumno(
|
||||
@Param('idServicio', ParseIntPipe) idServicio: number,
|
||||
) {
|
||||
@@ -56,7 +79,7 @@ export class UsuarioController {
|
||||
}
|
||||
|
||||
@Patch('responsable/:idUsuario')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
//seGuards(AuthGuard('jwt'))
|
||||
async actualizarResponsable(
|
||||
@Param('idUsuario', ParseIntPipe) idUsuario: number,
|
||||
@Body() updateUsuarioDto: UpdateUsuarioDto,
|
||||
@@ -67,4 +90,12 @@ export class UsuarioController {
|
||||
updateUsuarioDto.nombre,
|
||||
);
|
||||
}
|
||||
|
||||
@Get('tipos-usuario')
|
||||
async findTiposUsuario() {
|
||||
return await this.usuarioService.findAll();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,26 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { UsuarioService } from './usuario.service';
|
||||
import { UsuarioController } from './usuario.controller';
|
||||
import { Usuario } from './entities/usuario.entity';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { CarreraModule } from 'src/carrera/carrera.module';
|
||||
import { ServicioModule } from 'src/servicio/servicio.module';
|
||||
import { gmail } from 'src/helpers.services/gmail.service';
|
||||
import { Auth } from 'googleapis';
|
||||
import { AuthModule } from 'src/auth/auth.module';
|
||||
import { TipoUsuario } from 'src/tipo-usuario/entities/tipo-usuario.entity';
|
||||
import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
TypeOrmModule.forFeature([Usuario, TipoUsuario, Carrera, Servicio]),
|
||||
CarreraModule,
|
||||
ServicioModule,
|
||||
AuthModule,
|
||||
],
|
||||
controllers: [UsuarioController],
|
||||
providers: [UsuarioService],
|
||||
providers: [UsuarioService, gmail],
|
||||
exports: [TypeOrmModule],
|
||||
})
|
||||
export class UsuarioModule {}
|
||||
|
||||
+114
-18
@@ -1,5 +1,7 @@
|
||||
import {
|
||||
BadRequestException,
|
||||
HttpException,
|
||||
HttpStatus,
|
||||
Injectable,
|
||||
NotFoundException,
|
||||
UnauthorizedException,
|
||||
@@ -14,6 +16,8 @@ import { Carrera } from 'src/carrera/entities/carrera.entity';
|
||||
import { Servicio } from 'src/servicio/entities/servicio.entity';
|
||||
import { gmail } from 'src/helpers.services/gmail.service';
|
||||
import { AuthService } from 'src/auth/auth.service';
|
||||
import { TipoUsuario } from 'src/tipo-usuario/entities/tipo-usuario.entity';
|
||||
import * as bcrypt from 'bcrypt';
|
||||
|
||||
@Injectable()
|
||||
export class UsuarioService {
|
||||
@@ -52,24 +56,48 @@ export class UsuarioService {
|
||||
private readonly carreraRepo: Repository<Carrera>,
|
||||
@InjectRepository(Servicio)
|
||||
private readonly servicioRepo: Repository<Servicio>,
|
||||
@InjectRepository(TipoUsuario)
|
||||
private readonly tipoUsurioRepo: Repository<TipoUsuario>,
|
||||
private readonly gmail: gmail,
|
||||
private readonly authService: AuthService,
|
||||
) {}
|
||||
) { }
|
||||
|
||||
async escolares(numeroDeCuenta: string) {
|
||||
let response;
|
||||
try {
|
||||
response = await axios.post(
|
||||
`${process.env.ESCOLARES}${numeroDeCuenta}`,
|
||||
{ password: process.env.ESCOLARES_PASS },
|
||||
if (process.env.MODE == 'pruebas') {
|
||||
/*
|
||||
Quitamos la promesa ya que muestra un error
|
||||
response = new Promise((res) => {
|
||||
res({
|
||||
data: {
|
||||
nombre: 'nombre',
|
||||
carrconst: 'Carrera',
|
||||
avance: '80',
|
||||
},
|
||||
});
|
||||
});
|
||||
*/
|
||||
|
||||
{
|
||||
headers: {
|
||||
'Content-Type': 'application/json', // Tipo de contenido
|
||||
Authorization: `Bearer ${process.env.API_TOKEN}`, // Header de auth
|
||||
return response = {
|
||||
data: {
|
||||
nombre: 'nombre',
|
||||
carrconst: 'Carrera',
|
||||
avance: '80',
|
||||
},
|
||||
},
|
||||
);
|
||||
};
|
||||
} else {
|
||||
response = await axios.post(
|
||||
`${process.env.ESCOLARES}${numeroDeCuenta}`,
|
||||
process.env.ESCOLARES_PASS,
|
||||
{
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
}
|
||||
} catch (error) {
|
||||
throw new UnauthorizedException(
|
||||
'No se pudo conectar con el servicio de escolares',
|
||||
@@ -81,7 +109,7 @@ export class UsuarioService {
|
||||
!response.data.carrconst ||
|
||||
!response.data.avance
|
||||
) {
|
||||
throw new Error(
|
||||
throw new BadRequestException(
|
||||
'El alumno no cumple con los requisitos para realizar el Servicio Social. Si cree que esto es erróneo comunícate al Departamento de Servicio Social y Bolsa de Trabajo.',
|
||||
);
|
||||
}
|
||||
@@ -99,7 +127,7 @@ export class UsuarioService {
|
||||
};
|
||||
|
||||
if (alumno.creditos < this.carreras[alumno.carrera]) {
|
||||
throw new Error('Este alumno no cuenta con los créditos necesarios.');
|
||||
throw new BadRequestException('Este alumno no cuenta con los créditos necesarios.');
|
||||
}
|
||||
while (alumno.nombre.search('') != -1 && alumno.nombre.search('Ã') != -1) {
|
||||
alumno.nombre = alumno.nombre.replace('Ã', 'Ñ');
|
||||
@@ -129,17 +157,17 @@ export class UsuarioService {
|
||||
});
|
||||
alum = await this.userRepo.save(nuevoUsuario);
|
||||
}
|
||||
|
||||
console.log("Alumno:", alumno);
|
||||
return { ...alumno, idUsuario: alum.idUsuario };
|
||||
}
|
||||
|
||||
async newPasswordAlumno(idServicio: number) {
|
||||
const password = this.authService.generarPassword();
|
||||
const password = await this.authService.generarPassword();
|
||||
|
||||
// Buscar el servicio junto con el usuario
|
||||
const servicio = await this.servicioRepo.findOne({
|
||||
where: { idServicio },
|
||||
relations: ['usuario'], // asegura que traiga la relación
|
||||
relations: ['usuario', 'usuario.tipoUsuario'], // asegura que traiga la relación Le agregue la relacion para traer tipoUsuario
|
||||
});
|
||||
|
||||
if (!servicio) {
|
||||
@@ -153,6 +181,7 @@ export class UsuarioService {
|
||||
}
|
||||
|
||||
// Preparar correo
|
||||
const { preRegistro } = require('../helpers.services/msjCorreos');
|
||||
let correo = preRegistro(password, usuario.nombre);
|
||||
|
||||
// Enviar correo
|
||||
@@ -173,10 +202,10 @@ export class UsuarioService {
|
||||
}
|
||||
|
||||
async newPasswordResponsable(idUsuario: number) {
|
||||
const password = this.authService.generarPassword();
|
||||
const password = await this.authService.generarPassword();
|
||||
|
||||
// Buscar usuario
|
||||
const usuario = await this.userRepo.findOne({ where: { idUsuario } });
|
||||
const usuario = await this.userRepo.findOne({ where: { idUsuario }, relations: ['tipoUsuario'] });
|
||||
|
||||
if (!usuario) {
|
||||
throw new NotFoundException('No existe este Usuario.');
|
||||
@@ -186,7 +215,10 @@ export class UsuarioService {
|
||||
throw new BadRequestException('Este usuario no es de tipo responsable.');
|
||||
}
|
||||
|
||||
|
||||
// Preparar correo
|
||||
const { enviarSec } = require('../helpers.services/msjCorreos');
|
||||
|
||||
const correo = enviarSec(password, usuario.usuario, usuario.nombre);
|
||||
|
||||
// Enviar correo
|
||||
@@ -233,7 +265,10 @@ export class UsuarioService {
|
||||
const dataUpdate: Partial<Usuario> = {};
|
||||
|
||||
// Buscar responsable
|
||||
const responsable = await this.userRepo.findOne({ where: { idUsuario } });
|
||||
const responsable = await this.userRepo.findOne({
|
||||
where: { idUsuario },
|
||||
relations: ['tipoUsuario'],
|
||||
});
|
||||
if (!responsable) {
|
||||
throw new NotFoundException(
|
||||
'No existe este responsable en la base de datos.',
|
||||
@@ -249,6 +284,7 @@ export class UsuarioService {
|
||||
if (correo) {
|
||||
const yaUsado = await this.userRepo.findOne({
|
||||
where: { usuario: correo, idUsuario: Not(idUsuario) },
|
||||
relations: ['tipoUsuario'],
|
||||
});
|
||||
|
||||
if (yaUsado) {
|
||||
@@ -278,4 +314,64 @@ export class UsuarioService {
|
||||
'Se actualizó la información de este responsable de programas correctamente.',
|
||||
};
|
||||
}
|
||||
|
||||
async create(createUsuarioDto: CreateUsuarioDto) {
|
||||
// Verificar si el usuario ya existe
|
||||
const usuarioExistente = await this.userRepo.findOne({
|
||||
where: { usuario: createUsuarioDto.usuario },
|
||||
});
|
||||
|
||||
if (usuarioExistente) {
|
||||
throw new HttpException('El usuario ya existe', HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
// Verificar tipo de usuario
|
||||
const tipoUsuario = await this.tipoUsurioRepo.findOne({
|
||||
where: { idTipoUsuario: createUsuarioDto.tipoUsuario },
|
||||
});
|
||||
|
||||
if (!tipoUsuario) {
|
||||
throw new HttpException(
|
||||
'Tipo de usuario no válido',
|
||||
HttpStatus.BAD_REQUEST,
|
||||
);
|
||||
}
|
||||
|
||||
// Hash password
|
||||
let passwordHash = null;
|
||||
if (createUsuarioDto.password) {
|
||||
const saltRounds = 10;
|
||||
passwordHash = await bcrypt.hash(createUsuarioDto.password, saltRounds);
|
||||
}
|
||||
|
||||
// Crear usuario
|
||||
const usuario = this.userRepo.create({
|
||||
...createUsuarioDto,
|
||||
password: passwordHash,
|
||||
tipoUsuario: tipoUsuario,
|
||||
});
|
||||
|
||||
const usuarioGuardado = await this.userRepo.save(usuario);
|
||||
|
||||
// Eliminar password del response
|
||||
const { password, ...result } = usuarioGuardado;
|
||||
return {
|
||||
message: 'Usuario creado exitosamente',
|
||||
usuario: result,
|
||||
};
|
||||
}
|
||||
|
||||
async findAll() {
|
||||
return await this.tipoUsurioRepo.find()
|
||||
}
|
||||
|
||||
/*c obtenerTodosLosUsuarios() {
|
||||
return await this.userRepo.find({
|
||||
relations: ['tipoUsuario'],
|
||||
take: 10,
|
||||
order: {
|
||||
idUsuario: 'DESC', // Ordenar por el más reciente primero
|
||||
},
|
||||
});
|
||||
}*/ // no subir a produccion
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user