import { useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Button, Card, Container, Group, Loader, Modal, NumberInput, Select, Stack, Table, Text, TextInput, Title, Badge, Grid, } from "@mantine/core"; import { Plus } from "lucide-react"; import Breadcrumbs from "@/components/ui/Breadcrumbs"; import ListControls from "@/components/common/ListControls"; // Generic list footer — already shared by the fleet and train-scheduling lists // despite the ruleEngine path. import RuleEngineListFooter from "@/components/ruleEngine/RuleEngineListFooter"; import { useListControls } from "@/hooks/useListControls"; import { useToast } from "@/hooks/use-toast"; import { api } from "@/auth/http"; import { QUERY_KEYS } from "@/constants/QUERY_KEYS"; import { vehiclesService, type Vehicle as VehicleType } from "@/services/vehicles.service"; interface FuelPurchase { id: string; vehicleId: string; vehicleName?: string; purchaseDate: string; liters: number; costPerLiter: number; totalCost: number; fuelStation?: string; paymentMethod: string; odometerReading?: number; receiptNumber?: string; notes?: string; } export default function FuelPurchasePage() { const { toast } = useToast(); const qc = useQueryClient(); const [modalOpen, setModalOpen] = useState(false); const [formData, setFormData] = useState({ vehicleId: "", purchaseDate: new Date().toISOString().split("T")[0], liters: 0, costPerLiter: 0, fuelStation: "", paymentMethod: "CASH", odometerReading: undefined as number | undefined, receiptNumber: "", notes: "", }); // Fetch vehicles const { data: vehiclesData } = useQuery({ queryKey: QUERY_KEYS.VEHICLES.list(), queryFn: async () => { const res = await vehiclesService.getAll({ limit: 1000 }); return res.data || []; }, }); // Fetch fuel purchases const { data: purchasesData = [], isLoading: isLoadingPurchases } = useQuery({ queryKey: ["fuel-purchases"], queryFn: async () => { const res = await api.get("/fuel/purchases"); return res.data || []; }, }); // Record purchase mutation const recordMutation = useMutation({ mutationFn: async (data: typeof formData) => { const res = await api.post("/fuel/purchases", { ...data, liters: parseFloat(data.liters.toString()), costPerLiter: parseFloat(data.costPerLiter.toString()), }); return res.data; }, onSuccess: () => { toast({ title: "Fuel purchase recorded" }); setModalOpen(false); setFormData({ vehicleId: "", purchaseDate: new Date().toISOString().split("T")[0], liters: 0, costPerLiter: 0, fuelStation: "", paymentMethod: "CASH", odometerReading: undefined, receiptNumber: "", notes: "", }); qc.invalidateQueries({ queryKey: ["fuel-purchases"] }); }, onError: (error: any) => { toast({ title: "Error recording purchase", description: error?.response?.data?.message || "Failed to record fuel purchase", variant: "destructive", }); }, }); const vehicleOptions = vehiclesData?.map((v: VehicleType) => ({ value: v.id, label: `${v.plateNumber} - ${v.manufacturer} ${v.model}`, })) || []; const totalCost = formData.liters * formData.costPerLiter; // Aggregate stats (guarded against divide-by-zero when there are no purchases) const controls = useListControls(purchasesData as FuelPurchase[], { searchKeys: ["fuelStation", "paymentMethod"], dateKey: "purchaseDate", }); const totalLiters = (purchasesData as FuelPurchase[]).reduce( (sum, p) => sum + Number(p.liters), 0 ); const totalPurchaseCost = (purchasesData as FuelPurchase[]).reduce( (sum, p) => sum + Number(p.totalCost), 0 ); const avgPricePerLiter = totalLiters > 0 ? totalPurchaseCost / totalLiters : 0; return ( Fuel Purchases {/* Stats Cards */} Total Purchases {purchasesData.length} Total Liters {totalLiters.toFixed(2)} L Total Cost ETB {totalPurchaseCost.toLocaleString("en-US", { maximumFractionDigits: 2 })} Avg Price/L ETB {avgPricePerLiter.toFixed(2)} {/* Purchases Table */} Vehicle Date Liters Cost/L Total Station Payment {isLoadingPurchases ? ( ) : purchasesData.length === 0 ? ( No fuel purchases recorded yet. ) : null} {controls.pagedRows.map((purchase) => ( {(purchase as any).vehicle?.registrationNumber || (purchase as any).vehicle?.plateNumber || purchase.vehicleId} {new Date(purchase.purchaseDate).toLocaleDateString()} {Number(purchase.liters).toFixed(2)} ETB {Number(purchase.costPerLiter).toFixed(2)} ETB {Number(purchase.totalCost).toLocaleString("en-US", { maximumFractionDigits: 2 })} {purchase.fuelStation || "—"} {purchase.paymentMethod} ))}
{/* Modal */} setModalOpen(false)} title="Record Fuel Purchase" size="lg"> setFormData({ ...formData, paymentMethod: val || "CASH" })} /> setFormData({ ...formData, odometerReading: val as number | undefined })} decimalScale={0} min={0} /> setFormData({ ...formData, receiptNumber: e.currentTarget.value })} /> setFormData({ ...formData, notes: e.currentTarget.value })} />
); }