add euro prio in reglement

This commit is contained in:
mickael 2026-01-20 12:09:37 +03:00
parent 8736378bf2
commit 78e75ce41c

View file

@ -68,9 +68,43 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
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<ModalPaymentPanelProps> = ({
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<ModalPaymentPanelProps> = ({
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<ModalPaymentPanelProps> = ({
}, [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<ModalPaymentPanelProps> = ({
};
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<ModalPaymentPanelProps> = ({
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<ModalPaymentPanelProps> = ({
});
}
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<ModalPaymentPanelProps> = ({
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 => (
<option key={devise.code} value={devise.code}>
{devise.intitule} ({devise.sigle}) {devise.est_principale && '★'}
</option>
@ -431,7 +451,6 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
<span className="text-xs text-gray-500 block">Montant ventilé</span>
<span className={cn(
"text-lg font-bold block text-gray-900 dark:text-white",
// isOverAllocated ? "text-red-500" : "text-gray-900 dark:text-white"
)}>
{formatCurrency(totalAllocated)}
</span>
@ -448,12 +467,6 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
</div>
{/* Error Messages */}
{/* {isOverAllocated && (
<div className="flex items-start gap-2 p-3 bg-red-50 dark:bg-red-900/20 text-red-600 text-sm rounded-lg border border-red-100 dark:border-red-900/50">
<AlertCircle className="w-5 h-5 shrink-0" />
<p>Attention : Le montant ventilé est supérieur au montant du règlement.</p>
</div>
)} */}
{isUnderAllocated && (
<div className="flex items-start gap-2 p-3 bg-amber-50 dark:bg-amber-900/20 text-amber-600 text-sm rounded-lg border border-amber-100 dark:border-amber-900/50">
<AlertTriangle className="w-5 h-5 shrink-0" />