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
|
||||
});
|
||||
|
||||
// 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" />
|
||||
|
|
|
|||
Loading…
Reference in a new issue