/** * ========================================================================= * PLATEFORME ECO-PANNEAU.FR - VERSION 1.0.0 * Interface Administrateur - Onglet Facturation Globale * ========================================================================= */ window.AdminInvoicesTab = ({ data, refreshData, showToast, setActiveTab, openLocalModal, openLocalDialog, closeCurrentLayer, activeModal, activeDialog, targetId }) => { const { useState } = React; // FACTORISATION : Utilisation du Hook global de gestion des modales par URL const { activeModal: urlModal, activeDialog: urlDialog, targetId: urlTargetId, openModal, openDialog, closeCurrentLayer: urlCloseLayer } = window.useUrlModal(); // Priorité aux props passées par le parent, sinon fallback sur le hook const routerActiveModal = activeModal || urlModal; const routerActiveDialog = activeDialog || urlDialog; const routerCloseLayer = closeCurrentLayer || urlCloseLayer; const routerOpenModal = openLocalModal || openModal; const routerOpenDialog = openLocalDialog || openDialog; const [isSaving, setIsSaving] = useState(false); // Cibles des modales const [refundTarget, setRefundTarget] = useState(null); const [archives, setArchives] = useState([]); const [loadingArchives, setLoadingArchives] = useState(false); // FACTORISATION : Récupération sécurisée et propre des icônes const { DownloadIcon, RefreshCwIcon, FileTextIcon, LoaderIcon, CheckCircleIcon, ArchiveIcon } = window.getIcons(); const Modal = window.Modal || (() => null); const Button = window.Button || (({children}) => ); const clients = data.clients || []; const isImpersonating = data.settings?.impersonating === true; const handleRefund = async (e) => { e.preventDefault(); const amount = parseFloat(e.target.amount.value); const reason = e.target.reason.value; const mode = e.target.mode.value; if (amount <= 0 || amount > refundTarget.maxRefundable) return showToast("Montant invalide", "error"); const d = await window.apiFetch('invoices/refund', { body: { invoice_ref: refundTarget.invoice.invoiceNumber, amount, mode, reason }, setLoading: setIsSaving, successMessage: "Remboursement ou avoir traité avec succès !" }); if (d) { routerCloseLayer(); refreshData(); } }; const openLegalArchives = async () => { routerOpenModal('legal_archive'); const d = await window.apiFetch('invoices/legal_archive', { method: 'GET', setLoading: setLoadingArchives }); if (d) { setArchives(d.data || []); } else { routerCloseLayer(); } }; return (
Historique des paiements de tous clients.
Aucune facture émise.
Déchiffrement de l'index...