mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-08 00:45:41 +00:00
149 lines
4.4 KiB
TypeScript
149 lines
4.4 KiB
TypeScript
export interface BookingRequest {
|
|
id: string;
|
|
reference: string;
|
|
customer: string;
|
|
status: (typeof BOOKING_STATUSES)[number];
|
|
scheduledDate: string;
|
|
totalAmount: number;
|
|
paymentStatus: string;
|
|
contractType: string;
|
|
serviceType: string;
|
|
tradeDirection: string;
|
|
originYard: string;
|
|
destinationYard: string;
|
|
cargoType: string;
|
|
cargoTotalWeightVgm: number;
|
|
isHazardous: boolean;
|
|
paymentCurrency: string;
|
|
priorityScore: number;
|
|
firstMilePickupAddress: string | null;
|
|
lastMileDeliveryAddress: string | null;
|
|
shippingLine: string | null;
|
|
pnrCode: string | null;
|
|
createdBy: string;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export const BOOKING_STATUSES = [
|
|
"DRAFT",
|
|
"RFQ_SUBMITTED",
|
|
"QUOTATION_SENT",
|
|
"QUOTATION_APPROVED",
|
|
"QUOTATION_REJECTED",
|
|
"PENDING_APPROVAL",
|
|
"APPROVED",
|
|
"SIGNED_CUSTOMER",
|
|
"FULLY_EXECUTED",
|
|
"PAID",
|
|
"IN_TRANSIT",
|
|
"COMPLETED",
|
|
"CANCELLED",
|
|
"PENDING_CONSOLIDATION",
|
|
"CONSOLIDATED",
|
|
] as const;
|
|
|
|
const customers = [
|
|
"Ethio Cargo Logistics",
|
|
"Djibouti Shipping PLC",
|
|
"Horn of Africa Traders",
|
|
"Addis Freight Forwarders",
|
|
"Red Sea Maritime Services",
|
|
"Dire Dawa Imports Ltd",
|
|
"Awash Agro Industry",
|
|
"Mieso Mineral Exports",
|
|
];
|
|
|
|
const yards = [
|
|
"Addis Ababa Dry Port",
|
|
"Mojo Inland Container Depot",
|
|
"Dire Dawa Freight Station",
|
|
"Djibouti Port Terminal",
|
|
"Adama Logistics Hub",
|
|
"Awash Cargo Center",
|
|
];
|
|
|
|
const serviceTypes = ["RAIL", "RAIL_AND_FORWARDING"];
|
|
const tradeDirections = ["EXPORT", "IMPORT", "DOMESTIC"];
|
|
const cargoTypes = ["Containerized", "Bulk", "Liquid", "Refrigerated", "Hazardous"];
|
|
const shippingLines = ["MSC", "CMA CGM", "Maersk", "COSCO", "Hapag-Lloyd", null];
|
|
|
|
function pick<T>(arr: T[], index: number): T {
|
|
return arr[index % arr.length];
|
|
}
|
|
|
|
function randDate(daysAgo: number): string {
|
|
const d = new Date(2026, 4, 28 - daysAgo);
|
|
return d.toISOString();
|
|
}
|
|
|
|
const now = Date.now();
|
|
|
|
const INITIAL_REQUESTS: BookingRequest[] = Array.from({ length: 25 }, (_, i) => {
|
|
const statusIndex = i % BOOKING_STATUSES.length;
|
|
const status = BOOKING_STATUSES[statusIndex];
|
|
const customer = pick(customers, i);
|
|
|
|
return {
|
|
id: String(i + 1),
|
|
reference: `EDR-BK-${String(2026001 + i).slice(-6)}`,
|
|
customer,
|
|
status,
|
|
scheduledDate: new Date(2026, 5, 1 + (i % 28)).toISOString().slice(0, 10),
|
|
totalAmount: 1500 + i * 320 + (i % 7) * 100,
|
|
paymentStatus: status === "PAID" || status === "COMPLETED" ? "PAID" : status === "CANCELLED" ? "REFUNDED" : "PENDING",
|
|
contractType: i % 5 === 0 ? "RENEWAL" : "NEW",
|
|
serviceType: pick(serviceTypes, i),
|
|
tradeDirection: pick(tradeDirections, i),
|
|
originYard: pick(yards, i),
|
|
destinationYard: pick(yards, i + 3),
|
|
cargoType: pick(cargoTypes, i),
|
|
cargoTotalWeightVgm: 10 + ((i * 7) % 90),
|
|
isHazardous: i % 7 === 0,
|
|
paymentCurrency: "USD",
|
|
priorityScore: i % 4 === 0 ? 3 : i % 3 === 0 ? 2 : 1,
|
|
firstMilePickupAddress: i % 3 === 0 ? "Bole Industrial Zone, Addis Ababa" : null,
|
|
lastMileDeliveryAddress: i % 4 === 0 ? "Port Boulevard, Djibouti City" : null,
|
|
shippingLine: pick(shippingLines, i),
|
|
pnrCode: i % 6 === 0 ? `PNR-${202600 + i}` : null,
|
|
createdBy: customer,
|
|
createdAt: randDate(30 - i),
|
|
updatedAt: randDate(2),
|
|
};
|
|
});
|
|
|
|
export function saveBookingRequestsToStorage(data: BookingRequest[]) {
|
|
if (typeof window !== "undefined" && window.localStorage) {
|
|
localStorage.setItem("edr_backoffice_booking_requests", JSON.stringify(data));
|
|
}
|
|
}
|
|
|
|
export function getBookingRequestById(id: string): BookingRequest | undefined {
|
|
const requests = getBookingRequests();
|
|
return requests.find((r) => r.id === id);
|
|
}
|
|
|
|
export function updateBookingRequestStatus(id: string, newStatus: (typeof BOOKING_STATUSES)[number]) {
|
|
const requests = getBookingRequests();
|
|
const idx = requests.findIndex((r) => r.id === id);
|
|
if (idx === -1) return;
|
|
requests[idx] = { ...requests[idx], status: newStatus, updatedAt: new Date().toISOString() };
|
|
saveBookingRequestsToStorage(requests);
|
|
}
|
|
|
|
export function getBookingRequests(): BookingRequest[] {
|
|
if (typeof window === "undefined" || !window.localStorage) {
|
|
return INITIAL_REQUESTS;
|
|
}
|
|
const data = localStorage.getItem("edr_backoffice_booking_requests");
|
|
if (!data) {
|
|
localStorage.setItem("edr_backoffice_booking_requests", JSON.stringify(INITIAL_REQUESTS));
|
|
return INITIAL_REQUESTS;
|
|
}
|
|
try {
|
|
return JSON.parse(data);
|
|
} catch {
|
|
return INITIAL_REQUESTS;
|
|
}
|
|
}
|