Mise en place de la notion de perte définitive, ainsi que la révision avec statut Polongation

This commit is contained in:
ocroguennec committed 2026-08-22 16:27:41 +02:00
1 parent 4ad6ea79e8
commit 8e1b82d161
21 files changed
+1069 -184

No files matched your search

+14 -13
View File
@@ -59,19 +59,21 @@ router.get('/', (req, res) => {
recap.net_recu += recapInteretsPlateforme.net_recu;
recap.nb_remboursements += recapInteretsPlateforme.nb_remboursements;
// Pertes en capital : uniquement les dossiers explicitement déclarés en perte
// définitive (statut='perte_definitive'), avec le montant réellement acté dans
// investissement_pertes — pas les simples retards, ni les clôtures normales.
const pertes = db.prepare(`
SELECT i.id, i.nom_projet, p.nom AS plateforme_nom,
i.montant_investi,
COALESCE((SELECT SUM(r.capital) FROM remboursements r WHERE r.investissement_id = i.id),0) AS capital_rembourse,
(i.montant_investi -
COALESCE((SELECT SUM(r.capital) FROM remboursements r WHERE r.investissement_id = i.id),0)
) AS perte_capital,
i.statut, i.updated_at
ip.montant_perte AS perte_capital,
i.statut, ip.date_effet
FROM investissements i
JOIN plateformes p ON p.id = i.plateforme_id
JOIN investissement_pertes ip ON ip.investissement_id = i.id
WHERE ${invCond}
AND i.statut IN ('en_retard','cloture')
AND substr(i.updated_at,1,4) = ?
AND i.statut = 'perte_definitive'
AND substr(ip.date_effet,1,4) = ?
`).all(invArg, annee);
const pertesTotales = pertes.reduce((s, p) => s + Math.max(0, p.perte_capital), 0);
@@ -270,20 +272,19 @@ function buildCerfa2561(annee, invCond, invCondBonus2561, invArg) {
const rowsMerged = Object.values(rowsMap).sort((a, b) =>
a.plateforme_nom.localeCompare(b.plateforme_nom) || (a.investisseur_nom ?? '').localeCompare(b.investisseur_nom ?? ''));
// Pertes en capital par plateforme × investisseur
// Pertes en capital par plateforme × investisseur — uniquement les dossiers
// explicitement déclarés en perte définitive (voir note plus haut dans la route '/').
const pertesRows = db.prepare(`
SELECT
p.id AS plateforme_id,
i.investisseur_id,
COALESCE(SUM(
i.montant_investi -
COALESCE((SELECT SUM(r2.capital) FROM remboursements r2 WHERE r2.investissement_id = i.id),0)
), 0) AS perte_capital
COALESCE(SUM(ip.montant_perte), 0) AS perte_capital
FROM investissements i
JOIN plateformes p ON p.id = i.plateforme_id
JOIN investissement_pertes ip ON ip.investissement_id = i.id
WHERE ${invCond}
AND i.statut IN ('en_retard','cloture')
AND substr(i.updated_at,1,4) = ?
AND i.statut = 'perte_definitive'
AND substr(ip.date_effet,1,4) = ?
GROUP BY p.id, i.investisseur_id
`).all(invArg, annee);