/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React, { useState } from 'react'; import { motion } from 'motion/react'; import { TrendingUp, Package, AlertTriangle, FileText, UserCheck, Currency, ArrowRight, Plus, RefreshCw, Search, ShoppingCart } from 'lucide-react'; import { TireProduct, Invoice, StaffUser, SystemSettings } from '../types'; interface DashboardProps { products: TireProduct[]; invoices: Invoice[]; currentStaff: StaffUser; settings: SystemSettings; setActiveTab: (tab: string) => void; onQuickAddStock: (productId: string, amount: number) => void; setSelectedInvoiceForView: (invoice: Invoice | null) => void; } export default function Dashboard({ products, invoices, currentStaff, settings, setActiveTab, onQuickAddStock, setSelectedInvoiceForView }: DashboardProps) { const [replenishAmount, setReplenishAmount] = useState<{ [key: string]: number }>({}); const [searchTerm, setSearchTerm] = useState(''); // 1. Calculate general statistics const totalInvoiced = invoices.reduce((sum, inv) => sum + (inv.paymentStatus === 'PAID' ? inv.total : 0), 0); const totalActiveItems = products.reduce((sum, p) => sum + p.stock, 0); const lowStockItems = products.filter(p => p.stock <= p.minStock); const totalInvoicesCount = invoices.length; const currentMonthName = "June 2026"; const juneInvoices = invoices.filter(inv => { // Basic date checking return inv.dateTime.includes('-06-') || inv.dateTime.includes('/06/') || inv.dateTime.startsWith('02-06-') || inv.dateTime.startsWith('03-06-'); }); const juneSalesTotal = juneInvoices.reduce((sum, inv) => sum + (inv.paymentStatus === 'PAID' ? inv.total : 0), 0); // 2. Generate custom monthly line metrics for our 2026 sales chart // Group invoices by month const monthlyData = [ { label: 'Jan', value: invoices.filter(i => i.dateTime.includes('-01-')).reduce((sum, i) => sum + i.total, 0) }, { label: 'Feb', value: invoices.filter(i => i.dateTime.includes('-02-')).reduce((sum, i) => sum + i.total, 0) }, { label: 'Mar', value: invoices.filter(i => i.dateTime.includes('-03-')).reduce((sum, i) => sum + i.total, 0) }, { label: 'Apr', value: invoices.filter(i => i.dateTime.includes('-04-')).reduce((sum, i) => sum + i.total, 0) }, { label: 'May', value: invoices.filter(i => i.dateTime.includes('-05-')).reduce((sum, i) => sum + i.total, 0) }, { label: 'Jun', value: invoices.filter(i => i.dateTime.includes('-06-')).reduce((sum, i) => sum + i.total, 0) }, ]; const maxMonthlyVal = Math.max(...monthlyData.map(d => d.value), 100000); // 3. Category distribution const categories = ['Passenger', 'SUV', 'Commercial', 'Light Truck', 'Truck/Bus'] as const; const categoryStats = categories.map(cat => { const items = products.filter(p => p.category === cat); const count = items.reduce((sum, p) => sum + p.stock, 0); const totalValue = items.reduce((sum, p) => sum + (p.stock * p.price), 0); return { name: cat, count, value: totalValue }; }); const handleQuickAddClick = (productId: string) => { const amt = replenishAmount[productId] || 10; onQuickAddStock(productId, amt); // Reset counter setReplenishAmount(prev => ({ ...prev, [productId]: 10 })); }; // Filter products for low stock alert segment const filteredAlertProducts = lowStockItems.filter(p => p.brand.toLowerCase().includes(searchTerm.toLowerCase()) || p.model.toLowerCase().includes(searchTerm.toLowerCase()) || p.size.toLowerCase().includes(searchTerm.toLowerCase()) ); return (
Direct invoicing, tax calculations, dynamic offline persistence, and real-time stock alerts. Welcomed operator: {currentStaff.name}.
Mtd Cash Flow ({currentMonthName})
{settings.currencySymbol} {juneSalesTotal.toLocaleString()}
Total Warehouse Stock
{totalActiveItems} pcs
Across {products.length} distinct models
Critical Alerts
{lowStockItems.length} items
Total Sales Invoices
{totalInvoicesCount} sales
Invoiced: {settings.currencySymbol}{totalInvoiced.toLocaleString()}
Telemetry of invoice turnover for year 2026
Warehouse composition and valuation
{settings.currencySymbol} {products.reduce((sum, p) => sum + (p.stock * p.price), 0).toLocaleString()}
The products listed below are currently equal to or below their alert limit. Top up immediately:
No matching low stock warnings!
Review, query, and print historical customer receipts
No invoices drafted yet!
{inv.customerName}
{inv.dateTime}