Règles — Formules Analytics
BR-ANALYTICS-001 — Net worth courant [CALC]
totalCurrent = Σ accounts[isActive=true].snapshots[last].balance
Seuls les comptes isActive = true sont inclus. Le "dernier snapshot" est celui avec la date la plus récente (triés desc, take: 1). Les comptes sans snapshot comptent pour 0.
BR-ANALYTICS-002 — Variation sur 30 jours [CALC]
totalLastMonth = Σ dernier snapshot connu par compte avant (now - 30j)
variationAmount = totalCurrent - totalLastMonth
variationPct = (variationAmount / totalLastMonth) × 100
- Si
totalLastMonth = 0,variationPct = 0(pas de division par zéro). - Le "dernier snapshot connu avant 30j" est calculé avec
distinct: ["accountId"]etorderBy: { date: "desc" }sur la fenêtredate <= (now - 30 jours).
BR-ANALYTICS-003 — Algorithme forward-fill du graphique [CALC]
Le graphique d'évolution sur 1 an reconstruit une série quotidienne à partir des snapshots :
- Tous les snapshots des 12 derniers mois sont chargés, triés par date.
- Un
Map<date, Map<accountId, balance>>est construit (un point par compte par jour). - Pour chaque jour (trié chronologiquement), les soldes connus sont mis à jour dans
lastKnown. - Le total du jour =
Σ lastKnown.values().
Ce forward-fill signifie que si un compte n'a pas de snapshot un jour donné, son dernier solde connu est reconduit automatiquement.
BR-ANALYTICS-004 — Exclusion des transferts internes [APP]
Toutes les fonctions analytics excluent les transactions isInternal = true :
where: { ..., isInternal: false }
Cela évite de compter un même transfert deux fois (une fois en débit sur le compte source, une fois en crédit sur le compte cible).
BR-ANALYTICS-005 — Flux mensuels [CALC]
getMonthlyFlows(months, accountId?) agrège les transactions non-internes par mois calendaire :
pour chaque transaction (isInternal=false, date >= now - months mois) :
si amount > 0 → credits[mois] += amount
si amount < 0 → debits[mois] += |amount|
net[mois] = credits[mois] - debits[mois]
Les mois sans transactions n'apparaissent pas dans le résultat (pas de padding de zéros).
BR-ANALYTICS-006 — Répartition par catégorie [CALC]
getCategoryBreakdown(days, accountId?) :
- Ne considère que les débits (
amount < 0) non-internes sur lesdaysderniers jours. - Groupe par
category(valeur"Autre"sinull). - Retourne les top 8 catégories triées par montant décroissant.
- Calcule le pourcentage de chaque catégorie sur le total des débits de la période.
pct[cat] = total[cat] / Σ total[toutes catégories] × 100
BR-ANALYTICS-007 — Périodes standards [APP]
Les filtres de période des transactions utilisent ces valeurs fixes :
| Libellé | Valeur period | Jours |
|---|---|---|
| 1 mois | 1M | 30 |
| 3 mois | 3M | 90 |
| 6 mois | 6M | 180 |
| 1 an | 1A | 365 |
| Tout | ALL | — |
La date de référence est now au moment de l'appel (pas minuit, pas début de mois).
BR-ANALYTICS-008 — Résumé de transactions [CALC]
getTransactionsSummary() retourne une vue agrégée des transactions filtrées (excluant isInternal=true) :
credits = Σ amount[amount > 0]
debits = Σ amount[amount < 0] (valeur négative)
net = Σ amount[tous]
count = nombre de transactions