From a9b7777b109504e2e23a3e8d0add867e39bfcb47 Mon Sep 17 00:00:00 2001 From: Olivier Date: Tue, 16 Jun 2026 20:51:30 +0200 Subject: [PATCH] correctif --- frontend/src/pages/InvestissementDetail.jsx | 31 +++++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/InvestissementDetail.jsx b/frontend/src/pages/InvestissementDetail.jsx index 11fb918..57bca15 100644 --- a/frontend/src/pages/InvestissementDetail.jsx +++ b/frontend/src/pages/InvestissementDetail.jsx @@ -666,6 +666,13 @@ export default function InvestissementDetail() { // Si tout le capital est remboursé (capRestant = 0), fallback sur le dernier remboursement const rembByExactDate = new Map(remb.map(r => [r.date_remb, r])); const rembByMonth = new Map(remb.map(r => [r.date_remb.slice(0, 7), r])); + // Groupement multi-remb par mois (pour les mois avec plusieurs versements / rattrapages) + const rembsArrayByMonth = new Map(); + remb.forEach(r => { + const m = r.date_remb.slice(0, 7); + if (!rembsArrayByMonth.has(m)) rembsArrayByMonth.set(m, []); + rembsArrayByMonth.get(m).push(r); + }); const lastRemb = remb.length > 0 ? remb.reduce((latest, r) => r.date_remb > latest.date_remb ? r : latest, remb[0]) : null; @@ -673,6 +680,15 @@ export default function InvestissementDetail() { rembByExactDate.get(date_prevue) ?? rembByMonth.get(date_prevue?.slice(0, 7)) ?? (capRestant === 0 ? lastRemb : null); + // Retourne tous les remboursements correspondant à une date de projection (pour somme exacte) + const matchRembsAll = (date_prevue) => { + const exact = rembByExactDate.get(date_prevue); + if (exact) return [exact]; + const monthRembs = rembsArrayByMonth.get(date_prevue?.slice(0, 7)); + if (monthRembs?.length) return monthRembs; + if (capRestant === 0 && lastRemb) return [lastRemb]; + return []; + }; // ── Export dossier JSON ──────────────────────────────────────── const exportDossier = () => { @@ -1192,22 +1208,25 @@ export default function InvestissementDetail() { {simul.map(s => { - const matched = matchRemb(s.date_prevue); - const isPaid = !!matched; + const matched = matchRemb(s.date_prevue); + const matchedAll = matchRembsAll(s.date_prevue); + const isPaid = matchedAll.length > 0; const rates = getRatesForYear(s.date_prevue); const reduction = rates ? (rates.prelev_sociaux + rates.impot_revenu) / 100 : 0; const interets = netMode ? (s.interets_prevus || 0) * (1 - reduction) : (s.interets_prevus || 0); - // Montants réels pour comparaison + // Montants réels — somme de tous les remboursements du mois const interetsReels = isPaid - ? (netMode ? (matched.interets_nets || 0) : (matched.interets_bruts || 0)) + ? (netMode + ? matchedAll.reduce((sum, r) => sum + (r.interets_nets || 0), 0) + : matchedAll.reduce((sum, r) => sum + (r.interets_bruts || 0), 0)) : null; const totalRecu = isPaid ? (netMode - ? (matched.net_recu || 0) - : (matched.capital || 0) + (matched.cashback || 0) + (matched.interets_bruts || 0)) + ? matchedAll.reduce((sum, r) => sum + (r.net_recu || 0), 0) + : matchedAll.reduce((sum, r) => sum + (r.capital || 0) + (r.cashback || 0) + (r.interets_bruts || 0), 0)) : null; const interetsDiffers = isPaid && Math.abs(interetsReels - interets) > 0.01; const totalDiffers = isPaid && Math.abs(totalRecu - s.total_prevu) > 0.01;