refactor(reports): extraire un constructeur d'arbre feuille-driven generique (#260) #263

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

Factoriser buildCompareTree (src/services/reportService.ts:477) en un constructeur d'arbre feuille-driven generique buildLeafDrivenTree<T>, parametre par : payload de feuille, reducer de sous-total, ordre de type income-first, garde anti-cycle MAX_TREE_DEPTH. Refactor behavior-preserving : getCompareMonthOverMonth/getCompareYearOverYear produisent un output identique. Prerequis de #2b (l'arbre des tendances reutilisera ce builder). Choix DRY tranche par Max.

Fichiers concernes

  • src/services/reportService.ts : buildCompareTree:477, getCompareMonthOverMonth:703, getCompareYearOverYear:746
  • Tests compare existants (reportService.test.ts cas compare, compareResults.test.ts) = garde de non-regression

Depends on

  • (aucune)

Criteres d'acceptation

  • getCompareMonthOverMonth / getCompareYearOverYear inchanges (rapport comparable reel-vs-reel identique)
  • Tests compare existants verts sans modification d'assertion (preuve behavior-preserving)
  • La garde MAX_TREE_DEPTH + loop-break est conservee dans le builder generique
  • Build + suite vitest verts, aucune regression

Review caveats

  • 🟡 (Architecture) Extraction choisie malgre le risque de toucher le chemin compare deja shippe ; les tests compare sont la garde. Ne PAS changer le comportement observable de compare.

Decisions prises ce soir

  • Tree-builder generique extrait (DRY), isole en refactor dedie pour rayon d'explosion controle.

Spec source

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

Factoriser `buildCompareTree` (`src/services/reportService.ts:477`) en un constructeur d'arbre feuille-driven **generique** `buildLeafDrivenTree<T>`, parametre par : payload de feuille, reducer de sous-total, ordre de type income-first, garde anti-cycle `MAX_TREE_DEPTH`. Refactor **behavior-preserving** : `getCompareMonthOverMonth`/`getCompareYearOverYear` produisent un output identique. Prerequis de #2b (l'arbre des tendances reutilisera ce builder). Choix DRY tranche par Max. ## Fichiers concernes - `src/services/reportService.ts` : `buildCompareTree:477`, `getCompareMonthOverMonth:703`, `getCompareYearOverYear:746` - Tests compare existants (`reportService.test.ts` cas compare, `compareResults.test.ts`) = garde de non-regression ## Depends on - (aucune) ## Criteres d'acceptation - [ ] `getCompareMonthOverMonth` / `getCompareYearOverYear` inchanges (rapport comparable reel-vs-reel identique) - [ ] Tests compare existants verts **sans modification d'assertion** (preuve behavior-preserving) - [ ] La garde `MAX_TREE_DEPTH` + loop-break est conservee dans le builder generique - [ ] Build + suite vitest verts, aucune regression ## Review caveats - 🟡 (Architecture) Extraction choisie malgre le risque de toucher le chemin compare deja shippe ; les tests compare sont la garde. Ne PAS changer le comportement observable de compare. ## Decisions prises ce soir - Tree-builder generique extrait (DRY), isole en refactor dedie pour rayon d'explosion controle. ## 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:refactor
source:human
labels 2026-07-07 14:55:53 +00:00
maximus added
status:approved
and removed
status:ready
labels 2026-07-08 00:12:02 +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#263
No description provided.