CRUD modulo Requisicion de combustible
This commit is contained in:
140
backend/src/modules/fuel-requests/fuelRequest.controller.ts
Normal file
140
backend/src/modules/fuel-requests/fuelRequest.controller.ts
Normal file
@ -0,0 +1,140 @@
|
||||
import { Request, Response } from "express";
|
||||
import { FuelRequestService } from "./fuelRequest.service";
|
||||
|
||||
const service = new FuelRequestService();
|
||||
|
||||
export class FuelRequestController {
|
||||
//Obtener todas las requisiciones
|
||||
|
||||
async getAll(
|
||||
req:Request,
|
||||
res:Response
|
||||
){
|
||||
|
||||
try{
|
||||
const requests = await service.getAll();
|
||||
res.json(requests);
|
||||
} catch (error){
|
||||
|
||||
res.status(500).json({
|
||||
message:"Error al obtener requisiciones",
|
||||
error
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Obtener requisición por ID
|
||||
|
||||
async getById(
|
||||
req:Request,
|
||||
res:Response
|
||||
){
|
||||
try {
|
||||
const request =
|
||||
await service.getById(
|
||||
req.params.id as string
|
||||
);
|
||||
|
||||
if(!request) {
|
||||
return res.status(404).json({
|
||||
message:
|
||||
"Requisición no encontrada"
|
||||
});
|
||||
}
|
||||
|
||||
res.json(request);
|
||||
}
|
||||
|
||||
catch (error) {
|
||||
res.status(500).json({
|
||||
message:"Error al obtener requisicion",
|
||||
error
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Crear requisición
|
||||
|
||||
async create(
|
||||
req:Request,
|
||||
res:Response
|
||||
){
|
||||
try {
|
||||
const request =
|
||||
await service.create(
|
||||
req.body
|
||||
);
|
||||
|
||||
res.status(201).json(
|
||||
request
|
||||
);
|
||||
|
||||
}
|
||||
catch (error) {
|
||||
res.status(500).json({
|
||||
message:"Error al crear requisición",
|
||||
error
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async update(
|
||||
req:Request,
|
||||
res:Response
|
||||
){
|
||||
try {
|
||||
|
||||
const request = await service.update(
|
||||
req.params.id as string,
|
||||
req.body
|
||||
);
|
||||
|
||||
if (!request) {
|
||||
return res.status(404).json({
|
||||
message:
|
||||
"Requisición no encontrada"
|
||||
});
|
||||
}
|
||||
|
||||
res.json(request);
|
||||
}catch(error) {
|
||||
res.status(500).json({
|
||||
message:"Error al actualizar requisición",
|
||||
error
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//Eliminar requisición
|
||||
|
||||
async delete(
|
||||
req:Request,
|
||||
res:Response
|
||||
){
|
||||
try{
|
||||
const request =
|
||||
await service.delete(
|
||||
req.params.id as string
|
||||
);
|
||||
|
||||
if(!request){
|
||||
return res.status(404).json({
|
||||
message:
|
||||
"Requisición no encontrada"
|
||||
});
|
||||
}
|
||||
res.json({
|
||||
message:"Requisición eliminada correctamente"
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
res.status(500).json({
|
||||
message: "Error al eliminar requisición",
|
||||
error
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
25
backend/src/modules/fuel-requests/fuelRequest.interface.ts
Normal file
25
backend/src/modules/fuel-requests/fuelRequest.interface.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import {ObjectId} from "mongoose";
|
||||
|
||||
export interface IFuelRequest {
|
||||
|
||||
requestNumber:string;
|
||||
employeeId:number;
|
||||
department:number;
|
||||
vehicleId:number;
|
||||
routeId:number;
|
||||
fuelPumpId?:ObjectId;
|
||||
fuelTypeId:ObjectId;
|
||||
createdBy:ObjectId;
|
||||
authorizedBy?:ObjectId;
|
||||
gallonQuantity:number;
|
||||
pricePerGallon:number;
|
||||
totalAmount?:number;
|
||||
previousMileage:number;
|
||||
currentMileage:number;
|
||||
distanceTraveled?:number;
|
||||
pumpReadingId?:ObjectId;
|
||||
pumpDifference?:number;
|
||||
comments?:string;
|
||||
odometerWorkin:boolean;
|
||||
status:string;
|
||||
}
|
||||
115
backend/src/modules/fuel-requests/fuelRequest.model.ts
Normal file
115
backend/src/modules/fuel-requests/fuelRequest.model.ts
Normal file
@ -0,0 +1,115 @@
|
||||
import mongoose from "mongoose";
|
||||
|
||||
const fuelRequestSchema = new mongoose.Schema({
|
||||
|
||||
requestNumber:{
|
||||
type:Number,
|
||||
required:true,
|
||||
unique:true
|
||||
},
|
||||
|
||||
employeeId:{
|
||||
type:Number,
|
||||
required:true
|
||||
},
|
||||
|
||||
departmentId:{
|
||||
type:Number,
|
||||
required:true
|
||||
},
|
||||
|
||||
routeId:{
|
||||
type:Number,
|
||||
required:true
|
||||
},
|
||||
|
||||
fuelPumpId:{
|
||||
type:mongoose.Schema.Types.ObjectId,
|
||||
ref:"FuelPump"
|
||||
},
|
||||
|
||||
fuelTypeId:{
|
||||
type:mongoose.Schema.Types.ObjectId,
|
||||
ref:"FuelType"
|
||||
},
|
||||
|
||||
createdBy:{
|
||||
type:mongoose.Schema.Types.ObjectId,
|
||||
ref:"User",
|
||||
required:true
|
||||
},
|
||||
|
||||
authorizedBy:{
|
||||
type:mongoose.Schema.Types.ObjectId,
|
||||
ref:"User"
|
||||
},
|
||||
|
||||
gallonQuantity:{
|
||||
type:Number,
|
||||
required:true
|
||||
},
|
||||
|
||||
pricePerGallon:{
|
||||
type:Number,
|
||||
default:0
|
||||
},
|
||||
|
||||
totalAmount:{
|
||||
type:Number,
|
||||
default:0
|
||||
},
|
||||
|
||||
previousMileage:{
|
||||
type:Number,
|
||||
required:true,
|
||||
},
|
||||
|
||||
currentMileage:{
|
||||
type:Number,
|
||||
required:true
|
||||
},
|
||||
|
||||
distanceTraveled:{
|
||||
type:Number,
|
||||
default:0
|
||||
},
|
||||
|
||||
pumpReading:{
|
||||
type:mongoose.Schema.Types.ObjectId,
|
||||
ref:"PumpReading",
|
||||
},
|
||||
|
||||
pumpDifference:{
|
||||
type:Number,
|
||||
default:0
|
||||
},
|
||||
|
||||
comments:{
|
||||
type:String
|
||||
},
|
||||
|
||||
odometerWorking:{
|
||||
type:Boolean,
|
||||
default:true
|
||||
|
||||
},
|
||||
|
||||
status:{
|
||||
type:String,
|
||||
enum:[
|
||||
"PENDIENTE",
|
||||
"APROBADO",
|
||||
"RECHAZADO",
|
||||
],
|
||||
|
||||
default:"PENDIENTE"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
timestamps:true
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
export default mongoose.model("FuelRequest", fuelRequestSchema);
|
||||
49
backend/src/modules/fuel-requests/fuelRequest.routes.ts
Normal file
49
backend/src/modules/fuel-requests/fuelRequest.routes.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import { Router } from "express";
|
||||
import { FuelRequestController } from "./fuelRequest.controller";
|
||||
import { authMiddleware } from "../auth/auth.middleware";
|
||||
|
||||
const fuelRequestRouter = Router();
|
||||
|
||||
const controller = new FuelRequestController();
|
||||
|
||||
|
||||
//Obtener todas las requisiciones
|
||||
fuelRequestRouter.get(
|
||||
"/",
|
||||
authMiddleware,
|
||||
controller.getAll
|
||||
);
|
||||
|
||||
|
||||
//Obtener requisición por ID
|
||||
|
||||
fuelRequestRouter.get(
|
||||
"/:id",
|
||||
authMiddleware,
|
||||
controller.getById
|
||||
);
|
||||
|
||||
|
||||
//Crear requisición
|
||||
fuelRequestRouter.post(
|
||||
"/",
|
||||
authMiddleware,
|
||||
controller.create
|
||||
);
|
||||
|
||||
|
||||
//Actualizar requisición
|
||||
fuelRequestRouter.put(
|
||||
"/:id",
|
||||
authMiddleware,
|
||||
controller.update
|
||||
);
|
||||
|
||||
//Eliminar requisició
|
||||
fuelRequestRouter.delete(
|
||||
"/:id",
|
||||
authMiddleware,
|
||||
controller.delete
|
||||
);
|
||||
|
||||
export default fuelRequestRouter;
|
||||
101
backend/src/modules/fuel-requests/fuelRequest.service.ts
Normal file
101
backend/src/modules/fuel-requests/fuelRequest.service.ts
Normal file
@ -0,0 +1,101 @@
|
||||
import fuelRequestModel from "./fuelRequest.model";
|
||||
import { IFuelRequest } from "./fuelRequest.interface";
|
||||
|
||||
import { generateRequestNumber } from "../../utils/requestNumber";
|
||||
|
||||
export class FuelRequestService {
|
||||
//Obtener todas las requisiciones
|
||||
|
||||
async getAll() {
|
||||
return await fuelRequestModel
|
||||
.find()
|
||||
.populate("fuelPumpId")
|
||||
.populate("fuelTypeId")
|
||||
.populate("createdBy")
|
||||
.populate("authorizedBy")
|
||||
.sort({ createdAt: -1 });
|
||||
}
|
||||
|
||||
//Obtener reauisición por ID
|
||||
|
||||
async getById(
|
||||
id:string
|
||||
) {
|
||||
|
||||
return await fuelRequestModel
|
||||
.findById(id)
|
||||
.populate("fuelPumpId")
|
||||
.populate("fuelTypeId")
|
||||
.populate("createdBy")
|
||||
.populate("authorizedBy");
|
||||
|
||||
}
|
||||
|
||||
//Crear una nueva requisición
|
||||
|
||||
async create (
|
||||
data:IFuelRequest
|
||||
){
|
||||
//Generar número automático
|
||||
data.requestNumber = generateRequestNumber();
|
||||
|
||||
//Calcular distancia recorrida
|
||||
data.distanceTraveled = data.currentMileage - data.previousMileage;
|
||||
|
||||
//Calcular monto total
|
||||
data.totalAmount = data.gallonQuantity * data.pricePerGallon;
|
||||
|
||||
//Estado inicial
|
||||
data.status = "PENDIENTE";
|
||||
|
||||
//Crear documento
|
||||
const request = new fuelRequestModel(data);
|
||||
|
||||
//Guardar en DB
|
||||
return await request.save();
|
||||
|
||||
}
|
||||
|
||||
async update(
|
||||
id:string,
|
||||
data:Partial<IFuelRequest>
|
||||
){
|
||||
//Recalcular distancia
|
||||
if(data.currentMileage !== undefined &&
|
||||
data.previousMileage !== undefined
|
||||
){
|
||||
data.distanceTraveled =
|
||||
data.currentMileage -
|
||||
data.previousMileage;
|
||||
}
|
||||
|
||||
//Recalcular monto
|
||||
if(
|
||||
data.gallonQuantity !== undefined &&
|
||||
data.pricePerGallon !== undefined
|
||||
){
|
||||
data.totalAmount =
|
||||
data.gallonQuantity *
|
||||
data.pricePerGallon;
|
||||
}
|
||||
|
||||
return await fuelRequestModel
|
||||
.findByIdAndUpdate(
|
||||
id,
|
||||
data,
|
||||
{
|
||||
new:true
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
//Eliminar requisición
|
||||
|
||||
async delete(
|
||||
id:string
|
||||
){
|
||||
|
||||
return await fuelRequestModel
|
||||
.findByIdAndDelete(id);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user