diff --git a/src/app.gateway.ts b/src/app.gateway.ts index 8697a5e..536f974 100644 --- a/src/app.gateway.ts +++ b/src/app.gateway.ts @@ -12,8 +12,6 @@ import { Socket, Server } from 'socket.io'; origin: [ // 'http://localhost:3176', // 'http://localhost:3186', - // 'http://132.248.80.196:3155', - // 'http://132.248.80.196:3185', // 'https://pmodulospcpuma.unam.mx', // 'https://pmodulospcpuma.unam.mx:3015', 'https://modulospcpuma.unam.mx', diff --git a/src/app.module.ts b/src/app.module.ts index 9c91068..dc447ac 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -61,6 +61,7 @@ import { InstitucionUsuario } from './institucion-usuario/entity/institucion-usu import { Marca } from './marca/entity/marca.entity'; import { Modelo } from './modelo/entity/modelo.entity'; import { Modulo } from './modulo/entity/modulo.entity'; +import { ModuloMotivo } from './modulo-motivo/entity/modulo-motivo.entity'; import { Multa } from './multa/entity/multa.entity'; import { Nivel } from './institucion-carrera/entity/nivel.entity'; import { Operador } from './operador/entity/operador.entity'; @@ -93,6 +94,7 @@ import { FullInformacionPrestamoView } from './prestamo/entity/views/full-inform import { PrestamoInformacionView } from './prestamo/entity/views/prestamo-informacion.view'; import { InformacionPrestamoView } from './prestamo/entity/views/informacion-prestamo.view'; import { FullInformacionUsuarioView } from './usuario/entity/views/full-informacion-usuario.view'; +import { ModuloMotivoModule } from './modulo-motivo/modulo-motivo.module'; @Module({ imports: [ @@ -142,6 +144,7 @@ import { FullInformacionUsuarioView } from './usuario/entity/views/full-informac Marca, Modelo, Modulo, + ModuloMotivo, Multa, Nivel, Operador, @@ -209,6 +212,7 @@ import { FullInformacionUsuarioView } from './usuario/entity/views/full-informac UploadFileModule, UsuarioModule, ValidarUsuarioModule, + ModuloMotivoModule, ], }) export class AppModule {} diff --git a/src/carrito-motivo/carrito-motivo.service.ts b/src/carrito-motivo/carrito-motivo.service.ts index 59bdb42..c0c2563 100644 --- a/src/carrito-motivo/carrito-motivo.service.ts +++ b/src/carrito-motivo/carrito-motivo.service.ts @@ -16,20 +16,18 @@ export class CarritoMotivoService { private carritoService: CarritoService, ) {} - async create( + create( carrito: Carrito, operador: Operador, status: boolean, motivo: string, laboratorioMovil: boolean, ) { - const ahora = moment(); - // Creo y gurado registro return this.repository.save( this.repository.create({ carrito, - fecha_creacion: ahora.toDate(), + fecha_creacion: moment().toDate(), motivo, operador, status, diff --git a/src/carrito-motivo/entity/carrito-motivo.entity.ts b/src/carrito-motivo/entity/carrito-motivo.entity.ts index 9367d8f..177498f 100644 --- a/src/carrito-motivo/entity/carrito-motivo.entity.ts +++ b/src/carrito-motivo/entity/carrito-motivo.entity.ts @@ -35,7 +35,9 @@ export class CarritoMotivo { @JoinColumn({ name: 'id_carrito' }) carrito: Carrito; - @ManyToOne(() => Operador, (operador) => operador.motivos, { eager: true }) + @ManyToOne(() => Operador, (operador) => operador.motivosCarrito, { + eager: true, + }) @JoinColumn({ name: 'id_operador' }) operador: Operador; } diff --git a/src/equipo-motivo/entity/equipo-motivo.entity.ts b/src/equipo-motivo/entity/equipo-motivo.entity.ts index e9042f2..f19df18 100644 --- a/src/equipo-motivo/entity/equipo-motivo.entity.ts +++ b/src/equipo-motivo/entity/equipo-motivo.entity.ts @@ -30,7 +30,9 @@ export class EquipoMotivo { @Column({ type: Number, nullable: true }) id_status: number; - @ManyToOne(() => Operador, (operador) => operador.motivos, { eager: true }) + @ManyToOne(() => Operador, (operador) => operador.motivosEquipo, { + eager: true, + }) @JoinColumn({ name: 'id_operador' }) operador: Operador; diff --git a/src/equipo/equipo.module.ts b/src/equipo/equipo.module.ts index d8a784d..390abe9 100644 --- a/src/equipo/equipo.module.ts +++ b/src/equipo/equipo.module.ts @@ -27,6 +27,7 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module' CarritoModule, forwardRef(() => EquipoProgramaModule), forwardRef(() => EquipoTipoEntradaModule), + forwardRef(() => EquipoMotivoModule), InstitucionModule, InstitucionProgramaModule, InstitucionTipoCarritoModule, @@ -34,7 +35,6 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module' MarcaModule, ModeloModule, ModuloModule, - forwardRef(() => EquipoMotivoModule), OperadorModule, PassportModule.register({ defaultStrategy: 'jwt' }), StatusModule, diff --git a/src/institucion/dto/input/update.dto.ts b/src/institucion/dto/input/update.dto.ts index 4080c9e..0f9c163 100644 --- a/src/institucion/dto/input/update.dto.ts +++ b/src/institucion/dto/input/update.dto.ts @@ -25,11 +25,6 @@ export class UpdateInstitucionDto { @IsOptional() dias_multa_retraso?: number; - @IsString() - @IsNotEmpty() - @IsOptional() - dominio?: string; - @IsString() @IsNotEmpty() @IsOptional() diff --git a/src/institucion/dto/output/institucion.dto.ts b/src/institucion/dto/output/institucion.dto.ts index 0fa42e6..44073a8 100644 --- a/src/institucion/dto/output/institucion.dto.ts +++ b/src/institucion/dto/output/institucion.dto.ts @@ -16,9 +16,6 @@ export class InstitucionOutputDto { @Expose() dias_multa_retraso; - @Expose() - dominio; - @Expose() institucion; diff --git a/src/institucion/dto/output/instituciones-min.dto.ts b/src/institucion/dto/output/instituciones-min.dto.ts index 1d2393e..1cac13b 100644 --- a/src/institucion/dto/output/instituciones-min.dto.ts +++ b/src/institucion/dto/output/instituciones-min.dto.ts @@ -6,7 +6,4 @@ export class InstitucionesMinOutputDto { @Expose() institucion; - - @Expose() - dominio; } diff --git a/src/institucion/dto/output/instituciones.dto.ts b/src/institucion/dto/output/instituciones.dto.ts index fa44f7e..96ceb2d 100644 --- a/src/institucion/dto/output/instituciones.dto.ts +++ b/src/institucion/dto/output/instituciones.dto.ts @@ -7,9 +7,6 @@ export class InstitucionesOutputDto { @Expose() correo; - @Expose() - dominio; - @Expose() id_institucion; diff --git a/src/institucion/entity/institucion.entity.ts b/src/institucion/entity/institucion.entity.ts index afa8bff..c5344a8 100644 --- a/src/institucion/entity/institucion.entity.ts +++ b/src/institucion/entity/institucion.entity.ts @@ -25,9 +25,6 @@ export class Institucion { @Column({ type: Number, nullable: false, default: 7 }) dias_multa_retraso: number; - @Column({ type: String, nullable: true, length: 40 }) - dominio: string; - @Column({ type: String, nullable: false, length: 150 }) institucion: string; diff --git a/src/institucion/institucion.controller.ts b/src/institucion/institucion.controller.ts index 52c25eb..3c2195f 100644 --- a/src/institucion/institucion.controller.ts +++ b/src/institucion/institucion.controller.ts @@ -119,7 +119,6 @@ export class InstitucionController { id_institucion: 200, _activo: true, _dias_multa_retraso: 7, - _dominio: '@pcpuma.acatlan.unam.mx', _responsable: '', _telefono: '', _tiempo_entrega: 15, diff --git a/src/institucion/institucion.service.ts b/src/institucion/institucion.service.ts index c7d534d..229ff9c 100644 --- a/src/institucion/institucion.service.ts +++ b/src/institucion/institucion.service.ts @@ -52,7 +52,6 @@ export class InstitucionService { 'id_institucion', 'activo', 'correo', - 'dominio', 'institucion', 'responsable', ], diff --git a/src/modulo-motivo/dto/input/get.dto.ts b/src/modulo-motivo/dto/input/get.dto.ts new file mode 100644 index 0000000..5023bed --- /dev/null +++ b/src/modulo-motivo/dto/input/get.dto.ts @@ -0,0 +1,9 @@ +import { IsNumberString } from 'class-validator'; + +export class GetDto { + @IsNumberString() + id_modulo: string; + + @IsNumberString() + pagina: string; +} diff --git a/src/modulo-motivo/dto/output/modulo-motivo.dto.ts b/src/modulo-motivo/dto/output/modulo-motivo.dto.ts new file mode 100644 index 0000000..97be703 --- /dev/null +++ b/src/modulo-motivo/dto/output/modulo-motivo.dto.ts @@ -0,0 +1,20 @@ +import { Expose, Type } from 'class-transformer'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; + +export class ModuloMotivoOutputDto { + @Expose() + id_motivo; + + @Expose() + fecha_creacion; + + @Expose() + motivo; + + @Expose() + numero_alumnos; + + @Expose() + @Type(() => OperadorMinOutputDto) + operador; +} diff --git a/src/modulo-motivo/entity/modulo-motivo.entity.ts b/src/modulo-motivo/entity/modulo-motivo.entity.ts new file mode 100644 index 0000000..a63eadc --- /dev/null +++ b/src/modulo-motivo/entity/modulo-motivo.entity.ts @@ -0,0 +1,40 @@ +import { + Column, + Entity, + JoinColumn, + ManyToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { Modulo } from '../../modulo/entity/modulo.entity'; +import { Operador } from '../../operador/entity/operador.entity'; + +@Entity() +export class ModuloMotivo { + @PrimaryGeneratedColumn() + id_motivo: number; + + @Column({ type: Date, nullable: false }) + fecha_creacion: Date; + + @Column({ type: String, nullable: false, length: 250 }) + motivo: string; + + @Column({ type: Number, nullable: false }) + numero_alumnos: number; + + @Column({ type: Number, nullable: true }) + id_modulo: number; + + @Column({ type: Number, nullable: true }) + id_operador: number; + + @ManyToOne(() => Modulo, (modulo) => modulo.motivos) + @JoinColumn({ name: 'id_modulo' }) + modulo: Modulo; + + @ManyToOne(() => Operador, (operador) => operador.motivosModulo, { + eager: true, + }) + @JoinColumn({ name: 'id_operador' }) + operador: Operador; +} diff --git a/src/modulo-motivo/modulo-motivo.controller.spec.ts b/src/modulo-motivo/modulo-motivo.controller.spec.ts new file mode 100644 index 0000000..2985e59 --- /dev/null +++ b/src/modulo-motivo/modulo-motivo.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ModuloMotivoController } from './modulo-motivo.controller'; + +describe('ModuloMotivoController', () => { + let controller: ModuloMotivoController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ModuloMotivoController], + }).compile(); + + controller = module.get(ModuloMotivoController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/modulo-motivo/modulo-motivo.controller.ts b/src/modulo-motivo/modulo-motivo.controller.ts new file mode 100644 index 0000000..ed3e751 --- /dev/null +++ b/src/modulo-motivo/modulo-motivo.controller.ts @@ -0,0 +1,45 @@ +import { Controller, Get, Query, Request, UseGuards } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { ApiBearerAuth, ApiOperation, ApiQuery } from '@nestjs/swagger'; +import { Serealize } from '../interceptors/serialize.interceptor'; +import { ModuloMotivoService } from './modulo-motivo.service'; +import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service'; +import { Operador } from '../operador/entity/operador.entity'; +import { GetDto } from './dto/input/get.dto'; +import { ModuloMotivoOutputDto } from './dto/output/modulo-motivo.dto'; + +@Controller('modulo-motivo') +export class ModuloMotivoController { + constructor( + private moduloMotivoService: ModuloMotivoService, + private validarUsuarioService: ValidarUsuarioService, + ) {} + + @Serealize(ModuloMotivoOutputDto) + @Get() + @UseGuards(AuthGuard('jwt')) + @ApiOperation({ + description: + 'Endpoint que retorna 25 cambios de status que ha tenido un carrito dependiendo de la página en la que se encuentra el alumno.', + }) + @ApiBearerAuth('jwt') + @ApiQuery({ + description: 'Id del carrito.', + name: 'id_carrito', + type: 'string', + }) + @ApiQuery({ + description: 'Página en la que se encuentra el usuario.', + name: 'pagina', + type: 'string', + }) + get(@Request() req, @Query() query: GetDto) { + const operador: Operador = req.user.operador; + + this.validarUsuarioService.validarAdminOperador(operador); + return this.moduloMotivoService.findAllByIdModulo( + parseInt(query.id_modulo), + parseInt(query.pagina), + ); + } +} diff --git a/src/modulo-motivo/modulo-motivo.module.ts b/src/modulo-motivo/modulo-motivo.module.ts new file mode 100644 index 0000000..90efd51 --- /dev/null +++ b/src/modulo-motivo/modulo-motivo.module.ts @@ -0,0 +1,21 @@ +import { forwardRef, Module } from '@nestjs/common'; +import { PassportModule } from '@nestjs/passport'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ModuloMotivoController } from './modulo-motivo.controller'; +import { ModuloMotivoService } from './modulo-motivo.service'; +import { ModuloMotivo } from './entity/modulo-motivo.entity'; +import { ModuloModule } from '../modulo/modulo.module'; +import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module'; + +@Module({ + imports: [ + forwardRef(() => ModuloModule), + PassportModule.register({ defaultStrategy: 'jwt' }), + TypeOrmModule.forFeature([ModuloMotivo]), + ValidarUsuarioModule, + ], + controllers: [ModuloMotivoController], + providers: [ModuloMotivoService], + exports: [ModuloMotivoService], +}) +export class ModuloMotivoModule {} diff --git a/src/modulo-motivo/modulo-motivo.service.spec.ts b/src/modulo-motivo/modulo-motivo.service.spec.ts new file mode 100644 index 0000000..49b35d2 --- /dev/null +++ b/src/modulo-motivo/modulo-motivo.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ModuloMotivoService } from './modulo-motivo.service'; + +describe('ModuloMotivoService', () => { + let service: ModuloMotivoService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ModuloMotivoService], + }).compile(); + + service = module.get(ModuloMotivoService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/modulo-motivo/modulo-motivo.service.ts b/src/modulo-motivo/modulo-motivo.service.ts new file mode 100644 index 0000000..b693987 --- /dev/null +++ b/src/modulo-motivo/modulo-motivo.service.ts @@ -0,0 +1,46 @@ +import * as moment from 'moment'; +import { forwardRef, Inject, Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Modulo } from '../modulo/entity/modulo.entity'; +import { ModuloMotivo } from './entity/modulo-motivo.entity'; +import { Operador } from '../operador/entity/operador.entity'; +import { ModuloService } from '../modulo/modulo.service'; + +@Injectable() +export class ModuloMotivoService { + constructor( + @InjectRepository(ModuloMotivo) + private repository: Repository, + @Inject(forwardRef(() => ModuloService)) + private moduloService: ModuloService, + ) {} + + create( + operador: Operador, + modulo: Modulo, + motivo: string, + numero_alumnos: number, + fecha_creacion: string, + ) { + return this.repository.save( + this.repository.create({ + motivo, + numero_alumnos, + operador, + modulo, + fecha_creacion: moment(fecha_creacion).toDate(), + }), + ); + } + + findAllByIdModulo(id_modulo: number, pagina: number) { + return this.moduloService.findById(id_modulo).then((modulo) => + this.repository.findAndCount({ + where: { modulo }, + skip: (pagina - 1) * 25, + take: 25, + }), + ); + } +} diff --git a/src/modulo/dto/input/update.dto.ts b/src/modulo/dto/input/update.dto.ts index 1a79510..8e0bc98 100644 --- a/src/modulo/dto/input/update.dto.ts +++ b/src/modulo/dto/input/update.dto.ts @@ -1,5 +1,6 @@ import { IsBoolean, + IsDateString, IsInt, IsNotEmpty, IsOptional, @@ -20,4 +21,19 @@ export class UpdateModuloDto { @MaxLength(30) @IsOptional() modulo?: string; + + @IsString() + @IsNotEmpty() + @MaxLength(250) + @IsOptional() + motivo?: string; + + @IsInt() + @IsOptional() + numero_alumnos?: number; + + @IsString() + @IsDateString() + @IsOptional() + fecha_creacion?: string; } diff --git a/src/modulo/entity/modulo.entity.ts b/src/modulo/entity/modulo.entity.ts index 760bc50..60e5b68 100644 --- a/src/modulo/entity/modulo.entity.ts +++ b/src/modulo/entity/modulo.entity.ts @@ -8,6 +8,7 @@ import { } from 'typeorm'; import { Carrito } from '../../carrito/entity/carrito.entity'; import { Institucion } from '../../institucion/entity/institucion.entity'; +import { ModuloMotivo } from '../../modulo-motivo/entity/modulo-motivo.entity'; @Entity() export class Modulo { @@ -31,4 +32,7 @@ export class Modulo { @OneToMany(() => Carrito, (carrito) => carrito.modulo) carritos: Carrito[]; + + @OneToMany(() => ModuloMotivo, (motivo) => motivo.modulo) + motivos: ModuloMotivo[]; } diff --git a/src/modulo/modulo.controller.ts b/src/modulo/modulo.controller.ts index b516e3b..6d46dad 100644 --- a/src/modulo/modulo.controller.ts +++ b/src/modulo/modulo.controller.ts @@ -136,8 +136,18 @@ export class ModuloController { }) update(@Request() req, @Body() body: UpdateModuloDto) { const admin: Operador = req.user.operador; + const data = { ...body }; this.validarUsuarioService.validarAdmin(admin); - return this.moduloService.update(admin, body); + delete data.modulo; + delete data.numero_alumnos; + delete data.fecha_creacion; + return this.moduloService.update( + admin, + data, + body.motivo, + body.numero_alumnos, + body.fecha_creacion, + ); } } diff --git a/src/modulo/modulo.module.ts b/src/modulo/modulo.module.ts index b41ab49..f92b952 100644 --- a/src/modulo/modulo.module.ts +++ b/src/modulo/modulo.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { forwardRef, Module } from '@nestjs/common'; import { PassportModule } from '@nestjs/passport'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ModuloController } from './modulo.controller'; @@ -6,11 +6,13 @@ import { ModuloService } from './modulo.service'; import { Modulo } from './entity/modulo.entity'; import { InformacionModuloView } from './entity/views/informacion-modulo.view'; import { MinInformacionModuloView } from './entity/views/min-informacion-modulo.view'; +import { ModuloMotivoModule } from '../modulo-motivo/modulo-motivo.module'; import { InstitucionModule } from '../institucion/institucion.module'; import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module'; @Module({ imports: [ + forwardRef(() => ModuloMotivoModule), InstitucionModule, PassportModule.register({ defaultStrategy: 'jwt' }), TypeOrmModule.forFeature([ diff --git a/src/modulo/modulo.service.ts b/src/modulo/modulo.service.ts index 9f70d96..7607090 100644 --- a/src/modulo/modulo.service.ts +++ b/src/modulo/modulo.service.ts @@ -1,5 +1,7 @@ import { ConflictException, + forwardRef, + Inject, Injectable, NotFoundException, } from '@nestjs/common'; @@ -11,6 +13,7 @@ import { InformacionModuloView } from './entity/views/informacion-modulo.view'; import { MinInformacionModuloView } from './entity/views/min-informacion-modulo.view'; import { Operador } from '../operador/entity/operador.entity'; import { InstitucionService } from '../institucion/institucion.service'; +import { ModuloMotivoService } from '../modulo-motivo/modulo-motivo.service'; @Injectable() export class ModuloService { @@ -20,6 +23,8 @@ export class ModuloService { private informacionModuloView: Repository, @InjectRepository(MinInformacionModuloView) private minInformacionModuloView: Repository, + @Inject(forwardRef(() => ModuloMotivoService)) + private moduloMotivoService: ModuloMotivoService, private institucionService: InstitucionService, ) {} @@ -125,7 +130,15 @@ export class ModuloService { }); } - update(admin: Operador, attrs: Partial) { + update( + admin: Operador, + attrs: Partial, + motivo?: string, + numero_alumnos?: number, + fecha_creacion?: string, + ) { + if (!motivo || !numero_alumnos || !fecha_creacion) + throw new ConflictException('No se mandó toda la información necesaria.'); return this.findById(attrs.id_modulo) .then(async (modulo) => { // Valido que el modulo enviado sea del admin que realiza esta acción @@ -140,6 +153,14 @@ export class ModuloService { await this.findModulo(modulo.institucion, attrs.modulo, true); // Asigno valores enviados al objeto Object.assign(modulo, attrs); + if (motivo) + await this.moduloMotivoService.create( + admin, + modulo, + motivo, + numero_alumnos, + fecha_creacion, + ); // Guardar return this.repository.save(modulo); }) diff --git a/src/operador/entity/operador.entity.ts b/src/operador/entity/operador.entity.ts index e7e080e..28d40cc 100644 --- a/src/operador/entity/operador.entity.ts +++ b/src/operador/entity/operador.entity.ts @@ -7,7 +7,9 @@ import { PrimaryGeneratedColumn, } from 'typeorm'; import { Institucion } from '../../institucion/entity/institucion.entity'; +import { CarritoMotivo } from '../../carrito-motivo/entity/carrito-motivo.entity'; import { EquipoMotivo } from '../../equipo-motivo/entity/equipo-motivo.entity'; +import { ModuloMotivo } from '../../modulo-motivo/entity/modulo-motivo.entity'; import { Multa } from '../../multa/entity/multa.entity'; import { Prestamo } from '../../prestamo/entity/prestamo.entity'; import { TipoUsuario } from '../../tipo-usuario/entity/tipo-usuario.entity'; @@ -46,8 +48,14 @@ export class Operador { @JoinColumn({ name: 'id_tipo_usuario' }) tipoUsuario: TipoUsuario; + @OneToMany(() => CarritoMotivo, (motivo) => motivo.operador) + motivosCarrito: CarritoMotivo[]; + @OneToMany(() => EquipoMotivo, (motivo) => motivo.operador) - motivos: EquipoMotivo[]; + motivosEquipo: EquipoMotivo[]; + + @OneToMany(() => ModuloMotivo, (motivo) => motivo.operador) + motivosModulo: ModuloMotivo[]; @OneToMany(() => Multa, (multa) => multa.operadorMulta) multas: Multa[];