mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
@@ -82,8 +82,8 @@ import { FreightPermissionKeyMigrationSeeder } from "./seed/freight-permission-k
|
|||||||
import { FreightNotificationPermissionsSeeder } from "./seed/freight-notification-permissions.seeder";
|
import { FreightNotificationPermissionsSeeder } from "./seed/freight-notification-permissions.seeder";
|
||||||
// import { DemoFreightDataSeeder } from "./seed/demo-freight-data.seeder";
|
// import { DemoFreightDataSeeder } from "./seed/demo-freight-data.seeder";
|
||||||
// import { GovCompaniesSeeder } from "./seed/gov-companies.seeder";
|
// import { GovCompaniesSeeder } from "./seed/gov-companies.seeder";
|
||||||
import { ApprovedFirstLastMileDemoBookingsSeeder } from "./seed/approved-first-lastmile-demo-bookings.seeder";
|
// import { ApprovedFirstLastMileDemoBookingsSeeder } from "./seed/approved-first-lastmile-demo-bookings.seeder";
|
||||||
import { PaidImportExportMileDemoSeeder } from "./seed/paid-import-export-mile-demo.seeder";
|
// import { PaidImportExportMileDemoSeeder } from "./seed/paid-import-export-mile-demo.seeder";
|
||||||
//New Trains, Wagons, Container and Cargo management modules
|
//New Trains, Wagons, Container and Cargo management modules
|
||||||
import { TrainsModule } from "./modules/trains/trains.module";
|
import { TrainsModule } from "./modules/trains/trains.module";
|
||||||
import { VerifaydaModule } from "./modules/verifayda/verifayda.module";
|
import { VerifaydaModule } from "./modules/verifayda/verifayda.module";
|
||||||
@@ -281,8 +281,8 @@ if (!process.env.APPLICATION_NAME) {
|
|||||||
// WarehouseDemoSeeder,
|
// WarehouseDemoSeeder,
|
||||||
// ExportDjiboutiInterchangeDemoSeeder,
|
// ExportDjiboutiInterchangeDemoSeeder,
|
||||||
// MarshallingDemoTrainsSeeder,
|
// MarshallingDemoTrainsSeeder,
|
||||||
ApprovedFirstLastMileDemoBookingsSeeder,
|
// ApprovedFirstLastMileDemoBookingsSeeder,
|
||||||
PaidImportExportMileDemoSeeder,
|
// PaidImportExportMileDemoSeeder,
|
||||||
LoginAudienceMiddleware,
|
LoginAudienceMiddleware,
|
||||||
// Feeds position-TYPE grants to the synchronous permission checks — without
|
// Feeds position-TYPE grants to the synchronous permission checks — without
|
||||||
// it, staff whose permissions live on their position type resolve to none.
|
// it, staff whose permissions live on their position type resolve to none.
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ interface CarriageAcceptanceWagonRow {
|
|||||||
interface CarriageAcceptanceReceivedRow {
|
interface CarriageAcceptanceReceivedRow {
|
||||||
allocatedWeightTons: string | null;
|
allocatedWeightTons: string | null;
|
||||||
containerNumbers: string | null;
|
containerNumbers: string | null;
|
||||||
|
sealNumbers?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const URGENT_PRIORITY_THRESHOLD = 1000;
|
const URGENT_PRIORITY_THRESHOLD = 1000;
|
||||||
@@ -291,15 +292,19 @@ export class BookingsService {
|
|||||||
if (pendingWagons) {
|
if (pendingWagons) {
|
||||||
// Direct truck-to-train cargo never enters the warehouse, so there is no
|
// Direct truck-to-train cargo never enters the warehouse, so there is no
|
||||||
// GRN'd inventory to build the sheet from. Choosing direct handover is
|
// GRN'd inventory to build the sheet from. Choosing direct handover is
|
||||||
// itself the acceptance, so the sheet issues off the booking's own
|
// itself the acceptance, so the sheet issues off the containers the
|
||||||
// containers (or its VGM weight when the cargo is bulk).
|
// customer declared on the booking — freight.containers only gains rows at
|
||||||
|
// allocation, by which point the wagon query above already serves.
|
||||||
const receivedLines: CarriageAcceptanceReceivedRow[] = isDirectExport
|
const receivedLines: CarriageAcceptanceReceivedRow[] = isDirectExport
|
||||||
? await this.dataSource.query(
|
? await this.dataSource.query(
|
||||||
`SELECT NULL::numeric AS "allocatedWeightTons",
|
`SELECT NULL::numeric AS "allocatedWeightTons",
|
||||||
c.container_number AS "containerNumbers"
|
unit.container_number AS "containerNumbers",
|
||||||
FROM freight.containers c
|
unit.seal_number AS "sealNumbers"
|
||||||
WHERE c.booking_id = $1 AND c.deleted_at IS NULL
|
FROM freight.booking_container_units unit
|
||||||
ORDER BY c.container_number`,
|
JOIN freight.booking_container line
|
||||||
|
ON line.id = unit.booking_container_id AND line.deleted_at IS NULL
|
||||||
|
WHERE line.booking_id = $1 AND unit.deleted_at IS NULL
|
||||||
|
ORDER BY unit.container_number`,
|
||||||
[bookingId],
|
[bookingId],
|
||||||
)
|
)
|
||||||
: booking.tradeDirection === 'EXPORT'
|
: booking.tradeDirection === 'EXPORT'
|
||||||
@@ -319,11 +324,13 @@ export class BookingsService {
|
|||||||
)
|
)
|
||||||
: [];
|
: [];
|
||||||
// Bulk direct cargo has no containers — one line carrying the booking's
|
// Bulk direct cargo has no containers — one line carrying the booking's
|
||||||
// declared weight still makes a valid sheet.
|
// declared weight still makes a valid sheet. bulkTotalWeightTons only
|
||||||
|
// holds the real tonnage for PER_ITEM break-bulk; everywhere else (PER_TON
|
||||||
|
// bulk and every container booking) the VGM column is the weight.
|
||||||
if (isDirectExport && receivedLines.length === 0) {
|
if (isDirectExport && receivedLines.length === 0) {
|
||||||
|
const totalWeight = booking.bulkTotalWeightTons ?? booking.cargoTotalWeightVgm;
|
||||||
receivedLines.push({
|
receivedLines.push({
|
||||||
allocatedWeightTons:
|
allocatedWeightTons: totalWeight == null ? null : String(totalWeight),
|
||||||
booking.bulkTotalWeightTons == null ? null : String(booking.bulkTotalWeightTons),
|
|
||||||
containerNumbers: null,
|
containerNumbers: null,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -347,7 +354,7 @@ export class BookingsService {
|
|||||||
marshalledAt: null,
|
marshalledAt: null,
|
||||||
arrivalAt: null,
|
arrivalAt: null,
|
||||||
containerNumbers: row.containerNumbers,
|
containerNumbers: row.containerNumbers,
|
||||||
sealNumbers: null,
|
sealNumbers: row.sealNumbers ?? null,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,6 +95,20 @@ export class BookingJourneyService {
|
|||||||
await manager
|
await manager
|
||||||
.getRepository(TrainScheduleBooking)
|
.getRepository(TrainScheduleBooking)
|
||||||
.update({ trainScheduleId: scheduleId, bookingId }, { loadingStatus: 'LOADED' });
|
.update({ trainScheduleId: scheduleId, bookingId }, { loadingStatus: 'LOADED' });
|
||||||
|
// Warehouse cargo may be loaded either from the warehouse Load-to-Train
|
||||||
|
// queue or from the schedule itself. Loading here must move its inventory
|
||||||
|
// too, otherwise the goods read as still sitting in the shed while the
|
||||||
|
// train leaves with them. No-ops for direct truck-to-train (no inventory).
|
||||||
|
// ponytail: no WarehouseLoading record on this path — those are only read
|
||||||
|
// back as per-inventory loading history, never billed. Create them here if
|
||||||
|
// that history ever has to be complete.
|
||||||
|
await manager.query(
|
||||||
|
`UPDATE freight.warehouse_inventory
|
||||||
|
SET status = 'LOADED', loaded_at = COALESCE(loaded_at, $2), updated_at = NOW()
|
||||||
|
WHERE booking_id = $1 AND deleted_at IS NULL
|
||||||
|
AND status NOT IN ('LOADED', 'DISPATCHED')`,
|
||||||
|
[bookingId, now],
|
||||||
|
);
|
||||||
// The facility handed the cargo over — raise its GRN. No-ops for yards
|
// The facility handed the cargo over — raise its GRN. No-ops for yards
|
||||||
// without a facility (import/export terminals), which keep their own flow.
|
// without a facility (import/export terminals), which keep their own flow.
|
||||||
await this.facilityHandling.recordHandling(manager, {
|
await this.facilityHandling.recordHandling(manager, {
|
||||||
|
|||||||
@@ -46,12 +46,7 @@ import PaymentsPage from "./pages/payments/PaymentsPage";
|
|||||||
import AuditLogsPage from "./pages/audit/AuditLogsPage";
|
import AuditLogsPage from "./pages/audit/AuditLogsPage";
|
||||||
//import EmployeesPage from "./pages/dashboard/user-management/EmployeesPage";
|
//import EmployeesPage from "./pages/dashboard/user-management/EmployeesPage";
|
||||||
import { RequirePermission } from "./components/auth/RequirePermission";
|
import { RequirePermission } from "./components/auth/RequirePermission";
|
||||||
import {
|
import { FREIGHT_PERMS } from "./lib/permissions";
|
||||||
FREIGHT_PERMS,
|
|
||||||
isDjiboutiGl,
|
|
||||||
isEthiopianGl,
|
|
||||||
isSuperAdmin,
|
|
||||||
} from "./lib/permissions";
|
|
||||||
import { NO_ACCESS_PATH, resolveLandingPath } from "./lib/landing";
|
import { NO_ACCESS_PATH, resolveLandingPath } from "./lib/landing";
|
||||||
import NoAccessPage from "./pages/NoAccessPage";
|
import NoAccessPage from "./pages/NoAccessPage";
|
||||||
import FileUploadSettingsPage from "./pages/documents/FileUploadSettingsPage";
|
import FileUploadSettingsPage from "./pages/documents/FileUploadSettingsPage";
|
||||||
@@ -92,7 +87,6 @@ import TrainDetailPage from "./pages/trains/TrainDetailPage";
|
|||||||
import TrainBuilderDetailPage from "./pages/trainBuilder/TrainBuilderDetailPage";
|
import TrainBuilderDetailPage from "./pages/trainBuilder/TrainBuilderDetailPage";
|
||||||
import TrainBuilderListPage from "./pages/trainBuilder/TrainBuilderListPage";
|
import TrainBuilderListPage from "./pages/trainBuilder/TrainBuilderListPage";
|
||||||
import ArrivalQueuePage from "./pages/warehouses/ArrivalQueuePage";
|
import ArrivalQueuePage from "./pages/warehouses/ArrivalQueuePage";
|
||||||
import EDRLastMileReturnsPage from "./pages/warehouses/EDRLastMileReturnsPage";
|
|
||||||
import ContainerReturnsPage from "./pages/warehouses/ContainerReturnsPage";
|
import ContainerReturnsPage from "./pages/warehouses/ContainerReturnsPage";
|
||||||
import DispatchQueuePage from "./pages/warehouses/DispatchQueuePage";
|
import DispatchQueuePage from "./pages/warehouses/DispatchQueuePage";
|
||||||
import ExportDjiboutiUnloadingQueuePage from "./pages/warehouses/ExportDjiboutiUnloadingQueuePage";
|
import ExportDjiboutiUnloadingQueuePage from "./pages/warehouses/ExportDjiboutiUnloadingQueuePage";
|
||||||
@@ -119,11 +113,8 @@ import SupportInboxPage from "./pages/support/SupportInboxPage";
|
|||||||
import {
|
import {
|
||||||
APP_TITLE,
|
APP_TITLE,
|
||||||
buildSidebarSections,
|
buildSidebarSections,
|
||||||
DJ_CLEARANCE_HREF,
|
|
||||||
ET_CLEARANCE_HREF,
|
|
||||||
filterSidebarByPermission,
|
filterSidebarByPermission,
|
||||||
findActiveSidebarLabel,
|
findActiveSidebarLabel,
|
||||||
GL_WORKFLOW_PATH_PATTERNS,
|
|
||||||
} from "@/components/layout/sidebar-sections";
|
} from "@/components/layout/sidebar-sections";
|
||||||
|
|
||||||
const DashboardShell = () => {
|
const DashboardShell = () => {
|
||||||
@@ -139,18 +130,6 @@ const DashboardShell = () => {
|
|||||||
);
|
);
|
||||||
const displayName = user?.name?.en || user?.username || user?.email || "User";
|
const displayName = user?.name?.en || user?.username || user?.email || "User";
|
||||||
|
|
||||||
// GL positions are locked to their single clearance page: if they navigate
|
|
||||||
// (or deep-link) anywhere else, send them back to their clearance hub.
|
|
||||||
// Super admin is exempt. Allow the clearance path + its detail sub-routes.
|
|
||||||
const superAdmin = isSuperAdmin(user);
|
|
||||||
const glClearanceHome = !superAdmin
|
|
||||||
? isEthiopianGl(user)
|
|
||||||
? ET_CLEARANCE_HREF
|
|
||||||
: isDjiboutiGl(user)
|
|
||||||
? DJ_CLEARANCE_HREF
|
|
||||||
: null
|
|
||||||
: null;
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const activeLabel = findActiveSidebarLabel(
|
const activeLabel = findActiveSidebarLabel(
|
||||||
location.pathname,
|
location.pathname,
|
||||||
@@ -159,20 +138,9 @@ const DashboardShell = () => {
|
|||||||
document.title = activeLabel ? `${activeLabel} | ${APP_TITLE}` : APP_TITLE;
|
document.title = activeLabel ? `${activeLabel} | ${APP_TITLE}` : APP_TITLE;
|
||||||
}, [location.pathname, sidebarSections]);
|
}, [location.pathname, sidebarSections]);
|
||||||
|
|
||||||
if (
|
|
||||||
glClearanceHome &&
|
|
||||||
!location.pathname.startsWith(glClearanceHome) &&
|
|
||||||
!GL_WORKFLOW_PATH_PATTERNS.some((re) => re.test(location.pathname))
|
|
||||||
) {
|
|
||||||
return <Navigate to={glClearanceHome} replace />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FreightDashboardLayout
|
<FreightDashboardLayout
|
||||||
sidebarSections={sidebarSections}
|
sidebarSections={sidebarSections}
|
||||||
// GL Ethiopia / GL Djibouti are locked to a single clearance page — no
|
|
||||||
// sidebar (or mobile burger) at all; the page renders full width.
|
|
||||||
hideSidebar={Boolean(glClearanceHome)}
|
|
||||||
activeHref={location.pathname}
|
activeHref={location.pathname}
|
||||||
onNavigate={navigate}
|
onNavigate={navigate}
|
||||||
enableThemeToggle
|
enableThemeToggle
|
||||||
@@ -506,7 +474,6 @@ const App = () => {
|
|||||||
<Route path="intercity" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><IntercityPage /></RequirePermission>} />
|
<Route path="intercity" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><IntercityPage /></RequirePermission>} />
|
||||||
<Route path="trucks-on-site" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><TrucksOnSitePage /></RequirePermission>} />
|
<Route path="trucks-on-site" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><TrucksOnSitePage /></RequirePermission>} />
|
||||||
<Route path="import-trucks" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><ImportTrucksPage /></RequirePermission>} />
|
<Route path="import-trucks" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><ImportTrucksPage /></RequirePermission>} />
|
||||||
<Route path="edr-last-mile-returns" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><EDRLastMileReturnsPage /></RequirePermission>} />
|
|
||||||
<Route path="container-returns" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><ContainerReturnsPage /></RequirePermission>} />
|
<Route path="container-returns" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><ContainerReturnsPage /></RequirePermission>} />
|
||||||
<Route path="loaded-inventory" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><LoadedInventoryPage /></RequirePermission>} />
|
<Route path="loaded-inventory" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><LoadedInventoryPage /></RequirePermission>} />
|
||||||
<Route path="dispatch-queue" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><DispatchQueuePage /></RequirePermission>} />
|
<Route path="dispatch-queue" element={<RequirePermission permission={FREIGHT_PERMS.warehouseInventory.view}><DispatchQueuePage /></RequirePermission>} />
|
||||||
|
|||||||
@@ -344,12 +344,6 @@ export const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[]
|
|||||||
icon: <Truck />,
|
icon: <Truck />,
|
||||||
permission: FREIGHT_PERMS.warehouseInventory.view,
|
permission: FREIGHT_PERMS.warehouseInventory.view,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: "EDR Last Mile Returns",
|
|
||||||
href: "/dashboard/edr-last-mile-returns",
|
|
||||||
icon: <Container />,
|
|
||||||
permission: FREIGHT_PERMS.warehouseInventory.view,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Container Returns",
|
label: "Container Returns",
|
||||||
href: "/dashboard/container-returns",
|
href: "/dashboard/container-returns",
|
||||||
|
|||||||
@@ -1,406 +0,0 @@
|
|||||||
import { Fragment, useMemo, useState } from "react";
|
|
||||||
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
||||||
import {
|
|
||||||
ActionIcon,
|
|
||||||
Alert,
|
|
||||||
Badge,
|
|
||||||
Button,
|
|
||||||
Group,
|
|
||||||
Loader,
|
|
||||||
Modal,
|
|
||||||
Stack,
|
|
||||||
Table,
|
|
||||||
Text,
|
|
||||||
TextInput,
|
|
||||||
Textarea,
|
|
||||||
Select,
|
|
||||||
Checkbox,
|
|
||||||
} from "@mantine/core";
|
|
||||||
import { ChevronDown, ChevronRight } from "lucide-react";
|
|
||||||
|
|
||||||
import { PageContainer, PageHeader } from "@/components/page";
|
|
||||||
import RuleEngineListFooter from "@/components/ruleEngine/RuleEngineListFooter";
|
|
||||||
import { useListControls } from "@/hooks/useListControls";
|
|
||||||
import { useToast } from "@/hooks/use-toast";
|
|
||||||
import { api } from "@/services/api";
|
|
||||||
import { warehouseService } from "@/services/warehouse.service";
|
|
||||||
import { importOperationsService } from "@/services/importOperations.service";
|
|
||||||
|
|
||||||
interface ReturnContainer {
|
|
||||||
containerNumber: string;
|
|
||||||
size: string | null;
|
|
||||||
type: string | null;
|
|
||||||
selected: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface TruckReturn {
|
|
||||||
key: string;
|
|
||||||
plate: string;
|
|
||||||
companyName: string | null;
|
|
||||||
bookingRef: string;
|
|
||||||
bookingId: string;
|
|
||||||
customerId: string | null;
|
|
||||||
containers: ReturnContainer[];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export default function EDRLastMileReturnsPage() {
|
|
||||||
const { toast } = useToast();
|
|
||||||
const qc = useQueryClient();
|
|
||||||
const [expanded, setExpanded] = useState<string | null>(null);
|
|
||||||
const [returnModalOpen, setReturnModalOpen] = useState(false);
|
|
||||||
const [activeKey, setActiveKey] = useState<string | null>(null);
|
|
||||||
|
|
||||||
const { data: unloadedQueue = [], isLoading: queueLoading } = useQuery({
|
|
||||||
queryKey: ["import-unloaded-queue"],
|
|
||||||
queryFn: async () => {
|
|
||||||
const response = await api.warehouses.importUnloadedQueue.call();
|
|
||||||
return response ?? [];
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const bookingIds = unloadedQueue.map((item) => item.bookingId).filter(Boolean) as string[];
|
|
||||||
const truckReturnsQuery = useQuery({
|
|
||||||
queryKey: ["edr-last-mile-returns", bookingIds],
|
|
||||||
queryFn: async () => {
|
|
||||||
const grouped = new Map<string, TruckReturn>();
|
|
||||||
|
|
||||||
for (const item of unloadedQueue) {
|
|
||||||
if (!item.bookingId) continue;
|
|
||||||
|
|
||||||
const edrTrucks = await warehouseService.getLastMileTrucks(item.bookingId).catch(() => []);
|
|
||||||
for (const truck of edrTrucks) {
|
|
||||||
const inventory = await api.warehouses.listInventory.call({ filter: { bookingId: item.bookingId } }).catch(() => []);
|
|
||||||
|
|
||||||
const returnContainers = inventory
|
|
||||||
.filter((inv: any) => inv.isReturn)
|
|
||||||
.map((inv: any) => ({
|
|
||||||
containerNumber: inv.containerNumber || "—",
|
|
||||||
size: inv.containerSize || null,
|
|
||||||
type: inv.containerType || null,
|
|
||||||
selected: false,
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (returnContainers.length > 0) {
|
|
||||||
const key = `${item.bookingId}-${truck.vehicleId}`;
|
|
||||||
grouped.set(key, {
|
|
||||||
key,
|
|
||||||
plate: [truck.truckPlateNumber, truck.trailerPlateNumber].filter(Boolean).join(" + ") || "—",
|
|
||||||
companyName: item.customerName ?? null,
|
|
||||||
bookingRef: item.bookingReference ?? item.bookingId,
|
|
||||||
bookingId: item.bookingId,
|
|
||||||
customerId: item.customerId || null,
|
|
||||||
containers: returnContainers,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Array.from(grouped.values());
|
|
||||||
},
|
|
||||||
enabled: bookingIds.length > 0 && !queueLoading,
|
|
||||||
});
|
|
||||||
|
|
||||||
const trucksWithReturns = useMemo(() => truckReturnsQuery.data ?? [], [truckReturnsQuery.data]);
|
|
||||||
const controls = useListControls(trucksWithReturns, {
|
|
||||||
searchKeys: ["plate", "companyName", "bookingRef"],
|
|
||||||
});
|
|
||||||
|
|
||||||
const createReturnsMutation = useMutation({
|
|
||||||
mutationFn: async (payload: { trucks: Array<{ bookingId: string; customerId: string | null; containers: Array<{ containerNumber: string; returnDate: string; facility: string; yard?: string; zone?: string; condition?: string; handoverNote?: string }> }> }) => {
|
|
||||||
const results = [];
|
|
||||||
for (const truck of payload.trucks) {
|
|
||||||
for (const container of truck.containers) {
|
|
||||||
const result = await importOperationsService.createEmptyReturn({
|
|
||||||
containerNumber: container.containerNumber,
|
|
||||||
returnDate: new Date(container.returnDate).toISOString(),
|
|
||||||
bookingId: truck.bookingId,
|
|
||||||
customerId: truck.customerId ?? undefined,
|
|
||||||
facility: container.facility,
|
|
||||||
yard: container.yard,
|
|
||||||
zone: container.zone,
|
|
||||||
condition: container.condition,
|
|
||||||
handoverNote: container.handoverNote,
|
|
||||||
});
|
|
||||||
results.push(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
},
|
|
||||||
onSuccess: () => {
|
|
||||||
toast({ title: "Empty container returns recorded" });
|
|
||||||
qc.invalidateQueries({ queryKey: ["edr-last-mile-returns", bookingIds] });
|
|
||||||
setReturnModalOpen(false);
|
|
||||||
setActiveKey(null);
|
|
||||||
},
|
|
||||||
onError: (error: any) => {
|
|
||||||
toast({
|
|
||||||
variant: "destructive",
|
|
||||||
title: "Failed to record returns",
|
|
||||||
description: error?.response?.data?.message || error?.message,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const activeTruck = activeKey ? trucksWithReturns.find(t => t.key === activeKey) ?? null : null;
|
|
||||||
|
|
||||||
if (queueLoading || truckReturnsQuery.isLoading) {
|
|
||||||
return (
|
|
||||||
<PageContainer>
|
|
||||||
<Group justify="center" py="lg">
|
|
||||||
<Loader size="sm" />
|
|
||||||
</Group>
|
|
||||||
</PageContainer>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<PageContainer>
|
|
||||||
<PageHeader
|
|
||||||
title="EDR Last Mile Returns"
|
|
||||||
subtitle="Empty containers returned by EDR-haulage trucks — single or bulk processing"
|
|
||||||
/>
|
|
||||||
|
|
||||||
{trucksWithReturns.length === 0 ? (
|
|
||||||
<Alert color="gray">No EDR trucks with return containers found.</Alert>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<Table.ScrollContainer minWidth={1000}>
|
|
||||||
<Table highlightOnHover verticalSpacing="xs">
|
|
||||||
<Table.Thead>
|
|
||||||
<Table.Tr>
|
|
||||||
<Table.Th w={40} />
|
|
||||||
<Table.Th>Plate</Table.Th>
|
|
||||||
<Table.Th>Company</Table.Th>
|
|
||||||
<Table.Th>Booking Ref</Table.Th>
|
|
||||||
<Table.Th>Return Containers</Table.Th>
|
|
||||||
<Table.Th ta="right">Actions</Table.Th>
|
|
||||||
</Table.Tr>
|
|
||||||
</Table.Thead>
|
|
||||||
<Table.Tbody>
|
|
||||||
{controls.pagedRows.map((truck) => {
|
|
||||||
const isOpen = expanded === truck.key;
|
|
||||||
return (
|
|
||||||
<Fragment key={truck.key}>
|
|
||||||
<Table.Tr>
|
|
||||||
<Table.Td>
|
|
||||||
<ActionIcon
|
|
||||||
variant="subtle"
|
|
||||||
color="gray"
|
|
||||||
onClick={() => setExpanded(isOpen ? null : truck.key)}
|
|
||||||
>
|
|
||||||
{isOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}
|
|
||||||
</ActionIcon>
|
|
||||||
</Table.Td>
|
|
||||||
<Table.Td>
|
|
||||||
<Text fw={600}>{truck.plate}</Text>
|
|
||||||
</Table.Td>
|
|
||||||
<Table.Td>{truck.companyName ?? "—"}</Table.Td>
|
|
||||||
<Table.Td>{truck.bookingRef}</Table.Td>
|
|
||||||
<Table.Td>
|
|
||||||
<Badge>{truck.containers.length} container{truck.containers.length !== 1 ? "s" : ""}</Badge>
|
|
||||||
</Table.Td>
|
|
||||||
<Table.Td ta="right">
|
|
||||||
<Button
|
|
||||||
size="xs"
|
|
||||||
variant="light"
|
|
||||||
onClick={() => {
|
|
||||||
setActiveKey(truck.key);
|
|
||||||
setReturnModalOpen(true);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Process Returns
|
|
||||||
</Button>
|
|
||||||
</Table.Td>
|
|
||||||
</Table.Tr>
|
|
||||||
{isOpen && (
|
|
||||||
<Table.Tr>
|
|
||||||
<Table.Td colSpan={6}>
|
|
||||||
<Table striped>
|
|
||||||
<Table.Thead>
|
|
||||||
<Table.Tr>
|
|
||||||
<Table.Th w={40}>
|
|
||||||
<Checkbox disabled />
|
|
||||||
</Table.Th>
|
|
||||||
<Table.Th>Container</Table.Th>
|
|
||||||
<Table.Th>Size</Table.Th>
|
|
||||||
<Table.Th>Type</Table.Th>
|
|
||||||
</Table.Tr>
|
|
||||||
</Table.Thead>
|
|
||||||
<Table.Tbody>
|
|
||||||
{truck.containers.map((container, idx) => (
|
|
||||||
<Table.Tr key={idx}>
|
|
||||||
<Table.Td>
|
|
||||||
<Checkbox checked={container.selected} />
|
|
||||||
</Table.Td>
|
|
||||||
<Table.Td>{container.containerNumber}</Table.Td>
|
|
||||||
<Table.Td>{container.size ?? "—"}</Table.Td>
|
|
||||||
<Table.Td>{container.type ?? "—"}</Table.Td>
|
|
||||||
</Table.Tr>
|
|
||||||
))}
|
|
||||||
</Table.Tbody>
|
|
||||||
</Table>
|
|
||||||
</Table.Td>
|
|
||||||
</Table.Tr>
|
|
||||||
)}
|
|
||||||
</Fragment>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</Table.Tbody>
|
|
||||||
</Table>
|
|
||||||
</Table.ScrollContainer>
|
|
||||||
<RuleEngineListFooter
|
|
||||||
pagination={controls.pagination}
|
|
||||||
pageCount={controls.pageCount}
|
|
||||||
totalCount={controls.totalCount}
|
|
||||||
itemLabel="trucks"
|
|
||||||
onPaginationChange={controls.setPagination}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<EmptyContainerReturnModal
|
|
||||||
opened={returnModalOpen}
|
|
||||||
onClose={() => setReturnModalOpen(false)}
|
|
||||||
truck={activeTruck}
|
|
||||||
onSubmit={(payload) => createReturnsMutation.mutate(payload)}
|
|
||||||
loading={createReturnsMutation.isPending}
|
|
||||||
/>
|
|
||||||
</PageContainer>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EmptyContainerReturnModalProps {
|
|
||||||
opened: boolean;
|
|
||||||
onClose: () => void;
|
|
||||||
truck: TruckReturn | null;
|
|
||||||
onSubmit: (payload: any) => void;
|
|
||||||
loading: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
function EmptyContainerReturnModal({ opened, onClose, truck, onSubmit, loading }: EmptyContainerReturnModalProps) {
|
|
||||||
const [selectedContainers, setSelectedContainers] = useState<string[]>([]);
|
|
||||||
const [returnDate, setReturnDate] = useState<string>(new Date().toISOString().split("T")[0]);
|
|
||||||
const [warehouse, setWarehouse] = useState<string | null>(null);
|
|
||||||
const [condition, setCondition] = useState<string>("");
|
|
||||||
const [handoverNote, setHandoverNote] = useState<string>("");
|
|
||||||
|
|
||||||
const { data: warehousesResponse } = useQuery({
|
|
||||||
queryKey: ["warehouses-list"],
|
|
||||||
queryFn: async () => {
|
|
||||||
return await warehouseService.list({});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const warehouses = (warehousesResponse as any)?.data ?? warehousesResponse ?? [];
|
|
||||||
const warehouseOptions = Array.isArray(warehouses) ? warehouses.map((wh: any) => ({
|
|
||||||
value: wh.id,
|
|
||||||
label: `${wh.name} ${wh.code ? `(${wh.code})` : ""}`,
|
|
||||||
})) : [];
|
|
||||||
|
|
||||||
const selectedWarehouse = warehouse && Array.isArray(warehouses) ? warehouses.find((wh: any) => wh.id === warehouse) : null;
|
|
||||||
|
|
||||||
const handleSubmit = () => {
|
|
||||||
if (!truck || !selectedContainers.length || !warehouse) return;
|
|
||||||
|
|
||||||
const containers = truck.containers
|
|
||||||
.filter((c) => selectedContainers.includes(c.containerNumber))
|
|
||||||
.map((c) => ({
|
|
||||||
containerNumber: c.containerNumber,
|
|
||||||
returnDate,
|
|
||||||
facility: selectedWarehouse?.name || warehouse,
|
|
||||||
yard: selectedWarehouse?.code || undefined,
|
|
||||||
zone: undefined,
|
|
||||||
condition: condition || undefined,
|
|
||||||
handoverNote: handoverNote || undefined,
|
|
||||||
}));
|
|
||||||
|
|
||||||
onSubmit({
|
|
||||||
trucks: [{
|
|
||||||
bookingId: truck.bookingId,
|
|
||||||
customerId: truck.customerId,
|
|
||||||
containers,
|
|
||||||
}],
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Modal opened={opened} onClose={onClose} title="Process Empty Container Returns" size="lg">
|
|
||||||
{truck && (
|
|
||||||
<Stack gap="md">
|
|
||||||
<Group>
|
|
||||||
<Text fw={600}>{truck.plate}</Text>
|
|
||||||
<Text size="sm" c="dimmed">{truck.bookingRef}</Text>
|
|
||||||
</Group>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<Text size="sm" fw={600} mb="xs">Select containers to return:</Text>
|
|
||||||
<Stack gap="xs">
|
|
||||||
{truck.containers.map((container) => (
|
|
||||||
<Checkbox
|
|
||||||
key={container.containerNumber}
|
|
||||||
label={`${container.containerNumber} (${container.size || "bulk"})`}
|
|
||||||
checked={selectedContainers.includes(container.containerNumber)}
|
|
||||||
onChange={(e) => {
|
|
||||||
if (e.currentTarget.checked) {
|
|
||||||
setSelectedContainers([...selectedContainers, container.containerNumber]);
|
|
||||||
} else {
|
|
||||||
setSelectedContainers(selectedContainers.filter(c => c !== container.containerNumber));
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</Stack>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Select
|
|
||||||
label="Return Warehouse"
|
|
||||||
placeholder="Select warehouse for container return"
|
|
||||||
value={warehouse}
|
|
||||||
onChange={setWarehouse}
|
|
||||||
data={warehouseOptions}
|
|
||||||
required
|
|
||||||
searchable
|
|
||||||
/>
|
|
||||||
|
|
||||||
<TextInput
|
|
||||||
label="Return Date"
|
|
||||||
type="date"
|
|
||||||
value={returnDate}
|
|
||||||
onChange={(e) => setReturnDate(e.currentTarget.value)}
|
|
||||||
required
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Textarea
|
|
||||||
label="Condition"
|
|
||||||
placeholder="Damage, residue, or cleanliness notes"
|
|
||||||
value={condition}
|
|
||||||
onChange={(e) => setCondition(e.currentTarget.value)}
|
|
||||||
rows={3}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Textarea
|
|
||||||
label="Handover Note"
|
|
||||||
placeholder="Consignee, trucker, or authorization notes"
|
|
||||||
value={handoverNote}
|
|
||||||
onChange={(e) => setHandoverNote(e.currentTarget.value)}
|
|
||||||
rows={3}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Group justify="flex-end" gap="sm">
|
|
||||||
<Button variant="default" onClick={onClose} disabled={loading}>
|
|
||||||
Cancel
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
onClick={handleSubmit}
|
|
||||||
disabled={!selectedContainers.length || !warehouse}
|
|
||||||
loading={loading}
|
|
||||||
>
|
|
||||||
{selectedContainers.length > 1 ? "Bulk" : "Single"} Return ({selectedContainers.length})
|
|
||||||
</Button>
|
|
||||||
</Group>
|
|
||||||
</Stack>
|
|
||||||
)}
|
|
||||||
</Modal>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
BIN
dump-edr_prod-202608092016.sql
Normal file
BIN
dump-edr_prod-202608092016.sql
Normal file
Binary file not shown.
BIN
dump-smart_office_prod-202608092053.sql
Normal file
BIN
dump-smart_office_prod-202608092053.sql
Normal file
Binary file not shown.
12736
final_migration/edr_dev-freight-portable.sql
Normal file
12736
final_migration/edr_dev-freight-portable.sql
Normal file
File diff suppressed because one or more lines are too long
BIN
freight-backup-20260809.dump
Normal file
BIN
freight-backup-20260809.dump
Normal file
Binary file not shown.
BIN
freight-backup-preswap-20260809.dump
Normal file
BIN
freight-backup-preswap-20260809.dump
Normal file
Binary file not shown.
301
migrations-restore-299-rows.sql
Normal file
301
migrations-restore-299-rows.sql
Normal file
@@ -0,0 +1,301 @@
|
|||||||
|
-- restore deleted pre-baseline migration rows
|
||||||
|
INSERT INTO freight.migrations (timestamp, name) VALUES
|
||||||
|
(1748427600000, 'AddServiceTypesAndCargoTypes1748427600000'),
|
||||||
|
(1748514000000, 'AddRuleEngineTablesAndCodes1748514000000'),
|
||||||
|
(1748550000000, 'CreateFreightLegacyBaseline1748550000000'),
|
||||||
|
(1748600000000, 'ItmlsFullSchemaRewrite1748600000000'),
|
||||||
|
(1748700000000, 'AddBookingsConfigForeignKeys1748700000000'),
|
||||||
|
(1748800000000, 'AddBookingsRemainingForeignKeys1748800000000'),
|
||||||
|
(1748900000000, 'MoveCustomersToFreightSchema1748900000000'),
|
||||||
|
(1749000000000, 'NormalizeWeightLimitTradeDirectionBoth1749000000000'),
|
||||||
|
(1749100000000, 'CreateFreightFilesTable1749100000000'),
|
||||||
|
(1749200000000, 'CreateCompaniesModule1749200000000'),
|
||||||
|
(1749200000000, 'BookingFlowRefactor1749200000000'),
|
||||||
|
(1749300000000, 'AddFanNumberToCompanies1749300000000'),
|
||||||
|
(1749300000000, 'AddBookingFreightType1749300000000'),
|
||||||
|
(1749400000000, 'AddTrainScheduling1749400000000'),
|
||||||
|
(1749400000000, 'AddContractSignatures1749400000000'),
|
||||||
|
(1749500000000, 'AddCompanyIdToBookings1749500000000'),
|
||||||
|
(1749600000000, 'AddBlocksRoleToApprovalStep1749600000000'),
|
||||||
|
(1749700000000, 'SeedDefaultApprovalRules1749700000000'),
|
||||||
|
(1749800000000, 'AddShippingLinesCodeUniqueIndex1749800000000'),
|
||||||
|
(1749900000000, 'CreateFileUploadSettingsTables1749900000000'),
|
||||||
|
(1750000000000, 'CreateFacilitiesTable1750000000000'),
|
||||||
|
(1750000000000, 'AddTrainExtendedColumns1750000000000'),
|
||||||
|
(1750000000000, 'AddCompanyContactColumns1750000000000'),
|
||||||
|
(1750000000001, 'AddFacilityIdToWarehouses1750000000001'),
|
||||||
|
(1750000000002, 'AddProofOfDeliveryToCargoes1750000000002'),
|
||||||
|
(1750000000003, 'AddWarehouseInspection1750000000003'),
|
||||||
|
(1750100000000, 'CreateFleetCrudTables1750100000000'),
|
||||||
|
(1750100000000, 'AddRoutesAndExtendLocomotives1750100000000'),
|
||||||
|
(1750200000000, 'SeedDefaultWagonTypes1750200000000'),
|
||||||
|
(1750200000000, 'AddPhysicalWagonToTrainSetWagons1750200000000'),
|
||||||
|
(1750300000000, 'AddRouteToTrainSchedules1750300000000'),
|
||||||
|
(1750300000000, 'AddCurrentLocationToWagons1750300000000'),
|
||||||
|
(1750400000000, 'SeedEdRWagonFleet1750400000000'),
|
||||||
|
(1750400000000, 'AddSchedulingAllocationEnhancements1750400000000'),
|
||||||
|
(1750500000000, 'AddWagonReadiness1750500000000'),
|
||||||
|
(1750600000000, 'AddGovernmentBookingFields1750600000000'),
|
||||||
|
(1750700000000, 'CreateSchedulingEvents1750700000000'),
|
||||||
|
(1750800000000, 'FixContainerWagonsPerUnit1750800000000'),
|
||||||
|
(1750900000000, 'AddContainerNumberToBookingContainer1750900000000'),
|
||||||
|
(1751000000000, 'CreateTrainSchedulingGlobalRules1751000000000'),
|
||||||
|
(1751000000001, 'AddDeletedAtToTrainSchedulingGlobalRules1751000000001'),
|
||||||
|
(1752000000000, 'CreateCompanyProfiles1752000000000'),
|
||||||
|
(1752000000001, 'MoveBusinessLicenseToProfile1752000000001'),
|
||||||
|
(1770000000000, 'CreateVehiclesTable1770000000000'),
|
||||||
|
(1775000000000, 'CreateDriversTable1775000000000'),
|
||||||
|
(1780639311366, 'CreatePaymentTable1780639311366'),
|
||||||
|
(1780639978834, 'AlterClientActionToJsonb1780639978834'),
|
||||||
|
(1780644945086, 'UpdatePaymentTimestamp1780644945086'),
|
||||||
|
(1781000000000, 'AddLocomotiveReadiness1781000000000'),
|
||||||
|
(1781000000001, 'CreateTrainCheckpointEvents1781000000001'),
|
||||||
|
(1781000000002, 'AddBatchBookingFields1781000000002'),
|
||||||
|
(1781000000003, 'AddSelectedForBatchStatus1781000000003'),
|
||||||
|
(1781000000004, 'AddDomesticWeightLimitTradeDirection1781000000004'),
|
||||||
|
(1781000000005, 'CreateTrainCompositionRemovalLog1781000000005'),
|
||||||
|
(1782000000000, 'WagonLocomotiveYardLink1782000000000'),
|
||||||
|
(1782000000001, 'AddPaymentWebhookEventAndRefund1782000000001'),
|
||||||
|
(1782000000002, 'ExtendPaymentMethodEnum1782000000002'),
|
||||||
|
(1783000000000, 'ReplacePriorityRulesWithPriorityConfigs1783000000000'),
|
||||||
|
(1784000000000, 'CreateSavedSignatures1784000000000'),
|
||||||
|
(1784000000001, 'SeedWagonsWithYardAssignment1784000000001'),
|
||||||
|
(1784100000000, 'AddBookingRouteDayIndex1784100000000'),
|
||||||
|
(1790000000000, 'CreateWarehouseModule1790000000000'),
|
||||||
|
(1790000000001, 'WarehouseBatch21790000000001'),
|
||||||
|
(1790000000002, 'WarehouseBatch31790000000002'),
|
||||||
|
(1791000000000, 'AddWarehouseAllocationAndFeeRules1791000000000'),
|
||||||
|
(1791000000000, 'AddActiveModeAndOnboardingToExternalProfiles1791000000000'),
|
||||||
|
(1791000000001, 'AddWarehouseFeeInvoices1791000000001'),
|
||||||
|
(1791000000001, 'AddCompanyProfileIdToBookings1791000000001'),
|
||||||
|
(1791000000002, 'AddNationalityToCompanies1791000000002'),
|
||||||
|
(1791000000002, 'AddImportPickupDeliveryColumns1791000000002'),
|
||||||
|
(1791000000003, 'AddInventoryUnloadedAt1791000000003'),
|
||||||
|
(1791000000003, 'AddETradeFieldsToCompanies1791000000003'),
|
||||||
|
(1791000000003, 'AddBusinessLicenseFilesToCompanyProfiles1791000000003'),
|
||||||
|
(1791000000004, 'AddFacilityIdToWarehousesFix1791000000004'),
|
||||||
|
(1791000000005, 'AddWarehouseInventoryInspectionStatusFix1791000000005'),
|
||||||
|
(1791999999999, 'CreateDropdownSettings1791999999999'),
|
||||||
|
(1792000000000, 'AddUnitOfMeasureToCargoTypes1792000000000'),
|
||||||
|
(1792000000001, 'AddBookingTypeAndContractFields1792000000001'),
|
||||||
|
(1792000000002, 'CreateBookingOrders1792000000002'),
|
||||||
|
(1792000000003, 'SeedGeneralContractPeriod1792000000003'),
|
||||||
|
(1792000000004, 'SeedContractValidityPeriods1792000000004'),
|
||||||
|
(1800000000001, 'AddVehicleDriverAssignment1800000000001'),
|
||||||
|
(1810000000000, 'CreateFirstMile1810000000000'),
|
||||||
|
(1810000000001, 'CreateLastMile1810000000001'),
|
||||||
|
(1810000000002, 'MakeCompanyProfileReferenceNullable1810000000002'),
|
||||||
|
(1810000000002, 'CreateLastMileContainerAllocations1810000000002'),
|
||||||
|
(1810000000002, 'AddVehicleCodeAndPlates1810000000002'),
|
||||||
|
(1810000000003, 'CreateOtpVerifications1810000000003'),
|
||||||
|
(1810000000004, 'AddPostPaymentCompletedColumn1810000000004'),
|
||||||
|
(1820000000000, 'DropAllowConsolidation1820000000000'),
|
||||||
|
(1820000000001, 'CreateContractRouteLines1820000000001'),
|
||||||
|
(1820000000002, 'CreateBookingDocumentReview1820000000002'),
|
||||||
|
(1820000000003, 'AddPriceAdjustment1820000000003'),
|
||||||
|
(1820000000004, 'FoldSurchargeTypesIntoRates1820000000004'),
|
||||||
|
(1820000000005, 'AddContractValidityWindow1820000000005'),
|
||||||
|
(1820000000006, 'AddCustomsAgentAndMileCoordinates1820000000006'),
|
||||||
|
(1820000000010, 'AddGeneralContractOrderFields1820000000010'),
|
||||||
|
(1820000000011, 'DropEmailPhoneFromExternalProfiles1820000000011'),
|
||||||
|
(1820000000011, 'AddTrainSetLocomotives1820000000011'),
|
||||||
|
(1820000000012, 'AddEstimatedShipmentDate1820000000012'),
|
||||||
|
(1821000000000, 'CreateInterchangeDocuments1821000000000'),
|
||||||
|
(1821000000001, 'EnsureWarehouseInventoryInspectionStatus1821000000001'),
|
||||||
|
(1821000000002, 'CreateInvoices1821000000002'),
|
||||||
|
(1821000000002, 'AddDistanceColumnsToVehicles1821000000002'),
|
||||||
|
(1821000000003, 'AddCompanyKindAndGovBookingLinks1821000000003'),
|
||||||
|
(1821000000004, 'MakePaymentsTypeGeneric1821000000004'),
|
||||||
|
(1822000000000, 'CreateImportDjiboutiOperations1822000000000'),
|
||||||
|
(1822000000000, 'CreateContracts1822000000000'),
|
||||||
|
(1823000000000, 'CreateImportOperationsTables1823000000000'),
|
||||||
|
(1823000000000, 'BackfillContractsFromBookings1823000000000'),
|
||||||
|
(1824000000000, 'DropLegacyContractTables1824000000000'),
|
||||||
|
(1825000000000, 'CreateBookingContainerAllocations1825000000000'),
|
||||||
|
(1825000000000, 'AddGlOperations1825000000000'),
|
||||||
|
(1826000000000, 'AddCargoScopeQuantityCap1826000000000'),
|
||||||
|
(1827000000000, 'CreateBookingRequests1827000000000'),
|
||||||
|
(1828000000000, 'ExtendInvoicesForPartialPayment1828000000000'),
|
||||||
|
(1828000000000, 'AddGrnNumberToWarehouseInventory1828000000000'),
|
||||||
|
(1828000000000, 'AddBulkHazmatReeferQuantity1828000000000'),
|
||||||
|
(1829000000000, 'PhasedClearanceCycleMeta1829000000000'),
|
||||||
|
(1829000000000, 'CentralizeWarehouseInvoices1829000000000'),
|
||||||
|
(1829000000001, 'SeedRoVesselMinDays1829000000001'),
|
||||||
|
(1829000000002, 'BookingClearanceMeta1829000000002'),
|
||||||
|
(1830000000000, 'DropCargoTypeShowFreeTextBox1830000000000'),
|
||||||
|
(1830000000000, 'CreateFirstMileContainerAllocations1830000000000'),
|
||||||
|
(1830000000000, 'AddExpiredInvoiceStatus1830000000000'),
|
||||||
|
(1830000000001, 'RouteStatusAndSegmentKm1830000000001'),
|
||||||
|
(1830000000002, 'PreClearanceFinalizedAt1830000000002'),
|
||||||
|
(1831000000000, 'AddWarehouseFeeRuleTiers1831000000000'),
|
||||||
|
(1832000000000, 'AddCustomerTruckAssignmentToBookings1832000000000'),
|
||||||
|
(1840000000000, 'CreateFuelTables1840000000000'),
|
||||||
|
(1850000000000, 'CreateMaintenanceTables1850000000000'),
|
||||||
|
(1860000000000, 'AddPaidToFirstAndLastMile1860000000000'),
|
||||||
|
(1861000000000, 'AddBookingWindowGlobalRules1861000000000'),
|
||||||
|
(1861000000001, 'ReleaseStuckAssignedLocomotives1861000000001'),
|
||||||
|
(1862000000000, 'AddScheduleWindowPhases1862000000000'),
|
||||||
|
(1863000000000, 'CreateBookingBatchOffers1863000000000'),
|
||||||
|
(1870000000000, 'RepairSynchronizeDrift1870000000000'),
|
||||||
|
(1870000000000, 'AddLocationToVehicles1870000000000'),
|
||||||
|
(1880000000000, 'AddVehicleStatuses1880000000000'),
|
||||||
|
(1890000000000, 'SeparateVehicleAvailability1890000000000'),
|
||||||
|
(1890000000001, 'AddVehicleCodeAndPlates1890000000001'),
|
||||||
|
(1890000000002, 'AddFaydaVerificationSessions1890000000002'),
|
||||||
|
(1890000000003, 'AddDriverFaydaVerification1890000000003'),
|
||||||
|
(1890000000004, 'AddLastMileVehicleAssignments1890000000004'),
|
||||||
|
(1890000000005, 'AddDriverGender1890000000005'),
|
||||||
|
(1890000000006, 'AddDriverFaydaSubUnique1890000000006'),
|
||||||
|
(1890000000007, 'DriverUniquePartialSoftDelete1890000000007'),
|
||||||
|
(1890000000008, 'AddFleetEvents1890000000008'),
|
||||||
|
(1890000000009, 'AddLastMileAssignmentContainerNumber1890000000009'),
|
||||||
|
(1890000000010, 'AddLastMileAssignmentDistance1890000000010'),
|
||||||
|
(1900000000000, 'SimplifyRatesAndWeightLimitRules1900000000000'),
|
||||||
|
(1900000000000, 'AddLoadingStatusToTrainScheduleBookings1900000000000'),
|
||||||
|
(1900000000000, 'AddEmailToOtpVerifications1900000000000'),
|
||||||
|
(1910000000000, 'WidenWindowDurationHoursPrecision1910000000000'),
|
||||||
|
(1920000000000, 'AddScheduleWindowRuleSnapshot1920000000000'),
|
||||||
|
(1930000000000, 'AddMaxCapacityToWeightLimitRules1930000000000'),
|
||||||
|
(1940000000000, 'AddWagonTypeFkToCargoAndContainerTypes1940000000000'),
|
||||||
|
(1940000000000, 'AddFirstMileVehicleAssignments1940000000000'),
|
||||||
|
(1950000000000, 'CreateNotifications1950000000000'),
|
||||||
|
(1950000000000, 'AddWindowCloseHour1950000000000'),
|
||||||
|
(1950000000000, 'AddVehicleCompliance1950000000000'),
|
||||||
|
(1950000000000, 'AddCustomerTruckAssignments1950000000000'),
|
||||||
|
(1960000000000, 'AddIncidents1960000000000'),
|
||||||
|
(1960000000000, 'AddContainerReceiptToBookingContainerUnits1960000000000'),
|
||||||
|
(1970000000000, 'AddMaintenanceDepth1970000000000'),
|
||||||
|
(1970000000000, 'AddCustomerTruckDeparture1970000000000'),
|
||||||
|
(1980000000000, 'YardCountryEnumAndRouteDirection1980000000000'),
|
||||||
|
(1980000000000, 'AddProcurement1980000000000'),
|
||||||
|
(1980000000000, 'AddBookingHandovers1980000000000'),
|
||||||
|
(1990000000000, 'SegmentCorridorBookings1990000000000'),
|
||||||
|
(1990000000000, 'AddVehiclePricePerKm1990000000000'),
|
||||||
|
(1990000000000, 'AddDoubleHandlingBasisAndMachinery1990000000000'),
|
||||||
|
(2000000000000, 'CreateCompanyChangeRequest2000000000000'),
|
||||||
|
(2000000000000, 'AddTruckDetentionTiming2000000000000'),
|
||||||
|
(2000000000000, 'AddGpsTracking2000000000000'),
|
||||||
|
(2000000000000, 'AddCustomsPriorityConfig2000000000000'),
|
||||||
|
(2000000000001, 'AddCompanyProfileReview2000000000001'),
|
||||||
|
(2010000000000, 'AddFeeRuleVehicleType2010000000000'),
|
||||||
|
(2010000000000, 'AddConsolidationResumeStatus2010000000000'),
|
||||||
|
(2020000000000, 'WarehouseCapacityKgToTons2020000000000'),
|
||||||
|
(2020000000000, 'RepairOtpEmailSchema2020000000000'),
|
||||||
|
(2030000000000, 'AddTrainScheduleReference2030000000000'),
|
||||||
|
(2040000000000, 'MigrateLicenseFilesToFileRecords2040000000000'),
|
||||||
|
(2040000000000, 'AddLocomotiveOverageTolerance2040000000000'),
|
||||||
|
(2050000000000, 'DropWagonTypeMaxWagonsPerTrain2050000000000'),
|
||||||
|
(2050000000000, 'AddCustomerTruckContainerLoadedAt2050000000000'),
|
||||||
|
(2060000000000, 'SeedRailWagonTypes2060000000000'),
|
||||||
|
(2060000000000, 'CreateYardDistances2060000000000'),
|
||||||
|
(2070000000000, 'MakeWagonTypeTareWeightRequired2070000000000'),
|
||||||
|
(2080000000000, 'DropWagonSpecColumns2080000000000'),
|
||||||
|
(2090000000000, 'RepairGrnNumberColumn2090000000000'),
|
||||||
|
(2090000000000, 'CreateContractTemplates2090000000000'),
|
||||||
|
(2100000000000, 'WarehouseLoadingTrainAssociation2100000000000'),
|
||||||
|
(2100000000000, 'CompanyProfileDefaultPending2100000000000'),
|
||||||
|
(2110000000000, 'RepairVehicleAvailabilityColumn2110000000000'),
|
||||||
|
(2110000000000, 'AddBookingIsSplit2110000000000'),
|
||||||
|
(2120000000000, 'AddScheduleWagonAllocationSnapshot2120000000000'),
|
||||||
|
(2120000000000, 'AddLastMileProofOfDelivery2120000000000'),
|
||||||
|
(2130000000000, 'AddHandoverSignerName2130000000000'),
|
||||||
|
(2140000000000, 'CreateAccrualAcks2140000000000'),
|
||||||
|
(2150000000000, 'TrainBuilder2150000000000'),
|
||||||
|
(2160000000000, 'MultiWagonTypePerCargoAndContainer2160000000000'),
|
||||||
|
(2170000000000, 'ScheduleWagonAdjustmentLogs2170000000000'),
|
||||||
|
(2170000000000, 'CreateWagonTransferRequests2170000000000'),
|
||||||
|
(2180000000000, 'LinkWagonMovementToTransferRequest2180000000000'),
|
||||||
|
(2190000000000, 'DropReopenDelayMinutes2190000000000'),
|
||||||
|
(2200000000000, 'TrainNumberPair2200000000000'),
|
||||||
|
(2210000000000, 'ScheduleScopedWagonPins2210000000000'),
|
||||||
|
(2220000000000, 'AddContractDocumentSnapshot2220000000000'),
|
||||||
|
(2230000000000, 'RenameWagonStatusRetiredToDetained2230000000000'),
|
||||||
|
(2240000000000, 'AddTransferRequestReason2240000000000'),
|
||||||
|
(2250000000000, 'CreatePriorityRuleChangeRequests2250000000000'),
|
||||||
|
(2260000000000, 'SeedEdrWagonFleetErNumbering2260000000000'),
|
||||||
|
(2260000000000, 'AddLastMileTruckArrivalDeparture2260000000000'),
|
||||||
|
(2260000000000, 'AddClearanceFeePayment2260000000000'),
|
||||||
|
(2270000000000, 'AddWagonTrainNumbers2270000000000'),
|
||||||
|
(2270000000000, 'AddContainerReturnQuantity2270000000000'),
|
||||||
|
(2280000000000, 'WagonNumberPartialUnique2280000000000'),
|
||||||
|
(2280000000000, 'SeedWagonRunNumbers2280000000000'),
|
||||||
|
(2290000000000, 'YardFacilities2290000000000'),
|
||||||
|
(2290000000000, 'SeedWagonYardDoraleh2290000000000'),
|
||||||
|
(2290000000000, 'DropContainerWagonsPerUnit2290000000000'),
|
||||||
|
(2300000000000, 'RepairGpsTrackingTables2300000000000'),
|
||||||
|
(2300000000000, 'CreateRateChangeRequests2300000000000'),
|
||||||
|
(2310000000000, 'CreateSupportChat2310000000000'),
|
||||||
|
(2320000000000, 'YardFacilityFreightTypes2320000000000'),
|
||||||
|
(2320000000000, 'SupportChatAttachments2320000000000'),
|
||||||
|
(2320000000000, 'AddRateYardScope2320000000000'),
|
||||||
|
(2330000000000, 'AddBookingCloseOffset2330000000000'),
|
||||||
|
(2340000000000, 'AddReverseWagonOrder2340000000000'),
|
||||||
|
(2340000000000, 'AddCargoTypeHasLashing2340000000000'),
|
||||||
|
(2350000000000, 'RefreshContractPricingArticles2350000000000'),
|
||||||
|
(2360000000000, 'RefreshContractPricingArticles2360000000000'),
|
||||||
|
(2370000000000, 'AddContainerUnitReturnFlag2370000000000'),
|
||||||
|
(2380000000000, 'AddTrainDeactivatedStatus2380000000000'),
|
||||||
|
(2390000000000, 'WidenYardCodeForSoftDeleteSuffix2390000000000'),
|
||||||
|
(2390000000000, 'SeedImportTrainNumbers2390000000000'),
|
||||||
|
(2400000000000, 'NormalizeCompanyRegions2400000000000'),
|
||||||
|
(2400000000000, 'AddCustomerTruckExitWeights2400000000000'),
|
||||||
|
(2410000000000, 'DropBookingApprovalWidenRoles2410000000000'),
|
||||||
|
(2420000000000, 'CreateContractDocumentRevisions2420000000000'),
|
||||||
|
(2430000000000, 'UniqueLocomotiveName2430000000000'),
|
||||||
|
(2430000000000, 'AddFileReviewStatus2430000000000'),
|
||||||
|
(2440000000000, 'AddHandoverEdrAssignment2440000000000'),
|
||||||
|
(2450000000000, 'DropActiveProfileTypeFromExternalProfiles2450000000000'),
|
||||||
|
(2460000000000, 'AddCacBankPaymentMethod2460000000000'),
|
||||||
|
(2470000000000, 'AddAcquisitionItemName2470000000000'),
|
||||||
|
(2480000000000, 'AddMaintenanceDueNotifiedAt2480000000000'),
|
||||||
|
(2800000000000, 'AddMaintenanceIntervals2800000000000'),
|
||||||
|
(2800000000001, 'AddSignatureToHandover2800000000001'),
|
||||||
|
(2810000000000, 'AddMaintenanceServiceItem2810000000000'),
|
||||||
|
(2820000000000, 'CustomsClearanceRouteScope2820000000000'),
|
||||||
|
(2820000000000, 'AddMileTonsQuantity2820000000000'),
|
||||||
|
(2830000000000, 'ReturnSurchargeRouteScope2830000000000'),
|
||||||
|
(2840000000000, 'AddTruckTypes2840000000000'),
|
||||||
|
(2850000000000, 'AddBookingDoubleHandling2850000000000'),
|
||||||
|
(2860000000000, 'DropClearanceFeePrepay2860000000000'),
|
||||||
|
(2860000000000, 'AddPerTruckDetentionWindow2860000000000'),
|
||||||
|
(2870000000000, 'CustomsClearancePerKind2870000000000'),
|
||||||
|
(2880000000000, 'LashingPerKind2880000000000'),
|
||||||
|
(2890000000000, 'LashingBulkOnlyPerDirection2890000000000'),
|
||||||
|
(2900000000000, 'LivestockPerItem2900000000000'),
|
||||||
|
(2910000000000, 'AddContractSignatureStamp2910000000000'),
|
||||||
|
(2920000000000, 'AddRevisionActorName2920000000000'),
|
||||||
|
(2930000000000, 'AddWagonTransferPartialFulfilment2930000000000'),
|
||||||
|
(2940000000000, 'AddFileVersionHistory2940000000000'),
|
||||||
|
(2950000000000, 'AddTransitAssigneeHandshake2950000000000'),
|
||||||
|
(2960000000000, 'AddContractHazardDeclaration2960000000000'),
|
||||||
|
(2970000000000, 'AddDoCollectionDates2970000000000'),
|
||||||
|
(2980000000000, 'AddBookingRequestCurrency2980000000000'),
|
||||||
|
(2990000000000, 'IndodeYardsAndCargoRouting2990000000000'),
|
||||||
|
(3000000000000, 'AddContractSuspension3000000000000'),
|
||||||
|
(3010000000000, 'AddBookingTransitAssignee3010000000000'),
|
||||||
|
(3020000000000, 'AddContractSubmittedAt3020000000000'),
|
||||||
|
(3030000000000, 'AddGlExchangeDocumentFields3030000000000'),
|
||||||
|
(3040000000000, 'AddTransitAgents3040000000000'),
|
||||||
|
(3050000000000, 'AddCbeBillPaymentMethod3050000000000'),
|
||||||
|
(3050000000000, 'MergeDuplicateSebetaYards3050000000000'),
|
||||||
|
(3060000000000, 'AddExportPaymentWindow3060000000000'),
|
||||||
|
(3070000000000, 'AddBulkTotalWeightTons3070000000000'),
|
||||||
|
(3080000000000, 'BackfillDireDawaMilestone3080000000000'),
|
||||||
|
(3090000000000, 'AddSavedSignatureStamp3090000000000'),
|
||||||
|
(3100000000000, 'PromoteDraftSchedulesToScheduled3100000000000'),
|
||||||
|
(3110000000000, 'AddYardToScheduleWagonAdjustmentLogs3110000000000'),
|
||||||
|
(3120000000000, 'AddApprovedAtToCompanies3120000000000'),
|
||||||
|
(3120000000000, 'AddCargoTypeItemsPerWagonMap3120000000000'),
|
||||||
|
(3130000000000, 'CreateCompanyRevisions3130000000000'),
|
||||||
|
(3140000000000, 'SyncBulkRateUnitsToCargoUom3140000000000'),
|
||||||
|
(3150000000000, 'CreateUserTradeAccess3150000000000'),
|
||||||
|
(3150000000000, 'FixFaydaAddressShape3150000000000'),
|
||||||
|
(3160000000000, 'FixPaymentPaidAtType3160000000000'),
|
||||||
|
(3170000000000, 'YardFacilityOriginDestination3170000000000'),
|
||||||
|
(3180000000000, 'PortYardFacilityRecords3180000000000'),
|
||||||
|
(3190000000000, 'AddCargoTypeTonsPerWagonMap3190000000000'),
|
||||||
|
(3200000000000, 'AddScheduleWindowRuleCustom3200000000000'),
|
||||||
|
(3210000000000, 'EmptyContainerReturnedBy3210000000000'),
|
||||||
|
(3220000000000, 'EmptyContainerReturnStatusHistory3220000000000'),
|
||||||
|
(3230000000000, 'SplitContractTemplatesByCustoms3230000000000'),
|
||||||
|
(3240000000000, 'CreateExchangeSettings3240000000000');
|
||||||
BIN
migrations-rows-backup-20260809.dump
Normal file
BIN
migrations-rows-backup-20260809.dump
Normal file
Binary file not shown.
Reference in New Issue
Block a user