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 { 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 ?? undefined, 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), })), }; } }