feat(balance): starter accounts seedes + ADR pour modele a 2 niveaux (vehicule x composition) #179

Closed
opened 2026-05-01 01:28:36 +00:00 by maximus · 0 comments
Owner

Description

Le user demande des comptes de depart pour rendre l'onboarding du Bilan plus intuitif. Aussi, suggestion d'un modele a 2 niveaux (vehicule x composition) - capturee en ADR Proposed pour reflexion future.

Approche

Partie 1 - Starter accounts pour NOUVEAUX profils

Etendre src-tauri/src/database/consolidated_schema.sql pour ajouter 4 INSERT INTO balance_accounts apres les categories seedees:

Nom Categorie (key) Kind
Compte cheque cash simple
CELI tfsa simple
REER rrsp simple
Compte non-enregistre other simple

PAS de colonne is_seed ajoutee. Les comptes seedes sont des comptes ordinaires apres creation: l'utilisateur peut les renommer / archiver / supprimer librement.

i18n: les libelles UTILISES en BDD sont en francais (langue par defaut). Si l'utilisateur change la langue, les noms restent francais (comme tous les comptes utilisateur).

Partie 2 - Pop-up de proposition pour PROFILS EXISTANTS

Sur /balance au premier load post-migration, si user_preferences.balance_starter_proposed est absent ET balance_accounts est vide ou ne contient pas la totalite des starters, afficher un modal StarterAccountsModal:

  • Liste les 4 starters avec checkbox cochee par defaut
  • Pour chaque starter, valider la collision: si un compte existe avec le meme nom (case-insensitive trim) ET la meme categorie -> checkbox desactivee + tooltip "Deja present"
  • CTAs: "Ajouter les comptes selectionnes" (insertion atomique) et "Plus tard" (dismiss)
  • Quel que soit le clic (confirmer ou dismiss), ecrire user_preferences.balance_starter_proposed = {shown_at: ISO, accepted: <ids[]>} -> ne reapparait JAMAIS

Partie 3 - ADR 0011 (modele 2 niveaux)

Creer docs/adr/0011-balance-two-level-model.md (statut: Proposed):

  • Contexte: limitation actuelle (categories plates: TFSA et stock siblings au lieu de stocks DANS un TFSA)
  • Proposition: balance_vehicles (parent: bank/TFSA/RRSP/non-registered) + balance_compositions (child: cash/stock/bond/crypto). Snapshot lines deviennent (vehicle_id, composition_id, value).
  • Alternatives: tagging multi-axes; sous-comptes; status quo
  • Impact: migration v11+ massive, refonte UI complete
  • Decision: Proposed - pas implemente avant V1 stable du Bilan actuel
  • Lier depuis docs/architecture.md section Bilan

