import { InsurancePolicy } from '@rentaldrivego/database' import { prisma } from '../lib/prisma' export function calculateInsuranceCharge( policy: InsurancePolicy, totalDays: number, baseRentalAmount: number ): number { switch (policy.chargeType) { case 'PER_DAY': return policy.chargeValue * totalDays case 'PER_RENTAL': return policy.chargeValue case 'PERCENTAGE_OF_RENTAL': return Math.round(baseRentalAmount * policy.chargeValue / 100) default: return 0 } } export async function applyInsurancesToReservation( reservationId: string, companyId: string, selectedPolicyIds: string[], totalDays: number, baseRentalAmount: number ) { const allPolicies = await prisma.insurancePolicy.findMany({ where: { companyId, isActive: true } }) const required = allPolicies.filter((p) => p.isRequired) const selected = allPolicies.filter((p) => selectedPolicyIds.includes(p.id) && !p.isRequired) const toApply = [...required, ...selected] const records = toApply.map((policy) => ({ reservationId, insurancePolicyId: policy.id, policyName: policy.name, policyType: policy.type, chargeType: policy.chargeType, chargeValue: policy.chargeValue, totalCharge: calculateInsuranceCharge(policy, totalDays, baseRentalAmount), })) const insuranceTotal = records.reduce((s, r) => s + r.totalCharge, 0) await prisma.$transaction([ prisma.reservationInsurance.createMany({ data: records }), prisma.reservation.update({ where: { id: reservationId }, data: { insuranceTotal } }), ]) return { records, insuranceTotal } }