Enhance bulk booking handling and wagon capacity calculations across services

This commit is contained in:
Marshal
2026-07-09 15:30:00 +00:00
parent 3259bd7667
commit 1690f9e498
11 changed files with 278 additions and 32 deletions

View File

@@ -136,6 +136,7 @@ describe('BookingBatchService — PAID reconcile', () => {
expirePayable: jest.fn().mockResolvedValue(undefined),
} as never,
{ emitPhase: jest.fn() } as never,
{ computeSubmitPriorityScore: jest.fn().mockResolvedValue(0) } as never,
);
});
@@ -563,6 +564,7 @@ describe('BookingBatchService — PAID reconcile', () => {
trainSchedulingService as never,
{ syncPayableDueDate: jest.fn(), expirePayable: jest.fn() } as never,
{ emitPhase: jest.fn() } as never,
{ computeSubmitPriorityScore: jest.fn().mockResolvedValue(0) } as never,
undefined,
{ findOpenOffer: jest.fn() } as never,
);
@@ -585,6 +587,7 @@ describe('BookingBatchService — PAID reconcile', () => {
trainSchedulingService as never,
{ syncPayableDueDate: jest.fn(), expirePayable: jest.fn() } as never,
{ emitPhase: jest.fn() } as never,
{ computeSubmitPriorityScore: jest.fn().mockResolvedValue(0) } as never,
undefined,
{ findOpenOffer: jest.fn() } as never,
);
@@ -615,6 +618,7 @@ describe('BookingBatchService — PAID reconcile', () => {
trainSchedulingService as never,
{ syncPayableDueDate: jest.fn(), expirePayable: jest.fn() } as never,
{ emitPhase: jest.fn() } as never,
{ computeSubmitPriorityScore: jest.fn().mockResolvedValue(0) } as never,
undefined,
{ findOpenOffer: jest.fn() } as never,
);
@@ -745,6 +749,7 @@ describe('BookingBatchService — wagonsFor', () => {
null as never,
null as never,
null as never,
null as never,
) as unknown as {
wagonsFor(booking: unknown, dims: unknown): number;
};
@@ -780,6 +785,13 @@ describe('BookingBatchService — wagonsFor', () => {
expect(service.wagonsFor(bulk(2590, { wagonsRequired: 40 }), dims)).toBe(40);
});
it('ignores a stale undersized wagonsRequired: 700T of sugar rides 10 wagons, not 1', () => {
// Rows written while sumWagonsRequired hardcoded BULK to 1 are still in the
// DB; trusting them charged one tare for the whole consist (700 + 25.2
// instead of 700 + 10 × 25.2 gross).
expect(service.wagonsFor(bulk(700, { wagonsRequired: 1 }), dims)).toBe(10);
});
it('takes the binding axis for containers: weight can exceed TEU geometry', () => {
// Two 40ft units => 2 wagons by TEU geometry, but 210T needs 3 at 70T each.
const booking = {