import { Contract } from './entities/contract.entity'; /** * Resolves which seeded clearance FileUploadSetting applies to a contract during * the CONTRACT pre-booking phase (Path B). Mirrors clearance.util.ts but emits * `contract_clearance_*` codes keyed on (tradeDirection, freightType, customs). */ type Op = 'import' | 'export'; type Freight = 'container' | 'bulk'; /** Trade direction → clearance operation. DOMESTIC has no customs clearance. */ function operationFor(tradeDirection: string): Op | null { if (tradeDirection === 'IMPORT') return 'import'; if (tradeDirection === 'EXPORT') return 'export'; return null; // DOMESTIC / intercity — no clearance gate } function freightFor(freightType: string): Freight { return freightType === 'BULK' ? 'bulk' : 'container'; } /** * The customer-input clearance setting code, or null when no gate applies. * * - Path B (customs bundled): the customer uploads the documents GL needs to do * the clearance work → `contract_clearance_{op}_{freight}`. * - Path A (no customs): the customer clears the cargo himself and uploads his * own (smaller) clearance proof set → `contract_clearance_selfclear_{op}_{freight}`, * reviewed by Operations rather than GL. * * DOMESTIC/intercity has no border, so no clearance gate applies on either path. */ export function contractClearanceSettingCode( tradeDirection: string, freightType: string, includesCustoms: boolean, ): string | null { const op = operationFor(tradeDirection); if (!op) return null; const freight = freightFor(freightType); if (!includesCustoms) { return `contract_clearance_selfclear_${op}_${freight}`; } return `contract_clearance_${op}_${freight}`; } /** The GL-output (customs output) setting code, keyed on op + freight. */ export function contractClearanceOutputSettingCode( tradeDirection: string, freightType: string, includesCustoms: boolean, ): string | null { if (!includesCustoms) return null; const op = operationFor(tradeDirection); if (!op) return null; const freight = freightFor(freightType); return `contract_clearance_output_${op}_${freight}`; } /** Convenience: resolve both codes for a loaded contract. */ export function contractClearanceCodes(contract: Contract): { inputCode: string | null; outputCode: string | null; includesCustoms: boolean; } { const includesCustoms = contract.customsClearingEnabled ?? false; return { inputCode: contractClearanceSettingCode( contract.tradeDirection, contract.freightType, includesCustoms, ), outputCode: contractClearanceOutputSettingCode( contract.tradeDirection, contract.freightType, includesCustoms, ), includesCustoms, }; }