mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 19:00:55 +00:00
74 lines
2.2 KiB
TypeScript
74 lines
2.2 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
|
|
import { BookingPricingService } from '../modules/bookings/booking-pricing.service';
|
|
import { Booking } from '../modules/bookings/entities/booking.entity';
|
|
import { PriceLineItemDto } from '../modules/bookings/dto/generate-price-response.dto';
|
|
|
|
export interface PricingScheduleRow {
|
|
label: string;
|
|
description: string;
|
|
amount: number;
|
|
currency: string;
|
|
}
|
|
|
|
export interface PricingSchedule {
|
|
lineItems: PricingScheduleRow[];
|
|
surcharges: PricingScheduleRow[];
|
|
totalAmount: number;
|
|
currency: string;
|
|
equipmentReturn?: string;
|
|
originLabel: string;
|
|
destinationLabel: string;
|
|
containerLines: Array<{
|
|
label: string;
|
|
quantity: number;
|
|
vgmPerUnitTons: number;
|
|
}>;
|
|
}
|
|
|
|
@Injectable()
|
|
export class ContractPricingScheduleBuilder {
|
|
constructor(private readonly pricingService: BookingPricingService) {}
|
|
|
|
async build(booking: Booking): Promise<PricingSchedule> {
|
|
const { lineItems, totalAmount, currency } =
|
|
await this.pricingService.computeContractLineItems(booking);
|
|
|
|
const isSurcharge = (l: PriceLineItemDto) =>
|
|
l.code.includes('SURCHARGE') || l.description.toLowerCase().includes('surcharge');
|
|
|
|
const baseLines = lineItems.filter((l) => !isSurcharge(l));
|
|
const surchargeLines = lineItems.filter(isSurcharge);
|
|
|
|
return {
|
|
lineItems: baseLines.map((l) => ({
|
|
label: l.code,
|
|
description: l.description,
|
|
amount: l.amount,
|
|
currency: l.currency,
|
|
})),
|
|
surcharges: surchargeLines.map((l) => ({
|
|
label: l.code,
|
|
description: l.description,
|
|
amount: l.amount,
|
|
currency: l.currency,
|
|
})),
|
|
totalAmount,
|
|
currency,
|
|
equipmentReturn: booking.equipmentReturn ?? '—',
|
|
originLabel: booking.originYard?.label ?? booking.originYard?.code ?? '—',
|
|
destinationLabel:
|
|
booking.destinationYard?.label ?? booking.destinationYard?.code ?? '—',
|
|
containerLines: (booking.bookingContainers ?? []).map((c) => ({
|
|
label:
|
|
c.containerType?.label ??
|
|
c.containerType?.code ??
|
|
c.containerTypeId ??
|
|
'—',
|
|
quantity: c.quantity,
|
|
vgmPerUnitTons: Number(c.vgmPerUnitTons),
|
|
})),
|
|
};
|
|
}
|
|
}
|