From 78e75ce41ceaa6ba74646af75007ae38a48803fd Mon Sep 17 00:00:00 2001 From: mickael Date: Tue, 20 Jan 2026 12:09:37 +0300 Subject: [PATCH] add euro prio in reglement --- src/components/modal/ModalPaymentPanel.tsx | 71 +++++++++++++--------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/src/components/modal/ModalPaymentPanel.tsx b/src/components/modal/ModalPaymentPanel.tsx index 5896cf2..5ab7e4d 100644 --- a/src/components/modal/ModalPaymentPanel.tsx +++ b/src/components/modal/ModalPaymentPanel.tsx @@ -68,9 +68,43 @@ const ModalPaymentPanel: React.FC = ({ tva_encaissement: false }); - // Devise principale par défaut - const devisePrincipale = useMemo(() => { - return devises?.find(d => d.est_principale) || devises?.[0]; + // Devises triées avec Euro en priorité + const sortedDevises = useMemo(() => { + if (!devises) return []; + return [...devises].sort((a, b) => { + // Euro en premier (vérifie sigle EUR ou €, ou intitulé contenant "Euro") + const isEuroA = a.sigle?.toUpperCase() === 'EUR' || a.sigle === '€' || a.intitule?.toLowerCase().includes('euro'); + const isEuroB = b.sigle?.toUpperCase() === 'EUR' || b.sigle === '€' || b.intitule?.toLowerCase().includes('euro'); + + if (isEuroA && !isEuroB) return -1; + if (!isEuroA && isEuroB) return 1; + + // Ensuite devise principale + if (a.est_principale && !b.est_principale) return -1; + if (!a.est_principale && b.est_principale) return 1; + + return 0; + }); + }, [devises]); + + // Devise par défaut : Euro si disponible, sinon principale, sinon première + const deviseParDefaut = useMemo(() => { + if (!devises || devises.length === 0) return null; + + // Chercher l'Euro + const euro = devises.find(d => + d.sigle?.toUpperCase() === 'EUR' || + d.sigle === '€' || + d.intitule?.toLowerCase().includes('euro') + ); + if (euro) return euro; + + // Sinon devise principale + const principale = devises.find(d => d.est_principale); + if (principale) return principale; + + // Sinon première devise + return devises[0]; }, [devises]); // Initial setup when modal opens @@ -93,10 +127,10 @@ const ModalPaymentPanel: React.FC = ({ setReglementData({ client_id: clientId, code_journal: tresoreries?.[0]?.code || '', - cours_devise: devisePrincipale?.cours_actuel || 1, + cours_devise: deviseParDefaut?.cours_actuel || 1, date_echeance: new Date().toISOString().split('T')[0], date_reglement: new Date().toISOString().split('T')[0], - devise_code: devisePrincipale?.code || 0, + devise_code: deviseParDefaut?.code || 0, libelle: 'Reglement multiple', mode_reglement: modes?.[0]?.code || 2, montant_total: totalDue, @@ -107,7 +141,7 @@ const ModalPaymentPanel: React.FC = ({ setStep('input'); } - }, [isOpen, selectedInvoices, modes, devises, tresoreries, encaissements, devisePrincipale]); + }, [isOpen, selectedInvoices, modes, devises, tresoreries, encaissements, deviseParDefaut]); // Update numeros_factures based on allocations useEffect(() => { @@ -130,7 +164,6 @@ const ModalPaymentPanel: React.FC = ({ }, [allocations]); const remainingToAllocate = reglementData.montant_total - totalAllocated; - // const isOverAllocated = totalAllocated < reglementData.montant_total + 0.01; const isUnderAllocated = remainingToAllocate > 0.01; // Handlers @@ -167,14 +200,6 @@ const ModalPaymentPanel: React.FC = ({ }; const handleValidateClick = () => { - // if (isOverAllocated) { - // toast({ - // title: "Erreur de ventilation", - // description: "Le montant ventilé ne peut pas dépasser le montant du règlement.", - // variant: "destructive" - // }); - // return; - // } if(!reglementData.reference){ toast({ title: "Champ requis", @@ -194,11 +219,6 @@ const ModalPaymentPanel: React.FC = ({ setStep('confirmation'); }; - // const handleConfirm = () => { - // console.log("reglementData : ",reglementData); - // onValidate(reglementData); - // }; - const handlePaymentValidate = async() => { try { console.log('Règlement validé:', reglementData); @@ -221,7 +241,7 @@ const ModalPaymentPanel: React.FC = ({ }); } if(data.reglements.length > 1) navigate(`/home/reglements`); - else navigate(`/home/reglements`); //navigate(`/home/reglements/${data.reglements[0].numero_facture}`); + else navigate(`/home/reglements`); } @@ -341,7 +361,7 @@ const ModalPaymentPanel: React.FC = ({ onChange={(e) => handleDeviseChange(Number(e.target.value))} className="w-full px-3 py-2 bg-gray-50 dark:bg-gray-950 border border-gray-200 dark:border-gray-800 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-[#338660]" > - {devises?.map(devise => ( + {sortedDevises.map(devise => ( @@ -431,7 +451,6 @@ const ModalPaymentPanel: React.FC = ({ Montant ventilé {formatCurrency(totalAllocated)} @@ -448,12 +467,6 @@ const ModalPaymentPanel: React.FC = ({ {/* Error Messages */} - {/* {isOverAllocated && ( -
- -

Attention : Le montant ventilé est supérieur au montant du règlement.

-
- )} */} {isUnderAllocated && (