correctif

This commit is contained in:
2026-06-16 20:51:30 +02:00
parent f4db83591f
commit a9b7777b10
+24 -5
View File
@@ -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 = () => {
@@ -1193,21 +1209,24 @@ export default function InvestissementDetail() {
<tbody>
{simul.map(s => {
const matched = matchRemb(s.date_prevue);
const isPaid = !!matched;
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;