mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-07 14:15:44 +00:00
Price issue on sign in path addressed, Djibouti side pricing updates added
This commit is contained in:
@@ -103,6 +103,18 @@ export class FareEngineService {
|
||||
},
|
||||
});
|
||||
|
||||
// Route-level fare override: checked after segment (most specific) but before
|
||||
// schedule-scoped rules and the global seat-class tariff (least specific).
|
||||
const routeFareOverride = segmentOverride ? null : await this.prisma.routeFareRule.findFirst({
|
||||
where: {
|
||||
routeId: route.id,
|
||||
seatClassId: nationalitySeatClass.id,
|
||||
validFrom: { lte: now },
|
||||
OR: [{ validUntil: null }, { validUntil: { gte: now } }],
|
||||
},
|
||||
orderBy: { validFrom: 'desc' },
|
||||
});
|
||||
|
||||
if (segmentOverride) {
|
||||
baseFarePerPassengerMinor = segmentOverride.baseFareMinor;
|
||||
if (nationalityType === 'INTERNATIONAL' && !segmentOverride.nationality) {
|
||||
@@ -110,6 +122,20 @@ export class FareEngineService {
|
||||
}
|
||||
ratePerKmMinor = totalDistanceKm > 0 ? Math.round(baseFarePerPassengerMinor / totalDistanceKm) : 0;
|
||||
fareSource = 'SEGMENT_FARE_RULE';
|
||||
} else if (routeFareOverride) {
|
||||
// Stored as a per-km rate (same unit as SeatClass.baseFareMinor × 100).
|
||||
// Insurance factor and USD→ETB conversion are applied identically to the
|
||||
// global seat-class formula so the override is a pure rate substitution.
|
||||
const ratePerKmEtb = routeFareOverride.baseFareMinor / 100;
|
||||
insuranceFactor = nationalitySeatClass.insuranceFeeMinor > 0
|
||||
? nationalitySeatClass.insuranceFeeMinor / 100 : 1;
|
||||
usdToEtbRate = await this.currencyService.getExchangeRate(Currency.USD, Currency.ETB);
|
||||
ratePerKmMinor = routeFareOverride.baseFareMinor;
|
||||
baseFarePerPassengerMinor = Math.round(
|
||||
totalDistanceKm * ratePerKmEtb * insuranceFactor * usdToEtbRate,
|
||||
);
|
||||
fareSource = 'ROUTE_FARE_OVERRIDE';
|
||||
insuranceAlreadyInBase = true;
|
||||
} else if (fareRule?.tripId) {
|
||||
baseFarePerPassengerMinor = fareRule.baseFareMinor;
|
||||
if (nationalityType === 'INTERNATIONAL' && !fareRule.nationality) {
|
||||
@@ -172,7 +198,7 @@ export class FareEngineService {
|
||||
const calculation = [
|
||||
`Distance: ${totalDistanceKm} km (${originStation?.name} → ${destStation?.name})`,
|
||||
`Nationality: ${dto.nationality ?? 'unspecified'} → ${nationalityType}${nationalityType === 'INTERNATIONAL' ? ' (2× surcharge applied)' : ''} → ${nationalitySeatClass.name}`,
|
||||
`Rate per km: ${nationalitySeatClass.baseFareMinor} minor → ${nationalitySeatClass.baseFareMinor / 100} ETB/km`,
|
||||
`Rate per km: ${routeFareOverride ? routeFareOverride.baseFareMinor : nationalitySeatClass.baseFareMinor} minor → ${(routeFareOverride ? routeFareOverride.baseFareMinor : nationalitySeatClass.baseFareMinor) / 100} ETB/km${routeFareOverride ? ' [ROUTE OVERRIDE]' : ''}`,
|
||||
`Insurance: ${nationalitySeatClass.insuranceFeeMinor} minor → factor ${insuranceFactor}${insuranceAlreadyInBase ? ' (baked into base fare)' : ''}`,
|
||||
`USD→ETB rate: ${usdToEtbRate}`,
|
||||
`Base fare/pax: ${totalDistanceKm} km × (${nationalitySeatClass.baseFareMinor} / 100) × ${insuranceFactor} × ${usdToEtbRate} = ${baseFarePerPassengerMinor} ETB minor`,
|
||||
|
||||
Reference in New Issue
Block a user