69 lines
3.1 KiB
JavaScript
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
|