archetecture security fix
This commit is contained in:
+51
@@ -0,0 +1,51 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.applyPricingRules = applyPricingRules;
|
||||
const prisma_1 = require("../lib/prisma");
|
||||
async function applyPricingRules(companyId, customerId, additionalDrivers, dailyRate, totalDays) {
|
||||
const rules = await prisma_1.prisma.pricingRule.findMany({ where: { companyId, isActive: true } });
|
||||
const customer = await prisma_1.prisma.customer.findFirstOrThrow({ where: { id: customerId, companyId } });
|
||||
const allDrivers = [customer, ...additionalDrivers];
|
||||
const applied = [];
|
||||
const baseAmount = dailyRate * totalDays;
|
||||
for (const driver of allDrivers) {
|
||||
for (const rule of rules) {
|
||||
const driverAge = driver.dateOfBirth
|
||||
? Math.floor((Date.now() - driver.dateOfBirth.getTime()) / (365.25 * 24 * 60 * 60 * 1000))
|
||||
: null;
|
||||
const licenseYears = driver.licenseIssuedAt
|
||||
? Math.floor((Date.now() - driver.licenseIssuedAt.getTime()) / (365.25 * 24 * 60 * 60 * 1000))
|
||||
: null;
|
||||
let conditionMet = false;
|
||||
if (rule.condition === 'AGE_LESS_THAN' && driverAge !== null)
|
||||
conditionMet = driverAge < rule.conditionValue;
|
||||
else if (rule.condition === 'AGE_GREATER_THAN' && driverAge !== null)
|
||||
conditionMet = driverAge > rule.conditionValue;
|
||||
else if (rule.condition === 'LICENSE_YEARS_LESS_THAN' && licenseYears !== null)
|
||||
conditionMet = licenseYears < rule.conditionValue;
|
||||
else if (rule.condition === 'LICENSE_YEARS_GREATER_THAN' && licenseYears !== null)
|
||||
conditionMet = licenseYears > rule.conditionValue;
|
||||
if (!conditionMet)
|
||||
continue;
|
||||
let amount = 0;
|
||||
if (rule.adjustmentType === 'PERCENTAGE')
|
||||
amount = Math.round(baseAmount * rule.adjustmentValue / 100);
|
||||
else if (rule.adjustmentType === 'FLAT_PER_DAY')
|
||||
amount = rule.adjustmentValue * totalDays;
|
||||
else
|
||||
amount = rule.adjustmentValue;
|
||||
if (rule.type === 'DISCOUNT')
|
||||
amount = -amount;
|
||||
applied.push({ ruleId: rule.id, name: rule.name, type: rule.type, amount });
|
||||
}
|
||||
}
|
||||
// Deduplicate: each rule applied once even if multiple drivers qualify
|
||||
const deduped = applied.reduce((acc, item) => {
|
||||
if (!acc.find((a) => a.ruleId === item.ruleId))
|
||||
acc.push(item);
|
||||
return acc;
|
||||
}, []);
|
||||
const total = deduped.reduce((s, r) => s + r.amount, 0);
|
||||
return { applied: deduped, total };
|
||||
}
|
||||
//# sourceMappingURL=pricingRuleService.js.map
|
||||
Reference in New Issue
Block a user