Ajout du type Intérêt plateforme pour les remboursements

This commit is contained in:
ocroguennec committed 2026-08-16 16:49:20 +02:00
1 parent 37f9f8b8a7
commit 1bab97b5b3
9 files changed
+248 -66

No files matched your search

+50 -3
View File
@@ -92,6 +92,17 @@ router.get('/', (req, res) => {
GROUP BY bonus_plateforme_id
`).all(...invParams);
// Intérêts plateforme : comme les bonus, ils créditent directement le
// porte-monnaie de la plateforme (net_recu tient déjà compte des prélèvements).
const interetsPlateformeWalletPerPlat = db.prepare(`
SELECT bonus_plateforme_id AS plateforme_id,
COALESCE(SUM(net_recu), 0) AS interets_plateforme_wallet
FROM remboursements
WHERE ${invWhere.replace('investisseur_id', 'bonus_investisseur_id')}
AND type = 'interets_plateforme'
GROUP BY bonus_plateforme_id
`).all(...invParams);
const capitalInvestiPerPlat = db.prepare(`
SELECT i.plateforme_id,
COALESCE(SUM(
@@ -117,6 +128,7 @@ router.get('/', (req, res) => {
for (const r of drManuelPerPlat) walletMap[r.plateforme_id] = (walletMap[r.plateforme_id] || 0) + r.depots - r.retraits_manuels;
for (const r of rembWalletPerPlat) walletMap[r.plateforme_id] = (walletMap[r.plateforme_id] || 0) + r.remb_wallet;
for (const r of bonusWalletPerPlat) walletMap[r.plateforme_id] = (walletMap[r.plateforme_id] || 0) + r.bonus_wallet;
for (const r of interetsPlateformeWalletPerPlat) walletMap[r.plateforme_id] = (walletMap[r.plateforme_id] || 0) + r.interets_plateforme_wallet;
for (const r of capitalInvestiPerPlat) walletMap[r.plateforme_id] = (walletMap[r.plateforme_id] || 0) - r.capital_investi;
for (const r of correctionsPerPlat) walletMap[r.plateforme_id] = (walletMap[r.plateforme_id] || 0) + r.total_correction;
@@ -149,6 +161,10 @@ router.get('/', (req, res) => {
`).get(...invParams);
/* ── Interets ────────────────────────────────────────────────── */
// Inclut les remboursements normaux (liés à un investissement) et les
// "Intérêts plateforme" (type=interets_plateforme, rattachés via
// bonus_plateforme_id/bonus_investisseur_id comme les bonus, mais ce sont
// de vrais intérêts fiscalisés — contrairement aux bonus qui restent exclus).
const interets = db.prepare(`
SELECT
COALESCE(SUM(r.interets_bruts),0) AS interets_bruts,
@@ -156,9 +172,12 @@ router.get('/', (req, res) => {
COALESCE(SUM(r.prelev_forfaitaire),0) AS prelev_forfaitaire,
COALESCE(SUM(r.net_recu),0) AS net_recu
FROM remboursements r
JOIN investissements i ON i.id = r.investissement_id
WHERE ${invWhere.replace('investisseur_id', 'i.investisseur_id')}
`).get(...invParams);
LEFT JOIN investissements i ON i.id = r.investissement_id
WHERE (
(r.investissement_id IS NOT NULL AND ${invWhere.replace('investisseur_id', 'i.investisseur_id')})
OR (r.investissement_id IS NULL AND r.type = 'interets_plateforme' AND ${invWhere.replace('investisseur_id', 'r.bonus_investisseur_id')})
)
`).get(...invParams, ...invParams);
/* ── Interets par annee ──────────────────────────────────────── */
const interetsParAnnee = scopeAll
@@ -618,6 +637,23 @@ router.get('/interets-par-plateforme', (req, res) => {
ORDER BY p.nom, mois
`).all(...invParams, anneeStr);
/* ── Intérêts plateforme (hors investissement) par plateforme et par mois ── */
const interetsPlateformeByPlat = db.prepare(`
SELECT
r.bonus_plateforme_id AS plateforme_id,
p.nom AS plateforme_nom,
strftime('%Y-%m', r.date_remb) AS mois,
COALESCE(SUM(r.interets_bruts), 0) AS interets_bruts,
COALESCE(SUM(r.interets_bruts - r.prelev_sociaux - r.prelev_forfaitaire), 0) AS interets_nets
FROM remboursements r
JOIN plateformes p ON p.id = r.bonus_plateforme_id
WHERE ${invWhere.replace('investisseur_id', 'bonus_investisseur_id')}
AND r.type = 'interets_plateforme'
AND strftime('%Y', r.date_remb) = ?
GROUP BY r.bonus_plateforme_id, p.nom, mois
ORDER BY p.nom, mois
`).all(...invParams, anneeStr);
/* ── Projections par plateforme et par mois ──────────────────── */
// Exclure les investissements qui ont déjà un remboursement réel dans le même mois
const projectionsByPlat = db.prepare(`
@@ -782,6 +818,17 @@ router.get('/interets-par-plateforme', (req, res) => {
rembMap[b.plateforme_id].rembourses[b.mois] = { interets_bruts: 0, interets_nets: 0, cashback: b.cashback, capital: 0 };
}
}
// Ajouter les intérêts plateforme (hors investissement) aux remboursements par mois
for (const ip of interetsPlateformeByPlat) {
if (!rembMap[ip.plateforme_id]) rembMap[ip.plateforme_id] = { id: ip.plateforme_id, nom: ip.plateforme_nom, detenteur_nom: detenteurMap[ip.plateforme_id] ?? null, rembourses: {}, projections: {} };
const entry = rembMap[ip.plateforme_id].rembourses[ip.mois];
if (entry) {
entry.interets_bruts = (entry.interets_bruts ?? 0) + ip.interets_bruts;
entry.interets_nets = (entry.interets_nets ?? 0) + ip.interets_nets;
} else {
rembMap[ip.plateforme_id].rembourses[ip.mois] = { interets_bruts: ip.interets_bruts, interets_nets: ip.interets_nets, cashback: 0, capital: 0 };
}
}
for (const p of projectionsByPlat) {
if (!rembMap[p.plateforme_id]) rembMap[p.plateforme_id] = { id: p.plateforme_id, nom: p.plateforme_nom, detenteur_nom: detenteurMap[p.plateforme_id] ?? null, rembourses: {}, projections: {} };