Fichiers concernes

  • src-tauri/src/database/consolidated_schema.sql - INSERT INTO balance_accounts pour les 4 starters (apres categories seedees)
  • src-tauri/src/database/balance_schema.sql - PAS modifie (les migrations v9 ne re-insertent pas les comptes pour les profils existants; c'est le pop-up qui le fait)
  • src/components/balance/StarterAccountsModal.tsx - nouveau composant modal
  • src/components/balance/StarterAccountsModal.test.tsx - tests (dismiss, confirmation, collision)
  • src/pages/BalancePage.tsx - logique d'affichage du modal au premier load
  • src/services/balance.service.ts - helper proposeStarterAccounts(selectedKeys) qui insere les comptes selectionnes en transaction (BEGIN/COMMIT pattern existant)
  • src/services/balance.service.test.ts - tests collision insensible-casse + categorie
  • src/services/preferences.service.ts (si existe) ou getDb direct - cle balance_starter_proposed
  • src/i18n/locales/fr.json + en.json - cles balance.starters.*
  • docs/adr/0011-balance-two-level-model.md - nouvel ADR Proposed
  • docs/architecture.md - lien vers ADR 0011 + mention des starters
  • CHANGELOG.md + CHANGELOG.fr.md - section Added

Depends on

  • #178 (eviter conflit sur BalancePage.tsx, i18n, architecture.md, CHANGELOG)

Criteres d'acceptation

  • Nouveau profil cree -> /balance/accounts liste les 4 starters (Compte cheque, CELI, REER, Compte non-enregistre)
  • Profil existant sans la cle balance_starter_proposed -> modal apparait sur premier visit /balance
  • Modal affiche 4 checkboxes cochees par defaut
  • Collision (nom case-insensitive + categorie) -> checkbox desactivee avec tooltip "Deja present"
  • Confirm avec 2 starters selectionnes -> 2 INSERT en BDD, modal ferme, cle ecrite
  • Dismiss "Plus tard" -> aucun INSERT, modal ferme, cle ecrite avec accepted=[]
  • Modal NE REAPPARAIT PAS apres dismiss/confirm (verification via cle)
  • Test regression: profil sans starters + cle existante -> pas de modal
  • ADR 0011 cree avec statut "Proposed", reference dans architecture.md
  • Tous les textes UI passent par i18n (FR + EN)
  • cargo check + npm test + npm run build verts
  • Entree CHANGELOG sous [Unreleased] -> Added (FR + EN)

Decisions prises ce soir

  • 4 starters: Compte cheque (cash), CELI (tfsa), REER (rrsp), Compte non-enregistre (other), tous kind=simple
  • Pas de colonne is_seed (les starters sont des comptes ordinaires)
  • Profils existants: pop-up de proposition au premier visit /balance, dismissable
  • Persistance dismiss: cle balance_starter_proposed = {shown_at, accepted: []} dans user_preferences (per-profile, jamais reaffiche)
  • Collision: match insensible casse + meme categorie -> disable la case correspondante
  • Insertion: transaction (BEGIN/COMMIT) pour atomicite (pattern existant)
  • ADR 0011 inclus dans cette issue (statut Proposed, pas de code)
  • Tests de regression OBLIGATOIRES: collision rule, dismiss persistence, double-show prevention

Spec source

spec-plan-bilan-anomalies-174.md

## Description Le user demande des comptes de depart pour rendre l'onboarding du Bilan plus intuitif. Aussi, suggestion d'un modele a 2 niveaux (vehicule x composition) - capturee en ADR Proposed pour reflexion future. ## Approche ### Partie 1 - Starter accounts pour NOUVEAUX profils Etendre `src-tauri/src/database/consolidated_schema.sql` pour ajouter 4 INSERT INTO `balance_accounts` apres les categories seedees: | Nom | Categorie (key) | Kind | |-----|-----------------|------| | Compte cheque | cash | simple | | CELI | tfsa | simple | | REER | rrsp | simple | | Compte non-enregistre | other | simple | PAS de colonne `is_seed` ajoutee. Les comptes seedes sont des comptes ordinaires apres creation: l'utilisateur peut les renommer / archiver / supprimer librement. i18n: les libelles UTILISES en BDD sont en francais (langue par defaut). Si l'utilisateur change la langue, les noms restent francais (comme tous les comptes utilisateur). ### Partie 2 - Pop-up de proposition pour PROFILS EXISTANTS Sur `/balance` au premier load post-migration, si `user_preferences.balance_starter_proposed` est absent ET `balance_accounts` est vide ou ne contient pas la totalite des starters, afficher un modal `StarterAccountsModal`: - Liste les 4 starters avec checkbox cochee par defaut - Pour chaque starter, valider la collision: si un compte existe avec le meme nom (case-insensitive trim) ET la meme categorie -> checkbox desactivee + tooltip "Deja present" - CTAs: "Ajouter les comptes selectionnes" (insertion atomique) et "Plus tard" (dismiss) - Quel que soit le clic (confirmer ou dismiss), ecrire `user_preferences.balance_starter_proposed = {shown_at: ISO, accepted: <ids[]>}` -> ne reapparait JAMAIS ### Partie 3 - ADR 0011 (modele 2 niveaux) Creer `docs/adr/0011-balance-two-level-model.md` (statut: Proposed): - Contexte: limitation actuelle (categories plates: TFSA et stock siblings au lieu de stocks DANS un TFSA) - Proposition: `balance_vehicles` (parent: bank/TFSA/RRSP/non-registered) + `balance_compositions` (child: cash/stock/bond/crypto). Snapshot lines deviennent (vehicle_id, composition_id, value). - Alternatives: tagging multi-axes; sous-comptes; status quo - Impact: migration v11+ massive, refonte UI complete - Decision: **Proposed** - pas implemente avant V1 stable du Bilan actuel - Lier depuis `docs/architecture.md` section Bilan ## Fichiers concernes - `src-tauri/src/database/consolidated_schema.sql` - INSERT INTO balance_accounts pour les 4 starters (apres categories seedees) - `src-tauri/src/database/balance_schema.sql` - PAS modifie (les migrations v9 ne re-insertent pas les comptes pour les profils existants; c'est le pop-up qui le fait) - `src/components/balance/StarterAccountsModal.tsx` - nouveau composant modal - `src/components/balance/StarterAccountsModal.test.tsx` - tests (dismiss, confirmation, collision) - `src/pages/BalancePage.tsx` - logique d'affichage du modal au premier load - `src/services/balance.service.ts` - helper `proposeStarterAccounts(selectedKeys)` qui insere les comptes selectionnes en transaction (BEGIN/COMMIT pattern existant) - `src/services/balance.service.test.ts` - tests collision insensible-casse + categorie - `src/services/preferences.service.ts` (si existe) ou getDb direct - cle `balance_starter_proposed` - `src/i18n/locales/fr.json` + `en.json` - cles `balance.starters.*` - `docs/adr/0011-balance-two-level-model.md` - nouvel ADR Proposed - `docs/architecture.md` - lien vers ADR 0011 + mention des starters - `CHANGELOG.md` + `CHANGELOG.fr.md` - section Added ## Depends on - #178 (eviter conflit sur BalancePage.tsx, i18n, architecture.md, CHANGELOG) ## Criteres d'acceptation - [ ] Nouveau profil cree -> `/balance/accounts` liste les 4 starters (Compte cheque, CELI, REER, Compte non-enregistre) - [ ] Profil existant sans la cle `balance_starter_proposed` -> modal apparait sur premier visit /balance - [ ] Modal affiche 4 checkboxes cochees par defaut - [ ] Collision (nom case-insensitive + categorie) -> checkbox desactivee avec tooltip "Deja present" - [ ] Confirm avec 2 starters selectionnes -> 2 INSERT en BDD, modal ferme, cle ecrite - [ ] Dismiss "Plus tard" -> aucun INSERT, modal ferme, cle ecrite avec accepted=[] - [ ] Modal NE REAPPARAIT PAS apres dismiss/confirm (verification via cle) - [ ] Test regression: profil sans starters + cle existante -> pas de modal - [ ] ADR 0011 cree avec statut "Proposed", reference dans `architecture.md` - [ ] Tous les textes UI passent par i18n (FR + EN) - [ ] `cargo check` + `npm test` + `npm run build` verts - [ ] Entree CHANGELOG sous `[Unreleased]` -> `Added` (FR + EN) ## Decisions prises ce soir - 4 starters: Compte cheque (cash), CELI (tfsa), REER (rrsp), Compte non-enregistre (other), tous kind=simple - Pas de colonne `is_seed` (les starters sont des comptes ordinaires) - Profils existants: pop-up de proposition au premier visit /balance, dismissable - Persistance dismiss: cle `balance_starter_proposed = {shown_at, accepted: []}` dans user_preferences (per-profile, jamais reaffiche) - Collision: match insensible casse + meme categorie -> disable la case correspondante - Insertion: transaction (BEGIN/COMMIT) pour atomicite (pattern existant) - ADR 0011 inclus dans cette issue (statut Proposed, pas de code) - Tests de regression OBLIGATOIRES: collision rule, dismiss persistence, double-show prevention ## Spec source spec-plan-bilan-anomalies-174.md
maximus added this to the overnight-2026-05-01-bilan-anomalies-174 milestone 2026-05-01 01:28:36 +00:00
maximus added the
source:human
status:ready
type:feature
labels 2026-05-01 01:28:37 +00:00
maximus added
status:approved
autopilot:pending-human
and removed
status:ready
labels 2026-05-02 16:00:08 +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#179
No description provided.