diff --git a/src/carrito-motivo/carrito-motivo.controller.ts b/src/carrito-motivo/carrito-motivo.controller.ts index 8bb5f91..55a43b5 100644 --- a/src/carrito-motivo/carrito-motivo.controller.ts +++ b/src/carrito-motivo/carrito-motivo.controller.ts @@ -10,9 +10,11 @@ import { Serealize } from '../interceptors/serialize.interceptor'; import { CarritoMotivoService } from './carrito-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 { CarritoMotivoOutputDto } from './dto/output/carrito-motivo.dto'; import { CarritoDto } from '../carrito/dto/input/carrito.dto'; +import { GetDto } from './dto/input/get.dto'; +import { LaboratorioMovilDto } from './dto/input/laboratorio-movil.dto'; +import { CarritoMotivoOutputDto } from './dto/output/carrito-motivo.dto'; +import { CarritoMotivoLabMovilOutputDto } from './dto/output/carrito-motivo-lab-movil.dto'; @Controller('carrito-motivo') @ApiTags('carrito-motivo') @@ -51,6 +53,48 @@ export class CarritoMotivoController { ); } + @Serealize(CarritoMotivoLabMovilOutputDto) + @Get('laboratorio-movil') + @UseGuards(AuthGuard('jwt')) + @ApiOperation({ description: 'Reporte de laboratorio móvil.' }) + @ApiBearerAuth('jwt') + @ApiQuery({ + description: 'Carrito que se desea buscar.', + name: 'carrito', + type: 'string', + required: false, + }) + @ApiQuery({ + description: 'Id de la marca.', + name: 'id_marca', + type: 'string', + required: false, + }) + @ApiQuery({ + description: 'Id del modelo.', + name: 'id_modelo', + type: 'string', + required: false, + }) + @ApiQuery({ + description: 'Id del módulo.', + name: 'id_modulo', + type: 'string', + required: false, + }) + @ApiQuery({ + description: 'Id del tipo de carrito.', + name: 'id_tipo_carrito', + type: 'string', + required: false, + }) + laboratorioMovil(@Request() req, @Query() query: LaboratorioMovilDto) { + const admin: Operador = req.user.operador; + + this.validarUsuarioService.validarAdmin(admin); + return this.carritoMotivoService.findAllLaboratorioMovil(admin, query); + } + @Serealize(CarritoMotivoOutputDto) @Get('reporte') @UseGuards(AuthGuard('jwt')) diff --git a/src/carrito-motivo/carrito-motivo.module.ts b/src/carrito-motivo/carrito-motivo.module.ts index b288770..0c7bf81 100644 --- a/src/carrito-motivo/carrito-motivo.module.ts +++ b/src/carrito-motivo/carrito-motivo.module.ts @@ -5,11 +5,19 @@ import { CarritoMotivoController } from './carrito-motivo.controller'; import { CarritoMotivoService } from './carrito-motivo.service'; import { CarritoMotivo } from './entity/carrito-motivo.entity'; import { CarritoModule } from '../carrito/carrito.module'; +import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module'; +import { MarcaModule } from '../marca/marca.module'; +import { ModeloModule } from '../modelo/modelo.module'; +import { ModuloModule } from '../modulo/modulo.module'; import { StatusModule } from '../status/status.module'; @Module({ imports: [ forwardRef(() => CarritoModule), + InstitucionTipoCarritoModule, + MarcaModule, + ModeloModule, + ModuloModule, PassportModule.register({ defaultStrategy: 'jwt' }), StatusModule, TypeOrmModule.forFeature([CarritoMotivo]), diff --git a/src/carrito-motivo/carrito-motivo.service.ts b/src/carrito-motivo/carrito-motivo.service.ts index e62fcf2..bac5d84 100644 --- a/src/carrito-motivo/carrito-motivo.service.ts +++ b/src/carrito-motivo/carrito-motivo.service.ts @@ -6,11 +6,15 @@ import { Injectable, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { FindManyOptions, Repository } from 'typeorm'; +import { FindManyOptions, FindOptionsWhere, Repository } from 'typeorm'; import { Carrito } from '../carrito/entity/carrito.entity'; import { CarritoMotivo } from './entity/carrito-motivo.entity'; import { Operador } from '../operador/entity/operador.entity'; import { CarritoService } from '../carrito/carrito.service'; +import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service'; +import { MarcaService } from '../marca/marca.service'; +import { ModeloService } from '../modelo/modelo.service'; +import { ModuloService } from '../modulo/modulo.service'; @Injectable() export class CarritoMotivoService { @@ -19,6 +23,10 @@ export class CarritoMotivoService { private repository: Repository, @Inject(forwardRef(() => CarritoService)) private carritoService: CarritoService, + private institucionTipoCarritoService: InstitucionTipoCarritoService, + private marcaService: MarcaService, + private modeloService: ModeloService, + private moduloService: ModuloService, ) {} create( @@ -42,17 +50,17 @@ export class CarritoMotivoService { } async findAllByIdCarrito( - operador: Operador, + admin: Operador, id_carrito: number, pagina?: number, ): Promise { const carrito = await this.carritoService.findById(id_carrito); const options: FindManyOptions = { where: { carrito } }; - // Validamos que el carrito pertenezca a la institución del operador + // Validamos que el carrito pertenezca a la institución del admin if ( carrito.modulo.institucion.id_institucion != - operador.institucion.id_institucion + admin.institucion.id_institucion ) throw new ForbiddenException( 'No puedes acceder a esta información porque no le pertenece a tu institución.', @@ -64,4 +72,54 @@ export class CarritoMotivoService { return this.repository.findAndCount(options); } else return this.repository.find(options); } + + async findAllLaboratorioMovil( + admin: Operador, + filtros: { + carrito?: string; + id_marca?: string; + id_modelo?: string; + id_modulo?: string; + id_tipo_carrito?: string; + }, + ): Promise { + const marca = filtros.id_marca + ? await this.marcaService.findById(parseInt(filtros.id_marca), 'c') + : null; + const modelo = filtros.id_modelo + ? await this.modeloService.findById(parseInt(filtros.id_modelo), 'c') + : null; + const modulo = filtros.id_modulo + ? await this.moduloService.findById(parseInt(filtros.id_modulo)) + : null; + const tipoCarrito = filtros.id_tipo_carrito + ? await this.institucionTipoCarritoService.findTipoCarritoById( + parseInt(filtros.id_tipo_carrito), + ) + : null; + const busquedaCarrito: FindOptionsWhere = { + modulo: { institucion: admin.institucion }, + }; + const busqueda: FindOptionsWhere = { + laboratorioMovil: true, + }; + + if (filtros.carrito) busquedaCarrito.carrito = filtros.carrito; + if (marca) busquedaCarrito.marca = marca; + if (modelo) busquedaCarrito.modelo = modelo; + if (modulo) busquedaCarrito.modulo = modulo; + if (tipoCarrito) busquedaCarrito.tipoCarrito = tipoCarrito; + busqueda.carrito = busquedaCarrito; + return this.repository.find({ + join: { + alias: 'cmo', + innerJoinAndSelect: { + c: 'cmo.carrito', + m: 'c.modulo', + i: 'm.institucion', + }, + }, + where: busqueda, + }); + } } diff --git a/src/carrito-motivo/dto/input/laboratorio-movil.dto.ts b/src/carrito-motivo/dto/input/laboratorio-movil.dto.ts new file mode 100644 index 0000000..b0cb591 --- /dev/null +++ b/src/carrito-motivo/dto/input/laboratorio-movil.dto.ts @@ -0,0 +1,29 @@ +import { + IsNotEmpty, + IsNumberString, + IsOptional, + IsString, +} from 'class-validator'; + +export class LaboratorioMovilDto { + @IsString() + @IsNotEmpty() + @IsOptional() + carrito?: string; + + @IsNumberString() + @IsOptional() + id_marca?: string; + + @IsNumberString() + @IsOptional() + id_modelo?: string; + + @IsNumberString() + @IsOptional() + id_modulo?: string; + + @IsNumberString() + @IsOptional() + id_tipo_carrito?: string; +} diff --git a/src/carrito-motivo/dto/output/carrito-motivo-lab-movil.dto.ts b/src/carrito-motivo/dto/output/carrito-motivo-lab-movil.dto.ts new file mode 100644 index 0000000..54a39f7 --- /dev/null +++ b/src/carrito-motivo/dto/output/carrito-motivo-lab-movil.dto.ts @@ -0,0 +1,25 @@ +import { Expose, Type } from 'class-transformer'; +import { CarritoMinOutputDto } from '../../../carrito/dto/output/carrito-min.dto'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; + +export class CarritoMotivoLabMovilOutputDto { + @Expose() + id_motivo; + + @Expose() + fecha_creacion; + + @Expose() + laboratorioMovil; + + @Expose() + motivo; + + @Expose() + @Type(() => CarritoMinOutputDto) + carrito; + + @Expose() + @Type(() => OperadorMinOutputDto) + operador; +} diff --git a/src/carrito-motivo/dto/output/carrito-motivo.dto.ts b/src/carrito-motivo/dto/output/carrito-motivo.dto.ts index 693ae0f..b5ceec4 100644 --- a/src/carrito-motivo/dto/output/carrito-motivo.dto.ts +++ b/src/carrito-motivo/dto/output/carrito-motivo.dto.ts @@ -14,9 +14,6 @@ export class CarritoMotivoOutputDto { @Expose() motivo; - @Expose() - status; - @Expose() @Type(() => OperadorMinOutputDto) operador;