Files
alrahma_sunday_school_api/apps/api/dist/services/additionalDriverService.js
T
2026-06-11 03:22:12 -04:00

69 lines
3.1 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.calculateAdditionalDriverCharge = calculateAdditionalDriverCharge;
exports.applyAdditionalDriversToReservation = applyAdditionalDriversToReservation;
const prisma_1 = require("../lib/prisma");
const licenseValidationService_1 = require("./licenseValidationService");
function calculateAdditionalDriverCharge(chargeType, chargeValue, totalDays) {
switch (chargeType) {
case 'PER_DAY':
return chargeValue * totalDays;
case 'FLAT':
return chargeValue;
default:
return 0;
}
}
async function applyAdditionalDriversToReservation(reservationId, companyId, drivers, totalDays) {
if (drivers.length === 0) {
return { records: [], additionalDriverTotal: 0, requiresManualApproval: false };
}
const settings = await prisma_1.prisma.contractSettings.findUnique({ where: { companyId } });
const chargeType = settings?.additionalDriverCharge ?? 'FREE';
const chargeValue = chargeType === 'PER_DAY'
? settings?.additionalDriverDailyRate ?? 0
: chargeType === 'FLAT'
? settings?.additionalDriverFlatRate ?? 0
: 0;
const records = drivers.map((driver) => {
const licenseResult = (0, licenseValidationService_1.validateLicense)(driver.licenseExpiry ? new Date(driver.licenseExpiry) : null);
const totalCharge = calculateAdditionalDriverCharge(chargeType, chargeValue, totalDays);
return {
reservationId,
companyId,
firstName: driver.firstName,
lastName: driver.lastName,
email: driver.email ?? null,
phone: driver.phone ?? null,
driverLicense: driver.driverLicense,
licenseExpiry: driver.licenseExpiry ? new Date(driver.licenseExpiry) : null,
licenseIssuedAt: driver.licenseIssuedAt ? new Date(driver.licenseIssuedAt) : null,
dateOfBirth: driver.dateOfBirth ? new Date(driver.dateOfBirth) : null,
nationality: driver.nationality ?? null,
chargeType,
chargeValue,
totalCharge,
licenseExpired: licenseResult.status === 'EXPIRED',
licenseExpiringSoon: licenseResult.status === 'EXPIRING',
requiresApproval: licenseResult.requiresApproval,
approvalNote: licenseResult.requiresApproval ? licenseResult.message : null,
};
});
const additionalDriverTotal = records.reduce((sum, record) => sum + record.totalCharge, 0);
await prisma_1.prisma.$transaction([
prisma_1.prisma.additionalDriver.createMany({ data: records }),
prisma_1.prisma.reservation.update({
where: { id: reservationId },
data: {
additionalDriverTotal,
totalAmount: { increment: additionalDriverTotal },
},
}),
]);
return {
records,
additionalDriverTotal,
requiresManualApproval: records.some((record) => record.requiresApproval),
};
}
//# sourceMappingURL=additionalDriverService.js.map