Rapports → Tendances (par catégorie) : analyse de résultat (sections + sous-totaux + résultat net par mois) #256

Closed
opened 2026-07-06 00:00:41 +00:00 by maximus · 1 comment
Owner

Contexte

Suite à #253 (réel-vs-réel = analyse de résultat), appliquer la même présentation au tableau de tendance par catégorie : Rapports → Tendances → sous-vue « Par catégorie », vue Table = CategoryOverTimeTable, alimenté par getCategoryOverTime. Demande utilisateur 2026-07-05.

Adaptation (série temporelle)

Ce tableau a N mois en colonnes (pas 2 périodes), donc pas de bloc 2-lignes fixe. Équivalent fidèle :

  • Sections Revenus → Dépenses → Transferts (income-first) avec sous-totaux par mois + colonne Total.
  • Une ligne « Résultat net » par mois (revenus − dépenses + transferts par colonne), colorée par signe (surplus vert / déficit rouge), qui remplace la ligne « Total » actuelle — laquelle somme aujourd'hui revenus + dépenses + transferts en magnitudes absolues = chiffre sans signification (pathologie corrigée sur le compare).
  • Ligne « Résultat avant transferts » par mois si des transferts existent (miroir du compare).

Différences avec le compare :

  • Les revenus apparaissent déjà ici (pas de filtre amount<0) mais mélangés/non étiquetés → le gain = les sectionner + total correct.
  • Pas de couleur directionnelle par cellule (les cellules sont des niveaux, pas des deltas). Seule la ligne Résultat net est colorée par signe.

Travail

  • reportService.ts getCategoryOverTime : projeter COALESCE(c.type,'expense') AS category_type dans les 2 SELECT (top-N + pivot) et remonter une map types: Record<category, type> sur CategoryOverTimeData (additif, rétro-compatible, calqué sur colors/categoryIds).
  • shared/types : ajouter types à CategoryOverTimeData.
  • CategoryOverTimeTable.tsx : grouper en sections triées par COMPARE_TYPE_ORDER, sous-totaux par mois + colonne Total, ligne Résultat net (+ avant transferts si transferts) par mois, colorée par signe. Réutiliser les clés i18n reports.compare.resultBeforeTransfers/resultNet/totalIncome/totalExpenses/totalTransfers (ou dupliquer sous reports.overTime.*).

Blast radius

getCategoryOverTime alimente aussi le widget Dashboard (useDashboard) et CategoryOverTimeChart. La map types est additive (sûre) ; tout le sectionnement reste dans la table → Dashboard + graphe intacts. Ne pas trier/filtrer côté service.

Fichiers

  • src/services/reportService.tsgetCategoryOverTime (projeter type + map)
  • src/shared/types/index.tsCategoryOverTimeData.types
  • src/components/reports/CategoryOverTimeTable.tsx — sections + sous-totaux + résultat net par mois
  • src/services/reportService.test.ts — tests getCategoryOverTime (shape avec types, assertions strictes ~l.86/115/137)
  • i18n fr/en, CHANGELOG.md/.fr.md

Complexité : Medium

## Contexte Suite à #253 (réel-vs-réel = analyse de résultat), appliquer la même présentation au **tableau de tendance par catégorie** : Rapports → Tendances → sous-vue « Par catégorie », vue Table = `CategoryOverTimeTable`, alimenté par `getCategoryOverTime`. Demande utilisateur 2026-07-05. ## Adaptation (série temporelle) Ce tableau a **N mois en colonnes** (pas 2 périodes), donc pas de bloc 2-lignes fixe. Équivalent fidèle : - **Sections Revenus → Dépenses → Transferts** (income-first) avec **sous-totaux par mois** + colonne Total. - Une **ligne « Résultat net » par mois** (revenus − dépenses + transferts par colonne), colorée par signe (surplus vert / déficit rouge), qui **remplace** la ligne « Total » actuelle — laquelle somme aujourd'hui revenus + dépenses + transferts en magnitudes absolues = **chiffre sans signification** (pathologie corrigée sur le compare). - Ligne « Résultat avant transferts » par mois **si** des transferts existent (miroir du compare). Différences avec le compare : - Les revenus **apparaissent déjà** ici (pas de filtre `amount<0`) mais mélangés/non étiquetés → le gain = les **sectionner** + total correct. - **Pas de couleur directionnelle par cellule** (les cellules sont des niveaux, pas des deltas). Seule la ligne Résultat net est colorée par signe. ## Travail - `reportService.ts` `getCategoryOverTime` : projeter `COALESCE(c.type,'expense') AS category_type` dans les 2 SELECT (top-N + pivot) et remonter une **map `types: Record<category, type>`** sur `CategoryOverTimeData` (additif, rétro-compatible, calqué sur `colors`/`categoryIds`). - `shared/types` : ajouter `types` à `CategoryOverTimeData`. - `CategoryOverTimeTable.tsx` : grouper en sections triées par `COMPARE_TYPE_ORDER`, sous-totaux par mois + colonne Total, ligne Résultat net (+ avant transferts si transferts) par mois, colorée par signe. Réutiliser les clés i18n `reports.compare.resultBeforeTransfers`/`resultNet`/`totalIncome`/`totalExpenses`/`totalTransfers` (ou dupliquer sous `reports.overTime.*`). ## Blast radius `getCategoryOverTime` alimente **aussi** le widget Dashboard (`useDashboard`) et `CategoryOverTimeChart`. La map `types` est **additive** (sûre) ; tout le sectionnement reste **dans la table** → Dashboard + graphe intacts. Ne pas trier/filtrer côté service. ## Fichiers - `src/services/reportService.ts` — `getCategoryOverTime` (projeter type + map) - `src/shared/types/index.ts` — `CategoryOverTimeData.types` - `src/components/reports/CategoryOverTimeTable.tsx` — sections + sous-totaux + résultat net par mois - `src/services/reportService.test.ts` — tests `getCategoryOverTime` (shape avec `types`, assertions strictes ~l.86/115/137) - i18n fr/en, CHANGELOG.md/.fr.md ## Complexité : Medium
maximus added the
status:in-progress
type:feature
source:human
labels 2026-07-06 00:00:41 +00:00
maximus added
status:approved
and removed
status:in-progress
labels 2026-07-06 00:43:56 +00:00
Author
Owner

Livré dans main (merge 4497676, PR #257). Fermée manuellement — même raison que #253.

Livré dans `main` (merge 4497676, PR #257). Fermée manuellement — même raison que #253.
Sign in to join this conversation.
No milestone
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#256
No description provided.