Modificación CRUD módulo aprobaciones

This commit is contained in:
2026-07-04 14:40:16 +00:00
parent 2c8e5ad894
commit 432e89110c
6 changed files with 193 additions and 287 deletions

View File

@ -6,9 +6,8 @@ const service = new ApprovalService();
export class ApprovalController {
/**
* Obtener todas las aprobaciones
*/
//Obtener todas las aprobaciones
async getAll(
req: Request,
res: Response
@ -36,9 +35,8 @@ export class ApprovalController {
}
/**
* Obtener aprobación por ID
*/
//Obtener aprobación por ID
async getById(
req: Request,
res: Response
@ -54,34 +52,26 @@ export class ApprovalController {
if (!approval) {
return res.status(404).json({
message:
"Aprobación no encontrada"
message:"Aprobación no encontrada"
});
}
res.json(
approval
);
res.json(approval);
}
catch (error:any) {
console.error(error);
} catch(error){
res.status(500).json({
message: "Error al aprobar solicitud",
error: error.message,
stack: error.stack
message: "Error al obtener solicitud",
error
});
}
}
/**
* Crear aprobación
*/
//Crear aprobación
async create(
req: Request,
res: Response
@ -89,8 +79,7 @@ export class ApprovalController {
try {
const approval =
await service.create(
const approval = await service.create(
req.body
);
@ -98,12 +87,9 @@ export class ApprovalController {
approval
);
}
catch (error) {
} catch (error) {
res.status(500).json({
message:
"Error al crear aprobación",
message:"Error al crear aprobación",
error
});
@ -111,9 +97,8 @@ export class ApprovalController {
}
/**
* Aprobar solicitud
*/
//Aprobar solicitud
async approve(
req: Request,
res: Response
@ -121,27 +106,20 @@ export class ApprovalController {
try {
const approval =
await service.approve(
const approval = await service.approve(
req.params.id as string,
req.body.approvedBy,
req.body.comments
);
res.json(
approval
);
res.json(approval);
}
catch (error) {
} catch (error) {
res.status(500).json({
message:
"Error al aprobar solicitud",
message:"Error al aprobar solicitud",
error
});
@ -149,9 +127,8 @@ export class ApprovalController {
}
/**
* Rechazar solicitud
*/
//Rechazar solicitud
async reject(
req: Request,
res: Response
@ -159,27 +136,18 @@ export class ApprovalController {
try {
const approval =
await service.reject(
const approval = await service.reject(
req.params.id as string,
req.body.approvedBy,
req.body.comments
);
res.json(
approval
);
res.json(approval);
}
catch (error) {
}catch (error) {
res.status(500).json({
message:
"Error al rechazar solicitud",
message:"Error al rechazar solicitud",
error
});
@ -187,9 +155,8 @@ export class ApprovalController {
}
/**
* Buscar por estado
*/
//Buscar por estado
async getByStatus(
req: Request,
res: Response
@ -197,21 +164,16 @@ export class ApprovalController {
try {
const approvals =
await service.getByStatus(
const approvals = await service.getByStatus(
req.params.status as string
);
res.json(
approvals
);
res.json(approvals);
}
catch (error) {
} catch (error) {
res.status(500).json({
message:
"Error al buscar aprobaciones",
message:"Error al buscar aprobaciones",
error
});
@ -219,9 +181,8 @@ export class ApprovalController {
}
/**
* Buscar por tipo de referencia
*/
//Buscar por tipo de referencia
async getByReferenceType(
req: Request,
res: Response
@ -229,21 +190,16 @@ export class ApprovalController {
try {
const approvals =
await service.getByReferenceType(
const approvals = await service.getByReferenceType(
req.params.referenceType as string
);
res.json(
approvals
);
res.json(approvals);
}
catch (error) {
} catch (error) {
res.status(500).json({
message:
"Error al buscar aprobaciones",
message:"Error al buscar aprobaciones",
error
});
@ -251,9 +207,8 @@ export class ApprovalController {
}
/**
* Eliminar aprobación
*/
// Eliminar aprobación
async delete(
req: Request,
res: Response
@ -261,31 +216,26 @@ export class ApprovalController {
try {
const approval =
await service.delete(
const approval = await service.delete(
req.params.id as string
);
if (!approval) {
return res.status(404).json({
message:
"Aprobación no encontrada"
message:"Aprobación no encontrada"
});
}
res.json({
message:
"Aprobación eliminada correctamente"
message: "Aprobación eliminada correctamente"
});
}
catch (error) {
} catch (error) {
res.status(500).json({
message:
"Error al eliminar aprobación",
message:"Error al eliminar aprobación",
error
});

View File

@ -1,16 +1,19 @@
import { ObjectId } from "mongoose";
import { Types } from "mongoose";
export interface IApproval {
referenceType:string;
referenceId:ObjectId;
referenceId:Types.ObjectId;
approvedBy?:ObjectId;
approvedBy?:Types.ObjectId;
approvedDate?:Date;
status:string;
status:
| "PENDIENTE"
| "APROBADO"
| "RECHAZADO";
comments?:string;

View File

@ -40,7 +40,4 @@ new mongoose.Schema({
timestamps:true
});
export default mongoose.model(
"Approval",
approvalSchema
);
export default mongoose.model("Approval", approvalSchema);

View File

@ -1,11 +1,7 @@
import ApprovalModel from "./approval.model";
import FuelRequestModel from "../fuel-requests/fuelRequest.model";
import externalInvoiceModel from "../external-invoices/externalInvoice.model";
import lpgModel from "../lpg/lpg.model";
import { IApproval } from "./approval.interface";
@ -42,8 +38,18 @@ export class ApprovalService {
data: IApproval
) {
const approval =
new ApprovalModel(data);
const exists = await ApprovalModel.findOne({
referenceType: data.referenceType,
referenceId: data.referenceId
});
if (exists) {
throw new Error(
"La solicitud ya tiene una aprobación registrada."
);
}
const approval = new ApprovalModel(data);
return await approval.save();
@ -57,105 +63,72 @@ export class ApprovalService {
) {
// Buscar aprobación
const approval =
await ApprovalModel.findById(
const approval = await ApprovalModel.findById(
approvalId
);
if (!approval) {
throw new Error(
"Aprobación no encontrada"
);
}
// Actualizar aprobación
approval.status =
"APROBADO";
// Validar que aún esté pendiente
if (approval.status !== "PENDIENTE") {
throw new Error("Esta solicitud ya fue procesada.");
}
approval.approvedBy =
approvedBy as any;
// Actualizar datos de la aprobación
approval.status = "APROBADO";
approval.approvedDate =
new Date();
approval.approvedBy = approvedBy as any;
approval.comments =
comments || "";
approval.approvedDate = new Date();
approval.comments = comments || "";
await approval.save();
if (
approval.referenceType ===
"FuelRequest"
) {
await FuelRequestModel
.findByIdAndUpdate(
// Actualizar el documento relacionado
if (approval.referenceType === "FuelRequest") {
await FuelRequestModel.findByIdAndUpdate(
approval.referenceId,
{
status:
"APROBADO"
status: "APROBADO"
},
{
new: true
}
);
}
if (
approval.referenceType ===
"ExternalInvoice"
) {
await externalInvoiceModel
.findByIdAndUpdate(
} else if (approval.referenceType === "ExternalInvoice") {
await externalInvoiceModel.findByIdAndUpdate(
approval.referenceId,
{
status:
"APROBADO"
status: "APROBADO"
},
{
new: true
}
);
}
if (
approval.referenceType ===
"LPG"
) {
await lpgModel
.findByIdAndUpdate(
} else if (approval.referenceType === "LPG") {
await lpgModel.findByIdAndUpdate(
approval.referenceId,
{
status:
"APROBADO"
status: "APROBADO"
},
{
new: true
}
);
}
}
return approval;
}
//Rechazar solicitud
@ -167,104 +140,70 @@ export class ApprovalService {
) {
// Buscar aprobación
const approval =
await ApprovalModel.findById(
const approval = await ApprovalModel.findById(
approvalId
);
if (!approval) {
throw new Error(
"Aprobación no encontrada"
);
throw new Error("Aprobación no encontrada");
}
// Actualizar aprobación
approval.status =
"RECHAZADO";
// Validar que aún esté pendiente
if (approval.status !== "PENDIENTE") {
throw new Error("Esta solicitud ya fue procesada.");
}
approval.approvedBy =
approvedBy as any;
// Actualizar datos de la aprobación
approval.status = "RECHAZADO";
approval.approvedDate =
new Date();
approval.approvedBy = approvedBy as any;
approval.comments =
comments || "";
approval.approvedDate = new Date();
approval.comments = comments || "";
await approval.save();
if (
approval.referenceType ===
"FuelRequest"
) {
await FuelRequestModel
.findByIdAndUpdate(
// Actualizar el documento relacionado
if (approval.referenceType === "FuelRequest") {
await FuelRequestModel.findByIdAndUpdate(
approval.referenceId,
{
status:
"RECHAZADO"
status: "RECHAZADO"
},
{
new: true
}
);
}
if (
approval.referenceType ===
"ExternalInvoice"
) {
await externalInvoiceModel
.findByIdAndUpdate(
} else if (approval.referenceType === "ExternalInvoice") {
await externalInvoiceModel.findByIdAndUpdate(
approval.referenceId,
{
status:
"RECHAZADO"
status: "RECHAZADO"
},
{
new: true
}
);
}
if (
approval.referenceType ===
"LPG"
) {
await lpgModel
.findByIdAndUpdate(
} else if (approval.referenceType === "LPG") {
await lpgModel.findByIdAndUpdate(
approval.referenceId,
{
status:
"RECHAZADO"
status: "RECHAZADO"
},
{
new: true
}
);
}
return approval;
}
//Obtener aprobaciones por estado

View File

@ -1,17 +1,30 @@
import {ObjectId} from 'mongoose';
import {Types} from 'mongoose';
export interface IPumpReading {
readingNumber:string;
fuelPumpId:ObjectId;
fuelTypeId:ObjectId;
readingNumber?:string;
fuelPumpId:Types.ObjectId;
fuelTypeId:Types.ObjectId;
readingDate:Date;
initialReading:number;
finalReading:number;
gallonsDispensed?:number;
systemDispensed?:number;
difference:number;
createdBy:ObjectId;
status:string;
difference?:number;
createdBy:Types.ObjectId;
status?:
| "ABIERTA"
| "CUADRADA"
| "CON_DIFERENCIA";
comments?:string;
}

View File

@ -5,3 +5,7 @@ export const generateRequestNumber = ():string =>{
export const generateRequestLPGNumber =():string =>{
return `LPG-${Date.now()}`;
}
export const generatePumpReadingNumber = (): string => {
return `PR-${Date.now()}`;
};