mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
BuyerDetails Country/Region/City/Wereda now resolve from the Ministry's own EIMS_COUNTRY_REGION_VW master instead of the EIMS_BUYER_*_CODES env maps and the ethiopia-geo-codes table. Both invented their codes and looked names up globally, so KERSA/GORO/BABILE/BURE — each present in several zones with different LOCALITY_NOs — could be filed against the wrong jurisdiction. Resolution is hierarchical and refuses to guess: an unknown or ambiguous address raises a local validation error naming the level that failed, and never selects the first matching row. Spelling differences between EDR and MoR live in a reviewed, parent-scoped alias layer; the dataset itself stays verbatim so it remains traceable to the Ministry sheet. Resolution now runs before the counter reservation in both the single and bulk paths, so a bad company address no longer burns an EIMS sequence number. Adds eims:import-locations to regenerate the dataset from a future workbook, reporting duplicate rows and same-hierarchy code conflicts.
154 lines
4.8 KiB
TypeScript
154 lines
4.8 KiB
TypeScript
import { api as client } from '../auth/http';
|
|
import { URL_CONSTANTS } from '@/constants/URLS';
|
|
import { unwrap } from '@/utils/endpoint';
|
|
import type {
|
|
AssignCustomsRiskPayload,
|
|
CreateDjiboutiIncidentPayload,
|
|
CreateEmptyContainerReturnPayload,
|
|
LoadEmptyContainersOnTrainPayload,
|
|
DjiboutiIncident,
|
|
EmptyContainerReturn,
|
|
ImportCustomsFinalization,
|
|
ImportOperationActionPayload,
|
|
RecordDeclarationPayload,
|
|
UpdateEmptyContainerReturnStatusPayload,
|
|
UploadImportCustomsDocumentPayload,
|
|
} from '@/types/importOperations';
|
|
|
|
export const importOperationsService = {
|
|
listIncidents: async (bookingId?: string): Promise<DjiboutiIncident[]> => {
|
|
const response = await client.get<DjiboutiIncident[]>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.DJIBOUTI_INCIDENTS,
|
|
{ params: { bookingId } },
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
createIncident: async (
|
|
payload: CreateDjiboutiIncidentPayload,
|
|
): Promise<DjiboutiIncident> => {
|
|
const response = await client.post<DjiboutiIncident>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.DJIBOUTI_INCIDENTS,
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
getCustoms: async (bookingId: string): Promise<ImportCustomsFinalization> => {
|
|
const response = await client.get<ImportCustomsFinalization>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.CUSTOMS(bookingId),
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
uploadCustomsDocument: async (
|
|
bookingId: string,
|
|
payload: UploadImportCustomsDocumentPayload,
|
|
): Promise<ImportCustomsFinalization> => {
|
|
const response = await client.post<ImportCustomsFinalization>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.CUSTOMS_DOCUMENTS(bookingId),
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
recordDeclaration: async (
|
|
bookingId: string,
|
|
payload: RecordDeclarationPayload,
|
|
): Promise<ImportCustomsFinalization> => {
|
|
const response = await client.post<ImportCustomsFinalization>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.CUSTOMS_DECLARATION(bookingId),
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
notifyDutiesTaxes: async (
|
|
bookingId: string,
|
|
payload: ImportOperationActionPayload = {},
|
|
): Promise<ImportCustomsFinalization> => {
|
|
const response = await client.post<ImportCustomsFinalization>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.CUSTOMS_NOTIFY_DUTIES_TAXES(bookingId),
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
markDutiesTaxesPaid: async (
|
|
bookingId: string,
|
|
payload: ImportOperationActionPayload = {},
|
|
): Promise<ImportCustomsFinalization> => {
|
|
const response = await client.post<ImportCustomsFinalization>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.CUSTOMS_DUTIES_TAXES_PAID(bookingId),
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
assignRisk: async (
|
|
bookingId: string,
|
|
payload: AssignCustomsRiskPayload,
|
|
): Promise<ImportCustomsFinalization> => {
|
|
const response = await client.post<ImportCustomsFinalization>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.CUSTOMS_RISK(bookingId),
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
markReleasePermitted: async (
|
|
bookingId: string,
|
|
payload: ImportOperationActionPayload = {},
|
|
): Promise<ImportCustomsFinalization> => {
|
|
const response = await client.post<ImportCustomsFinalization>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.CUSTOMS_RELEASE_PERMITTED(bookingId),
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
listEmptyReturns: async (): Promise<EmptyContainerReturn[]> => {
|
|
const response = await client.get<EmptyContainerReturn[]>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.EMPTY_CONTAINER_RETURNS,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
createEmptyReturn: async (
|
|
payload: CreateEmptyContainerReturnPayload,
|
|
): Promise<EmptyContainerReturn> => {
|
|
const response = await client.post<EmptyContainerReturn>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.EMPTY_CONTAINER_RETURNS,
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
loadEmptyContainersOnTrain: async (
|
|
payload: LoadEmptyContainersOnTrainPayload,
|
|
): Promise<EmptyContainerReturn[]> => {
|
|
const response = await client.post<EmptyContainerReturn[]>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.EMPTY_CONTAINER_RETURNS_LOAD_ON_TRAIN,
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
updateEmptyReturnStatus: async (
|
|
id: string,
|
|
payload: UpdateEmptyContainerReturnStatusPayload,
|
|
): Promise<EmptyContainerReturn> => {
|
|
const response = await client.post<EmptyContainerReturn>(
|
|
URL_CONSTANTS.IMPORT_OPERATIONS.EMPTY_CONTAINER_RETURN_STATUS(id),
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
/** Equipment interchange receipt — the doc handed to the customer at handover. */
|
|
downloadEquipmentInterchangeDocument: (id: string) =>
|
|
client.get<Blob>(URL_CONSTANTS.IMPORT_OPERATIONS.EMPTY_CONTAINER_RETURN_DOCUMENT(id), {
|
|
responseType: 'blob',
|
|
}),
|
|
};
|