diff --git a/src/Operations/operations.services.ts b/src/Operations/operations.services.ts index 47626fd..8bdbc47 100644 --- a/src/Operations/operations.services.ts +++ b/src/Operations/operations.services.ts @@ -1,5 +1,6 @@ import { BadRequestException, + HttpException, Injectable, InternalServerErrorException, } from '@nestjs/common'; @@ -65,7 +66,12 @@ export class OperationsService { return { message: 'correct' }; } catch (error) { await queryRunner.rollbackTransaction(); - throw new InternalServerErrorException(error.message); + + if (error instanceof HttpException) { + throw error; + } + + throw new InternalServerErrorException('Error al realizar el cobro'); } finally { await queryRunner.release(); } diff --git a/src/programa_equipo/dto/update-programa_equipo.dto.ts b/src/programa_equipo/dto/update-programa_equipo.dto.ts index 9eacc8b..b441f97 100644 --- a/src/programa_equipo/dto/update-programa_equipo.dto.ts +++ b/src/programa_equipo/dto/update-programa_equipo.dto.ts @@ -1,4 +1,11 @@ import { PartialType } from '@nestjs/mapped-types'; import { CreateProgramaEquipoDto } from './create-programa_equipo.dto'; -export class UpdateProgramaEquipoDto extends PartialType(CreateProgramaEquipoDto) {} +export class UpdateProgramaEquipoDto { + programas: number[]; +} + +export class UpdateProgramasSalaDto { + sala: number; + programas: number[]; +} \ No newline at end of file diff --git a/src/programa_equipo/programa_equipo.controller.ts b/src/programa_equipo/programa_equipo.controller.ts index 2d77ab9..c8495b1 100644 --- a/src/programa_equipo/programa_equipo.controller.ts +++ b/src/programa_equipo/programa_equipo.controller.ts @@ -1,6 +1,6 @@ import { Controller, Get, Body, Patch, Param } from '@nestjs/common'; import { ProgramaEquipoService } from './programa_equipo.service'; -import { UpdateProgramaEquipoDto } from './dto/update-programa_equipo.dto'; +import { UpdateProgramaEquipoDto, UpdateProgramasSalaDto } from './dto/update-programa_equipo.dto'; @Controller('programa-equipo') export class ProgramaEquipoController { @@ -11,16 +11,29 @@ export class ProgramaEquipoController { return this.programaEquipoService.findAllProgramByNumber(+id); } + @Get('ubicacion/:id') + findAllProgramByUbicacion(@Param('id') id: string) { + return this.programaEquipoService.findAllProgramByUbication(id); + } + @Get(':id') findOne(@Param('id') id: string) { return this.programaEquipoService.findOne(id); } - @Patch(':id') - update( + @Patch('equipo/:id') + updateMachine( @Param('id') id: string, @Body() updateProgramaEquipoDto: UpdateProgramaEquipoDto, ) { - return this.programaEquipoService.update(+id, updateProgramaEquipoDto); + return this.programaEquipoService.updateMachine( + Number(id), + updateProgramaEquipoDto.programas, + ); + } + + @Patch('sala') + updateBySala(@Body() dto: UpdateProgramasSalaDto) { + return this.programaEquipoService.updateBySala(dto.sala, dto.programas); } } diff --git a/src/programa_equipo/programa_equipo.module.ts b/src/programa_equipo/programa_equipo.module.ts index 0e1d104..760c5eb 100644 --- a/src/programa_equipo/programa_equipo.module.ts +++ b/src/programa_equipo/programa_equipo.module.ts @@ -3,9 +3,10 @@ import { ProgramaEquipoService } from './programa_equipo.service'; import { ProgramaEquipoController } from './programa_equipo.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ProgramaEquipo } from './entities/programa_equipo.entity'; +import { Equipo } from 'src/equipo/entities/equipo.entity'; @Module({ - imports:[TypeOrmModule.forFeature([ProgramaEquipo])], + imports:[TypeOrmModule.forFeature([ProgramaEquipo,Equipo])], controllers: [ProgramaEquipoController], providers: [ProgramaEquipoService], }) diff --git a/src/programa_equipo/programa_equipo.service.ts b/src/programa_equipo/programa_equipo.service.ts index 6d9d082..0141695 100644 --- a/src/programa_equipo/programa_equipo.service.ts +++ b/src/programa_equipo/programa_equipo.service.ts @@ -1,24 +1,29 @@ import { Injectable, NotFoundException } from '@nestjs/common'; -import { CreateProgramaEquipoDto } from './dto/create-programa_equipo.dto'; -import { UpdateProgramaEquipoDto } from './dto/update-programa_equipo.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { ProgramaEquipo } from './entities/programa_equipo.entity'; -import { Repository } from 'typeorm'; +import { In, Repository } from 'typeorm'; +import { DataSource } from 'typeorm'; +import { Equipo } from 'src/equipo/entities/equipo.entity'; @Injectable() export class ProgramaEquipoService { constructor( @InjectRepository(ProgramaEquipo) - private readonly ProgramaEquipoRepository: Repository, + private readonly programaEquipoRepository: Repository, + private readonly dataSource: DataSource, ) {} findAllProgramByNumber(id_equipo: number) { - return this.ProgramaEquipoRepository.find({ where: { id_equipo } }); + return this.programaEquipoRepository.find({ where: { id_equipo } }); + } + + findAllProgramByUbication(ubicacion: string) { + return this.programaEquipoRepository.find(); } async findOne(ubicacion: string) { - const equipo = await this.ProgramaEquipoRepository.find({ - where: { equipo:{ubicacion} }, + const equipo = await this.programaEquipoRepository.find({ + where: { equipo: { ubicacion } }, }); if (equipo.length === 0) { @@ -28,7 +33,104 @@ export class ProgramaEquipoService { return equipo; } - update(id: number, updateProgramaEquipoDto: UpdateProgramaEquipoDto) { - return `This action updates a #${id} programaEquipo`; + async updateMachine(id_equipo: number, programasSeleccionados: number[]) { + const actuales = await this.programaEquipoRepository.find({ + where: { id_equipo }, + }); + + const actualesIds = actuales.map((p) => p.id_programa); + + const aCrear = programasSeleccionados.filter( + (id) => !actualesIds.includes(id), + ); + + const aEliminar = actualesIds.filter( + (id) => !programasSeleccionados.includes(id), + ); + + if (aCrear.length > 0) { + const nuevos = aCrear.map((id_programa) => + this.programaEquipoRepository.create({ + id_equipo, + id_programa, + }), + ); + await this.programaEquipoRepository.save(nuevos); + } + + if (aEliminar.length > 0) { + await this.programaEquipoRepository.delete({ + id_equipo, + id_programa: In(aEliminar), + }); + } + + return { + message: 'Programas del equipo actualizados correctamente', + }; + } + + async updateBySala( + id_area_ubicacion: number, + programasSeleccionados: number[], +) { + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + + try { + const equipos = await queryRunner.manager.find(Equipo, { + where: { id_area_ubicacion }, + }); + + if (equipos.length === 0) { + throw new Error('No hay equipos en la sala'); + } + + for (const equipo of equipos) { + const actuales = await queryRunner.manager.find(ProgramaEquipo, { + where: { id_equipo: equipo.id_equipo }, + }); + + const actualesIds = actuales.map(p => p.id_programa); + + const aCrear = programasSeleccionados.filter( + id => !actualesIds.includes(id), + ); + + const aEliminar = actualesIds.filter( + id => !programasSeleccionados.includes(id), + ); + + if (aCrear.length > 0) { + const nuevos = aCrear.map(id_programa => + queryRunner.manager.create(ProgramaEquipo, { + id_equipo: equipo.id_equipo, + id_programa, + }), + ); + await queryRunner.manager.save(nuevos); + } + + if (aEliminar.length > 0) { + await queryRunner.manager.delete(ProgramaEquipo, { + id_equipo: equipo.id_equipo, + id_programa: In(aEliminar), + }); + } + } + + await queryRunner.commitTransaction(); + + return { + message: 'Programas actualizados correctamente en la sala', + equiposActualizados: equipos.length, + }; + } catch (error) { + await queryRunner.rollbackTransaction(); + throw error; + } finally { + await queryRunner.release(); } } +}