add euro prio in reglement
This commit is contained in:
parent
8736378bf2
commit
78e75ce41c
1 changed files with 42 additions and 29 deletions
|
|
@ -68,9 +68,43 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
tva_encaissement: false
|
tva_encaissement: false
|
||||||
});
|
});
|
||||||
|
|
||||||
// Devise principale par défaut
|
// Devises triées avec Euro en priorité
|
||||||
const devisePrincipale = useMemo(() => {
|
const sortedDevises = useMemo(() => {
|
||||||
return devises?.find(d => d.est_principale) || devises?.[0];
|
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]);
|
}, [devises]);
|
||||||
|
|
||||||
// Initial setup when modal opens
|
// Initial setup when modal opens
|
||||||
|
|
@ -93,10 +127,10 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
setReglementData({
|
setReglementData({
|
||||||
client_id: clientId,
|
client_id: clientId,
|
||||||
code_journal: tresoreries?.[0]?.code || '',
|
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_echeance: new Date().toISOString().split('T')[0],
|
||||||
date_reglement: 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',
|
libelle: 'Reglement multiple',
|
||||||
mode_reglement: modes?.[0]?.code || 2,
|
mode_reglement: modes?.[0]?.code || 2,
|
||||||
montant_total: totalDue,
|
montant_total: totalDue,
|
||||||
|
|
@ -107,7 +141,7 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
|
|
||||||
setStep('input');
|
setStep('input');
|
||||||
}
|
}
|
||||||
}, [isOpen, selectedInvoices, modes, devises, tresoreries, encaissements, devisePrincipale]);
|
}, [isOpen, selectedInvoices, modes, devises, tresoreries, encaissements, deviseParDefaut]);
|
||||||
|
|
||||||
// Update numeros_factures based on allocations
|
// Update numeros_factures based on allocations
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
@ -130,7 +164,6 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
}, [allocations]);
|
}, [allocations]);
|
||||||
|
|
||||||
const remainingToAllocate = reglementData.montant_total - totalAllocated;
|
const remainingToAllocate = reglementData.montant_total - totalAllocated;
|
||||||
// const isOverAllocated = totalAllocated < reglementData.montant_total + 0.01;
|
|
||||||
const isUnderAllocated = remainingToAllocate > 0.01;
|
const isUnderAllocated = remainingToAllocate > 0.01;
|
||||||
|
|
||||||
// Handlers
|
// Handlers
|
||||||
|
|
@ -167,14 +200,6 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleValidateClick = () => {
|
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){
|
if(!reglementData.reference){
|
||||||
toast({
|
toast({
|
||||||
title: "Champ requis",
|
title: "Champ requis",
|
||||||
|
|
@ -194,11 +219,6 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
setStep('confirmation');
|
setStep('confirmation');
|
||||||
};
|
};
|
||||||
|
|
||||||
// const handleConfirm = () => {
|
|
||||||
// console.log("reglementData : ",reglementData);
|
|
||||||
// onValidate(reglementData);
|
|
||||||
// };
|
|
||||||
|
|
||||||
const handlePaymentValidate = async() => {
|
const handlePaymentValidate = async() => {
|
||||||
try {
|
try {
|
||||||
console.log('Règlement validé:', reglementData);
|
console.log('Règlement validé:', reglementData);
|
||||||
|
|
@ -221,7 +241,7 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if(data.reglements.length > 1) navigate(`/home/reglements`);
|
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))}
|
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]"
|
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}>
|
<option key={devise.code} value={devise.code}>
|
||||||
{devise.intitule} ({devise.sigle}) {devise.est_principale && '★'}
|
{devise.intitule} ({devise.sigle}) {devise.est_principale && '★'}
|
||||||
</option>
|
</option>
|
||||||
|
|
@ -431,7 +451,6 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
<span className="text-xs text-gray-500 block">Montant ventilé</span>
|
<span className="text-xs text-gray-500 block">Montant ventilé</span>
|
||||||
<span className={cn(
|
<span className={cn(
|
||||||
"text-lg font-bold block text-gray-900 dark:text-white",
|
"text-lg font-bold block text-gray-900 dark:text-white",
|
||||||
// isOverAllocated ? "text-red-500" : "text-gray-900 dark:text-white"
|
|
||||||
)}>
|
)}>
|
||||||
{formatCurrency(totalAllocated)}
|
{formatCurrency(totalAllocated)}
|
||||||
</span>
|
</span>
|
||||||
|
|
@ -448,12 +467,6 @@ const ModalPaymentPanel: React.FC<ModalPaymentPanelProps> = ({
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Error Messages */}
|
{/* 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 && (
|
{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">
|
<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" />
|
<AlertTriangle className="w-5 h-5 shrink-0" />
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue