feat(reports): adopt shared FilterPanel on Compare and Budget #284
No reviewers
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
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#284
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-276-adopt-compare-budget"
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?
Resolves #276
Generated autonomously by /autopilot run of 2026-07-11
Summary
<FilterPanel>onReportsComparePage(temporal slot = existingCompareReferenceMonthPicker) andBudgetPage(temporal slot = existingYearNavigator) — temporal model unchanged on both pages.useComparenow fetchesaccountIdsfromuseReportsPeriodand threads it intogetCompareMonthOverMonth/getCompareYearOverYear; fetches the account checkbox list viagetAllImportSources(same pattern asuseTrends/#275).CompareBudgetView(the Compare page's budget sub-tab) accepts a newaccountIdsprop and threads it intogetBudgetVsActualData— this closes the gap flagged in the issue's review caveat, where this sub-tab silently ignored the filter while the rest of the page respected it.useBudgetnow fetchesaccountIdsand its own account list the same way, and threadsaccountIdsinto everyrefreshDatacall site (initial load + all 6 post-mutation refreshes).Decision (MEDIUM ambiguity) — Budget's data source
The issue's acceptance criterion says: "Budget : accountIds passe a getBudgetVsActualData (via useBudget)".
useBudgetnever callsgetBudgetVsActualData— that function is exclusive toCompareBudgetView, the Dashboard, and the Cartes report.useBudget's only real-transactions fetch isgetActualTotalsForYear(year - 1), which populates the grid's previous-year reference column.Decided: extend
getActualTotalsForYearwith the same optionalaccountIds?: number[]pass-through pattern#273already established on the other 7 services (one-line change, forwards to the existinggetActualsByCategoryRangehelper it already calls internally). This makes the Budget page's actual reference data respect the filter, which is the evident intent, without inventing an unrelated call to a differently-shaped service (BudgetVsActualRow, single-month+YTD) that has no consumer in the Budget grid'sBudgetYearRowmodel.Rejected alternative: wire a literal
getBudgetVsActualDatacall intouseBudgetjust to match the issue text verbatim — rejected because it would fetch data in an incompatible shape unused byBudgetTable, and would require restructuring the Budget grid's rendering, which the issue explicitly keeps unchanged (temporal model unchanged; the Budget-page restructure to an income-statement grid is separate scope, tracked under epic #260/M2 per STATE.md).Test plan
npm run build(tsc + vite) greennpm test— 788 -> 791 (3 new regression tests forgetActualTotalsForYear's accountIds pass-through, mirroring the existinggetBudgetVsActualDatatests), zero regressionsaccountIds) is byte-identical to pre-#276 behavior on both pages (regression-tested at the service layer; UI wiring mirrors the #275 Trends adoption exactly)Caveat for reviewer
See the "Decision" section above re:
getActualTotalsForYearvs. the issue's literalgetBudgetVsActualDatawording for the Budget page./pr-review— PR #284 · feat(reports): adopt shared FilterPanel on Compare and BudgetVerdict : APPROVE
Adoption mécanique et fidèle du
FilterPanelpartagé sur les pages Comparaison et Budget, calquée sur le pattern #275 (Tendances) déjà mergé.accountIdscircule correctement depuis l'état URL mémoïsé jusqu'à des effets à dépendances stables (aucune boucle de rendu), le pass-through service préserve le comportement byte-identique sans filtre, et le trou signalé dans le caveat de #275 (CompareBudgetViewignorait le filtre) est refermé.Vérifié
accountIdsestuseMemo'd sur le param URLsources→ référence stable ; les nouveauxuseEffect([…, accountIds])deuseCompare/useBudgetne se relancent que sur un vrai changement de sélection.fetch(useCompare) etrefreshData(useBudget) ont des deps[]→ stables. Aucun risque de fetch infini.getActualTotalsForYear(year-1, ids)= une ligne versgetActualsByCategoryRangeexistant ;inPlaceholders(ids, 3)renvoienullpourundefined/[]→ la requête sans filtre reste byte-identique. Placeholders à partir de$3→ cohérent avec les nouveaux tests (source_id IN ($3, $4), params[…, 4, 9]). Seul appelant degetActualTotalsForYear=useBudget→ param optionnel rétrocompatible.useCompare.test.tsn'exerce que les helpers purs → insensible au nouvel effetgetAllImportSourceset au 3ᵉ argument service.useBudgetn'expose pasrefreshData→ son changement de signature est purement interne. 3 tests de régression ajoutés (788→791), expectations internes cohérentes avecinPlaceholders.FilterPanelrespecté sur les 2 sites d'appel ; les 2 rendus de page sont bien formés. La restructurationshowActualControls(Comparaison) préserve le comportement antérieur (sélecteur de mois de référence toujours visible ; sous-mode + vue seulement en modeactual). Aucune nouvelle chaîne user-facing (réutilise les clés de #274). CHANGELOG FR+EN sous [Unreleased],architecture.mdà jour.Notes non bloquantes
FilterPanelcouvre visuellement toute la grille, mais seule la colonne de référence « actuals année précédente » réagit (les montants budgétés ne sont pas rattachés à un compte). C'est la sémantique correcte et c'est clairement documenté (corps de PR + CHANGELOG) ; la refonte Budget→état de résultat est déférée à l'épic #260/M2. À revisiter en M2 : le filtre devrait-il paraître plus complet ici.getAllImportSources) dispatchSET_ERRORsur le même champerrorque le fetch principal → un hoquet de liste de comptes remonterait en erreur de page même si le rapport a chargé. Faible sévérité, identique au pattern #275/useTrendsdéjà mergé ; isolable plus tard.issue-275-adopt-trends, pasmain→check.ymln'a jamais tourné sur ce maillon ; le build vert / 791 tests = run local de l'auteur. Conformément à la guidance stacked-PR : valider le tip cumulé en local (tsc && vite build,vitest run,cargo check/test) avant de merger la pile.La décision d'étendre
getActualTotalsForYearplutôt que de câbler un appel littéral àgetBudgetVsActualDataest le bon choix — elle filtre la seule donnée de transactions réelles que la grille Budget consomme réellement, sans introduire un fetch inutilisé de forme incompatible.Merged into
mainvia local fast-forward (commitfe9ae01) as a linear stack. Forgejo doesn't flag non-API merges as merged; closing manually.Pull request closed