Listo equipo

This commit is contained in:
lemuel 2022-10-23 21:57:29 -05:00
parent b8d2294328
commit fca9da4d9b
9 changed files with 158 additions and 119 deletions

View File

@ -49,7 +49,7 @@ export class EquipoMotivoService {
}
findAllByIdEquipo(id_equipo: number, pagina: number) {
return this.equipoService.findInfoEquipoById(id_equipo).then((equipo) =>
return this.equipoService.findById(id_equipo).then((equipo) =>
this.repository.findAndCount({
where: { equipo },
skip: (pagina - 1) * 25,

View File

@ -31,7 +31,7 @@ export class EquipoProgramaService {
) {}
async asignar(operador: Operador, id_equipo: number, id_programa: number) {
const equipo = await this.equipoService.findInfoEquipoById(id_equipo);
const equipo = await this.equipoService.findById(id_equipo);
const programa = await this.institucionProgramaService.findProgramaById(
id_programa,
);

View File

@ -31,7 +31,7 @@ export class EquipoTipoEntradaService {
) {}
async asignar(id_equipo: number, id_tipo_entrada: number) {
const equipo = await this.equipoService.findInfoEquipoById(id_equipo);
const equipo = await this.equipoService.findById(id_equipo);
const tipoEntrada =
await this.institucionTipoEntradaService.findTipoEntradaById(
id_tipo_entrada,

View File

@ -35,6 +35,18 @@ export class Equipo {
@Column({ type: Number, nullable: true, default: null })
u: number;
@Column({ type: Number, nullable: true })
id_carrito: number;
@Column({ type: Number, nullable: true })
id_marca: number;
@Column({ type: Number, nullable: true })
id_modelo: number;
@Column({ type: Number, nullable: true })
id_status: number;
@ManyToOne(() => Carrito, (carrito) => carrito.equipos, { eager: true })
@JoinColumn({ name: 'id_carrito' })
carrito: Carrito;

View File

@ -22,6 +22,7 @@ import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.servic
import { Operador } from '../operador/entity/operador.entity';
import { NumeroInventarioDto } from '../dto/numero-inventario.dto';
import { EquiposDto } from './dto/input/equipos.dto';
import { MessageOutputDto } from '../dto/output/message.dto';
import { UpdateEquipoDto } from './dto/input/update.dto';
import { EquipoOutputDto } from './dto/output/equipo.dto';
import { EquiposOutputDto } from './dto/output/equipos.dto';
@ -57,7 +58,7 @@ export class EquipoController {
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoService
.findFullInfoEquipoByNumeroInventario(
.findFullInfoByNumeroInventario(
parseInt(query.id_institucion),
query.numero_inventario,
)
@ -160,6 +161,7 @@ export class EquipoController {
return this.equipoService.findAll(operador, query);
}
@Serealize(MessageOutputDto)
@Put()
@UseGuards(AuthGuard('jwt'))
@ApiOperation({

View File

@ -69,6 +69,7 @@ export class EquipoService {
marca: Marca,
modelo: Modelo,
) {
// Creo y guardo el registro
const equipoNuevo = await this.repository.save(
this.repository.create({
carrito,
@ -81,6 +82,7 @@ export class EquipoService {
}),
);
// Le asigno programa "Sin programa"
return this.equipoProgramaService
.createSinPrograma(equipoNuevo)
.then((_) => equipoNuevo);
@ -159,7 +161,10 @@ export class EquipoService {
.take(15)
.skip((parseInt(filtros.pagina) - 1) * 15);
// Si se mando id modulo
if (modulo) {
// Valido que el módulo le pertenezca a la institución del
// operador que solicita la información
if (
operador.tipoUsuario.id_tipo_usuario > 2 &&
operador.institucion.id_institucion != modulo.institucion.id_institucion
@ -171,7 +176,10 @@ export class EquipoService {
id_modulo: modulo.id_modulo,
});
}
// Si se mando id carrito
if (carrito) {
// Valido que el carrito le pertenezca a la institución del
// operador que solicita la información
if (
operador.tipoUsuario.id_tipo_usuario > 2 &&
operador.institucion.id_institucion !=
@ -223,87 +231,7 @@ export class EquipoService {
return query.getManyAndCount();
}
async findEquipo(
id_usuario: number,
modulo: Modulo,
tipoCarrito: TipoCarrito,
programa?: Programa,
tipoEntrada?: TipoEntrada,
) {
const busquedaReseteo: FindOptionsWhere<InformacionEquipoPrestamoView> = {
prestado: 1,
id_modulo: modulo.id_modulo,
id_tipo_carrito: tipoCarrito.id_tipo_carrito,
};
const busqueda: FindOptionsWhere<InformacionEquipoPrestamoView> = {
prestado: 0,
id_modulo: modulo.id_modulo,
id_tipo_carrito: tipoCarrito.id_tipo_carrito,
};
if (programa) {
busqueda.id_programa = programa.id_programa;
busquedaReseteo.id_programa = programa.id_programa;
} else {
busqueda.id_programa = 1;
busquedaReseteo.id_programa = 1;
}
if (tipoEntrada) {
busqueda.id_tipo_entrada = tipoEntrada.id_tipo_entrada;
busquedaReseteo.id_tipo_entrada = tipoEntrada.id_tipo_entrada;
}
return this.informacionEquipoPrestamoView
.findOne({ where: busqueda })
.then((infoEquipo) => {
if (!infoEquipo)
return this.informacionEquipoPrestamoView
.find({ where: busquedaReseteo })
.then(async (infoEquipos) => {
for (let i = 0; i < infoEquipos.length; i++)
await this.repository.save(
this.repository.create({
id_equipo: infoEquipos[i].id_equipo,
prestado: false,
}),
);
return this.informacionEquipoPrestamoView.findOne({
where: busqueda,
});
})
.then((infoEquipo) => {
if (!infoEquipo)
throw new ConflictException(
'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitadas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las características.',
);
return infoEquipo;
});
return infoEquipo;
})
.then((infoEquipo) => {
if (infoEquipo.u)
throw new ConflictException(
'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
const equipo = this.repository.create({
id_equipo: infoEquipo.id_equipo,
u: id_usuario,
status: { id_status: 2 },
});
return this.repository.save(equipo);
})
.then((equipo) => this.findInfoEquipoById(equipo.id_equipo))
.then((equipo) => {
if (equipo.u != id_usuario)
throw new ConflictException(
'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
return equipo;
});
}
findInfoEquipoById(id_equipo: number) {
findById(id_equipo: number) {
return this.informacionEquipoView
.findOne({ where: { id_equipo } })
.then((infoEquipo) => {
@ -313,7 +241,27 @@ export class EquipoService {
});
}
findInfoEquipoByNumeroInventario(
findByEquipo(carrito: Carrito, equipo: string, validarNoExiste = true) {
return this.informacionEquipoView
.findOne({
where: {
id_carrito: carrito.id_carrito,
equipo,
},
})
.then((infoEquipo) => {
if (!infoEquipo) {
if (validarNoExiste)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario.',
);
return null;
}
return this.viewToEquipo(infoEquipo);
});
}
findByNumeroInventario(
institucion: Institucion,
numero_inventario: string,
validarNoExiste = true,
@ -337,31 +285,102 @@ export class EquipoService {
});
}
async findInfoEquipoByEquipo(
carrito: Carrito,
equipo: string,
validarNoExiste = true,
findEquipo(
id_usuario: number,
modulo: Modulo,
tipoCarrito: TipoCarrito,
programa?: Programa,
tipoEntrada?: TipoEntrada,
) {
return this.informacionEquipoView
.findOne({
where: {
id_carrito: carrito.id_carrito,
equipo,
},
})
.then((infoEquipo) => {
if (!infoEquipo) {
if (validarNoExiste)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario.',
const busquedaReseteo: FindOptionsWhere<InformacionEquipoPrestamoView> = {
prestado: 1,
id_modulo: modulo.id_modulo,
id_tipo_carrito: tipoCarrito.id_tipo_carrito,
};
const busqueda: FindOptionsWhere<InformacionEquipoPrestamoView> = {
prestado: 0,
id_modulo: modulo.id_modulo,
id_tipo_carrito: tipoCarrito.id_tipo_carrito,
};
// Si se mando un programa se añade a la busqueda
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
return (
this.informacionEquipoPrestamoView
.findOne({ where: busqueda })
.then((infoEquipo) => {
// Si no hay uno busca a todos los quipos que cumplan las mismas
// condiciones pero que ya hayan sido prestados
if (!infoEquipo)
return this.informacionEquipoPrestamoView
.find({ where: busquedaReseteo })
.then(async (infoEquipos) => {
// Los pasamos a no prestados para resetear los equipos
for (let i = 0; i < infoEquipos.length; i++)
await this.repository.save(
this.repository.create({
id_equipo: infoEquipos[i].id_equipo,
prestado: false,
}),
);
// Trata de buscar otro
return this.informacionEquipoPrestamoView.findOne({
where: busqueda,
});
})
.then((infoEquipo) => {
// Si no hay saca error
if (!infoEquipo)
throw new ConflictException(
'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitadas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las características.',
);
return infoEquipo;
});
return infoEquipo;
})
.then((infoEquipo) => {
// Esta variable debe estar siempre en null antes de asignar el equipo
if (infoEquipo.u)
throw new ConflictException(
'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
return null;
}
return this.viewToEquipo(infoEquipo);
});
// Actualizo el status del equipo a apartado y gurado el id del usaurio
// al que se asignó
return this.repository.save(
this.repository.create({
id_equipo: infoEquipo.id_equipo,
u: id_usuario,
status: { id_status: 2 },
}),
);
})
// Una vez actualizado lo busco de nuvo
.then((equipo) => this.findById(equipo.id_equipo))
.then((equipo) => {
// Si el campo u no coincide con el id_usaurio saca error
if (equipo.u != id_usuario)
throw new ConflictException(
'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
return equipo;
})
);
}
findFullInfoEquipoByNumeroInventario(
findFullInfoByNumeroInventario(
id_institucion: number,
numero_inventario: string,
) {
@ -381,10 +400,12 @@ export class EquipoService {
'No existe un equipo de cómputo con este número de inventario.',
);
// Busco todos los programas de este equipo
const programas =
await this.equipoProgramaService.findFullInfoEquipoProgramaAllByIdEquipo(
infoEquipo.id_equipo,
);
// Busco todos los tipos de entrada de este equipo
const tiposEntradas =
await this.equipoTipoEntradaService.findFullInfoEquipoTipoEntradaAllByIdEquipo(
infoEquipo.id_equipo,
@ -451,8 +472,10 @@ export class EquipoService {
? await this.statusService.findById(id_status)
: null;
return this.findInfoEquipoById(attrs.id_equipo)
return this.findById(attrs.id_equipo)
.then(async (equipo) => {
// Valido 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 !=
@ -461,11 +484,14 @@ export class EquipoService {
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 este status.',
@ -478,6 +504,8 @@ export class EquipoService {
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,
@ -486,14 +514,14 @@ export class EquipoService {
);
}
if (carrito) equipo.carrito = carrito;
// Guardar
return this.repository.save(equipo);
})
.then((_) => ({
message: 'Se guardaron los cambios correctamente.',
}));
.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)
@ -507,6 +535,7 @@ export class EquipoService {
motivo,
);
}
// Guardo los cambios
return this.repository.save(equipo);
}

View File

@ -183,7 +183,7 @@ export class MultaService {
}
findAllByIdEquipo(id_equipo: number, pagina: number) {
return this.equipoService.findInfoEquipoById(id_equipo).then((equipo) =>
return this.equipoService.findById(id_equipo).then((equipo) =>
this.fullInformacionMultaView
.findAndCount({
where: { id_equipo: equipo.id_equipo },

View File

@ -696,7 +696,7 @@ export class PrestamoService {
return this.institucionService
.findInfoInstitucionById(id_institucion)
.then((institucion) =>
this.equipoService.findInfoEquipoByNumeroInventario(
this.equipoService.findByNumeroInventario(
institucion,
numero_inventario,
),

View File

@ -214,11 +214,7 @@ export class UploadFileService {
)
: null;
let equipo = carrito
? await this.equipoService.findInfoEquipoByEquipo(
carrito,
dataEquipo.equipo,
false,
)
? await this.equipoService.findByEquipo(carrito, dataEquipo.equipo, false)
: null;
if (!tipoCarrito || !marca || !modelo || !modulo || !carrito) {
@ -249,7 +245,7 @@ export class UploadFileService {
);
return;
} else {
equipo = await this.equipoService.findInfoEquipoByNumeroInventario(
equipo = await this.equipoService.findByNumeroInventario(
institucion,
dataEquipo.numero_inventario,
false,