KPI porte-monaie dans plateforme
This commit is contained in:
1 parent
6453218e2b
commit
ea01cf3205
1 file changed
+64
-5
@@ -818,6 +818,53 @@ export default function Plateformes() {
|
||||
const netMode = displayMode === 'net';
|
||||
const prevYearLabel = selectedYear ? Number(selectedYear) - 1 : new Date().getFullYear() - 1;
|
||||
|
||||
/* ── Solde porte-monnaie (cf. formule dashboard.js) ──────────────
|
||||
dépôts − retraits manuels + remboursements crédités au portefeuille
|
||||
+ bonus − capital investi + corrections de solde, cumulés sur la
|
||||
sélection plateforme(s)/détenteur, jusqu'à une date de coupure. */
|
||||
const computeSoldePortefeuille = (cutoff) => {
|
||||
let balance = 0;
|
||||
for (const d of allDepots) {
|
||||
if (!filteredPlatIds.has(d.plateforme_id)) continue;
|
||||
if (cutoff && d.date_operation > cutoff) continue;
|
||||
if (d.type === 'depot') balance += d.montant || 0;
|
||||
else if (d.source !== 'auto_remboursement') balance -= d.montant || 0;
|
||||
}
|
||||
for (const r of allRembs) {
|
||||
if (!filteredPlatIds.has(r.plateforme_id)) continue;
|
||||
if (r.methode_remboursement !== 'portefeuille') continue;
|
||||
if (!r.date_remb || (cutoff && r.date_remb > cutoff)) continue;
|
||||
if (r.type === 'normal') {
|
||||
const plat = plats.find(p => p.id === r.plateforme_id);
|
||||
balance += plat?.fiscalite === 'flat_tax'
|
||||
? (r.net_recu || 0)
|
||||
: (r.capital || 0) + (r.cashback || 0) + (r.interets_bruts || 0);
|
||||
} else if (r.type === 'bonus_parrainage' || r.type === 'bonus_plateforme') {
|
||||
balance += r.cashback || 0;
|
||||
}
|
||||
}
|
||||
for (const inv of allRows) {
|
||||
if (!filteredPlatIds.has(inv.plateforme_id)) continue;
|
||||
if (!inv.date_souscription || (cutoff && inv.date_souscription > cutoff)) continue;
|
||||
balance -= inv.capital_total ?? inv.montant_investi ?? 0;
|
||||
}
|
||||
for (const c of allCorrections) {
|
||||
if (!filteredPlatIds.has(c.plateforme_id)) continue;
|
||||
if (cutoff && c.date > cutoff) continue;
|
||||
balance += c.montant || 0;
|
||||
}
|
||||
return Math.round(balance * 100) / 100;
|
||||
};
|
||||
|
||||
const soldePortefeuille = useMemo(
|
||||
() => computeSoldePortefeuille(selectedYear ? `${selectedYear}-12-31` : null),
|
||||
[allDepots, allRembs, allRows, allCorrections, plats, filteredPlatIds, selectedYear]
|
||||
);
|
||||
const prevSoldePortefeuille = useMemo(
|
||||
() => computeSoldePortefeuille(`${prevYearLabel}-12-31`),
|
||||
[allDepots, allRembs, allRows, allCorrections, plats, filteredPlatIds, prevYearLabel]
|
||||
);
|
||||
|
||||
if (!loading && plats.length === 0) {
|
||||
return (
|
||||
<>
|
||||
@@ -886,7 +933,7 @@ export default function Plateformes() {
|
||||
</div>}
|
||||
|
||||
{/* ── KPIs ── */}
|
||||
{!listFocused && <div className="dr-kpi-row" style={{ gridTemplateColumns: 'repeat(6, 1fr)' }}>
|
||||
{!listFocused && <div className="dr-kpi-row" style={{ gridTemplateColumns: 'repeat(7, 1fr)' }}>
|
||||
|
||||
{/* 1 — Capital investi */}
|
||||
<div className="kpi">
|
||||
@@ -914,7 +961,19 @@ export default function Plateformes() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 3 — Investissements depuis le début */}
|
||||
{/* 3 — Porte-monnaie */}
|
||||
<div className="kpi" title="Cash disponible sur les porte-monnaie des plateformes (hors compte courant)">
|
||||
<div className="label">Porte-monnaie</div>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8, margin: '4px 0 0' }}>
|
||||
<span style={{ fontSize: '1.35rem', fontWeight: 700 }}>{fmtEUR(soldePortefeuille)}</span>
|
||||
<TrendBadge current={soldePortefeuille} prev={prevSoldePortefeuille} />
|
||||
</div>
|
||||
<div style={{ fontSize: '0.8em', color: 'var(--text-muted)', marginTop: 5 }}>
|
||||
{fmtEUR(prevSoldePortefeuille)} en {prevYearLabel}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 4 — Investissements depuis le début */}
|
||||
<div className="kpi">
|
||||
<div className="label">Investissements depuis le début</div>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8, margin: '4px 0 0' }}>
|
||||
@@ -926,7 +985,7 @@ export default function Plateformes() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 4 — Capital remboursé */}
|
||||
{/* 5 — Capital remboursé */}
|
||||
<div className="kpi">
|
||||
<div className="label">Capital remboursé</div>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8, margin: '4px 0 0' }}>
|
||||
@@ -938,7 +997,7 @@ export default function Plateformes() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 5 — Intérêts perçus */}
|
||||
{/* 6 — Intérêts perçus */}
|
||||
<div className="kpi">
|
||||
<div className="label">Intérêts perçus — {netMode ? 'Net' : 'Brut'}</div>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8, margin: '4px 0 0' }}>
|
||||
@@ -955,7 +1014,7 @@ export default function Plateformes() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 6 — XIRR */}
|
||||
{/* 7 — XIRR */}
|
||||
{(() => {
|
||||
const rendement = netMode ? plateformeXirr.net : plateformeXirr.brut;
|
||||
const cutoffLabel = selectedYear ? `31/12/${selectedYear}` : "aujourd'hui";
|
||||
|
||||
Reference in new issue
Block a user