import { ConflictException, ForbiddenException, forwardRef, Inject, Injectable, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Equipo } from '../equipo/entity/equipo.entity'; import { EquipoPrograma } from './entity/equipo-programa.entity'; import { Programa } from '../institucion-programa/entity/programa.entity'; import { EquipoService } from '../equipo/equipo.service'; import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service'; import { Operador } from 'src/operador/entity/operador.entity'; @Injectable() export class EquipoProgramaService { constructor( @InjectRepository(EquipoPrograma) private repository: Repository, @Inject(forwardRef(() => EquipoService)) private equipoService: EquipoService, private institucionProgramaService: InstitucionProgramaService, ) {} async create( // operador: Operador, id_equipo: number | Equipo, id_programa: number | Programa, ) { const sinPrograma = await this.institucionProgramaService.findProgramaById( 1, ); 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.findEquipoProgramaByEquipoPrograma(equipo, programa) .then((_) => this.findEquipoProgramaByEquipoPrograma(equipo, sinPrograma, false), ) .then(async (existeEquipoSinPrograma) => { if (existeEquipoSinPrograma) await this.repository.remove(existeEquipoSinPrograma); return this.repository.save( this.repository.create({ equipo, programa }), ); }) .then((equipoPrograma) => ({ message: `Se asignó el software: ${equipoPrograma.programa.programa}, al equipo con número de inventario: ${equipo.numero_inventario}.`, equipoPrograma, })); } async delete(operador: Operador, id_equipo_programa: number) { const equipoPrograma = await this.findById(id_equipo_programa); if ( operador.institucion.id_institucion != equipoPrograma.equipo.carrito.modulo.institucion.id_institucion ) throw new ForbiddenException( 'No puedes eliminar el software de este equipo porque no pertenece a tu institución.', ); return this.repository .count({ equipo: equipoPrograma.equipo }) .then(async (n) => { if (n === 1) { if (equipoPrograma.programa.id_programa === 1) throw new ConflictException('No se puede eliminar esta opción.'); await this.create(equipoPrograma.equipo, 1); } return this.repository.remove(equipoPrograma); }) .then((_) => ({ message: 'Se eliminó correctamente el software de este equipo.', })); } findById(id_equipo_programa: number) { return this.repository .findOne({ join: { alias: 'ep', innerJoinAndSelect: { e: 'ep.equipo', p: 'ep.programa', c: 'e.carrito', m: 'c.modulo', i: 'm.institucion', }, }, where: { id_equipo_programa }, }) .then((equipoPrograma) => { if (!equipoPrograma) throw new ConflictException('No existe este id equipo software.'); return equipoPrograma; }); } findEquipoProgramaByEquipoPrograma( equipo: Equipo, programa: Programa, validarExistencia = true, ) { return this.repository .findOne({ equipo, programa }) .then((equipoPrograma) => { if (validarExistencia && equipoPrograma) throw new ConflictException( 'Este software ya fue asignado a este equipo.', ); return equipoPrograma; }); } }