Container return and Price per KM for Vehcles

This commit is contained in:
Hagernesh
2026-07-31 09:13:13 +00:00
parent 7f87e2d8ca
commit 90fef6856b
3 changed files with 113 additions and 34 deletions

View File

@@ -141,6 +141,7 @@ export const vehiclesConfig: FleetResourceConfig = {
required: true,
description: "Pre-filled from the truck type — override only for a one-off",
},
{ name: "pricePerKm", label: "Price per KM (ETB)", type: "number", description: "Haulage rate charged per kilometre" },
{ name: "status", label: "Status", type: "select", required: true, options: VEHICLE_STATUS_OPTIONS },
{ name: "availability", label: "Availability", type: "select", required: true, options: VEHICLE_AVAILABILITY_OPTIONS },
{ name: "description", label: "Description", type: "textarea" },
@@ -157,6 +158,7 @@ export const vehiclesConfig: FleetResourceConfig = {
year: new Date().getFullYear(),
fuelType: "DIESEL",
capacity: 0,
pricePerKm: 0,
status: "ACTIVE",
availability: "FREE",
description: "",

View File

@@ -23,6 +23,7 @@ import { PageContainer, PageHeader } from "@/components/page";
import RuleEngineListFooter from "@/components/ruleEngine/RuleEngineListFooter";
import { useListControls } from "@/hooks/useListControls";
import { useToast } from "@/hooks/use-toast";
import { useWarehouseYards, useWarehouseZones } from "@/hooks/useWarehouses";
import { api } from "@/services/api";
import { warehouseService } from "@/services/warehouse.service";
import { importOperationsService } from "@/services/importOperations.service";
@@ -561,12 +562,11 @@ function StandaloneReturnModal({ opened, onClose, onSubmit, loading }: Standalon
const [returnedBy, setReturnedBy] = useState<"EDR" | "CUSTOMER" | null>(null);
const [returnDate, setReturnDate] = useState<string>(new Date().toISOString().split("T")[0]);
const [warehouse, setWarehouse] = useState<string | null>(null);
const [yard, setYard] = useState<string>("");
const [zone, setZone] = useState<string>("");
const [yardId, setYardId] = useState<string | null>(null);
const [zoneId, setZoneId] = useState<string | null>(null);
const [condition, setCondition] = useState<string>("");
const [handoverNote, setHandoverNote] = useState<string>("");
// Auto-populate yard and zone from selected warehouse
const { data: warehousesResponse } = useQuery({
queryKey: ["warehouses-list"],
queryFn: async () => {
@@ -575,17 +575,18 @@ function StandaloneReturnModal({ opened, onClose, onSubmit, loading }: Standalon
});
const warehouses = (warehousesResponse as any)?.data ?? warehousesResponse ?? [];
const selectedWarehouseData = warehouse && Array.isArray(warehouses) ? warehouses.find((wh: any) => wh.id === warehouse) : null;
const { data: yards } = useWarehouseYards(warehouse ?? undefined);
const { data: zones } = useWarehouseZones(yardId ?? undefined);
useEffect(() => {
if (selectedWarehouseData) {
setYard(selectedWarehouseData.yard || selectedWarehouseData.code || "");
setZone(selectedWarehouseData.zone || "");
} else {
setYard("");
setZone("");
}
}, [selectedWarehouseData]);
setYardId(null);
setZoneId(null);
}, [warehouse]);
useEffect(() => {
setZoneId(null);
}, [yardId]);
const warehouseOptions = Array.isArray(warehouses)
? warehouses.map((wh: any) => ({
@@ -594,10 +595,20 @@ function StandaloneReturnModal({ opened, onClose, onSubmit, loading }: Standalon
}))
: [];
const yardOptions = (yards ?? [])
.filter((y) => y.status === "ACTIVE")
.map((y) => ({ value: y.id, label: `${y.name} (${y.code})` }));
const zoneOptions = (zones ?? [])
.filter((z) => z.status === "ACTIVE")
.map((z) => ({ value: z.id, label: `${z.name} (${z.code})` }));
const handleSubmit = () => {
if (!containerNumber || !warehouse || !returnedBy) return;
const selectedWarehouse = Array.isArray(warehouses) ? warehouses.find((wh: any) => wh.id === warehouse) : null;
const selectedYard = yards?.find((y) => y.id === yardId);
const selectedZone = zones?.find((z) => z.id === zoneId);
onSubmit({
trucks: [
@@ -610,6 +621,8 @@ function StandaloneReturnModal({ opened, onClose, onSubmit, loading }: Standalon
containerNumber,
returnDate,
warehouse: selectedWarehouse?.name || warehouse,
yard: selectedYard?.name,
zone: selectedZone?.name,
condition: condition || undefined,
handoverNote: handoverNote || undefined,
},
@@ -622,8 +635,8 @@ function StandaloneReturnModal({ opened, onClose, onSubmit, loading }: Standalon
setReturnedBy(null);
setReturnDate(new Date().toISOString().split("T")[0]);
setWarehouse(null);
setYard("");
setZone("");
setYardId(null);
setZoneId(null);
setCondition("");
setHandoverNote("");
onClose();
@@ -666,20 +679,24 @@ function StandaloneReturnModal({ opened, onClose, onSubmit, loading }: Standalon
searchable
/>
<TextInput
<Select
label="Yard"
placeholder="Auto-populated from warehouse"
value={yard}
disabled
readOnly
placeholder={warehouse ? "Select yard" : "Select warehouse first"}
value={yardId}
onChange={setYardId}
data={yardOptions}
disabled={!warehouse}
searchable
/>
<TextInput
<Select
label="Zone"
placeholder="Auto-populated from warehouse"
value={zone}
disabled
readOnly
placeholder={yardId ? "Select zone" : "Select yard first"}
value={zoneId}
onChange={setZoneId}
data={zoneOptions}
disabled={!yardId}
searchable
/>
<input