feat: compare report — MoM / YoY / Actual vs Budget (#73) #92
No reviewers
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#92
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-73-compare"
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?
Fixes #73
Rapport
/reports/compareavec 3 modes accessibles via un tab bar secondaire.Services (SQL strictement paramétrés)
getCompareMonthOverMonth(year, month)— expense totals par catégorie, mois cible vs mois précédent,ORDER BY ABS(delta) DESCgetCompareYearOverYear(year)— même logique sur 12 mois vs 12 moisgetBudgetVsActualDataréutilisé tel quel (pas de nouveau service)Types
CategoryDeltapartagé ;HighlightMoverdevient un aliasHook
useComparetodeuseReportsPeriod(bookmarkable)CompareBudgetView)Composants
CompareModeTabs— tab bar tri-étatComparePeriodTable— tableau avec coloration signée du deltaComparePeriodChart— diverging bar chart horizontal Recharts centré sur 0 +ChartPatternDefsCompareBudgetView— wrapper autour deBudgetVsActualTableexistant, charge les données pour la ciblePage
ReportsComparePagecomplète avecPeriodSelector+CompareModeTabs+ViewModeToggle(storage keyreports-viewmode-compare), masqué en mode budgeti18n
reports.compare.modeMoM / modeYoY / modeBudgetFR + EN, parité OKTests
npm run build✅npm test✅ 46/46 (4 nouveaux : boundary params, wrap janvier, conversion delta, YoY span)cargo check✅Review — APPROVE
Sécurité ✅
2026'dans les SQL et la présence des placeholders$N)${year}dans les requêtes — seuls les helpers JS manipulent les strings avant de les passer en paramsCorrectness ✅
deltaPct = nullquand previous=0 (évite division par zéro) — test dédiéuseComparesynchronise year/month depuis letodeuseReportsPeriod→ bookmarkable via URLORDER BY ABS(delta) DESC→ plus gros mouvements en têteQualité ✅
npm run build✅npm test✅ 46/46cargo check✅Compare*)Non-bloquant
CompareBudgetViewcharge ses données séparément (hook skip budget mode) — trade-off acceptableReady to merge.