feat(reports): getCategoryOverTime -> arbre tendances (sidecar id-keyed) + resultats (#260) #264

Closed
opened 2026-07-07 14:55:53 +00:00 by maximus · 0 comments
Owner

Ajouter a getCategoryOverTime un champ hierarchique tree: OverTimeRow[] cle-par-id, construit via le builder generique (#2a), feuille-driven income-first, sans top-N ni bucket Other. Approche sidecar (resolution des 3 critiques review) : le pivot par mois (data/categories/colors/types) reste INCHANGE pour le chart + le dashboard. computeOverTimeResults consomme l'arbre id-keyed (sous-totaux + Resultat calcules sur les feuilles). Le chart conserve un cap top-N sur la serie pivot.

Fichiers concernes

  • src/services/reportService.ts : getCategoryOverTime:71-193 (ajouter tree, retirer LIMIT 50 + bucket Other du chemin arbre)
  • src/shared/types/index.ts : CategoryOverTimeData:370-377 + nouveau OverTimeRow (champs snake_case parent_id/is_parent/depth/category_type + monthly[], comme CategoryDelta)
  • src/services/overTimeResults.ts : computeOverTimeResults:63 consomme l'arbre id-keyed ; corriger le commentaire perime :8-9 (income-first depuis #253)
  • src/components/reports/CategoryOverTimeChart.tsx : garder le pivot, appliquer/garder un cap top-N feuilles (pas d'explosion de series)
  • src/services/reportService.test.ts : reecrire les assertions topN/Other (elles encodent le comportement supprime)
  • src/services/overTimeResults.test.ts + tests de regression

Depends on

Criteres d'acceptation

  • tree id-keyed, parent-first depth-first, income-first, sans LIMIT/Other
  • Deux categories homonymes de types differents ne collisionnent PAS (Resultat net correct) — test de regression dedie
  • Sous-totaux + Resultat avant/net calcules sur les feuilles (jamais les parents) — test
  • Le pivot data.data reste INCHANGE : chart Trends et dashboard (DashboardPage.tsx:142) rendent a l'identique — verifie
  • Le chart reste borne (cap top-N), pas 80+ series empilees
  • Garde MAX_TREE_DEPTH + test cycle parent_id A->B->A
  • SQL parametre (pas d'interpolation), build + suite verts

Review caveats

  • 🔴 (Technique/Archi) Dashboard = consommateur partage du service+type+chart ; le sidecar preserve son comportement -> verifier DashboardPage:142 identique.
  • 🔴 (Securite) id-keying obligatoire : le pivot cle-par-nom corromprait le Resultat net sur homonymes une fois le LIMIT retire.
  • 🟡 (Technique) Le flux de l'arbre doit etre depth-first parent-first type-contigu (requis par le collapse en #3).
  • 🟡 (Archi) OverTimeRow reprend les champs snake_case de CategoryDelta pour composer avec collapsibleRows/useCollapsibleGroups sans friction.

Decisions prises ce soir

  • Toutes les categories (pas de top-N cote tableau) ; chart garde son cap ; sidecar (pivot intact + arbre id-keyed).

Spec source

spec-plan-tendances-hierarchiques.md (milestone overnight-2026-07-08-tendances-hierarchiques)

Ajouter a `getCategoryOverTime` un champ hierarchique `tree: OverTimeRow[]` **cle-par-id**, construit via le builder generique (#2a), feuille-driven income-first, **sans top-N ni bucket Other**. **Approche sidecar** (resolution des 3 critiques review) : le pivot par mois (`data`/`categories`/`colors`/`types`) reste **INCHANGE** pour le chart + le dashboard. `computeOverTimeResults` consomme l'arbre id-keyed (sous-totaux + Resultat calcules sur les feuilles). Le chart conserve un cap top-N sur la serie pivot. ## Fichiers concernes - `src/services/reportService.ts` : `getCategoryOverTime:71-193` (ajouter `tree`, retirer LIMIT 50 + bucket Other du chemin arbre) - `src/shared/types/index.ts` : `CategoryOverTimeData:370-377` + nouveau `OverTimeRow` (champs snake_case `parent_id`/`is_parent`/`depth`/`category_type` + `monthly[]`, comme `CategoryDelta`) - `src/services/overTimeResults.ts` : `computeOverTimeResults:63` consomme l'arbre id-keyed ; corriger le commentaire perime `:8-9` (income-first depuis #253) - `src/components/reports/CategoryOverTimeChart.tsx` : garder le pivot, appliquer/garder un cap top-N feuilles (pas d'explosion de series) - `src/services/reportService.test.ts` : reecrire les assertions topN/Other (elles encodent le comportement supprime) - `src/services/overTimeResults.test.ts` + tests de regression ## Depends on - #263 ## Criteres d'acceptation - [ ] `tree` id-keyed, parent-first depth-first, income-first, sans LIMIT/Other - [ ] Deux categories homonymes de types differents ne collisionnent PAS (Resultat net correct) — test de regression dedie - [ ] Sous-totaux + Resultat avant/net calcules sur les feuilles (jamais les parents) — test - [ ] Le pivot `data.data` reste INCHANGE : chart Trends **et** dashboard (`DashboardPage.tsx:142`) rendent a l'identique — verifie - [ ] Le chart reste borne (cap top-N), pas 80+ series empilees - [ ] Garde `MAX_TREE_DEPTH` + test cycle `parent_id` A->B->A - [ ] SQL parametre (pas d'interpolation), build + suite verts ## Review caveats - 🔴 (Technique/Archi) Dashboard = consommateur partage du service+type+chart ; le sidecar preserve son comportement -> **verifier DashboardPage:142 identique**. - 🔴 (Securite) id-keying obligatoire : le pivot cle-par-nom corromprait le Resultat net sur homonymes une fois le LIMIT retire. - 🟡 (Technique) Le flux de l'arbre doit etre depth-first parent-first type-contigu (requis par le collapse en #3). - 🟡 (Archi) `OverTimeRow` reprend les champs snake_case de `CategoryDelta` pour composer avec `collapsibleRows`/`useCollapsibleGroups` sans friction. ## Decisions prises ce soir - Toutes les categories (pas de top-N cote tableau) ; chart garde son cap ; sidecar (pivot intact + arbre id-keyed). ## Spec source spec-plan-tendances-hierarchiques.md (milestone overnight-2026-07-08-tendances-hierarchiques)
maximus added this to the overnight-2026-07-08-tendances-hierarchiques milestone 2026-07-07 14:55:53 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-07-07 14:55:53 +00:00
maximus added
status:approved
and removed
status:ready
labels 2026-07-08 00:18:50 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#264
No description provided.