import DashboardLayout from "@/components/DashboardLayout"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { trpc } from "@/lib/trpc"; import { buildSupplierBudgetSummary } from "@shared/invoiceAnalytics"; import { CalendarDays, Euro, FileText } from "lucide-react"; import { useMemo, useState } from "react"; const MONTHS = [ ["01", "Janvier"], ["02", "Février"], ["03", "Mars"], ["04", "Avril"], ["05", "Mai"], ["06", "Juin"], ["07", "Juillet"], ["08", "Août"], ["09", "Septembre"], ["10", "Octobre"], ["11", "Novembre"], ["12", "Décembre"], ] as const; function formatCurrency(value: number) { return new Intl.NumberFormat("fr-FR", { style: "currency", currency: "EUR" }).format(value); } export default function RealBudget() { const currentYear = new Date().getFullYear(); const [selectedYear, setSelectedYear] = useState(String(currentYear)); const [selectedMonth, setSelectedMonth] = useState("all"); const { data: invoices, isLoading } = trpc.invoices.list.useQuery(); const availableYears = useMemo(() => { const years = new Set([currentYear]); (invoices || []).forEach((invoice) => { const value = invoice.invoiceDate ?? invoice.createdAt; if (!value) return; const date = new Date(value); if (!Number.isNaN(date.getTime())) years.add(date.getFullYear()); }); return Array.from(years).sort((a, b) => b - a); }, [invoices, currentYear]); const rows = useMemo( () => buildSupplierBudgetSummary(invoices || [], selectedYear, selectedMonth), [invoices, selectedYear, selectedMonth], ); const totals = useMemo(() => rows.reduce((total, row) => ({ subscriptionAmount: total.subscriptionAmount + row.subscriptionAmount, nonSubscriptionAmount: total.nonSubscriptionAmount + row.nonSubscriptionAmount, totalAmount: total.totalAmount + row.totalAmount, }), { subscriptionAmount: 0, nonSubscriptionAmount: 0, totalAmount: 0 }), [rows]); return (

Budget réel

Montants réellement facturés, regroupés par fournisseur.

Période :
Abonnements
{formatCurrency(totals.subscriptionAmount)}
Hors abonnement
{formatCurrency(totals.nonSubscriptionAmount)}
Total facturé
{formatCurrency(totals.totalAmount)}
Budget réel par fournisseurLes factures finalisées sont séparées entre abonnements et hors abonnement. {isLoading ?
Chargement du budget…
: rows.length === 0 ?
Aucune facture finalisée pour cette période.
: (
{rows.map((row) => )}
FournisseurAbonnementsMontant abonnementsHors abonnementMontant hors abonnementTotal
{row.supplierName}{row.subscriptionCount}{formatCurrency(row.subscriptionAmount)}{row.nonSubscriptionCount}{formatCurrency(row.nonSubscriptionAmount)}{formatCurrency(row.totalAmount)}
Total{formatCurrency(totals.subscriptionAmount)}{formatCurrency(totals.nonSubscriptionAmount)}{formatCurrency(totals.totalAmount)}
)}
); }