"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