mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 09:42:53 +00:00
82 lines
2.7 KiB
TypeScript
82 lines
2.7 KiB
TypeScript
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,
|
|
};
|
|
}
|