[feat] Plomber le filtre multi-comptes (accountIds[], IN(...)) dans 7 services #273

Closed
opened 2026-07-09 00:37:56 +00:00 by maximus · 0 comments
Owner

Uniformiser 7 services de rapports sur un filtre compte optionnel accountIds?: number[] avec clause SQL parametree source_id IN (...). Additif → aucune regression sans filtre. Epic #260.

Fichiers concernes

  • src/services/reportService.ts (getCompareMonthOverMonth, getCompareYearOverYear, getCartesSnapshot @:1221 + appels internes @:1236-1237, getMonthlyTrends @:32, getCategoryOverTime @:76)
  • src/services/budgetService.ts (getBudgetVsActualData)
  • src/services/dashboardService.ts (getExpensesByCategory @:57)
  • fichiers de test correspondants (call-sites scalaires a mettre a jour)

Depends on

  • (aucune)

Criteres d'acceptation

  • Les 7 services acceptent accountIds?: number[] optionnel
  • Nouveaux params : getCompareMonthOverMonth, getCompareYearOverYear, getBudgetVsActualData, getCartesSnapshot (+ passe aux 2 appels internes)
  • Changement de signature scalaire→pluriel : getMonthlyTrends, getCategoryOverTime, getExpensesByCategory (sourceId?: numberaccountIds?: number[])
  • SQL parametre : un placeholder lie par id (IN ($n, $n+1, ...)), jamais de join(',') de valeurs ; clause ajoutee seulement si accountIds.length > 0
  • Defaut vide/omis → resultats byte-identiques (test de regression sur chaque service)
  • Grep + mise a jour des call-sites scalaires des 3 services changes (tests inclus) ; verifier aucun appelant de prod orphelin
  • build + npm test verts

Review caveats

  • 🔴 (Securite/Archi/Tech) : scalaire→pluriel = vrai changement de signature, pas un simple « brancher » (les 3 prenaient sourceId?: number, = $N).
  • 🟡 (Securite, CWE-89) : accountIds viennent de l'URL (I1) → valider entiers + placeholders lies, jamais concatener.
  • 🔴 (Securite) : getCartesSnapshot DOIT etre inclus, sinon le dashboard converti (I7) ignore le filtre silencieusement.

Decisions prises

  • Aucun precedent IN ($1,$2) dans le codebase (que des IN (SELECT...)) → etablir le pattern parametre propre ici.

Spec source

spec-plan-rapports-uniformes-suite.md

Uniformiser 7 services de rapports sur un filtre compte optionnel `accountIds?: number[]` avec clause SQL **parametree** `source_id IN (...)`. Additif → aucune regression sans filtre. Epic #260. ## Fichiers concernes - `src/services/reportService.ts` (`getCompareMonthOverMonth`, `getCompareYearOverYear`, `getCartesSnapshot` @:1221 + appels internes @:1236-1237, `getMonthlyTrends` @:32, `getCategoryOverTime` @:76) - `src/services/budgetService.ts` (`getBudgetVsActualData`) - `src/services/dashboardService.ts` (`getExpensesByCategory` @:57) - fichiers de test correspondants (call-sites scalaires a mettre a jour) ## Depends on - (aucune) ## Criteres d'acceptation - [ ] Les 7 services acceptent `accountIds?: number[]` optionnel - [ ] **Nouveaux** params : `getCompareMonthOverMonth`, `getCompareYearOverYear`, `getBudgetVsActualData`, `getCartesSnapshot` (+ passe aux 2 appels internes) - [ ] **Changement de signature** scalaire→pluriel : `getMonthlyTrends`, `getCategoryOverTime`, `getExpensesByCategory` (`sourceId?: number` → `accountIds?: number[]`) - [ ] SQL parametre : un placeholder lie **par id** (`IN ($n, $n+1, ...)`), jamais de `join(',')` de valeurs ; clause ajoutee seulement si `accountIds.length > 0` - [ ] Defaut vide/omis → resultats **byte-identiques** (test de regression sur chaque service) - [ ] Grep + mise a jour des call-sites scalaires des 3 services changes (tests inclus) ; verifier aucun appelant de prod orphelin - [ ] build + `npm test` verts ## Review caveats - 🔴 (Securite/Archi/Tech) : scalaire→pluriel = vrai changement de signature, pas un simple « brancher » (les 3 prenaient `sourceId?: number`, `= $N`). - 🟡 (Securite, CWE-89) : `accountIds` viennent de l'URL (I1) → valider entiers + placeholders lies, jamais concatener. - 🔴 (Securite) : `getCartesSnapshot` DOIT etre inclus, sinon le dashboard converti (I7) ignore le filtre silencieusement. ## Decisions prises - Aucun precedent `IN ($1,$2)` dans le codebase (que des `IN (SELECT...)`) → etablir le pattern parametre propre ici. ## Spec source spec-plan-rapports-uniformes-suite.md
maximus added this to the overnight-2026-07-08-filtres-fondation milestone 2026-07-09 00:37:56 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-07-09 00:37:56 +00:00
maximus added
status:review
and removed
status:ready
labels 2026-07-11 19:16:16 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-07-11 20:16:10 +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#273
No description provided.