Correctif Calcul porte-monnaie
This commit is contained in:
1 parent
b43754fe19
commit
7ee011de09
3 files changed
+96
-134
No files matched your search
@@ -299,6 +299,11 @@ export default function Plateformes() {
|
||||
const [allDepots, setAllDepots] = useState([]);
|
||||
const [allCorrections, setAllCorrections] = useState([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
// Snapshots backend du solde porte-monnaie par plateforme, clé 'live' ou 'YYYY-12-31'
|
||||
// (GET /dashboard[?asOf=]) — remplace le recalcul client historique de
|
||||
// computeSoldePortefeuille, cf. dashDataAsOf dans DepotsRetraits.jsx et mémoire
|
||||
// project_taxreport_interets_plateforme (source unique de vérité).
|
||||
const [dashDataAsOf, setDashDataAsOf] = useState({});
|
||||
|
||||
/* ── État sélecteurs ── */
|
||||
/* selectedPlatName et activeTab sont dans l'URL pour survivre au retour arrière */
|
||||
@@ -379,6 +384,22 @@ export default function Plateformes() {
|
||||
|
||||
useEffect(() => { load(); /* eslint-disable-next-line */ }, [activeId, activeView]);
|
||||
|
||||
// Snapshots backend du solde porte-monnaie : 'live' (aucune coupure) + l'année
|
||||
// sélectionnée (si filtre actif) + l'année précédente (toujours nécessaire pour
|
||||
// le TrendBadge). Même endpoint que DepotsRetraits.jsx (GET /dashboard[?asOf=]).
|
||||
useEffect(() => {
|
||||
if (!activeId && activeView !== 'all') return;
|
||||
const scopeParams = activeView === 'all' ? { scope: 'all' } : undefined;
|
||||
const prevYear = selectedYear ? Number(selectedYear) - 1 : new Date().getFullYear() - 1;
|
||||
const keys = new Set(['live', `${prevYear}-12-31`]);
|
||||
if (selectedYear) keys.add(`${selectedYear}-12-31`);
|
||||
Promise.all([...keys].map(k =>
|
||||
api.get('/dashboard', { ...scopeParams, ...(k === 'live' ? {} : { asOf: k }) }).then(d => [k, d])
|
||||
)).then(entries => {
|
||||
setDashDataAsOf(prev => ({ ...prev, ...Object.fromEntries(entries) }));
|
||||
}).catch(e => console.error('dashDataAsOf load error (Plateformes):', e));
|
||||
}, [selectedYear, activeView, activeId]); // eslint-disable-line
|
||||
|
||||
/* ── Section "Mois en cours" (DrillCellPanel) — saisie/édition de remboursements ── */
|
||||
const [drillRefreshKey, setDrillRefreshKey] = useState(0);
|
||||
const [rembModalOpen, setRembModalOpen] = useState(false);
|
||||
@@ -827,53 +848,23 @@ 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;
|
||||
} else if (r.type === 'interets_plateforme') {
|
||||
balance += r.net_recu || 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;
|
||||
/* ── Solde porte-monnaie (source unique : GET /dashboard[?asOf=], cf. dashboard.js) ──
|
||||
Snapshot backend filtré sur la sélection plateforme(s)/détenteur (filteredPlatIds). */
|
||||
const soldeFromSnapshot = (snap) => {
|
||||
if (!snap) return null;
|
||||
const total = (snap.cashByPlatform ?? [])
|
||||
.filter(c => filteredPlatIds.has(c.plateforme_id))
|
||||
.reduce((s, c) => s + (c.solde_portefeuille ?? 0), 0);
|
||||
return Math.round(total * 100) / 100;
|
||||
};
|
||||
|
||||
const soldePortefeuille = useMemo(
|
||||
() => computeSoldePortefeuille(selectedYear ? `${selectedYear}-12-31` : null),
|
||||
[allDepots, allRembs, allRows, allCorrections, plats, filteredPlatIds, selectedYear]
|
||||
() => soldeFromSnapshot(dashDataAsOf[selectedYear ? `${selectedYear}-12-31` : 'live']),
|
||||
[dashDataAsOf, filteredPlatIds, selectedYear]
|
||||
);
|
||||
const prevSoldePortefeuille = useMemo(
|
||||
() => computeSoldePortefeuille(`${prevYearLabel}-12-31`),
|
||||
[allDepots, allRembs, allRows, allCorrections, plats, filteredPlatIds, prevYearLabel]
|
||||
() => soldeFromSnapshot(dashDataAsOf[`${prevYearLabel}-12-31`]),
|
||||
[dashDataAsOf, filteredPlatIds, prevYearLabel]
|
||||
);
|
||||
|
||||
/* ══════════════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in new issue
Block a user