feat(budget) : adopter le repli multi-niveaux sur la grille Budget #293
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#293
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-289-budget-collapse"
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 #289
Stacks on #292 (issue #288's collapse socle) — base is
issue-288-collapse-socle, NOTmain. Review/merge #292 first.Summary
useCollapsibleGroupssocle with accessors declared inline (nobudgetTableModel.ts).sumLeavesForTypeon the raw group, so folding is purely visual;STORAGE_KEYrenamed tobudget-subtotals-positionto decouple from the real-vs-budget report.buildBudgetYearRowsfromuseBudgetand pinned its level-order (BFS) emission with a regression test — the invariant the abandoned v1 collapse plan got wrong.Build clean (0 TS errors), 828 vitest pass,
cargo checkclean.Generated autonomously by /autopilot run of 2026-07-15
Review PR #293 —
feat(budget): repli multi-niveaux sur la grille BudgetVerdict : APPROVE ✅
Résumé
Implémentation fidèle de l'issue #289. La grille Budget adopte le repli multi-niveaux via le socle #288 (
useCollapsibleGroups+ remontée d'ancêtres), avec extraction pure debuildBudgetYearRowshors deuseBudgetet un test qui verrouille l'invariant d'ordre par niveau (BFS). Aucun point bloquant.Revue statique adversariale (
git showsans checkout ; tip9c325e2vs base48adb3d).Correction
buildBudgetYearRowsbehavior-preserving — le corps déplacé est identique à l'ancien bloc inline deuseBudget; le site d'appelbuildBudgetYearRows(allCategories, entries, prevYearActuals)reçoit exactement les mêmes variables, etTYPE_ORDER(module scope) reste en portée.renderTypeSectioncalculesumLeavesForType(group, type)sur le groupe brut ; seul le rendu des lignes passe pargroups.visible(group).sumLeavesForTypeest strictement équivalent à l'ancien calcul fait-main : signe appliqué àmonths/annual, pas àpreviousYearTotal(déjà signé en base). Idemresults = computeBudgetResults(rows)surrowsbrut. Replier ne déplace jamais un total.category_idque son parent) ne clobbe pas le sous-total dans la map (visibleRowsn'indexe que lesisParent) et est masquée avec son parent viaparentKeyOf. Le toggle n'est câblé que sur les lignes parentes ;groupCount/collapsibleKeysne comptent que les parents → pas de double comptage ni de faux chevron.Tests
useBudget.test.tsverrouillent exactement les invariants exigés par #289 : ordre BFS ([10,1,3,2,4,5]), cascade de repli ([10,1]tout replié →[10,1,3,2]après dépliage d'une racine, petits-enfants toujours masqués sous l'intermédiaire replié), et sous-totaux sur lignes brutes (-1150brut vs0visible). Tracés à la main sur la fixture : corrects.buildBudgetYearRowsdepuis./useBudgetsuit le précédent établi (useCompare.test.ts+ 9 autres tests de hooks service-backed dans la même suite node) → le chargement du module ne casse pas en env node.Category/BudgetEntry/BudgetYearRow, champs requis tous fournis) → pas d'erreur tsc attendue.Qualité / conformité au plan #289
BUDGET_COLLAPSE_ACCESSORS+BUDGET_EXPANDED_KEY), pas debudgetTableModel.ts— comme mandaté.budget-subtotals-position≠subtotals-position(encore utilisé parBudgetVsActualTable).reports.collapse.expandAll/.collapseAll(présents FR+EN) ; le diff ne touche aucun fichier de locale. Persistance viauser_preferences(requêtes paramétrées, clés constantes) — aucune migration DB, pas d'injection.Suggestions (non bloquantes)
issue-288-collapse-socle, pasmain→check.ymln'a pas tourné dessus (gap CI des piles). Valider le tip cumulé en local (tsc && vite build,vitest run,cargo check) avant de merger #292 puis #293.Mergé en fast-forward dans
main(pile #292→#295), commit9c325e2. Forgejo ne détecte pas le merge local → fermeture manuelle. L'issue liée s'est auto-fermée viaResolves #N.Pull request closed