import { useState, useMemo } from "react"; import { useQuery } from "@tanstack/react-query"; import { useStore } from "@/contexts/StoreContext"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Loader2, Calendar, DollarSign, Building, CreditCard, AlertCircle } from "lucide-react"; import { format, parseISO, startOfMonth, endOfMonth, eachMonthOfInterval, isWithinInterval } from "date-fns"; import { fr } from "date-fns/locale"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; interface PaymentSchedule { id: string | number; invoiceReference: string; dueDate: string; amount: number; supplierName: string; paymentMethod: string | null; groupId: number; groupName: string; } interface PaymentScheduleResponse { schedules: PaymentSchedule[]; message?: string; } export default function PaymentSchedulePage() { const { selectedStoreId } = useStore(); const [selectedMonth, setSelectedMonth] = useState(() => { const now = new Date(); return format(now, 'yyyy-MM'); }); // Récupérer les échéances const { data, isLoading, error } = useQuery({ queryKey: ['/api/payment-schedule', selectedStoreId], queryFn: async () => { const response = await fetch(`/api/payment-schedule?groupId=${selectedStoreId}`, { credentials: 'include' }); if (!response.ok) { throw new Error(`Erreur ${response.status}: ${response.statusText}`); } return response.json(); }, enabled: !!selectedStoreId, }); // Calculer les mois disponibles (12 derniers mois + 12 prochains mois) const availableMonths = useMemo(() => { const now = new Date(); const startDate = new Date(now.getFullYear(), now.getMonth() - 12, 1); const endDate = new Date(now.getFullYear(), now.getMonth() + 12, 1); return eachMonthOfInterval({ start: startDate, end: endDate }) .map(date => ({ value: format(date, 'yyyy-MM'), label: format(date, 'MMMM yyyy', { locale: fr }) })); }, []); // Filtrer les échéances par mois sélectionné const filteredSchedules = useMemo(() => { if (!data?.schedules) return []; const monthStart = parseISO(`${selectedMonth}-01`); const monthEnd = endOfMonth(monthStart); return data.schedules .filter(schedule => { try { const dueDate = parseISO(schedule.dueDate); return isWithinInterval(dueDate, { start: monthStart, end: monthEnd }); } catch { return false; } }) .sort((a, b) => { const dateA = parseISO(a.dueDate); const dateB = parseISO(b.dueDate); return dateA.getTime() - dateB.getTime(); }); }, [data?.schedules, selectedMonth]); // Calculer le total du mois const monthTotal = useMemo(() => { return filteredSchedules.reduce((sum, schedule) => sum + schedule.amount, 0); }, [filteredSchedules]); // Grouper par mode de paiement const paymentMethodTotals = useMemo(() => { const totals: Record = {}; filteredSchedules.forEach(schedule => { const method = schedule.paymentMethod || 'Non défini'; totals[method] = (totals[method] || 0) + schedule.amount; }); return totals; }, [filteredSchedules]); if (!selectedStoreId) { return (
Sélectionner un magasin Veuillez sélectionner un magasin pour afficher l'échéancier
); } if (isLoading) { return (
); } if (error) { return (
Erreur Une erreur est survenue lors du chargement des échéances
); } if (data?.message) { return (
Configuration requise {data.message}
); } return (
{/* En-tête */}

Échéancier des Paiements

Gestion des échéances fournisseurs

{/* Statistiques du mois */}
Total du Mois
{monthTotal.toFixed(2)} €

{filteredSchedules.length} échéance{filteredSchedules.length > 1 ? 's' : ''}

Modes de Paiement
{Object.entries(paymentMethodTotals).map(([method, total]) => (
{method}: {total.toFixed(2)} €
))}
Période
{format(parseISO(`${selectedMonth}-01`), 'MMMM', { locale: fr })}

{format(parseISO(`${selectedMonth}-01`), 'yyyy', { locale: fr })}

{/* Liste des échéances */} Échéances du Mois Liste détaillée des paiements à effectuer pour le mois sélectionné {filteredSchedules.length === 0 ? (
Aucune échéance pour ce mois
) : (
{filteredSchedules.map((schedule, index) => (
{format(parseISO(schedule.dueDate), 'dd/MM/yyyy', { locale: fr })}
{schedule.supplierName}
Facture: {schedule.invoiceReference}
{schedule.paymentMethod && (
{schedule.paymentMethod}
)}
{schedule.amount.toFixed(2)} €
))}
)}
); }