3 Commits

Author SHA1 Message Date
TheManus88 e9184963f5 merge into reportes from development 2024-09-30 18:14:57 -06:00
TheManus88 3a356887f7 add direccion controller, services and module 2024-09-25 14:16:02 -06:00
TheManus88 afafad2d4e modified and add structure to integrate direction elements 2024-09-25 13:48:26 -06:00
13 changed files with 213 additions and 84 deletions
+1 -1
View File
@@ -8,7 +8,7 @@
"scripts": { "scripts": {
"build": "nest build", "build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "source ~/.nvm/nvm.sh && nvm use 20.17.0 && nest start", "start": "nest start",
"start:dev": "nest start --watch", "start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch", "start:debug": "nest start --debug --watch",
"start:prod": "node dist/main", "start:prod": "node dist/main",
+4
View File
@@ -25,6 +25,8 @@ import { ComentariosModule } from './comentarios/comentarios.module';
import { ComentarioLineasProgramaticas } from './entities/comentarioLineasProgramaticas.entity'; import { ComentarioLineasProgramaticas } from './entities/comentarioLineasProgramaticas.entity';
import { ReportesController } from './reportes/reportes.controller'; import { ReportesController } from './reportes/reportes.controller';
import { ReportesModule } from './reportes/reportes.module'; import { ReportesModule } from './reportes/reportes.module';
import { Direccion } from './entities/direccion.entity';
import { DireccionModule } from './direccion/direccion.module';
config({ path: '.env' }); config({ path: '.env' });
@Module({ @Module({
imports: [ imports: [
@@ -35,6 +37,7 @@ config({ path: '.env' });
LineasProgramaticasModule, LineasProgramaticasModule,
CarreraModule, CarreraModule,
ReportesModule, ReportesModule,
DireccionModule,
ConfigModule.forRoot({ ConfigModule.forRoot({
isGlobal: true, isGlobal: true,
}), }),
@@ -54,6 +57,7 @@ config({ path: '.env' });
LineaProgramatica, LineaProgramatica,
TipoUsuarioEntity, TipoUsuarioEntity,
UsuarioEntity, UsuarioEntity,
Direccion,
], ],
}), }),
JwtModule.register({ JwtModule.register({
+1 -8
View File
@@ -20,7 +20,6 @@ export class AuthService {
switch (loginDto.tipo_usuario) { switch (loginDto.tipo_usuario) {
case 1: case 1:
// Administrador // Administrador
user = await this.usersService.findAdmin(loginDto);
break; break;
case 2: case 2:
// Alumno // Alumno
@@ -28,15 +27,9 @@ export class AuthService {
break; break;
case 3: case 3:
// Trabajadores // Trabajadores académicos o base
user = await this.usersService.findWorker(loginDto); user = await this.usersService.findWorker(loginDto);
break; break;
case 4:
// Académicos
user = await this.usersService.findWorker(loginDto);
break;
default: default:
throw new BadRequestException(); throw new BadRequestException();
break; break;
+69
View File
@@ -0,0 +1,69 @@
import {
Body,
Controller,
Get,
Header,
HttpCode,
Logger,
Post,
Put,
Query,
UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '../auth/auth.guard';
import { DireccionService } from './direccion.service';
import { isUndefined } from '@nestjs/common/utils/shared.utils';
import { DireccionDTO } from '../dtos/direccionDTO';
import { Delete } from '@nestjs/common/decorators/http/request-mapping.decorator';
@Controller('direccion')
export class DireccionController {
constructor(private readonly direccionService: DireccionService) {}
@UseGuards(AuthGuard)
@Header('content-type', 'application/json')
@Get('direccion')
@HttpCode(200)
getDireccion() {
Logger.log('Direccion', 'getDireccion');
return this.direccionService.findDirecciones();
}
@UseGuards(AuthGuard)
@Header('content-type', 'application/json')
@Get('direccionById')
@HttpCode(200)
getDireccionById(@Query('direccionId') direccionId: number) {
Logger.log('Direccion', 'getDireccionById');
if (!isUndefined(direccionId)) {
return this.direccionService.findDireccionById(direccionId);
}
}
@UseGuards(AuthGuard)
@Header('content-type', 'application/json')
@Post('addDireccion')
@HttpCode(200)
setDireccion(@Body() direccion: DireccionDTO) {
Logger.log('Direccion', 'setDireccion');
return this.direccionService.addDireccion(direccion);
}
@UseGuards(AuthGuard)
@Header('content-type', 'application/json')
@Put('updateDireccion')
@HttpCode(200)
updateDireccion(@Body() direccion: DireccionDTO) {
Logger.log('Direccion', 'updateDireccion');
return this.direccionService.updateDireccion(direccion);
}
@UseGuards(AuthGuard)
@Header('content-type', 'application/json')
@Delete('deleteDireccion')
@HttpCode(200)
deleteDireccion(@Body() direccion: DireccionDTO) {
Logger.log('Direccion', 'deleteDireccion');
return this.direccionService.deleteDireccion(direccion);
}
}
+13
View File
@@ -0,0 +1,13 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Direccion } from '../entities/direccion.entity';
import { DireccionService } from './direccion.service';
import { DireccionController } from './direccion.controller';
@Module({
imports: [TypeOrmModule.forFeature([Direccion])],
providers: [DireccionService],
controllers: [DireccionController],
exports: [TypeOrmModule.forFeature([DireccionService])],
})
export class DireccionModule {}
+36
View File
@@ -0,0 +1,36 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { DeleteResult, Repository, UpdateResult } from 'typeorm';
import { Direccion } from '../entities/direccion.entity';
import { DireccionDTO } from '../dtos/direccionDTO';
@Injectable()
export class DireccionService {
constructor(
@InjectRepository(Direccion)
private direccionRepository: Repository<Direccion>,
) {}
findDirecciones(): Promise<Direccion[]> {
return this.direccionRepository.find({});
}
findDireccionById(direccionId: number): Promise<Direccion[]> {
return this.direccionRepository.findBy({ id: direccionId });
}
addDireccion(direccion: DireccionDTO): Promise<Direccion> {
return this.direccionRepository.save(direccion);
}
updateDireccion(direccion: DireccionDTO): Promise<UpdateResult> {
return this.direccionRepository.update({ direccion });
}
deleteDireccion(direccion: Direccion): Promise<DeleteResult> {
return this.direccionRepository.delete({
id: direccion.id,
});
}
}
+44
View File
@@ -0,0 +1,44 @@
import { IsDefined, IsInt, IsNotEmpty, IsString } from "@nestjs/class-validator";
export class DireccionDTO {
@IsString()
@IsNotEmpty()
@IsDefined()
readonly primer_nombre: string;
@IsString()
readonly segundo_nombre: string;
@IsString()
@IsNotEmpty()
@IsDefined()
readonly apellido_paterno: string;
@IsString()
@IsNotEmpty()
@IsDefined()
readonly apellido_materno: string;
@IsString()
@IsNotEmpty()
@IsDefined()
readonly inicio_periodo: Date;
@IsString()
@IsNotEmpty()
@IsDefined()
readonly fin_periodo: Date;
@IsString()
@IsNotEmpty()
@IsDefined()
readonly inicio_periodo_encuesta: Date;
@IsString()
@IsNotEmpty()
@IsDefined()
readonly fin_periodo_encuesta: Date;
@IsInt()
readonly id: number;
}
+32
View File
@@ -0,0 +1,32 @@
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity('direccion')
export class Direccion {
@PrimaryGeneratedColumn('increment', { type: 'int' })
id: number;
@Column('varchar', { length: 100 })
primer_nombre: string;
@Column('varchar', { length: 100 })
segundo_nombre: string;
@Column('varchar', { length: 100 })
apellido_paterno: string;
@Column('varchar', { length: 100 })
apellido_materno: string;
@Column('date')
inicio_periodo: Date;
@Column('date')
fin_periodo: Date;
@Column('date')
inicio_periodo_encuesta: Date;
@Column('date')
fin_periodo_encuesta: Date;
}
+11 -1
View File
@@ -1,5 +1,12 @@
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from 'typeorm'; import {
Entity,
Column,
PrimaryGeneratedColumn,
OneToMany,
ManyToOne,
} from 'typeorm';
import { LineaProgramatica } from './LineaProgramatica.entity'; import { LineaProgramatica } from './LineaProgramatica.entity';
import { Direccion } from './direccion.entity';
@Entity('ejes_estrategicos') @Entity('ejes_estrategicos')
export class EjeEstrategico { export class EjeEstrategico {
@@ -17,4 +24,7 @@ export class EjeEstrategico {
(lineaProgramatica) => lineaProgramatica.ejeEstrategico, (lineaProgramatica) => lineaProgramatica.ejeEstrategico,
) )
lineasProgramaticas: LineaProgramatica[]; lineasProgramaticas: LineaProgramatica[];
@ManyToOne(() => Direccion, (direccion) => direccion.id)
direccion: Direccion;
} }
@@ -5,8 +5,6 @@ import { InjectRepository } from '@nestjs/typeorm';
import { UsuarioEntity } from '../entities/usuario.entity'; import { UsuarioEntity } from '../entities/usuario.entity';
import { TipoUsuarioEntity } from '../entities/tipoUsuario.entity'; import { TipoUsuarioEntity } from '../entities/tipoUsuario.entity';
import { Carrera } from '../entities/carreras.entity'; import { Carrera } from '../entities/carreras.entity';
import { ComentarioLineasProgramaticas } from '../entities/comentarioLineasProgramaticas.entity';
import { LineaProgramatica } from '../entities/LineaProgramatica.entity';
@Injectable() @Injectable()
export class ParticipacionService { export class ParticipacionService {
@@ -17,8 +15,6 @@ export class ParticipacionService {
private readonly tUReportesRepository: Repository<any>, private readonly tUReportesRepository: Repository<any>,
@InjectRepository(Carrera) @InjectRepository(Carrera)
private readonly carrearasReportesRepository: Repository<any>, private readonly carrearasReportesRepository: Repository<any>,
@InjectRepository(ComentarioLineasProgramaticas)
private readonly comentarioLineaProgramaticaReportesRepository: Repository<any>,
) {} ) {}
async getParticipacionAlumno(): Promise<ParticipacionAlumno[]> { async getParticipacionAlumno(): Promise<ParticipacionAlumno[]> {
@@ -53,22 +49,6 @@ export class ParticipacionService {
return result; return result;
} }
async getParticipacionAcademico(): Promise<SelectQueryBuilder<any>> {
const result = await this.reportesRepository
.createQueryBuilder('usuarios')
.select('COUNT(DISTINCT usuarios.id)', 'Participacion Trabajadores')
.addSelect(
`
(COUNT(DISTINCT usuarios.id) * 100.0 / (SELECT COUNT(*) FROM usuarios WHERE usuarios.tipo_usuario_id = 4)) AS PorcentajeParticipacion
`,
)
.innerJoin('usuarios.comentarios', 'clp')
.where('usuarios.tipo_usuario_id = 4')
.getRawOne();
return result;
}
async getTotalUsuarios(): Promise<ParticipacionAlumno[]> { async getTotalUsuarios(): Promise<ParticipacionAlumno[]> {
const queryBuilder = const queryBuilder =
await this.tUReportesRepository.createQueryBuilder('tu'); await this.tUReportesRepository.createQueryBuilder('tu');
@@ -92,27 +72,4 @@ export class ParticipacionService {
.groupBy('c.id, c.nombre') .groupBy('c.id, c.nombre')
.getRawMany()) as any[]; // Cast to .getRawMany()) as any[]; // Cast to
} }
async getReporteGeneral(): Promise<any> {
const result = await this.comentarioLineaProgramaticaReportesRepository
.createQueryBuilder('clp')
.innerJoin('clp.lineaProgramatica', 'lp')
.innerJoin('lp.ejeEstrategico', 'ee')
.innerJoin('clp.usuario', 'u')
.innerJoin('u.tipoUsuario', 'tu')
.leftJoin('u.carrera', 'c')
.select([
'clp.id as Id_Comentario',
'clp.comentario as Comentario',
'lp.descripcion AS Linea_Programatica',
'ee.nombre AS Eje_Estrategico',
'ee.objetivo as Objetivo',
'u.numero_identificacion AS numero_Cuenta_O_Trabajador',
'tu.tipo as Tipo',
"CASE WHEN tu.id = 2 THEN c.nombre ELSE 'No aplica' END AS carrera",
])
.getRawMany();
return result;
}
} }
+1 -18
View File
@@ -1,45 +1,28 @@
import { Controller, Get, UseGuards } from "@nestjs/common"; import { Controller, Get } from '@nestjs/common';
import { ParticipacionAlumno } from './ParticipacionAlumno.interface'; import { ParticipacionAlumno } from './ParticipacionAlumno.interface';
import { ParticipacionService } from './participacionAlumno.service'; import { ParticipacionService } from './participacionAlumno.service';
import { AuthGuard } from "../auth/auth.guard";
@Controller('reportes') @Controller('reportes')
export class ReportesController { export class ReportesController {
constructor(private readonly participacionService: ParticipacionService) {} constructor(private readonly participacionService: ParticipacionService) {}
@UseGuards(AuthGuard)
@Get('participacionAlumnos') @Get('participacionAlumnos')
async geParticipacionAlumno(): Promise<ParticipacionAlumno[]> { async geParticipacionAlumno(): Promise<ParticipacionAlumno[]> {
return this.participacionService.getParticipacionAlumno(); return this.participacionService.getParticipacionAlumno();
} }
@UseGuards(AuthGuard)
@Get('participacionTrabajador') @Get('participacionTrabajador')
async geParticipacionTrabajador(): Promise<any> { async geParticipacionTrabajador(): Promise<any> {
return this.participacionService.getParticipacionTrabajador(); return this.participacionService.getParticipacionTrabajador();
} }
@UseGuards(AuthGuard)
@Get('participacionAcademico')
async geParticipacionAcademico(): Promise<any> {
return this.participacionService.getParticipacionAcademico();
}
@UseGuards(AuthGuard)
@Get('totalParticipantes') @Get('totalParticipantes')
async getTotalParticipantes(): Promise<ParticipacionAlumno[]> { async getTotalParticipantes(): Promise<ParticipacionAlumno[]> {
return this.participacionService.getTotalUsuarios(); return this.participacionService.getTotalUsuarios();
} }
@UseGuards(AuthGuard)
@Get('totalAlumnosPorCarrera') @Get('totalAlumnosPorCarrera')
async getTotalAlumnosPorCarrera(): Promise<ParticipacionAlumno[]> { async getTotalAlumnosPorCarrera(): Promise<ParticipacionAlumno[]> {
return this.participacionService.getTotalAlumnos(); return this.participacionService.getTotalAlumnos();
} }
@UseGuards(AuthGuard)
@Get('reporteGeneral')
async getReporteGeneral(): Promise<any> {
return this.participacionService.getReporteGeneral();
}
} }
+1 -3
View File
@@ -5,12 +5,10 @@ import { ReportesController } from './reportes.controller';
import { UsuarioEntity } from '../entities/usuario.entity'; import { UsuarioEntity } from '../entities/usuario.entity';
import { TipoUsuarioEntity } from '../entities/tipoUsuario.entity'; import { TipoUsuarioEntity } from '../entities/tipoUsuario.entity';
import { Carrera } from '../entities/carreras.entity'; import { Carrera } from '../entities/carreras.entity';
import { LineaProgramatica } from "../entities/LineaProgramatica.entity";
import { ComentarioLineasProgramaticas } from "../entities/comentarioLineasProgramaticas.entity";
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([UsuarioEntity, TipoUsuarioEntity, Carrera, ComentarioLineasProgramaticas]), TypeOrmModule.forFeature([UsuarioEntity, TipoUsuarioEntity, Carrera]),
], ],
providers: [ParticipacionService], providers: [ParticipacionService],
controllers: [ReportesController], controllers: [ReportesController],
-10
View File
@@ -40,14 +40,4 @@ export class UsersService {
rfc, rfc,
}); });
} }
findAdmin(loginDto: LoginDTO): Promise<UsuarioEntity | null> {
const numero_identificacion = loginDto.numero_identificacion;
const rfc = loginDto.rfc;
return this.usersRepository.findOneBy({
numero_identificacion,
rfc,
tipo_usuario_id:1
});
}
} }