docs(reports/cartes): document and surface savings-rate formula #102
Labels
No labels
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#102
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Suite à l'analyse post-sprint (2026-04-19), 3 des 5 tâches originales de cette issue ont été livrées dans #101 (tooltip, i18n
savingsRateTooltip, fallbackincome=0→ "—"). Cette issue est re-scopée pour couvrir la décision produit restante et la documentation.Les règles Saisonnalité et le bug Budget Adherence (
#112) ont été identifiés pendant la même analyse.Scope révisé
1. Toggle Mensuel / YTD sur les 4 KPI cards
Ajouter un toggle segmenté « Mensuel · YTD » en haut de
/reports/cartes, juste à côté duCompareReferenceMonthPicker. Le toggle s'applique aux 4 KpiCard (Revenus, Dépenses, Solde net, Taux d'épargne) :(revenus YTD − dépenses YTD) / revenus YTD × 100.En mode YTD, les deltas sont recalculés pour la cohérence avec
/reports/compare(décision prise pour #104) :Les sparklines restent 13 mois dans les deux modes (ce qui change, c'est le point "current" affiché).
2. Persistance du toggle
Dans
localStoragesous la cléreports-cartes-period-mode. Valeurs acceptées :"month"|"ytd". Défaut :"month".3. Mise à jour du tooltip i18n
reports.cartes.savingsRateTooltipdoit refléter les deux modes. Option :reports.cartes.savingsRateTooltip.month= "Formule : (revenus − dépenses) ÷ revenus × 100, calculée sur le mois de référence."reports.cartes.savingsRateTooltip.ytd= "Formule : (revenus YTD − dépenses YTD) ÷ revenus YTD × 100, cumul depuis le 1er janvier."4. Documentation utilisateur
Ajouter une section « Cartes (KPI) » dans
docs/guide-utilisateur.mdsous la section Rapports. Doit couvrir :Fichiers concernés
src/pages/ReportsCartesPage.tsx— insérer le toggle, passer le mode au hooksrc/hooks/useCartes.ts— state du mode, persistance localStorage, relecture au mountsrc/services/reportService.ts—getCartesSnapshotaccepte un paramètremode: "month" | "ytd", calcule les agrégats YTD côté serveur (réutiliser la logique éprouvée degetCompareMonthOverMonthpour les fenêtres cumulatives)src/shared/types/index.ts—CartesKpiPeriodModetype, pas de changement àCartesKpi(la sémantique decurrentabsorbe simplement la valeur choisie)src/components/reports/cards/KpiCard.tsx— accepter un tooltip dynamique par modesrc/i18n/locales/{fr,en}.json— clésreports.cartes.periodMode.*+ tooltip par modedocs/guide-utilisateur.md— nouvelle section CartesCHANGELOG.md+CHANGELOG.fr.md— entréeAdded/Ajoutésrc/services/reportService.cartes.test.ts— ajouter des fixtures YTDSurface de test
src/services/reportService.cartes.test.ts(13 tests),src/hooks/useCartes.test.ts(3 tests).nullsirevenusYTD = 0Critères d'acceptation
Mensuel · YTDvisible à côté duCompareReferenceMonthPickerdans/reports/cartes.localStorageet relue au mount.docs/guide-utilisateur.mdavec les règles de Saisonnalité et les formules.npm run buildetnpm test -- --runpassent.Complexité
Medium — un peu de SQL pour les agrégats YTD, mais les patterns existent déjà dans
getCompareMonthOverMonth(fenêtres Jan→refMonth). Le reste est du plumbing UI + docs.Hors scope
monthBudget > 0→ traité séparément dans #112.