47 Commits

Author SHA1 Message Date
IO 4db486a8c6 merge Axel 2026-05-28 14:02:16 -05:00
IO a1028b1cd8 Merge branch 'Axel' of repositorio.acatlan.unam.mx:IO/api-AT into develop 2026-05-28 14:01:15 -05:00
IO 07c1e1651a now can calculate sancion 2026-05-18 14:55:34 -05:00
IO 61fb91c7ec modified conections 2026-04-22 14:42:18 -05:00
IO 46ad8e88ce modified connection 2026-04-22 13:54:54 -05:00
IO 94641514ad delete guard 2026-04-16 16:25:07 -05:00
IO f334a0f9e2 added timeout 2026-04-14 19:35:21 -05:00
IO ac009d0688 added package 2026-04-14 19:21:02 -05:00
Tyrannuss d0217b445b se crearon endpoints para traer datos de los servicios por periodo 2026-04-14 14:17:45 -06:00
IO 8b6186ff6e delete spaces 2026-04-13 12:11:14 -05:00
IO 0d9e82f527 Merge branch 'Axel' of repositorio.acatlan.unam.mx:IO/api-AT 2026-04-06 14:42:00 -05:00
Tyrannuss 0b984f1a9e reportes por mes y año 2026-03-26 18:43:08 -06:00
IO 65bdb47c00 Merge branch 'Axel' of repositorio.acatlan.unam.mx:IO/api-AT 2026-03-26 19:06:07 -05:00
IO 73e0ede7ed package 2026-03-25 20:48:08 -05:00
IO 645c4ed6c1 fixed modified machines' programs and search programs 2026-03-20 17:51:12 -05:00
Tyrannuss 5b5d552b0c se agrego un endponit para buscar inscritos por un rango 2026-03-19 18:33:02 -06:00
IO 4bd78578a7 pool limited 2026-03-19 15:56:59 -05:00
IO 5f5295dcb4 fixed format 2026-03-18 18:28:23 -05:00
IO 70e1e2d7bf fixed orderBy and added roles 2026-03-17 12:07:26 -05:00
IO 2071be5a65 Merge branch 'Axel' of repositorio.acatlan.unam.mx:IO/api-AT into Lino 2026-03-10 17:52:14 -05:00
Tyrannuss b154d1fb93 se cambio la forma de enviar informacion en el service de findAllInscritos 2026-03-10 16:39:39 -06:00
IO 0cf4fc5d3c fixed package 2026-03-10 16:54:33 -05:00
IO 9d07eab337 Merge branch 'master' of repositorio.acatlan.unam.mx:IO/api-AT into Lino 2026-03-10 16:34:49 -05:00
IO af2052111c created active-directory 2026-03-10 16:32:50 -05:00
frcarlos 3bb95a3d50 @Patch idactivo 2026-03-05 14:41:19 -05:00
IO e28d534edf new ep usoWhitout 2026-03-04 18:19:36 -06:00
frcarlos 81ad881d6a merge 2026-03-04 14:20:47 -05:00
IO 54d878c145 now the component login dont give access to inactive 2026-03-04 11:16:14 -06:00
IO 04290f4097 merge axel 2026-03-03 17:41:06 -06:00
IO 22431dd73e Merge branch 'Axel' of repositorio.acatlan.unam.mx:IO/api-AT 2026-03-03 17:37:43 -06:00
IO 9ddff920fb npm audit fix 2026-03-03 17:37:36 -06:00
Tyrannuss a42cfb6247 se agregaron endpoints para ver el monto total por servico filtrando por el periodo de inicio y el periodo de termino 2026-03-03 17:25:25 -06:00
IO c4c14f8520 added IO 2026-03-02 18:50:31 -06:00
IO 9c07860840 Merge branch 'develop' 2026-03-02 18:39:07 -06:00
IO 53ab8c5c27 modified get periodo and return user 2026-03-02 18:38:42 -06:00
IO 0323c93ca3 added all roles 2026-03-02 14:49:15 -06:00
IO 8aa0eab353 delete error about sancion 2026-03-02 12:05:08 -06:00
IO a96187a10f fixed error get student whit error 2026-03-02 12:00:11 -06:00
IO 07e7160242 merge master 2026-02-27 19:23:56 -06:00
IO 1584e16a46 merge carlos 2026-02-27 19:22:56 -06:00
IO 9e836fb947 delete sommeting that not used 2026-02-27 10:56:57 -06:00
IO 8f65896390 Merge branch 'master' into develop 2026-02-26 11:25:58 -06:00
IO 45e91e5c3f Merge branch 'master' into develop 2026-02-25 13:59:05 -06:00
IO 46d98e2a6b new ep uso and new ep in costo 2026-02-25 13:01:34 -06:00
IO b6594bd879 Merge branch 'master' into develop 2026-02-24 11:30:18 -06:00
IO 18b869d681 added guard jwt 2026-02-23 18:16:17 -06:00
IO 472bfebb7a fixed ep mesa 2026-02-23 18:05:09 -06:00
43 changed files with 1243 additions and 684 deletions
+347 -557
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -30,6 +30,7 @@
"@nestjs/typeorm": "^11.0.0", "@nestjs/typeorm": "^11.0.0",
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"class-validator": "^0.14.2", "class-validator": "^0.14.2",
"ldapts": "^8.1.7",
"mysql2": "^3.14.4", "mysql2": "^3.14.4",
"passport": "^0.7.0", "passport": "^0.7.0",
"passport-jwt": "^4.0.1", "passport-jwt": "^4.0.1",
+12 -5
View File
@@ -2,33 +2,40 @@ import { Body, Controller, Post, Req, UseGuards } from '@nestjs/common';
import { OperationsService } from './operations.services'; import { OperationsService } from './operations.services';
import { chargePrintDto } from './dto/operations.dto'; import { chargePrintDto } from './dto/operations.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard'; import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('operations') @Controller('operations')
export class OperationsController { export class OperationsController {
constructor(private readonly operationsService: OperationsService) {} constructor(private readonly operationsService: OperationsService) { }
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.PCPUMA, Role.SERVICIO_SOCIAL)
@Post('impressions') @Post('impressions')
async chargePrint(@Body() data: chargePrintDto, @Req() req: any) { async chargePrint(@Body() data: chargePrintDto, @Req() req: any) {
const id_usuario = req.user.id; const id_usuario = req.user.id;
return this.operationsService.chargePrint(data, id_usuario); return this.operationsService.chargePrint(data, id_usuario);
} }
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.PCPUMA, Role.SERVICIO_SOCIAL)
@Post('receipt') @Post('receipt')
async addCredit(@Body() data, @Req() req: any) { async addCredit(@Body() data, @Req() req: any) {
const id_usuario = req.user.id; const id_usuario = req.user.id;
return this.operationsService.addCredit(data, id_usuario); return this.operationsService.addCredit(data, id_usuario);
} }
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.SERVICIO_SOCIAL, Role.ATENCION_USUARIOS)
@Post('registration') @Post('registration')
async addReceiptInscription(@Body() data, @Req() req: any) { async addReceiptInscription(@Body() data, @Req() req: any) {
const id_usuario = req.user.id; const id_usuario = req.user.id;
return this.operationsService.addReceiptInscription(data, id_usuario); return this.operationsService.addReceiptInscription(data, id_usuario);
} }
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.SERVICIO_SOCIAL, Role.ATENCION_USUARIOS)
@Post('time') @Post('time')
async addTime(@Body() data, @Req() req: any) { async addTime(@Body() data, @Req() req: any) {
const id_usuario = req.user.id; const id_usuario = req.user.id;
@@ -0,0 +1,20 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ActiveDirectoryController } from './active-directory.controller';
import { ActiveDirectoryService } from './active-directory.service';
describe('ActiveDirectoryController', () => {
let controller: ActiveDirectoryController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [ActiveDirectoryController],
providers: [ActiveDirectoryService],
}).compile();
controller = module.get<ActiveDirectoryController>(ActiveDirectoryController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});
@@ -0,0 +1,28 @@
import { Controller, Post, Body, Param } from '@nestjs/common';
import { ActiveDirectoryService } from './active-directory.service';
@Controller('active-directory')
export class ActiveDirectoryController {
constructor(private readonly adService: ActiveDirectoryService) {}
@Post('crear/:cuenta')
async crearUsuario(@Param('cuenta') cuenta: string) {
await this.adService.createUser(cuenta);
return { message: `Usuario ${cuenta} creado en AD` };
}
@Post('reset/:cuenta')
async resetPassword(@Param('cuenta') cuenta: string) {
await this.adService.resetPassword(cuenta);
return { message: `Contraseña de ${cuenta} reseteada` };
}
@Post('cambiar-password/:cuenta')
async cambiarPassword(
@Param('cuenta') cuenta: string,
@Body('password') password?: string,
) {
await this.adService.changePassword(cuenta, password);
return { message: `Contraseña de ${cuenta} actualizada` };
}
}
@@ -0,0 +1,12 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { ActiveDirectoryService } from './active-directory.service';
import { ActiveDirectoryController } from './active-directory.controller';
@Module({
imports: [ConfigModule],
providers: [ActiveDirectoryService],
controllers: [ActiveDirectoryController],
exports: [ActiveDirectoryService],
})
export class ActiveDirectoryModule {}
@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ActiveDirectoryService } from './active-directory.service';
describe('ActiveDirectoryService', () => {
let service: ActiveDirectoryService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [ActiveDirectoryService],
}).compile();
service = module.get<ActiveDirectoryService>(ActiveDirectoryService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});
@@ -0,0 +1,124 @@
import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Client, Attribute, Change } from 'ldapts';
@Injectable()
export class ActiveDirectoryService {
private readonly logger = new Logger(ActiveDirectoryService.name);
constructor(private configService: ConfigService) { }
private createClient(): Client {
return new Client({
url: this.configService.get<string>('AD_URL')!,
tlsOptions: { rejectUnauthorized: false },
});
}
async createUser(cuenta: string): Promise<void> {
const client = this.createClient();
const bindDN = this.configService.get<string>('AD_BIND_DN')!;
const bindPass = this.configService.get<string>('AD_BIND_PASS')!;
const baseDN = this.configService.get<string>('AD_BASE_DN')!;
try {
await client.bind(bindDN, bindPass);
const userDN = `CN=${cuenta},${baseDN}`;
await client.add(userDN, {
objectClass: ['top', 'person', 'organizationalPerson', 'user'],
sAMAccountName: cuenta,
cn: cuenta,
description: 'Creado desde el Sitio',
userAccountControl: '32',
});
const encodedPassword = Buffer.from(`"${cuenta}"`, 'utf16le');
await client.modify(userDN, [
new Change({
operation: 'replace',
modification: new Attribute({ type: 'unicodePwd', values: [encodedPassword] }),
}),
]);
await client.modify(userDN, [
new Change({
operation: 'replace',
modification: new Attribute({ type: 'pwdLastSet', values: ['0'] }),
}),
]);
await client.modify(userDN, [
new Change({
operation: 'replace',
modification: new Attribute({ type: 'userAccountControl', values: ['512'] }),
}),
]);
this.logger.log(`Usuario ${cuenta} creado exitosamente en AD`);
} catch (error) {
this.logger.error(`Error al crear usuario ${cuenta} en AD`, error);
throw error;
} finally {
await client.unbind();
}
}
async resetPassword(cuenta: string): Promise<void> {
const client = this.createClient();
const bindDN = this.configService.get<string>('AD_BIND_DN')!;
const bindPass = this.configService.get<string>('AD_BIND_PASS')!;
const baseDN = this.configService.get<string>('AD_BASE_DN')!;
try {
await client.bind(bindDN, bindPass);
const userDN = `CN=${cuenta},${baseDN}`;
await client.del(userDN);
this.logger.log(`Usuario ${cuenta} eliminado de AD`);
} catch (error) {
this.logger.warn(`No se pudo eliminar ${cuenta} de AD (puede no existir)`, error);
} finally {
await client.unbind();
}
await this.createUser(cuenta);
}
async changePassword(cuenta: string, newPass?: string): Promise<void> {
const client = this.createClient();
const bindDN = this.configService.get<string>('AD_BIND_DN')!;
const bindPass = this.configService.get<string>('AD_BIND_PASS')!;
const baseDN = this.configService.get<string>('AD_BASE_DN')!;
const password = newPass ?? cuenta;
try {
await client.bind(bindDN, bindPass);
const userDN = `CN=${cuenta},${baseDN}`;
const encodedPassword = Buffer.from(`"${password}"`, 'utf16le');
await client.modify(userDN, [
new Change({
operation: 'replace',
modification: new Attribute({ type: 'unicodePwd', values: [encodedPassword] }),
}),
]);
await client.modify(userDN, [
new Change({
operation: 'replace',
modification: new Attribute({ type: 'pwdLastSet', values: ['0'] }),
}),
]);
this.logger.log(`Contraseña de ${cuenta} actualizada`);
} catch (error) {
this.logger.error(`Error al cambiar contraseña de ${cuenta}`, error);
throw error;
} finally {
await client.unbind();
}
}
}
@@ -0,0 +1 @@
export class CreateActiveDirectoryDto {}
@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/mapped-types';
import { CreateActiveDirectoryDto } from './create-active-directory.dto';
export class UpdateActiveDirectoryDto extends PartialType(CreateActiveDirectoryDto) {}
@@ -0,0 +1 @@
export class ActiveDirectory {}
+9 -2
View File
@@ -11,28 +11,35 @@ import { Role } from 'src/role.enum';
export class AlumnoController { export class AlumnoController {
constructor(private readonly alumnoService: AlumnoService) { } constructor(private readonly alumnoService: AlumnoService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
async find() { async find() {
return this.alumnoService.findAll() return this.alumnoService.findAll()
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post() @Post()
async create(@Body() createStudentDto: CreateStudentDto): Promise<Alumno> { async create(@Body() createStudentDto: CreateStudentDto): Promise<Alumno> {
return this.alumnoService.create(createStudentDto); return this.alumnoService.create(createStudentDto);
} }
//@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL,Role.PCPUMA)
@Get(':id') @Get(':id')
findOneWhitSancion(@Param('id') id: number) { findOneWhitSancion(@Param('id') id: number) {
return this.alumnoService.findOneWhitSancion(+id); return this.alumnoService.findOneWhitSancion(+id);
} }
//@UseGuards(JwtAuthGuard) //delete guard to use in cedetec
@Get('sancion/:id') @Get('sancion/:id')
findOne(@Param('id') id: number) { findOne(@Param('id') id: number) {
return this.alumnoService.findOne(+id); return this.alumnoService.findOne(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('/create') @Post('/create')
async newStudent(@Body() createStudentDto: CreateStudentDto) { async newStudent(@Body() createStudentDto: CreateStudentDto) {
return this.alumnoService.create(createStudentDto); return this.alumnoService.create(createStudentDto);
@@ -1,44 +1,48 @@
import { Controller, Get, Post, Body, Param, Patch } from '@nestjs/common'; import { Controller, Get, Post, Body, Param, Patch, UseGuards, ParseIntPipe } from '@nestjs/common';
import { AlumnoInscritoService } from './alumno_inscrito.service'; import { AlumnoInscritoService } from './alumno_inscrito.service';
import { import {
CreateAlumnoInscritoDto, CreateAlumnoInscritoDto,
} from './dto/create-alumno_inscrito.dto'; } from './dto/create-alumno_inscrito.dto';
import { AlumnoInscrito } from './entities/alumno_inscrito.entity'; import { AlumnoInscrito } from './entities/alumno_inscrito.entity';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('alumno-inscrito') @Controller('alumno-inscrito')
export class AlumnoInscritoController { export class AlumnoInscritoController {
constructor(private readonly alumnoInscritoService: AlumnoInscritoService) { } constructor(private readonly alumnoInscritoService: AlumnoInscritoService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Post() @Post()
async create(@Body() dto: CreateAlumnoInscritoDto): Promise<AlumnoInscrito> { async create(@Body() dto: CreateAlumnoInscritoDto): Promise<AlumnoInscrito> {
return this.alumnoInscritoService.createWhitoutPay(dto); return this.alumnoInscritoService.createWhitoutPay(dto);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
async findAll(): Promise<AlumnoInscrito[]> { async findAll(): Promise<AlumnoInscrito[]> {
return this.alumnoInscritoService.findAll(); return this.alumnoInscritoService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get("/inscritos/:idPeriodo") @Get("/inscritos/:idPeriodo")
async findAllInscritos(@Param('idPeriodo') idPeriodo: number) { async findAllInscritos(@Param('idPeriodo') idPeriodo: number) {
return this.alumnoInscritoService.findAllInscritos(idPeriodo); return this.alumnoInscritoService.findAllInscritos(idPeriodo);
} }
// @Post('/tiempo') @UseGuards(JwtAuthGuard, RolesGuard)
// async addTime(@Body() body: AddTimeDto) { @Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
// const { idCuenta, idPlataforma, tiempoExtra } = body;
// return this.alumnoInscritoService.(
// idCuenta,
// idPlataforma,
// tiempoExtra,
// );
// }
@Get('/plataforma') @Get('/plataforma')
async findAllPlataforma() { async findAllPlataforma() {
return this.alumnoInscritoService.findAllPlataforma(); return this.alumnoInscritoService.findAllPlataforma();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get(':id_cuenta') @Get(':id_cuenta')
async findByIdWhitoud( async findByIdWhitoud(
@Param('id_cuenta') id_cuenta: number, @Param('id_cuenta') id_cuenta: number,
@@ -46,6 +50,8 @@ export class AlumnoInscritoController {
return this.alumnoInscritoService.findByIdWhitoud(id_cuenta); return this.alumnoInscritoService.findByIdWhitoud(id_cuenta);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get(':id_cuenta/sancion') @Get(':id_cuenta/sancion')
async findById( async findById(
@Param('id_cuenta') id_cuenta: number, @Param('id_cuenta') id_cuenta: number,
@@ -53,17 +59,26 @@ export class AlumnoInscritoController {
return this.alumnoInscritoService.findById(id_cuenta); return this.alumnoInscritoService.findById(id_cuenta);
} }
//pruebas borrar @Get('inscritos/periodo/:inicio/:fin')
@Patch('platica/:idCuenta/:idPeriodo/:idPlataforma') findByPeriodo(
marcarPlatica( @Param('inicio', ParseIntPipe) inicio: number,
@Param('idCuenta') idCuenta: number, @Param('fin', ParseIntPipe) fin: number,
@Param('idPeriodo') idPeriodo: number,
@Param('idPlataforma') idPlataforma: number,
) { ) {
return this.alumnoInscritoService.marcarPlatica( return this.alumnoInscritoService.findAllInscritosByRango(inicio, fin, 'periodo');
idCuenta, }
idPeriodo,
idPlataforma, @Get('inscritos/anio/:inicio/:fin')
); findByAnio(
@Param('inicio', ParseIntPipe) inicio: number,
@Param('fin', ParseIntPipe) fin: number,
) {
return this.alumnoInscritoService.findAllInscritosByRango(inicio, fin, 'anio');
}
@Get('inscritos/mes/:anio')
findByMes(
@Param('anio', ParseIntPipe) anio: number,
) {
return this.alumnoInscritoService.findAllInscritosByRango(anio, 0, 'mes');
} }
} }
+136 -26
View File
@@ -61,31 +61,26 @@ export class AlumnoInscritoService {
take: 100, take: 100,
}); });
} }
async findAllInscritos(idPeriodo: number) {
async findAllInscritos(idPeriodo: number) { return this.alumnoInscritoRepo
return this.alumnoInscritoRepo .createQueryBuilder('inscritos')
.createQueryBuilder('inscritos') .innerJoin('inscritos.alumno', 'alumno')
.innerJoin('alumno.carrera', 'carrera')
.innerJoin('inscritos.alumno', 'alumno') .innerJoin('inscritos.plataforma', 'plataforma')
.innerJoin('alumno.carrera', 'carrera') .innerJoin('inscritos.periodo', 'periodo')
.innerJoin('inscritos.plataforma', 'plataforma') .where('periodo.id_periodo = :idPeriodo', { idPeriodo })
.innerJoin('inscritos.periodo', 'periodo') .select([
'carrera.carrera AS carrera',
.where('periodo.id_periodo = :idPeriodo', { idPeriodo }) 'periodo.semestre AS semestre',
'plataforma.nombre AS profesor',
.select([ 'COUNT(DISTINCT CASE WHEN alumno.genero IN (\'F\', \'Femenino\') THEN alumno.id_cuenta END) AS femenino',
'carrera.carrera AS carrera', 'COUNT(DISTINCT CASE WHEN alumno.genero IN (\'M\', \'Masculino\') THEN alumno.id_cuenta END) AS masculino',
'alumno.genero AS genero', 'COUNT(DISTINCT alumno.id_cuenta) AS total'
'plataforma.nombre AS profesor', ])
'COUNT(DISTINCT alumno.id_cuenta) AS total' .groupBy('carrera.carrera')
]) .addGroupBy('plataforma.nombre')
.getRawMany();
.groupBy('carrera.carrera') }
.addGroupBy('alumno.genero')
.addGroupBy('plataforma.nombre')
.getRawMany();
}
async findAllPlataforma() { async findAllPlataforma() {
return this.plataformaRepo.find(); return this.plataformaRepo.find();
@@ -199,7 +194,7 @@ export class AlumnoInscritoService {
} }
} }
//Borrar
async addTimeBorrar( async addTimeBorrar(
idCuenta: number, idCuenta: number,
idPlataforma: number, idPlataforma: number,
@@ -236,4 +231,119 @@ export class AlumnoInscritoService {
const create = repo.create(data); const create = repo.create(data);
return await repo.save(create); return await repo.save(create);
} }
async findAllInscritosByRango(
inicio: number,
fin: number,
tipo: 'periodo' | 'mes' | 'anio',
) {
const qb = this.alumnoInscritoRepo
.createQueryBuilder('inscritos')
.innerJoin('inscritos.alumno', 'alumno')
.innerJoin('alumno.carrera', 'carrera')
.innerJoin('inscritos.plataforma', 'plataforma')
.innerJoin('inscritos.periodo', 'periodo');
// ============================
// 🟢 PERIODO
// ============================
if (tipo === 'periodo') {
qb.where('periodo.id_periodo BETWEEN :inicio AND :fin', {
inicio,
fin,
});
qb.select([
'periodo.id_periodo AS id_periodo',
'periodo.semestre AS semestre',
'carrera.carrera AS carrera',
'plataforma.nombre AS profesor',
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('F', 'Femenino')
THEN alumno.id_cuenta
END) AS femenino`,
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('M', 'Masculino')
THEN alumno.id_cuenta
END) AS masculino`,
'COUNT(DISTINCT alumno.id_cuenta) AS total',
]);
qb.groupBy('periodo.id_periodo')
.addGroupBy('carrera.carrera')
.addGroupBy('plataforma.nombre')
.orderBy('periodo.id_periodo', 'ASC');
}
// ============================
// 🔵 AÑO
// ============================
else if (tipo === 'anio') {
qb.where(
'periodo.fecha_inicio_servicio BETWEEN :inicio AND :fin',
{
inicio: `${inicio}-01-01`,
fin: `${fin}-12-31`,
},
);
qb.select([
'YEAR(periodo.fecha_inicio_servicio) AS semestre',
'carrera.carrera AS carrera',
'plataforma.nombre AS profesor',
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('F', 'Femenino')
THEN alumno.id_cuenta
END) AS femenino`,
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('M', 'Masculino')
THEN alumno.id_cuenta
END) AS masculino`,
'COUNT(DISTINCT alumno.id_cuenta) AS total',
]);
qb.groupBy('YEAR(periodo.fecha_inicio_servicio)')
.addGroupBy('carrera.carrera')
.addGroupBy('plataforma.nombre')
.orderBy('YEAR(periodo.fecha_inicio_servicio)', 'ASC')
}
// ============================
// 🟡 MES (UN SOLO AÑO)
// ============================
else if (tipo === 'mes') {
qb.where('YEAR(periodo.fecha_inicio_servicio) = :anio', {
anio: inicio, // aquí "inicio" es el año
});
qb.select([
'MONTH(periodo.fecha_inicio_servicio) AS semestre',
'carrera.carrera AS carrera',
'plataforma.nombre AS profesor',
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('F', 'Femenino')
THEN alumno.id_cuenta
END) AS femenino`,
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('M', 'Masculino')
THEN alumno.id_cuenta
END) AS masculino`,
'COUNT(DISTINCT alumno.id_cuenta) AS total',
]);
qb.groupBy('MONTH(periodo.fecha_inicio_servicio)')
.addGroupBy('carrera.carrera')
.addGroupBy('plataforma.nombre')
.orderBy('YEAR(periodo.fecha_inicio_servicio)', 'ASC')
}
return qb.getRawMany();
} }
}
@@ -1,21 +1,31 @@
import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common'; import { Body, Controller, Delete, Get, Param, Post, UseGuards } from '@nestjs/common';
import { AlumnoSancionService } from './alumno_sancion.service'; import { AlumnoSancionService } from './alumno_sancion.service';
import { CreateAlumnoSancionDto } from './dto/create-alumno_sancion.dto'; import { CreateAlumnoSancionDto } from './dto/create-alumno_sancion.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('alumno-sancion') @Controller('alumno-sancion')
export class AlumnoSancionController { export class AlumnoSancionController {
constructor(private readonly alumnoSancionService: AlumnoSancionService) {} constructor(private readonly alumnoSancionService: AlumnoSancionService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post() @Post()
async create(@Body() createAlumnoSancionDto: CreateAlumnoSancionDto) { async create(@Body() createAlumnoSancionDto: CreateAlumnoSancionDto) {
return this.alumnoSancionService.create(createAlumnoSancionDto); return this.alumnoSancionService.create(createAlumnoSancionDto);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get(':id') @Get(':id')
findbyStudent(@Param('id') id: number) { findbyStudent(@Param('id') id: number) {
return this.alumnoSancionService.findbyStudent(+id); return this.alumnoSancionService.findbyStudent(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Delete(':id_cuenta') @Delete(':id_cuenta')
async deleteSancionesAlumno(@Param('id_cuenta') id_cuenta: number) { async deleteSancionesAlumno(@Param('id_cuenta') id_cuenta: number) {
return this.alumnoSancionService.removeByStudent(+id_cuenta); return this.alumnoSancionService.removeByStudent(+id_cuenta);
+18 -4
View File
@@ -54,12 +54,26 @@ export class AlumnoSancionService {
const alusancion = await this.alumnosancionRepository.find({ const alusancion = await this.alumnosancionRepository.find({
where: { alumno: { id_cuenta } }, where: { alumno: { id_cuenta } },
relations: ['sancion'],
}); });
if (alusancion.length === 0) { const now = new Date();
throw new NotFoundException(`El estudiante no cuenta con una sanción activa`);
} const sancionesActivas = alusancion.filter((item) => {
return { student, alusancion }; const fechaInicio = new Date(item.fecha_inicio);
const fechaFin = new Date(fechaInicio);
fechaFin.setDate(
fechaFin.getDate() + item.sancion.duracion * 7,
);
return fechaFin >= now;
});
return {
student,
alusancion: sancionesActivas,
};
} }
async removeByStudent(id_cuenta: number): Promise<{ message: string }> { async removeByStudent(id_cuenta: number): Promise<{ message: string }> {
+10 -1
View File
@@ -43,6 +43,7 @@ import { BitacoraModule } from './bitacora/bitacora.module';
import { Bitacora } from './bitacora/entities/bitacora.entity'; import { Bitacora } from './bitacora/entities/bitacora.entity';
import { MensajeModule } from './mensaje/mensaje.module'; import { MensajeModule } from './mensaje/mensaje.module';
import { Mensaje } from './mensaje/entities/mensaje.entity'; import { Mensaje } from './mensaje/entities/mensaje.entity';
import { ActiveDirectoryModule } from './active-directory/active-directory.module';
import { CostoModule } from './costo/costo.module'; import { CostoModule } from './costo/costo.module';
import { Costo } from './costo/entities/costo.entity'; import { Costo } from './costo/entities/costo.entity';
@@ -85,6 +86,13 @@ import { Costo } from './costo/entities/costo.entity';
Costo, Costo,
], ],
synchronize: false, //Never change to true in production! synchronize: false, //Never change to true in production!
extra: {
connectionLimit: 5,
waitForConnections: true,
idleTimeout: 60000,
connectTimeout: 10000,
},
}), }),
}), }),
UserModule, UserModule,
@@ -107,9 +115,10 @@ import { Costo } from './costo/entities/costo.entity';
BitacoraModule, BitacoraModule,
MensajeModule, MensajeModule,
CostoModule, CostoModule,
ActiveDirectoryModule,
], ],
controllers: [AppController], controllers: [AppController],
providers: [AppService], providers: [AppService],
}) })
export class AppModule {} export class AppModule { }
//IO //IO
@@ -1,22 +1,32 @@
import { Controller, Get, Param } from '@nestjs/common'; import { Controller, Get, Param, UseGuards } from '@nestjs/common';
import { AreaUbicacionService } from './area_ubicacion.service'; import { AreaUbicacionService } from './area_ubicacion.service';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('area-ubicacion') @Controller('area-ubicacion')
export class AreaUbicacionController { export class AreaUbicacionController {
constructor(private readonly areaUbicacionService: AreaUbicacionService) {} constructor(private readonly areaUbicacionService: AreaUbicacionService) { }
@Get() @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get()
findAll() { findAll() {
return this.areaUbicacionService.findAll(); return this.areaUbicacionService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get(':id') @Get(':id')
findOne(@Param('id') id: string) { findOne(@Param('id') id: string) {
return this.areaUbicacionService.findOne(+id); return this.areaUbicacionService.findOne(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('/programs/:id') @Get('/programs/:id')
findProgramsByArea(@Param('id')id:number){ findProgramsByArea(@Param('id') id: number) {
return this.areaUbicacionService.findProgramsByArea(+id) return this.areaUbicacionService.findProgramsByArea(+id)
} }
} }
+19 -2
View File
@@ -1,26 +1,38 @@
import { Controller, Get, Post, Body, Param, Patch } from '@nestjs/common'; import { Controller, Get, Post, Body, Param, Patch, UseGuards } from '@nestjs/common';
import { BitacoraService } from './bitacora.service'; import { BitacoraService } from './bitacora.service';
import { BitacoraAlumnoDto, CreateBitacoraDto, EquiposPorEquipoDto } from './dto/create-bitacora.dto'; import { BitacoraAlumnoDto, CreateBitacoraDto, EquiposPorEquipoDto } from './dto/create-bitacora.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('bitacora') @Controller('bitacora')
export class BitacoraController { export class BitacoraController {
constructor(private readonly bitacoraService: BitacoraService) { } constructor(private readonly bitacoraService: BitacoraService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Post() @Post()
assignment(@Body() createBitacoraDto: CreateBitacoraDto) { assignment(@Body() createBitacoraDto: CreateBitacoraDto) {
return this.bitacoraService.assignment(createBitacoraDto); return this.bitacoraService.assignment(createBitacoraDto);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get('/cuenta/:id') @Get('/cuenta/:id')
findOneByAcount(@Param('id') id: string) { findOneByAcount(@Param('id') id: string) {
return this.bitacoraService.findOneByAcount(+id); return this.bitacoraService.findOneByAcount(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get('/equipo/:id') @Get('/equipo/:id')
findOneByMachine(@Param('id') id: string) { findOneByMachine(@Param('id') id: string) {
return this.bitacoraService.findOneByMachine(+id); return this.bitacoraService.findOneByMachine(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Patch('cancelar/:id') @Patch('cancelar/:id')
cancelationByMachine( cancelationByMachine(
@Param('id') id: number, @Param('id') id: number,
@@ -29,12 +41,15 @@ export class BitacoraController {
return this.bitacoraService.cancelation(id, tiempo_asignado); return this.bitacoraService.cancelation(id, tiempo_asignado);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
findAll() { findAll() {
return this.bitacoraService.findAll(); return this.bitacoraService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('equipos-por-dia') @Post('equipos-por-dia')
async obtenerEquipos( async obtenerEquipos(
@Body() dto: BitacoraAlumnoDto @Body() dto: BitacoraAlumnoDto
@@ -45,6 +60,8 @@ export class BitacoraController {
); );
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('equipos-por-equipo') @Post('equipos-por-equipo')
async equiposPorEquipo( async equiposPorEquipo(
@Body() dto: EquiposPorEquipoDto, @Body() dto: EquiposPorEquipoDto,
+21 -1
View File
@@ -5,45 +5,63 @@ import {
Body, Body,
Patch, Patch,
Param, Param,
Delete, UseGuards,
} from '@nestjs/common'; } from '@nestjs/common';
import { BitacoraMesaService } from './bitacora_mesa.service'; import { BitacoraMesaService } from './bitacora_mesa.service';
import { CreateBitacoraMesaDto, FindByDate } from './dto/create-bitacora_mesa.dto'; import { CreateBitacoraMesaDto, FindByDate } from './dto/create-bitacora_mesa.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('bitacora-mesa') @Controller('bitacora-mesa')
export class BitacoraMesaController { export class BitacoraMesaController {
constructor(private readonly bitacoraMesaService: BitacoraMesaService) { } constructor(private readonly bitacoraMesaService: BitacoraMesaService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Post() @Post()
assignment(@Body() createBitacoraMesaDto: CreateBitacoraMesaDto) { assignment(@Body() createBitacoraMesaDto: CreateBitacoraMesaDto) {
return this.bitacoraMesaService.assignment(createBitacoraMesaDto); return this.bitacoraMesaService.assignment(createBitacoraMesaDto);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
findAll() { findAll() {
return this.bitacoraMesaService.findAll(); return this.bitacoraMesaService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get(':id') @Get(':id')
findOne(@Param('id') id: string) { findOne(@Param('id') id: string) {
return this.bitacoraMesaService.findOne(+id); return this.bitacoraMesaService.findOne(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get('/cuenta/:id_cuenta') @Get('/cuenta/:id_cuenta')
findByCuenta(@Param('id_cuenta') id_cuenta: string) { findByCuenta(@Param('id_cuenta') id_cuenta: string) {
return this.bitacoraMesaService.findByCuenta(+id_cuenta); return this.bitacoraMesaService.findByCuenta(+id_cuenta);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get('/table/:id_mesa') @Get('/table/:id_mesa')
findByTable(@Param('id_mesa') id_mesa: number) { findByTable(@Param('id_mesa') id_mesa: number) {
return this.bitacoraMesaService.findByTable(id_mesa); return this.bitacoraMesaService.findByTable(id_mesa);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('/date') @Post('/date')
findByDate(@Body() data: FindByDate) { findByDate(@Body() data: FindByDate) {
return this.bitacoraMesaService.findByDate(data.date); return this.bitacoraMesaService.findByDate(data.date);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Patch('cancelar/:id') @Patch('cancelar/:id')
cancelationByMachine( cancelationByMachine(
@Param('id') id: number, @Param('id') id: number,
@@ -52,6 +70,8 @@ export class BitacoraMesaController {
return this.bitacoraMesaService.cancelation(id, tiempo_asignado); return this.bitacoraMesaService.cancelation(id, tiempo_asignado);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('mesas-por-dia') @Post('mesas-por-dia')
mesasPorDia(@Body() body: { fecha: string }) { mesasPorDia(@Body() body: { fecha: string }) {
return this.bitacoraMesaService.mesasPorFecha(body.fecha); return this.bitacoraMesaService.mesasPorFecha(body.fecha);
+8 -2
View File
@@ -1,11 +1,17 @@
import { Controller, Get } from '@nestjs/common'; import { Controller, Get, UseGuards } from '@nestjs/common';
import { CarreraService } from './carrera.service'; import { CarreraService } from './carrera.service';
import { Carrera } from './entities/carrera.entity'; import { Carrera } from './entities/carrera.entity';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('carrera') @Controller('carrera')
export class CarreraController { export class CarreraController {
constructor(private readonly carreraService: CarreraService) {} constructor(private readonly carreraService: CarreraService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get() @Get()
findAll(): Promise<Carrera[]> { findAll(): Promise<Carrera[]> {
return this.carreraService.findAll(); return this.carreraService.findAll();
+15 -3
View File
@@ -1,13 +1,25 @@
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; import { Controller, Get, Param, UseGuards } from '@nestjs/common';
import { CostoService } from './costo.service'; import { CostoService } from './costo.service';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Role } from 'src/role.enum';
import { Roles } from 'src/roles.decorator';
@Controller('costo') @Controller('costo')
export class CostoController { export class CostoController {
constructor(private readonly costoService: CostoService) {} constructor(private readonly costoService: CostoService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL,Role.PCPUMA)
@Get() @Get()
findAll() { findAll() {
return this.costoService.findAll(); return this.costoService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('/:id_servicio')
find(@Param('id_servicio') id_servicio: number) {
return this.costoService.find(id_servicio);
}
} }
+6 -1
View File
@@ -6,9 +6,14 @@ import { Repository } from 'typeorm';
@Injectable() @Injectable()
export class CostoService { export class CostoService {
constructor(@InjectRepository(Costo) constructor(@InjectRepository(Costo)
private readonly CostoRepository: Repository<Costo>) { } private readonly CostoRepository: Repository<Costo>) {}
findAll() { findAll() {
return this.CostoRepository.find(); return this.CostoRepository.find();
} }
find(id_servicio: number) {
return this.CostoRepository.find({ where: { id_servicio } });
}
} }
@@ -1,20 +1,41 @@
import { Body, Controller, Get, Post } from '@nestjs/common'; import { Body, Controller, Get, Post, Query, UseGuards } from '@nestjs/common';
import { DetalleServicioService } from './detalle_servicio.service'; import { DetalleServicioService } from './detalle_servicio.service';
import { FindReciboByRangeDto } from 'src/recibo/dto/create-recibo.dto'; import { FindReciboByRangeDto } from 'src/recibo/dto/create-recibo.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('detalle-servicio') @Controller('detalle-servicio')
export class DetalleServicioController { export class DetalleServicioController {
constructor(private readonly detalleServicioService: DetalleServicioService) {} constructor(private readonly detalleServicioService: DetalleServicioService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
findAll(){ findAll() {
return this.detalleServicioService.findAll() return this.detalleServicioService.findAll()
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('rango') @Post('rango')
async findByDateRange(@Body() data: FindReciboByRangeDto) { async findByDateRange(@Body() data: FindReciboByRangeDto) {
return this.detalleServicioService.findByDateRange(data.desde, data.hasta); return this.detalleServicioService.findByDateRange(data.desde, data.hasta);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('totales-por-periodo')
async getTotalesPorPeriodo(
@Query('periodoInicio') periodoInicio?: string,
@Query('periodoFin') periodoFin?: string,
@Query('servicioId') servicioId?: string,
) {
const inicio = periodoInicio ? parseInt(periodoInicio) : undefined;
const fin = periodoFin ? parseInt(periodoFin) : undefined;
const servicio = servicioId ? parseInt(servicioId) : undefined;
return this.detalleServicioService.getTotalesPorServicioYPeriodo(inicio, fin, servicio);
}
} }
@@ -35,4 +35,42 @@ export class DetalleServicioService {
.addGroupBy('servicio.servicio') .addGroupBy('servicio.servicio')
.getRawMany(); .getRawMany();
} }
async getTotalesPorServicioYPeriodo(periodoInicio?: number, periodoFin?: number, servicioId?: number) {
const query = this.detalleServicioRepository
.createQueryBuilder('ds')
.select('s.servicio', 'nombre_servicio')
.addSelect('p.semestre', 'periodo')
.addSelect('p.id_periodo', 'id_periodo')
.addSelect('SUM(ds.monto)', 'monto_total')
.innerJoin('ds.servicio', 's')
.innerJoin('ds.periodo', 'p');
if (periodoInicio && periodoFin) {
query.andWhere('p.id_periodo BETWEEN :inicio AND :fin', { inicio: periodoInicio, fin: periodoFin });
} else if (periodoInicio) {
query.andWhere('p.id_periodo >= :inicio', { inicio: periodoInicio });
} else if (periodoFin) {
query.andWhere('p.id_periodo <= :fin', { fin: periodoFin });
}
if (servicioId) {
query.andWhere('s.id_servicio = :servicioId', { servicioId });
}
const resultados = await query
.groupBy('s.id_servicio')
.addGroupBy('p.id_periodo')
.orderBy('p.id_periodo')
.addOrderBy('s.servicio')
.getRawMany();
return resultados.map(item => ({
nombre_servicio: item.nombre_servicio,
periodo: item.periodo,
monto_total: parseFloat(item.monto_total) || 0,
}));
} }
}
//IO
+25 -1
View File
@@ -1,57 +1,81 @@
import { Body, Controller, Get, Param, Patch, Post } from '@nestjs/common'; import { Body, Controller, Get, Param, Patch, Post, UseGuards } from '@nestjs/common';
import { EquipoService } from './equipo.service'; import { EquipoService } from './equipo.service';
import { Equipo } from './entities/equipo.entity'; import { Equipo } from './entities/equipo.entity';
import { CreateEquipoDto, UpdateAreaEquiposDto } from './dto/create-equipo.dto'; import { CreateEquipoDto, UpdateAreaEquiposDto } from './dto/create-equipo.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('equipo') @Controller('equipo')
export class EquipoController { export class EquipoController {
constructor(private readonly equipoService: EquipoService) { } constructor(private readonly equipoService: EquipoService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Get() @Get()
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.SERVICIO_SOCIAL)
findAll(): Promise<Equipo[]> { findAll(): Promise<Equipo[]> {
return this.equipoService.findAll(); return this.equipoService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get('/active') @Get('/active')
findActive() { findActive() {
return this.equipoService.findActive(); return this.equipoService.findActive();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('/disable') @Get('/disable')
findDisable() { findDisable() {
return this.equipoService.findDisable(); return this.equipoService.findDisable();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Get('/student/:id') @Get('/student/:id')
findOnlyUsable(@Param('id') id: number): Promise<Equipo[]> { findOnlyUsable(@Param('id') id: number): Promise<Equipo[]> {
return this.equipoService.findOnlyUsable(+id); return this.equipoService.findOnlyUsable(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('/busy') @Get('/busy')
findOnlyBusy(): Promise<Equipo[]> { findOnlyBusy(): Promise<Equipo[]> {
return this.equipoService.findOnlyBusy(); return this.equipoService.findOnlyBusy();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get(':id') @Get(':id')
findOne(@Param('id') id: string): Promise<Equipo> { findOne(@Param('id') id: string): Promise<Equipo> {
return this.equipoService.findOne(id); return this.equipoService.findOne(id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post() @Post()
create(@Body() equipo: CreateEquipoDto) { create(@Body() equipo: CreateEquipoDto) {
return this.equipoService.create(equipo); return this.equipoService.create(equipo);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Patch() @Patch()
update(@Body() equipo: CreateEquipoDto) { update(@Body() equipo: CreateEquipoDto) {
return this.equipoService.update(equipo); return this.equipoService.update(equipo);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.SERVICIO_SOCIAL)
@Patch(':id/activo') @Patch(':id/activo')
toggleActivo(@Param('id') id: number) { toggleActivo(@Param('id') id: number) {
return this.equipoService.toggleActivo(+id); return this.equipoService.toggleActivo(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR,Role.ATENCION_USUARIOS,Role.SERVICIO_SOCIAL)
@Patch('actualizar-area') @Patch('actualizar-area')
actualizarPorArea( actualizarPorArea(
@Body() updateAreaEquiposDto: UpdateAreaEquiposDto, @Body() updateAreaEquiposDto: UpdateAreaEquiposDto,
+2 -2
View File
@@ -51,7 +51,7 @@ export class EquipoService {
.innerJoin('equipo.plataforma', 'p') .innerJoin('equipo.plataforma', 'p')
.innerJoin('equipo.areaUbicacion', 'a') .innerJoin('equipo.areaUbicacion', 'a')
.where('equipo.activo = 1') .where('equipo.activo = 1')
.orderBy('equipo.ubicacion', 'ASC') .orderBy('equipo.ubicacion + 0', 'ASC')
.getRawMany(); .getRawMany();
} }
@@ -108,7 +108,7 @@ export class EquipoService {
return `equipo.id_equipo NOT IN ${subQuery}`; return `equipo.id_equipo NOT IN ${subQuery}`;
}) })
.orderBy('equipo.ubicacion', 'ASC') .orderBy('equipo.ubicacion + 0', 'ASC')
.getMany(); .getMany();
+5 -4
View File
@@ -10,10 +10,11 @@ async function bootstrap() {
app.useGlobalPipes(new ValidationPipe()); app.useGlobalPipes(new ValidationPipe());
app.enableCors( app.enableCors(
// { // {
// origin: configService.get<string>('Front_URL'), // origin: configService.get<string>('Front_URL'),
// } // }
); );
app.enableShutdownHooks();
await app.listen(process.env.PORT ?? 3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
+10 -5
View File
@@ -1,17 +1,22 @@
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; import { Controller, Get, Param, UseGuards } from '@nestjs/common';
import { MensajeService } from './mensaje.service'; import { MensajeService } from './mensaje.service';
import { CreateMensajeDto } from './dto/create-mensaje.dto'; import { JwtAuthGuard } from 'src/user/jwt.guard';
import { UpdateMensajeDto } from './dto/update-mensaje.dto'; import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('mensaje') @Controller('mensaje')
export class MensajeController { export class MensajeController {
constructor(private readonly mensajeService: MensajeService) {} constructor(private readonly mensajeService: MensajeService) { }
@Get() @UseGuards(JwtAuthGuard, RolesGuard)
@Get() @Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
findAll() { findAll() {
return this.mensajeService.findAll(); return this.mensajeService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get(':id') @Get(':id')
findOne(@Param('id') id: string) { findOne(@Param('id') id: string) {
return this.mensajeService.findOne(+id); return this.mensajeService.findOne(+id);
+22 -1
View File
@@ -1,26 +1,45 @@
import { Controller, Body, Patch, Param, Get } from '@nestjs/common'; import { Controller, Body, Patch, Param, Get, UseGuards } from '@nestjs/common';
import { MesaService } from './mesa.service'; import { MesaService } from './mesa.service';
import { UpdateMesaDto } from './dto/update-mesa.dto'; import { UpdateMesaDto } from './dto/update-mesa.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Role } from 'src/role.enum';
import { Roles } from 'src/roles.decorator';
@Controller('mesa') @Controller('mesa')
export class MesaController { export class MesaController {
constructor(private readonly mesaService: MesaService) { } constructor(private readonly mesaService: MesaService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.SERVICIO_SOCIAL)
@Get() @Get()
async findAll() { async findAll() {
return this.mesaService.findAll(); return this.mesaService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.SERVICIO_SOCIAL)
@Get('activo') @Get('activo')
async findAllActivo() { async findAllActivo() {
return this.mesaService.findAllActivo(); return this.mesaService.findAllActivo();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.SERVICIO_SOCIAL)
@Get('uso') @Get('uso')
async findActiveMesas() { async findActiveMesas() {
return this.mesaService.findActiveMesas(); return this.mesaService.findActiveMesas();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.SERVICIO_SOCIAL)
@Get('usoWhitout')
async findActiveMesasWhitoudOcupado() {
return this.mesaService.findActiveMesasWhitoudOcupado();
}
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Patch(':id') @Patch(':id')
async updateActivo( async updateActivo(
@Param('id') id: number, @Param('id') id: number,
@@ -29,6 +48,8 @@ export class MesaController {
return this.mesaService.updateActivo(id, updateMesaDto); return this.mesaService.updateActivo(id, updateMesaDto);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR, Role.ATENCION_USUARIOS, Role.SERVICIO_SOCIAL)
@Patch(':id/activo') @Patch(':id/activo')
toggleActivo(@Param('id') id: number) { toggleActivo(@Param('id') id: number) {
return this.mesaService.toggleActivo(+id); return this.mesaService.toggleActivo(+id);
+23
View File
@@ -142,4 +142,27 @@ export class MesaService {
.orderBy('mesa.id_mesa', 'ASC') .orderBy('mesa.id_mesa', 'ASC')
.getRawMany(); .getRawMany();
} }
findActiveMesasWhitoudOcupado() {
return this.mesaRepository
.createQueryBuilder('mesa')
.select([
'mesa.id_mesa AS id_mesa',
])
.where('mesa.activo = 1')
.andWhere(`
NOT EXISTS (
SELECT 1
FROM bitacora_mesa bm
WHERE bm.id_mesa = mesa.id_mesa
AND TIMESTAMPDIFF(
SECOND,
NOW(),
DATE_ADD(bm.tiempo_entrada, INTERVAL bm.tiempo_asignado MINUTE)
) > 0
)
`)
.orderBy('mesa.id_mesa', 'ASC')
.getRawMany();
}
} }
+32 -1
View File
@@ -1,28 +1,59 @@
import { Body, Controller, Delete, Get, Param, Patch, Post, Put } from '@nestjs/common'; import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, UseGuards } from '@nestjs/common';
import { PeriodoService } from './periodo.service'; import { PeriodoService } from './periodo.service';
import { CreatePeriodoDto, ModifiedDateDto } from './dto/create-periodo.dto'; import { CreatePeriodoDto, ModifiedDateDto } from './dto/create-periodo.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('periodo') @Controller('periodo')
export class PeriodoController { export class PeriodoController {
constructor(private readonly periodoService: PeriodoService) { } constructor(private readonly periodoService: PeriodoService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
findAll() { findAll() {
return this.periodoService.findAll(); return this.periodoService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post() @Post()
create(@Body() data: CreatePeriodoDto) { create(@Body() data: CreatePeriodoDto) {
return this.periodoService.create(data); return this.periodoService.create(data);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Delete("/:id_periodo") @Delete("/:id_periodo")
delete(@Param("id_periodo") id_periodo: number) { delete(@Param("id_periodo") id_periodo: number) {
return this.periodoService.delete(id_periodo) return this.periodoService.delete(id_periodo)
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Patch("/date/:id_periodo") @Patch("/date/:id_periodo")
modifiedDate(@Body() data: ModifiedDateDto, @Param("id_periodo") id_periodo: number) { modifiedDate(@Body() data: ModifiedDateDto, @Param("id_periodo") id_periodo: number) {
return this.periodoService.modifiedDate(data, id_periodo) return this.periodoService.modifiedDate(data, id_periodo)
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('compare')
compare(
@Query('p1') p1: number,
@Query('p2') p2: number,
) {
return this.periodoService.comparePeriodos(p1, p2);
}
@Get('range')
getRange(
@Query('p1') p1: number,
@Query('p2') p2: number,
) {
return this.periodoService.getPeriodosEnRango(p1, p2);
}
} }
+53 -7
View File
@@ -1,7 +1,7 @@
import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { Periodo } from './entities/periodo.entity'; import { Periodo } from './entities/periodo.entity';
import { Repository } from 'typeorm'; import { Between, Repository } from 'typeorm';
import { CreatePeriodoDto, ModifiedDateDto } from './dto/create-periodo.dto'; import { CreatePeriodoDto, ModifiedDateDto } from './dto/create-periodo.dto';
@Injectable() @Injectable()
@@ -16,7 +16,7 @@ export class PeriodoService {
} }
async findAll() { async findAll() {
return this.periodoRepository.find(); return this.periodoRepository.find({ order: { 'id_periodo': "DESC" } });
} }
async getPeriodoActivo(): Promise<Periodo> { async getPeriodoActivo(): Promise<Periodo> {
@@ -32,7 +32,7 @@ export class PeriodoService {
return periodo; return periodo;
} }
async getPeriodoActivoWhitoutError(): Promise<Periodo | null> { async getPeriodoActivoWhitoutError(): Promise<Periodo | null> {
const periodo = await this.periodoRepository.findOne({ const periodo = await this.periodoRepository.findOne({
where: { activo: true }, where: { activo: true },
order: { id_periodo: 'DESC' }, order: { id_periodo: 'DESC' },
@@ -45,7 +45,7 @@ export class PeriodoService {
await this.periodoRepository.delete(id_periodo) await this.periodoRepository.delete(id_periodo)
} }
async periodoDisable(id_periodo:number) { async periodoDisable(id_periodo: number) {
await this.periodoRepository.update(id_periodo, { activo: false }) await this.periodoRepository.update(id_periodo, { activo: false })
} }
@@ -58,7 +58,7 @@ export class PeriodoService {
const periodoActive = await this.getPeriodoActivoWhitoutError(); const periodoActive = await this.getPeriodoActivoWhitoutError();
if(periodoActive){ if (periodoActive) {
await this.periodoDisable(periodoActive.id_periodo) await this.periodoDisable(periodoActive.id_periodo)
} }
@@ -66,7 +66,53 @@ export class PeriodoService {
return this.periodoRepository.save(create) return this.periodoRepository.save(create)
} }
async modifiedDate(data:ModifiedDateDto,id_periodo){ async modifiedDate(data: ModifiedDateDto, id_periodo) {
return this.periodoRepository.update(id_periodo,data) return this.periodoRepository.update(id_periodo, data)
} }
async comparePeriodos(id1: number, id2: number) {
const periodo1 = await this.periodoRepository.findOne({
where: { id_periodo: id1 },
});
const periodo2 = await this.periodoRepository.findOne({
where: { id_periodo: id2 },
});
if (!periodo1 || !periodo2) {
throw new NotFoundException('Uno de los periodos no existe');
}
return {
periodo1: {
id: periodo1.id_periodo,
nombre: periodo1.semestre,
fecha_inicio: periodo1.fecha_inicio_servicio,
fecha_fin: periodo1.fecha_fin_servicio,
},
periodo2: {
id: periodo2.id_periodo,
nombre: periodo2.semestre,
fecha_inicio: periodo2.fecha_inicio_servicio,
fecha_fin: periodo2.fecha_fin_servicio,
},
};
}
async getPeriodosEnRango(id1: number, id2: number) {
const min = Math.min(id1, id2);
const max = Math.max(id1, id2);
return this.periodoRepository.find({
where: {
id_periodo: Between(min, max),
},
order: {
id_periodo: 'ASC',
},
});
}
} }
+15 -1
View File
@@ -1,31 +1,45 @@
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards } from '@nestjs/common';
import { ProgramaService } from './programa.service'; import { ProgramaService } from './programa.service';
import { UpdateProgramaDto } from './dto/update-programa.dto'; import { UpdateProgramaDto } from './dto/update-programa.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('programa') @Controller('programa')
export class ProgramaController { export class ProgramaController {
constructor(private readonly programaService: ProgramaService) { } constructor(private readonly programaService: ProgramaService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
findAll() { findAll() {
return this.programaService.findAll(); return this.programaService.findAll();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get(':id') @Get(':id')
findOne(@Param('id') id: string) { findOne(@Param('id') id: string) {
return this.programaService.findOne(+id); return this.programaService.findOne(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post() @Post()
create(@Body() body) { create(@Body() body) {
return this.programaService.create(body); return this.programaService.create(body);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Patch(':id') @Patch(':id')
update(@Param('id') id: string, @Body() updateProgramaDto: UpdateProgramaDto) { update(@Param('id') id: string, @Body() updateProgramaDto: UpdateProgramaDto) {
return this.programaService.update(+id, updateProgramaDto); return this.programaService.update(+id, updateProgramaDto);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Delete(':id') @Delete(':id')
delete(@Param('id') id:string){ delete(@Param('id') id:string){
return this.programaService.delete(+id); return this.programaService.delete(+id);
@@ -1,26 +1,38 @@
import { Controller, Get, Body, Patch, Param } from '@nestjs/common'; import { Controller, Get, Body, Patch, Param, UseGuards } from '@nestjs/common';
import { ProgramaEquipoService } from './programa_equipo.service'; import { ProgramaEquipoService } from './programa_equipo.service';
import { UpdateProgramaEquipoDto, UpdateProgramasSalaDto } from './dto/update-programa_equipo.dto'; import { UpdateProgramaEquipoDto, UpdateProgramasSalaDto } from './dto/update-programa_equipo.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('programa-equipo') @Controller('programa-equipo')
export class ProgramaEquipoController { export class ProgramaEquipoController {
constructor(private readonly programaEquipoService: ProgramaEquipoService) {} constructor(private readonly programaEquipoService: ProgramaEquipoService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('programas/:id') @Get('programas/:id')
findAllProgramByNumber(@Param('id') id: number) { async findAllProgramByNumber(@Param('id') id: number) {
return this.programaEquipoService.findAllProgramByNumber(+id); return await this.programaEquipoService.findAllProgramByNumber(+id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('ubicacion/:id') @Get('ubicacion/:id')
findAllProgramByUbicacion(@Param('id') id: string) { findAllProgramByUbicacion(@Param('id') id: string) {
return this.programaEquipoService.findAllProgramByUbication(id); return this.programaEquipoService.findAllProgramByUbication(id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get(':id') @Get(':id')
findOne(@Param('id') id: string) { findOne(@Param('id') id: number) {
return this.programaEquipoService.findOne(id); return this.programaEquipoService.findOne(id);
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Patch('equipo/:id') @Patch('equipo/:id')
updateMachine( updateMachine(
@Param('id') id: string, @Param('id') id: string,
@@ -32,6 +44,8 @@ export class ProgramaEquipoController {
); );
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Patch('sala') @Patch('sala')
updateBySala(@Body() dto: UpdateProgramasSalaDto) { updateBySala(@Body() dto: UpdateProgramasSalaDto) {
return this.programaEquipoService.updateBySala(dto.sala, dto.programas); return this.programaEquipoService.updateBySala(dto.sala, dto.programas);
@@ -21,9 +21,9 @@ export class ProgramaEquipoService {
return this.programaEquipoRepository.find(); return this.programaEquipoRepository.find();
} }
async findOne(ubicacion: string) { async findOne(id_equipo: number) {
const equipo = await this.programaEquipoRepository.find({ const equipo = await this.programaEquipoRepository.find({
where: { equipo: { ubicacion } }, where: { equipo: { id_equipo } },
}); });
if (equipo.length === 0) { if (equipo.length === 0) {
+7 -2
View File
@@ -3,15 +3,20 @@ import {
Post, Post,
Body, Body,
UseGuards, UseGuards,
Req,
} from '@nestjs/common'; } from '@nestjs/common';
import { ReciboService } from './recibo.service'; import { ReciboService } from './recibo.service';
import { FindReciboByRangeDto } from './dto/create-recibo.dto'; import { FindReciboByRangeDto } from './dto/create-recibo.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('recibo') @Controller('recibo')
export class ReciboController { export class ReciboController {
constructor(private readonly reciboService: ReciboService) {} constructor(private readonly reciboService: ReciboService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('rango') @Post('rango')
async findByDateRange(@Body() data: FindReciboByRangeDto) { async findByDateRange(@Body() data: FindReciboByRangeDto) {
return this.reciboService.findByDateRange(data.desde, data.hasta); return this.reciboService.findByDateRange(data.desde, data.hasta);
+6 -4
View File
@@ -1,5 +1,7 @@
export enum Role { export enum Role {
ADMINISTRADOR = 'ADMINISTRADOR', ADMINISTRADOR = 1,
OPERADOR = 'OPERADOR', ATENCION_USUARIOS = 2,
} SERVICIO_SOCIAL = 3,
SUPER_ADMINISTRADOR = 4,
PCPUMA = 5,
}
+2 -2
View File
@@ -6,7 +6,7 @@ import { ROLES_KEY } from './roles.decorator';
@Injectable() @Injectable()
export class RolesGuard implements CanActivate { export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {} constructor(private reflector: Reflector) { }
canActivate(context: ExecutionContext): boolean { canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [ const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
@@ -17,6 +17,6 @@ export class RolesGuard implements CanActivate {
return true; return true;
} }
const { user } = context.switchToHttp().getRequest(); const { user } = context.switchToHttp().getRequest();
return requiredRoles.some((role) => user.role?.includes(role)); return requiredRoles.some((role) => user.role === role);
} }
} }
+10 -2
View File
@@ -1,14 +1,22 @@
import { Controller, Get, Param } from '@nestjs/common'; import { Controller, Get, Param, UseGuards } from '@nestjs/common';
import { SancionService } from './sancion.service'; import { SancionService } from './sancion.service';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('sancion') @Controller('sancion')
export class SancionController { export class SancionController {
constructor(private readonly sancionService: SancionService) {} constructor(private readonly sancionService: SancionService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
find() { find() {
return this.sancionService.find(); return this.sancionService.find();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get(':id') @Get(':id')
findOne(@Param('id') id: number) { findOne(@Param('id') id: number) {
return this.sancionService.findOne(+id); return this.sancionService.findOne(+id);
+9 -2
View File
@@ -1,9 +1,16 @@
import { Controller, Get } from '@nestjs/common'; import { Controller, Get, UseGuards } from '@nestjs/common';
import { ServicioService } from './servicio.service'; import { ServicioService } from './servicio.service';
import { JwtAuthGuard } from 'src/user/jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('servicio') @Controller('servicio')
export class ServicioController { export class ServicioController {
constructor(private readonly servicioService: ServicioService) {} constructor(private readonly servicioService: ServicioService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
findAll() { findAll() {
return this.servicioService.findAll(); return this.servicioService.findAll();
+29 -4
View File
@@ -4,29 +4,51 @@ import {
Post, Post,
Body, Body,
UseGuards, UseGuards,
Request,
Res, Res,
Req, Req,
Param,
Patch,
} from '@nestjs/common'; } from '@nestjs/common';
import type { Response } from 'express'; import type { Response } from 'express';
import { UserService } from './user.service'; import { UserService } from './user.service';
import { changePasswordDto, CreateUserDto, Login } from './dto/create-user.dto'; import { changePasswordDto, CreateUserDto, Login } from './dto/create-user.dto';
import { JwtAuthGuard } from './jwt.guard'; import { JwtAuthGuard } from './jwt.guard';
import { RolesGuard } from 'src/roles.guard';
import { Roles } from 'src/roles.decorator';
import { Role } from 'src/role.enum';
@Controller('user') @Controller('user')
export class UserController { export class UserController {
constructor(private readonly userService: UserService) {} constructor(private readonly userService: UserService) { }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('/switch/:id')
async getactive(@Param('id') id: number) {
return this.userService.getactive(id);
}
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get() @Get()
async getAll() { async getAll() {
return this.userService.getAll(); return this.userService.getAll();
} }
@Get('/perfil') @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('/perfil')
async getAllPerfil() { async getAllPerfil() {
return this.userService.getAllPerfil(); return this.userService.getAllPerfil();
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Patch(':id/activo')
toggleActivo(@Param('id') id: number) {
return this.userService.toggleActivo(id);
}
@Post() @Post()
async Login(@Body() data: Login, @Res() res: Response) { async Login(@Body() data: Login, @Res() res: Response) {
return this.userService.Login(data, res); return this.userService.Login(data, res);
@@ -38,12 +60,15 @@ export class UserController {
return req.user.role; return req.user.role;
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('/create') @Post('/create')
async createUser(@Body() data: CreateUserDto) { async createUser(@Body() data: CreateUserDto) {
return this.userService.create(data); return this.userService.create(data);
} }
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post('/changePassword') @Post('/changePassword')
async changePassword(@Body() data: changePasswordDto, @Req() req) { async changePassword(@Body() data: changePasswordDto, @Req() req) {
const id_usuario = req.user.id; const id_usuario = req.user.id;
+37 -4
View File
@@ -19,7 +19,36 @@ export class UserService {
@InjectRepository(Perfil) @InjectRepository(Perfil)
private perfilRepository: Repository<Perfil>, private perfilRepository: Repository<Perfil>,
private jwtService: JwtService, private jwtService: JwtService,
) {} ) { }
async toggleActivo(id: number) {
const usuario = await this.userRepository.findOne({
where: { id_usuario: id }
});
if (!usuario) {
throw new NotFoundException("no se encontro usuario")
}
usuario.activo = usuario.activo === 1 ? 0 : 1;
return this.userRepository.save(usuario);
}
async getactive(id: number) {
const user = await this.userRepository.findOne({
where: { id_usuario: id },
});
if (!user) {
throw new NotFoundException('Usuario no encontrado');
}
user.activo = user.activo === 1 ? 0 : 1;
return this.userRepository.save(user);
}
async findOneByNameandPassword(data: Login): Promise<User> { async findOneByNameandPassword(data: Login): Promise<User> {
const { usuario, password } = data; const { usuario, password } = data;
@@ -28,6 +57,10 @@ export class UserService {
where: { usuario, password }, where: { usuario, password },
}); });
if (user?.activo === 0) {
throw new NotFoundException(`El usuario se encuentra desactivado`);
}
if (!user) { if (!user) {
throw new NotFoundException(`El usuario o la contraseña es incorrecta`); throw new NotFoundException(`El usuario o la contraseña es incorrecta`);
} }
@@ -40,14 +73,14 @@ export class UserService {
const payload = { const payload = {
id: user.id_usuario, id: user.id_usuario,
usuario: user.usuario, usuario: user.nombre,
role: user.perfil.id_perfil, role: user.perfil.id_perfil,
}; };
const token = await this.jwtService.signAsync(payload); const token = await this.jwtService.signAsync(payload);
res.cookie('token', token, { res.cookie('token', token, {
httpOnly: true, httpOnly: true,
secure: process.env.NODE_ENV === 'production', // en dev desactívalo secure: process.env.NODE_ENV === 'production',
sameSite: 'strict', sameSite: 'strict',
path: '/', path: '/',
}); });
@@ -111,7 +144,7 @@ export class UserService {
} }
async getAll() { async getAll() {
return this.userRepository.find(); return this.userRepository.find({select:['id_usuario','nombre','usuario','perfil','activo','password']});
} }
async getAllPerfil() { async getAllPerfil() {