48 lines
1.6 KiB
TypeScript
48 lines
1.6 KiB
TypeScript
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 }
|
|
}
|