Actualización CRUD módulo requisición de combustible y adición de validaciones
This commit is contained in:
@ -1,8 +1,8 @@
|
|||||||
import { ObjectId } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
|
|
||||||
export interface IFuelRequest {
|
export interface IFuelRequest {
|
||||||
|
|
||||||
_id?: ObjectId;
|
_id?: Types.ObjectId;
|
||||||
|
|
||||||
requestNumber: string;
|
requestNumber: string;
|
||||||
|
|
||||||
@ -14,13 +14,13 @@ export interface IFuelRequest {
|
|||||||
|
|
||||||
routeId: number;
|
routeId: number;
|
||||||
|
|
||||||
fuelPumpId: ObjectId;
|
fuelPumpId: Types.ObjectId;
|
||||||
|
|
||||||
fuelTypeId: ObjectId;
|
fuelTypeId: Types.ObjectId;
|
||||||
|
|
||||||
createdBy: ObjectId;
|
createdBy: Types.ObjectId;
|
||||||
|
|
||||||
authorizedBy?: ObjectId;
|
authorizedBy?: Types.ObjectId;
|
||||||
|
|
||||||
gallonQuantity: number;
|
gallonQuantity: number;
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ export interface IFuelRequest {
|
|||||||
|
|
||||||
distanceTraveled?: number;
|
distanceTraveled?: number;
|
||||||
|
|
||||||
pumpReading?: ObjectId;
|
pumpReading?: Types.ObjectId;
|
||||||
|
|
||||||
pumpDifference?: number;
|
pumpDifference?: number;
|
||||||
|
|
||||||
|
|||||||
@ -30,12 +30,14 @@ const fuelRequestSchema = new mongoose.Schema({
|
|||||||
|
|
||||||
fuelPumpId:{
|
fuelPumpId:{
|
||||||
type:mongoose.Schema.Types.ObjectId,
|
type:mongoose.Schema.Types.ObjectId,
|
||||||
ref:"FuelPump"
|
ref:"FuelPump",
|
||||||
|
required:true
|
||||||
},
|
},
|
||||||
|
|
||||||
fuelTypeId:{
|
fuelTypeId:{
|
||||||
type:mongoose.Schema.Types.ObjectId,
|
type:mongoose.Schema.Types.ObjectId,
|
||||||
ref:"FuelType"
|
ref:"FuelType",
|
||||||
|
required:true
|
||||||
},
|
},
|
||||||
|
|
||||||
createdBy:{
|
createdBy:{
|
||||||
|
|||||||
@ -40,6 +40,16 @@ export class FuelRequestService {
|
|||||||
async create (
|
async create (
|
||||||
data:IFuelRequest
|
data:IFuelRequest
|
||||||
){
|
){
|
||||||
|
///Validar kilometraje
|
||||||
|
if(data.currentMileage < data.previousMileage) {
|
||||||
|
throw new Error ("El kilometraje no puede ser menor que el anterior");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Validar que los galones sean mayor a 0
|
||||||
|
if(data.gallonQuantity <= 0){
|
||||||
|
throw new Error ("La cantidad de galones debe ser mayor que 0");
|
||||||
|
}
|
||||||
|
|
||||||
//Generar número automático
|
//Generar número automático
|
||||||
data.requestNumber = generateRequestNumber();
|
data.requestNumber = generateRequestNumber();
|
||||||
|
|
||||||
@ -56,7 +66,14 @@ export class FuelRequestService {
|
|||||||
const request = new fuelRequestModel(data);
|
const request = new fuelRequestModel(data);
|
||||||
|
|
||||||
//Guardar en DB
|
//Guardar en DB
|
||||||
return await request.save();
|
const fuelRequest = await request.save();
|
||||||
|
|
||||||
|
//Validaciones automáticas
|
||||||
|
await this.detectAnomalies(
|
||||||
|
fuelRequest
|
||||||
|
);
|
||||||
|
|
||||||
|
return fuelRequest;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,33 +81,45 @@ export class FuelRequestService {
|
|||||||
id:string,
|
id:string,
|
||||||
data:Partial<IFuelRequest>
|
data:Partial<IFuelRequest>
|
||||||
){
|
){
|
||||||
//Recalcular distancia
|
//Buscar la requisición actual
|
||||||
if(data.currentMileage !== undefined &&
|
const request = await fuelRequestModel.findById(id);
|
||||||
data.previousMileage !== undefined
|
|
||||||
){
|
if(!request){
|
||||||
data.distanceTraveled =
|
return null;
|
||||||
data.currentMileage -
|
|
||||||
data.previousMileage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Recalcular monto
|
const previousMileage = data.previousMileage ?? request.previousMileage;
|
||||||
if(
|
|
||||||
data.gallonQuantity !== undefined &&
|
const currentMileage = data.currentMileage ?? request.currentMileage;
|
||||||
data.pricePerGallon !== undefined
|
|
||||||
){
|
const gallonQuantity = data.gallonQuantity ?? request.gallonQuantity;
|
||||||
data.totalAmount =
|
|
||||||
data.gallonQuantity *
|
const pricePerGallon = data.pricePerGallon ?? request.pricePerGallon;
|
||||||
data.pricePerGallon;
|
|
||||||
|
//Recalcular distancia recorrida
|
||||||
|
data.distanceTraveled = currentMileage - previousMileage;
|
||||||
|
|
||||||
|
//Validar kilometraje
|
||||||
|
|
||||||
|
if(data.distanceTraveled < 0){
|
||||||
|
throw new Error("El kilometraje actual no puede ser menor que el anterior");
|
||||||
}
|
}
|
||||||
|
|
||||||
return await fuelRequestModel
|
//Recalcular monto total
|
||||||
.findByIdAndUpdate(
|
|
||||||
|
data.totalAmount = gallonQuantity * pricePerGallon;
|
||||||
|
|
||||||
|
//Actualizar la requisición
|
||||||
|
const updateRequest = await fuelRequestModel.findByIdAndUpdate(
|
||||||
id,
|
id,
|
||||||
data,
|
data,
|
||||||
{
|
{
|
||||||
new:true
|
new:true
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return updateRequest;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Eliminar requisición
|
//Eliminar requisición
|
||||||
@ -198,7 +227,7 @@ export class FuelRequestService {
|
|||||||
data:any
|
data:any
|
||||||
){
|
){
|
||||||
const vehicleConfig = await vehiclesConfigModel.findOne({
|
const vehicleConfig = await vehiclesConfigModel.findOne({
|
||||||
vehicleid:data.vehicleId
|
vehicleId:data.vehicleId
|
||||||
});
|
});
|
||||||
|
|
||||||
//Sino existe configuración no validar
|
//Sino existe configuración no validar
|
||||||
@ -210,12 +239,12 @@ export class FuelRequestService {
|
|||||||
|
|
||||||
if(
|
if(
|
||||||
data.gallonQuantity >
|
data.gallonQuantity >
|
||||||
vehicleConfig.tankcapacity
|
vehicleConfig.tankCapacity
|
||||||
){
|
){
|
||||||
await this.createAnomaly(
|
await this.createAnomaly(
|
||||||
data,
|
data,
|
||||||
"CONSUMO ELEVADO",
|
"CONSUMO ELEVADO",
|
||||||
`Se solicitaron ${data.gallonQuantity} galones, pero la capacidad del tanque es de ${vehicleConfig.tankcapacity} galones.`
|
`Se solicitaron ${data.gallonQuantity} galones, pero la capacidad del tanque es de ${vehicleConfig.tankCapacity} galones.`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user