feat: reports hub + highlights panel + detailed highlights page (#71) #90
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#90
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-71-highlights-hub"
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 #71
/reportsdevient un hub affichant un panneau de faits saillants et 4 cartes de navigation vers les sous-rapports.Changements
Service
reportService.getHighlights(windowDays, referenceDate, topMoversLimit, topTransactionsLimit)— SQL strictement paramétré,referenceDateinjectable pour tests déterministes{ currentMonth, netBalanceCurrent, netBalanceYtd, monthlyBalanceSeries[12], topMovers[], topTransactions[] }ORDER BY ABS(delta) DESCORDER BY ABS(amount) DESCHook
useHighlightscomplet avec reducer, loading/error, window-days switchingComposants hub
HubNetBalanceTile— montant formaté + sparkline coloré selon signeHubTopMoversTile— top 3 avec toggle$/%, couleurs + icônes ArrowUp/DownHubTopTransactionsTile— top 5 condenséHubHighlightsPanel— layout 4-col responsiveHubReportNavCard— carte de navigation react-routerLink, préserve la query stringHub
/reportsPageHelp+PeriodSelectorglobal +HubHighlightsPanel+ grille de 4HubReportNavCardPage détaillée
/reports/highlightsHighlightsTopMoversTabletriable (catégorie, précédent, courant, Δ$, Δ%)HighlightsTopMoversChart— BarChart horizontal Recharts centré sur 0,ChartPatternDefs+getPatternFillHighlightsTopTransactionsList— liste 10 items avec toggle 30/60/90 joursViewModeToggleavecstorageKey=reports-viewmode-highlightsi18n
reports.hub.*Description,reports.highlights.*en FR et ENTests
getHighlights: profil vide, paramétrisation SQL, fenêtre 60 jours, calcul deltas, zéro-previousnpm test✅ 42/42npm run build✅cargo check✅Review — APPROVE
Sécurité ✅
parameterises every query with no inlined strings)getHighlightsacceptereferenceDatecomme string — mais injecté uniquement viadb.select(sql, params)(jamais concaténé){tx.description}), troncature viatruncateCSSIntl.NumberFormatcôté affichage, pas de concat manuelleCorrectness ✅
shiftMonthStart(refIso, -11)→ début inclusif, test couvre la borne2026-05→2026-04ABS(amount)en filtrantamount < 0(expenses only) — cohérent avec la sémantique "top hausse"deltaPct = nullquandprevious = 0— test dédié vérifiereports.empty.noDatasi pas de donnéesLink to=/reports/...${preserveSearch}` → la query string de période est préservée entre hub et sous-pages ✅Qualité ✅
npm run build✅npm test✅ 42/42 (5 nouveaux pourgetHighlights)cargo check✅Hub*,Highlights*)chartPatterns.tsxPoints non-bloquants
HubReportNavCardutilisewindow.location.searchpour préserver la query : dépend de SSR absent, OK pour Tauri desktopnetBalanceCurrent= "Ce mois-ci" est today-relative (ignore le sélecteur de période) — décision cohérente avec la spec mockup mais peut surprendre ; documenté implicitement par le nom des clés i18nuseReports→ legacy vraiment orphelin en attente de #72/#73/#74 ; ok avec plan de sprint (suppression en #76)Ready to merge.