equipo service final
This commit is contained in:
parent
fb29f4b4e0
commit
98794cc2ea
@ -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 })
|
||||
|
@ -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(
|
||||
): Promise<Equipo> {
|
||||
// Creamos y guradamos registro
|
||||
return this.repository
|
||||
.save(
|
||||
this.repository.create({
|
||||
carrito,
|
||||
equipo,
|
||||
marca,
|
||||
modelo,
|
||||
numero_inventario,
|
||||
numero_serie,
|
||||
status: { id_status: 1 },
|
||||
carrito,
|
||||
marca,
|
||||
modelo,
|
||||
}),
|
||||
);
|
||||
|
||||
// Le asigno programa "Sin programa"
|
||||
return this.equipoProgramaService
|
||||
.createSinPrograma(equipoNuevo)
|
||||
.then((_) => equipoNuevo);
|
||||
)
|
||||
.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({
|
||||
|
@ -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,
|
||||
|
@ -254,8 +254,8 @@ export class UploadFileService {
|
||||
}
|
||||
await this.equipoService
|
||||
.create(
|
||||
carrito,
|
||||
dataEquipo.equipo,
|
||||
carrito,
|
||||
dataEquipo.numero_inventario,
|
||||
dataEquipo.numero_serie,
|
||||
marca,
|
||||
|
Loading…
Reference in New Issue
Block a user