mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-29 19:58:11 +00:00
fix: premature payable invoice
This commit is contained in:
@@ -33,8 +33,6 @@ import { ClearanceMilestoneService } from '../contracts/clearance-milestone.serv
|
||||
import { ClearanceWorkflowService } from '../contracts/clearance-workflow.service';
|
||||
import { ContractDocPhase } from '@edr/types';
|
||||
|
||||
|
||||
import { Freight } from "@edr/types";
|
||||
import { BookingInvoiceService } from "./booking-invoice.service";
|
||||
|
||||
@Injectable()
|
||||
@@ -1112,14 +1110,25 @@ export class BookingTransitionService {
|
||||
await this.bookingBatchService.pickExportSchedule(booking);
|
||||
}
|
||||
|
||||
// Mint the booking's invoice (DRAFT) so the priced order carries its billing
|
||||
// record from accept onward. It is deliberately NOT issued here: accepting an
|
||||
// operation only puts the booking in the batch holding pool — no slot has been
|
||||
// offered and no pay window exists yet. Issuing at this point made the invoice
|
||||
// payable straight away (portal invoice list/detail gate on invoice status
|
||||
// alone), letting a customer pay before being selected for a batch, while the
|
||||
// booking page correctly still showed it as not payable. The batch engine
|
||||
// issues it in `reserve` (SELECTED_FOR_BATCH), which is where the pay window
|
||||
// and the real deadline are created — matching the portal's `canPay` gate.
|
||||
const invoice = await this.invoiceService.ensureInvoiceForBooking(booking);
|
||||
this.logger.log(
|
||||
`Generated invoice ${invoice.invoiceNumber} (${invoice.id}) for ${booking.reference}:${booking.id}`,
|
||||
);
|
||||
await this.invoiceService.updateStatus(
|
||||
invoice.id,
|
||||
Freight.InvoiceStatus.Pending,
|
||||
`Generated draft invoice ${invoice.invoiceNumber} (${invoice.id}) for ${booking.reference}:${booking.id} — issued on batch selection`,
|
||||
);
|
||||
// TODO: road (truck) orders are an incomplete feature — they stop at the
|
||||
// dead-end ROAD_DISPATCH_PENDING status below (no dispatch transition, no
|
||||
// per-km pricing wired via roadKmPrice, no pay surface in the portal). They
|
||||
// skip the train batch, so they never reach `reserve` and their invoice stays
|
||||
// DRAFT / unpayable. When the road flow is built, issue its invoice
|
||||
// (billing.issuePayable) at whatever transition opens the road pay window.
|
||||
if (isRoadService(booking.serviceType)) {
|
||||
await this.bookingsRepository.update(booking.id, {
|
||||
status: "ROAD_DISPATCH_PENDING",
|
||||
|
||||
Reference in New Issue
Block a user