Skip to main content

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"] et orderBy: { date: "desc" } sur la fenêtre date <= (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 :

  1. Tous les snapshots des 12 derniers mois sont chargés, triés par date.
  2. Un Map<date, Map<accountId, balance>> est construit (un point par compte par jour).
  3. Pour chaque jour (trié chronologiquement), les soldes connus sont mis à jour dans lastKnown.
  4. 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 les days derniers jours.
  • Groupe par category (valeur "Autre" si null).
  • 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 periodJours
1 mois1M30
3 mois3M90
6 mois6M180
1 an1A365
ToutALL

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

Voir aussi