Correctif Calcul porte-monnaie

This commit is contained in:
ocroguennec committed 2026-08-16 18:48:23 +02:00
1 parent b43754fe19
commit 7ee011de09
3 files changed
+96 -134

No files matched your search

+20 -9
View File
@@ -54,15 +54,22 @@ router.get('/', (req, res) => {
`).all(...invParams, userId);
/* ── Solde porte-monnaie par plateforme ──────────────────────── */
// ?asOf=YYYY-MM-DD (optionnel) : cumule uniquement jusqu'à cette date au lieu
// de tout l'historique. Utilisé par le frontend pour le solde "à la fin de
// l'année sélectionnée", en réutilisant exactement la même formule que le
// solde live (source unique de vérité — cf. project_taxreport_interets_plateforme
// en mémoire sur les bugs de duplication de cette formule côté frontend).
const asOf = /^\d{4}-\d{2}-\d{2}$/.test(req.query.asOf || '') ? req.query.asOf : null;
const drManuelPerPlat = db.prepare(`
SELECT plateforme_id,
COALESCE(SUM(CASE WHEN type='depot' THEN montant ELSE 0 END), 0) AS depots,
COALESCE(SUM(CASE WHEN type='retrait' AND COALESCE(source,'') != 'auto_remboursement'
THEN montant ELSE 0 END), 0) AS retraits_manuels
FROM depots_retraits
WHERE ${invWhere}
WHERE ${invWhere}${asOf ? ' AND date_operation <= ?' : ''}
GROUP BY plateforme_id
`).all(...invParams);
`).all(...invParams, ...(asOf ? [asOf] : []));
const rembWalletPerPlat = db.prepare(`
SELECT i.plateforme_id,
@@ -80,8 +87,9 @@ router.get('/', (req, res) => {
WHERE ${invWhere.replace('investisseur_id', 'i.investisseur_id')}
AND r.type = 'normal'
AND r.methode_remboursement = 'portefeuille'
${asOf ? 'AND r.date_remb <= ?' : ''}
GROUP BY i.plateforme_id
`).all(...invParams);
`).all(...invParams, ...(asOf ? [asOf] : []));
const bonusWalletPerPlat = db.prepare(`
SELECT bonus_plateforme_id AS plateforme_id,
@@ -89,8 +97,9 @@ router.get('/', (req, res) => {
FROM remboursements
WHERE ${invWhere.replace('investisseur_id', 'bonus_investisseur_id')}
AND type IN ('bonus_parrainage', 'bonus_plateforme')
${asOf ? 'AND date_remb <= ?' : ''}
GROUP BY bonus_plateforme_id
`).all(...invParams);
`).all(...invParams, ...(asOf ? [asOf] : []));
// 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).
@@ -100,28 +109,30 @@ router.get('/', (req, res) => {
FROM remboursements
WHERE ${invWhere.replace('investisseur_id', 'bonus_investisseur_id')}
AND type = 'interets_plateforme'
${asOf ? 'AND date_remb <= ?' : ''}
GROUP BY bonus_plateforme_id
`).all(...invParams);
`).all(...invParams, ...(asOf ? [asOf] : []));
const capitalInvestiPerPlat = db.prepare(`
SELECT i.plateforme_id,
COALESCE(SUM(
i.montant_investi
+ COALESCE((SELECT SUM(rv.montant) FROM reinvestissements rv WHERE rv.investissement_id = i.id), 0)
+ COALESCE((SELECT SUM(rv.montant) FROM reinvestissements rv WHERE rv.investissement_id = i.id${asOf ? ' AND rv.date_reinvestissement <= ?' : ''}), 0)
), 0) AS capital_investi
FROM investissements i
WHERE ${invWhere.replace('investisseur_id', 'i.investisseur_id')}
${asOf ? 'AND i.date_souscription <= ?' : ''}
GROUP BY i.plateforme_id
`).all(...invParams);
`).all(...(asOf ? [asOf] : []), ...invParams, ...(asOf ? [asOf] : []));
// Corrections de solde (micro-ecarts fiscaux sur plateformes flat_tax)
const correctionsPerPlat = db.prepare(`
SELECT plateforme_id,
COALESCE(SUM(montant), 0) AS total_correction
FROM corrections_solde
WHERE ${invWhere}
WHERE ${invWhere}${asOf ? ' AND date <= ?' : ''}
GROUP BY plateforme_id
`).all(...invParams);
`).all(...invParams, ...(asOf ? [asOf] : []));
// Fusion en une map plateforme_id → solde_portefeuille
const walletMap = {};