equipo service final

This commit is contained in:
xXpuma99Xx 2022-12-19 21:20:52 -06:00
parent fb29f4b4e0
commit 98794cc2ea
4 changed files with 168 additions and 168 deletions

View File

@ -44,7 +44,7 @@ export class Equipo {
@Column({ type: Number, nullable: true })
id_modelo: number;
@Column({ type: Number, nullable: true })
@Column({ type: Number, nullable: true, default: 1 })
id_status: number;
@ManyToOne(() => Carrito, (carrito) => carrito.equipos, { eager: true })

View File

@ -18,10 +18,12 @@ import { Operador } from '../operador/entity/operador.entity';
import { Programa } from '../institucion-programa/entity/programa.entity';
import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity';
import { TipoEntrada } from '../institucion-tipo-entrada/entity/tipo-entrada.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { FullInformacionEquipoView } from './entity/views/full-informacion-equipo.view';
import { InformacionEquipoPrestamoView } from './entity/views/informacion-equipo-prestamo.view';
import { InformacionEquipoView } from './entity/views/informacion-equipo.view';
import { InformacionEquipoPrestamoView } from './entity/views/informacion-equipo-prestamo.view';
import { CarritoService } from '../carrito/carrito.service';
import { EquipoMotivoService } from '../equipo-motivo/equipo-motivo.service';
import { EquipoProgramaService } from '../equipo-programa/equipo-programa.service';
import { EquipoTipoEntradaService } from '../equipo-tipo-entrada/equipo-tipo-entrada.service';
import { InstitucionService } from '../institucion/institucion.service';
@ -31,7 +33,6 @@ import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/insti
import { MarcaService } from '../marca/marca.service';
import { ModeloService } from '../modelo/modelo.service';
import { ModuloService } from '../modulo/modulo.service';
import { EquipoMotivoService } from '../equipo-motivo/equipo-motivo.service';
import { StatusService } from '../status/status.service';
@Injectable()
@ -40,11 +41,13 @@ export class EquipoService {
@InjectRepository(Equipo) private repository: Repository<Equipo>,
@InjectRepository(FullInformacionEquipoView)
private fullInformacionEquipoView: Repository<FullInformacionEquipoView>,
@InjectRepository(InformacionEquipoPrestamoView)
private informacionEquipoPrestamoView: Repository<InformacionEquipoPrestamoView>,
@InjectRepository(InformacionEquipoView)
private informacionEquipoView: Repository<InformacionEquipoView>,
@InjectRepository(InformacionEquipoPrestamoView)
private informacionEquipoPrestamoView: Repository<InformacionEquipoPrestamoView>,
private carritoService: CarritoService,
@Inject(forwardRef(() => EquipoMotivoService))
private equipoMotivoService: EquipoMotivoService,
@Inject(forwardRef(() => EquipoProgramaService))
private equipoProgramaService: EquipoProgramaService,
@Inject(forwardRef(() => EquipoTipoEntradaService))
@ -56,36 +59,34 @@ export class EquipoService {
private marcaService: MarcaService,
private modeloService: ModeloService,
private moduloService: ModuloService,
@Inject(forwardRef(() => EquipoMotivoService))
private equipoMotivoService: EquipoMotivoService,
private statusService: StatusService,
) {}
async create(
carrito: Carrito,
equipo: string,
carrito: Carrito,
numero_inventario: string,
numero_serie: string,
marca: Marca,
modelo: Modelo,
) {
// Creo y guardo el registro
const equipoNuevo = await this.repository.save(
this.repository.create({
carrito,
equipo,
marca,
modelo,
numero_inventario,
numero_serie,
status: { id_status: 1 },
}),
);
// Le asigno programa "Sin programa"
return this.equipoProgramaService
.createSinPrograma(equipoNuevo)
.then((_) => equipoNuevo);
): Promise<Equipo> {
// Creamos y guradamos registro
return this.repository
.save(
this.repository.create({
equipo,
numero_inventario,
numero_serie,
carrito,
marca,
modelo,
}),
)
.then(async (equipo) => {
// Asignamos programa "Sin programa" por default
await this.equipoProgramaService.createSinPrograma(equipo);
return equipo;
});
}
async findAll(
@ -104,7 +105,7 @@ export class EquipoService {
id_tipo_carrito?: string;
id_tipo_entrada?: string;
},
) {
): Promise<[Equipo[], number]> {
const carrito = filtros.id_carrito
? await this.carritoService.findById(parseInt(filtros.id_carrito))
: null;
@ -130,14 +131,14 @@ export class EquipoService {
parseInt(filtros.id_tipo_carrito),
)
: null;
const status = filtros.id_status
? await this.statusService.findById(parseInt(filtros.id_status))
: null;
const tipoEntrada = filtros.id_tipo_entrada
? await this.institucionTipoEntradaService.findTipoEntradaById(
parseInt(filtros.id_tipo_entrada),
)
: null;
const status = filtros.id_status
? await this.statusService.findById(parseInt(filtros.id_status))
: null;
const query = this.repository
.createQueryBuilder('e')
.innerJoinAndSelect('e.carrito', 'c')
@ -210,17 +211,18 @@ export class EquipoService {
return query.getManyAndCount();
}
findById(id_equipo: number) {
return this.informacionEquipoView
.findOne({ where: { id_equipo } })
.then((infoEquipo) => {
if (!infoEquipo)
throw new NotFoundException('No existe este id equipo.');
return this.viewToEquipo(infoEquipo);
});
findAllResetear(): Promise<Equipo[]> {
return this.repository.find({
select: ['id_equipo'],
where: { prestado: true, status: { id_status: Not(3) } },
});
}
findByEquipo(carrito: Carrito, equipo: string, validarNoExiste = true) {
findByEquipo(
carrito: Carrito,
equipo: string,
validarNoExiste = true,
): Promise<Equipo> {
return this.informacionEquipoView
.findOne({
where: {
@ -237,11 +239,21 @@ export class EquipoService {
});
}
findById(id_equipo: number): Promise<Equipo> {
return this.informacionEquipoView
.findOne({ where: { id_equipo } })
.then((infoEquipo) => {
if (!infoEquipo)
throw new NotFoundException('No existe este id equipo.');
return this.viewToEquipo(infoEquipo);
});
}
findByNumeroInventario(
institucion: Institucion,
numero_inventario: string,
validarNoExiste = true,
) {
): Promise<Equipo> {
return this.informacionEquipoView
.findOne({
where: {
@ -252,27 +264,29 @@ export class EquipoService {
.then((infoEquipo) => {
if (!infoEquipo && validarNoExiste)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario.',
'No existe un equipo de cómputo con este número de inventario en esta institución.',
);
return this.viewToEquipo(infoEquipo);
});
}
findEquipo(
id_usuario: number,
usuario: Usuario,
modulo: Modulo,
tipoCarrito: TipoCarrito,
programa?: Programa,
tipoEntrada?: TipoEntrada,
) {
): Promise<Equipo> {
const busquedaReseteo: FindOptionsWhere<InformacionEquipoPrestamoView> = {
prestado: 1,
id_modulo: modulo.id_modulo,
id_programa: 1,
id_tipo_carrito: tipoCarrito.id_tipo_carrito,
};
const busqueda: FindOptionsWhere<InformacionEquipoPrestamoView> = {
prestado: 0,
id_modulo: modulo.id_modulo,
id_programa: 1,
id_tipo_carrito: tipoCarrito.id_tipo_carrito,
};
@ -280,27 +294,22 @@ export class EquipoService {
if (programa) {
busqueda.id_programa = programa.id_programa;
busquedaReseteo.id_programa = programa.id_programa;
} else {
// De lo contrario se asigna el valor por defaulta, "Sin programa"
busqueda.id_programa = 1;
busquedaReseteo.id_programa = 1;
}
// Si se mando un tipo de entrada se añade a la busqueda
if (tipoEntrada) {
busqueda.id_tipo_entrada = tipoEntrada.id_tipo_entrada;
busquedaReseteo.id_tipo_entrada = tipoEntrada.id_tipo_entrada;
}
// Busaca un equipo
// Intentamos encontrar un equipo
return this.informacionEquipoPrestamoView
.findOne({ where: busqueda })
.then(async (infoEquipo) => {
// Si no hay uno busca a todos los quipos que cumplan las mismas
// condiciones pero que ya hayan sido prestados
// Si no se encuentra un equipo reseteamos todos los equipos con las carecteríasticas solicitadas
if (!infoEquipo)
await this.informacionEquipoPrestamoView
.find({ where: busquedaReseteo })
.then(async (infoEquipos) => {
// Los pasamos a no prestados para resetear los equipos
// Reseteamos prestado y guardamos los cambios
for (let i = 0; i < infoEquipos.length; i++)
await this.repository.save(
this.repository.create({
@ -308,7 +317,7 @@ export class EquipoService {
prestado: false,
}),
);
// Trata de buscar otro
// Intentamos buscar de nuevo
return this.informacionEquipoPrestamoView.findOne({
where: busqueda,
});
@ -326,12 +335,11 @@ export class EquipoService {
throw new ConflictException(
'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
// Actualizo el status del equipo a apartado y gurado el id del usaurio
// al que se asignó
// Cambiamos el equipo a apartado y guardamos el id del usuario al que le asignamos ese equipo
return this.repository.save(
this.repository.create({
id_equipo: infoEquipo.id_equipo,
u: id_usuario,
u: usuario.id_usuario,
status: { id_status: 2 },
}),
);
@ -339,7 +347,7 @@ export class EquipoService {
.then((equipo) => this.findFullInfoById(equipo.id_equipo)) // Una vez actualizado lo busco de nuevo
.then((equipo) => {
// Si el campo u no coincide con el id_usaurio saca error
if (equipo.u != id_usuario)
if (equipo.u != usuario.id_usuario)
throw new ConflictException(
'Ocurrió un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
@ -347,10 +355,22 @@ export class EquipoService {
});
}
findFullInfoById(id_equipo: number): Promise<Equipo> {
return this.fullInformacionEquipoView
.findOne({ where: { id_equipo } })
.then((infoEquipo) => {
if (!infoEquipo)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario en esta institución.',
);
return this.fullViewToEquipo(infoEquipo);
});
}
findFullInfoByNumeroInventario(
operador: Operador,
numero_inventario: string,
) {
): Promise<Equipo> {
return this.fullInformacionEquipoView
.findOne({
where: {
@ -365,12 +385,12 @@ export class EquipoService {
);
const equipo = this.fullViewToEquipo(infoEquipo);
// Busco todos los programas de este equipo
// Buscamos todos los programas de este equipo
const programas =
await this.equipoProgramaService.findFullInfoAllByIdEquipo(
equipo.id_equipo,
);
// Busco todos los tipos de entrada de este equipo
// Buscamos todos los tipos de entrada de este equipo
const tiposEntradas =
await this.equipoTipoEntradaService.findFullInfoAllByIdEquipo(
equipo.id_equipo,
@ -382,113 +402,7 @@ export class EquipoService {
});
}
findFullInfoById(id_equipo: number) {
return this.fullInformacionEquipoView
.findOne({ where: { id_equipo } })
.then((infoEquipo) => {
if (!infoEquipo)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario en esta institución.',
);
return this.fullViewToEquipo(infoEquipo);
});
}
findAllResetear(): Promise<Equipo[]> {
return this.repository.find({
select: ['id_equipo'],
where: { prestado: true, status: { id_status: Not(3) } },
});
}
save(equipo: Equipo): Promise<Equipo> {
return this.repository.save(equipo);
}
update(
operador: Operador,
attrs: Partial<Equipo>,
id_carrito?: number,
id_status?: number,
motivo?: string,
) {
return this.findById(attrs.id_equipo)
.then(async (equipo) => {
const carrito = id_carrito
? await this.carritoService.findById(id_carrito)
: null;
const status = id_status
? await this.statusService.findById(id_status)
: null;
// Validamos que el equipo pertenezca a la institución del operador
// que realiza esta acción
if (
operador.tipoUsuario.id_tipo_usuario > 2 &&
operador.institucion.id_institucion !=
equipo.carrito.modulo.institucion.id_institucion
)
throw new ForbiddenException(
'No puedes modificar la información este equipo porque no pertenece a tu institución.',
);
// Si se mandó id_status
if (status) {
// No se pude actualziar el status de lequipo cuando esta en uno de estos
if (equipo.status.id_status === 2 || equipo.status.id_status === 3)
throw new ConflictException(
'No se puede cambiar el status de un equipo si esta apartada o en uso.',
);
// El operador no puede cambiar el status de un equipo a uno de estos
if (status.id_status === 2 || status.id_status === 3)
throw new ConflictException(
'No se puede cambiar manualmente el status de un equipo a apartado o en uso.',
);
if (!motivo)
throw new ConflictException(
'No se mandó el motivo para el cambio de status.',
);
}
Object.assign(equipo, attrs);
if (status) {
equipo.status = status;
// Se crea registro de quien cambio el status del equipo, el motivo
// por el cual lo cambió, el status al que lo cmabió y cuando lo hizo
await this.equipoMotivoService.create(
equipo,
operador,
status,
motivo,
);
}
if (carrito) equipo.carrito = carrito;
// Guardar
return this.repository.save(equipo);
})
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
async updateStatus(equipo: Equipo, operador?: Operador, motivo?: string) {
// Si el status al que se esta actualizando es mayo o igual a 4
if (equipo.status.id_status >= 4) {
if (!operador) throw new ConflictException('No se mandó el id operador.');
if (!motivo)
throw new ConflictException(
'No se mandó el motivo para el cambio de status.',
);
// Se crea registro de quien cambio el status del equipo, el motivo
// por el cual lo cambió, el status al que lo cmabió y cuando lo hizo
await this.equipoMotivoService.create(
equipo,
operador,
equipo.status,
motivo,
);
}
// Guardo los cambios
return this.repository.save(equipo);
}
private fullViewToEquipo(infoEquipo: FullInformacionEquipoView) {
private fullViewToEquipo(infoEquipo: FullInformacionEquipoView): Equipo {
return this.repository.create({
id_equipo: infoEquipo.id_equipo,
equipo: infoEquipo.equipo,
@ -527,6 +441,92 @@ export class EquipoService {
});
}
save(equipo: Equipo): Promise<Equipo> {
return this.repository.save(equipo);
}
update(
operador: Operador,
attrs: Partial<Equipo>,
id_carrito?: number,
id_status?: number,
motivo?: string,
): Promise<{ message: string }> {
return this.findById(attrs.id_equipo)
.then(async (equipo) => {
const carrito = id_carrito
? await this.carritoService.findById(id_carrito)
: null;
const status = id_status
? await this.statusService.findById(id_status)
: null;
// Validamos que el equipo pertenezca a la institución del operador
if (
operador.institucion.id_institucion !=
equipo.carrito.modulo.institucion.id_institucion
)
throw new ForbiddenException(
'No puedes modificar la información este equipo porque no pertenece a tu institución.',
);
// Si se mandó id_status
if (status) {
// No se puede actualziar el status del equipo cuando esta apartado o en uso
if (equipo.status.id_status === 2 || equipo.status.id_status === 3)
throw new ConflictException(
'No se puede cambiar el status de un equipo si esta apartada o en uso.',
);
// El operador no puede cambiar el status de un equipo a apartado o en uso
if (status.id_status === 2 || status.id_status === 3)
throw new ConflictException(
'No se puede cambiar manualmente el status de un equipo a apartado o en uso.',
);
// Si no se mando motivo saca error
if (!motivo)
throw new ConflictException(
'No se mandó el motivo para el cambio de status.',
);
}
Object.assign(equipo, attrs);
if (status) {
equipo.status = status;
// Se crea un registro del cambio de status de este equipo
await this.equipoMotivoService.create(
equipo,
operador,
status,
motivo,
);
}
if (carrito) equipo.carrito = carrito;
// Guardamos los cambios
return this.repository.save(equipo);
})
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
async updateStatus(equipo: Equipo, operador?: Operador, motivo?: string) {
// Si el status al que se esta actualizando es mayor a 3
if (equipo.status.id_status > 3) {
// Si no se manda operador saca error
if (!operador) throw new ConflictException('No se mandó el id operador.');
// Si no se mando motivo saca error
if (!motivo)
throw new ConflictException(
'No se mandó el motivo de cambio de status.',
);
// Se crea un registro del cambio de status de este equipo
await this.equipoMotivoService.create(
equipo,
operador,
equipo.status,
motivo,
);
}
// Guardamos los cambios
return this.repository.save(equipo);
}
private viewToEquipo(infoEquipo: InformacionEquipoView) {
if (!infoEquipo) return null;
return this.repository.create({

View File

@ -222,7 +222,7 @@ export class PrestamoService {
);
// Busco un equipo con las caracteríasticas solicitadas
return this.equipoService.findEquipo(
usuario.id_usuario,
usuario,
modulo,
tipoCarrito,
programa,

View File

@ -254,8 +254,8 @@ export class UploadFileService {
}
await this.equipoService
.create(
carrito,
dataEquipo.equipo,
carrito,
dataEquipo.numero_inventario,
dataEquipo.numero_serie,
marca,