feat(reports): CategoryOverTimeTable hierarchique + collapse + resultat interleave (#265) #269
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#269
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-265-overtime-hierarchy"
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 #265
Generated autonomously by /autopilot run of 2026-07-07
Base: #264 (sidecar tree).
Renders the trends-by-category table (
CategoryOverTimeTable) as a hierarchical, collapsible income statement — parity withComparePeriodTable.What
depthoff the #264 id-keyed tree; top-level parents show a chevron + their own subtotal.useCollapsibleGroups+collapsibleRows(reused from #254), keyed by category id, collapsed by default, with an expand-all / collapse-all button. State persisted under a dedicated keyreports-trends-expanded(distinct fromreports-compare-expanded).Result before transfersnow sits between the non-transfer sections and the transfers section (was at the bottom);Net resultstays the bottom line.computeOverTimeResultsover the raw tree, never the visible rows.How
overTimeTableModel.ts:groupOverTimeSections(analysis, tree)(full-hierarchy sections + transfer split) +OVERTIME_COLLAPSE_ACCESSORS+ storage key. Keeps the component thin and unit-testable (this repo has no React render harness).overTimeResults.tsleft untouched (its 9 tests unchanged) — grouping happens in the component, mirroringComparePeriodTable, rather than widening the reducer's leaves-only sections.Tests / build
overTimeTableModel.test.ts(hierarchy grouping, collapsed-by-default, Paie/revenue visible after expand, result interleave split, totals-invariant).npm run buildgreen, 728 vitest green (720 baseline + 8), no regressions.reports.collapse.*/reports.compare.*). CHANGELOG bilingual under Unreleased.Decisions
overTimeResults.ts+ its tests byte-identical (zero baseline regression) and confines changes to #265's scoped files.ComparePeriodTable) — out of #265 scope; parents render on top in natural tree order./pr-reviewPR #269 — feat(reports): CategoryOverTimeTable hiérarchique + collapse + résultat interleave (#265)Verdict : APPROVE ✅
PR empilée (base
issue-264-overtime-tree, review head-vs-base). Le tableau de tendances par catégorie reprend fidèlement le pattern hiérarchie + collapse déjà éprouvé surComparePeriodTable. Aucun blocage.Ce qui est solide
Résultat avant transfertsetRésultat netproviennent tous decomputeOverTimeResults(data)sur l'arbre brut, jamais des lignes visibles.overTimeResults.tsreste inchangé (ses 9 tests intacts) — le regroupement full-hierarchy vit dans le nouveau module puroverTimeTableModel.ts, exactement comme le faitComparePeriodTable.Résultat avant transfertspasse entre les sections non-transfert et la section transferts (avant : sous la section transferts), et n'apparaît que sihasTransfers— parité stricte avec le compare. Le net reste la ligne du bas. Les chiffres ne changent pas : seule la présentation (hiérarchie + collapse + déplacement du before-transfers) évolue vs l'ancien rendu.groupOverTimeSectionspilote l'ordre et les sous-totaux paranalysis.sections(donc identiques au réducteur), et n'ajoute que les lignes parentes depuisdata.tree. L'arbre étant déjà trié income→expense→transfer en profondeur d'abord,visibleRowsreçoit bien des sous-arbres contigus.overTimeTableModel.test.tssont arithmétiquement corrects (income 6500, expense 3300, before 3200, net 3600) et couvrent : split hiérarchique ordonné, sous-totaux leaf-summed non double-comptés, section vide droppée, collapsed-by-default, révélation de Paie après expand, invariance des résultats.reports-trends-expanded(distincte dereports-compare-expanded), hook appelé avant l'early-return (ordre stable), aucune string i18n nouvelle (toutes réutilisées et présentes dansen.json/fr.json), aucune migration DB, aucun artefact de debug (.only/.skip/console/TODOabsents), CHANGELOG bilingue sous[Unreleased]/[Non publié].Suggestions non bloquantes
renderResultRowsanskey(CategoryOverTimeTable.tsx). La version parité deComparePeriodTableposekey={labelKey}sur le<tr>. Ici sans effet (ce sont des enfants standalone de<tbody>, pas des éléments d'un.map→ pas de warning React), mais ajouter la clé alignerait exactement sur la référence.typeOfdupliqué verbatim entreoverTimeResults.tsetoverTimeTableModel.ts. Exporter le helper du réducteur éviterait la duplication. Trivial.Notes (informatives, hors périmètre)
issue-264-overtime-tree), donccheck.ymln'a pas tourné sur cette PR. Valider le tip cumulé en local (build + vitest + cargo) avant de merger la pile. Le corps de PR rapporte build vert + 728 vitest localement.category_type— hypothèse pré-existante de l'ordre de l'arbre, non introduite ici.Review générée via
/pr-review.Mergée localement dans
main(pile #266/#267/#268/#269, tipfe87313). Fermée manuellement — merge local d'une pile stackée (l'API merge Forgejo échoue sur les bases non-main), tip cumulé validé build + 728 vitest verts.Pull request closed