import { ConflictException, forwardRef, Inject, Injectable, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Equipo } from 'src/equipo/entity/equipo.entity'; import { EquipoPrograma } from './entity/equipo-programa.entity'; import { Programa } from 'src/institucion-programa/entity/programa.entity'; import { EquipoService } from '../equipo/equipo.service'; import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service'; @Injectable() export class EquipoProgramaService { constructor( @InjectRepository(EquipoPrograma) private repository: Repository, @Inject(forwardRef(() => EquipoService)) private equipoService: EquipoService, private institucionProgramaService: InstitucionProgramaService, ) {} countProgramasEquipo(equipo: Equipo) { return this.repository.count({ equipo }); } async create(id_equipo: number | Equipo, id_programa: number | Programa) { const equipo = typeof id_equipo === 'number' ? await this.equipoService.findById(id_equipo) : id_equipo; const programa = typeof id_programa === 'number' ? await this.institucionProgramaService.findProgramaById(id_programa) : id_programa; return this.existeEquipoPrograma(equipo, programa) .then((_) => this.repository.save(this.repository.create({ equipo, programa })), ) .then((equipoPrograma) => ({ message: `Se asignó el programa: ${equipoPrograma.programa}, al equipo con número de inventario: ${equipo.numero_inventario}.`, equipoPrograma, })); } async delete(id_equipo_programa: number | EquipoPrograma) { const equipoPrograma = typeof id_equipo_programa === 'number' ? await this.findById(id_equipo_programa) : id_equipo_programa; if (typeof id_equipo_programa === 'number') await this.countProgramasEquipo(equipoPrograma.equipo).then((n) => { if (n === 1) { if (equipoPrograma.programa.id_programa === 1) throw new ConflictException('No se puede eliminar esta opción.'); return this.create(equipoPrograma.equipo, 1); } }); return this.repository .remove(equipoPrograma) .then((_) => ({ message: 'Se eliminó correctamente el programa de este equipo.', })); } eliminarEquipoSinPrograma(equipo: Equipo) { return this.institucionProgramaService .findProgramaById(1) .then((programa) => this.repository.findOne({ equipo, programa })) .then((equipoPrograma) => { if (equipoPrograma) return this.delete(equipoPrograma); }); } existeEquipoPrograma( equipo: Equipo, programa: Programa, validarExistencia = true, ) { return this.repository .findOne({ equipo, programa }) .then((equipoPrograma) => { if (validarExistencia && equipoPrograma) throw new ConflictException( 'Este programa ya fue asignado a este equipo.', ); return equipoPrograma; }); } findById(id_equipo_programa: number) { return this.repository .findOne({ join: { alias: 'ep', innerJoinAndSelect: { e: 'ep.equipo' } }, where: { id_equipo_programa }, }) .then((equipoPrograma) => { if (!equipoPrograma) throw new ConflictException('No existe este id equipo programa.'); return equipoPrograma; }); } }