feat(balance): add asset_type column to balance_categories #169
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#169
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Ajouter une colonne explicite
asset_type(stock|crypto) àbalance_categoriespour permettre àPriceFetchControlde router vers le bon provider (best-effort Yahoo pour les actions, exchanges directs pour la crypto). Supprimer le fallback hardcodé'stock'dans le wiring deSnapshotEditPage(TODO posé dans PR #167 / issue #158).Why
Les symboles seuls ne suffisent pas à déterminer le type d'actif. Collisions réelles :
ETH= Ethan Allen Interiors (NYSE) ET Ethereum (crypto)MARA= Marathon Digital Holdings (NASDAQ) ET d'autres tickersLINK= un titre minier ET Chainlink (crypto)Aucune heuristique (préfixe, suffixe d'exchange, casse) ne disambigue de façon fiable. Il faut stocker le type explicitement.
Fichiers concernés
Schema (migration v10)
src-tauri/src/lib.rs— ajouter migrationversion: 10après la v9 :Nullable car non pertinent pour
kind = 'simple'. Pourkind = 'priced', l'application l'exige côté form (validation TS) ; pas de CHECK SQL conditionnel pour rester simple.src-tauri/src/database/balance_schema.sql— ajouter la colonne dansCREATE TABLE balance_categories.src-tauri/src/database/consolidated_schema.sql— idem (utilisé pour les nouveaux profils, doit refléter le schema cumulatif).src-tauri/src/database/balance_schema.sql(seedINSERT OR IGNORE) — mettre à jour les 2 lignes priced pour inclure la valeur deasset_type.Form de création/édition de catégorie
src/components/balance/CategoryForm.tsxou une variante danssrc/components/categories/. Issue #140 a livré ce variant en milestone bilan ; vérifier le nom exact.asset_type(radio ou dropdown) avec deux options :stock,crypto. Visible et requis uniquement quandkind === 'priced'. i18n keys :balance.category.assetType.label(FR « Type d'actif » / EN "Asset type")balance.category.assetType.stock(FR « Action » / EN "Stock")balance.category.assetType.crypto(FR « Crypto » / EN "Crypto")balance.category.assetType.required(FR « Sélectionne le type d'actif » / EN "Select an asset type")Service / hook
src/hooks/useBalanceCategories.ts(ou équivalent) — étendre le typeBalanceCategoryavecasset_type: 'stock' | 'crypto' | null.asset_typeest non-null sikind === 'priced'. Reject sinon avec une clé d'erreur i18n.Wiring dans le snapshot editor
src/components/balance/SnapshotLineRow.tsx(ou le fichier qui rend<PriceFetchControl ... />) — supprimer le// TODO: read asset_type from category schemaet le hardcoded'stock'. Lirecategory.asset_typedirectement. Si null pour une catégorie priced (rows pré-migration ou edge case), masquer le control (return null) plutôt que de tenter un fetch dans un type indéfini.Scope
lib.rsbalance_schema.sqletconsolidated_schema.sqlsynchronisésasset_typeBalanceCategoryétendu (asset_typechamp)balance.category.assetType.*)SnapshotLineRow(ou équivalent) litcategory.asset_type; supprime le TODO + hardcoded[Unreleased] / AddedCritères d'acceptation
cargo testmigrations vert (incluant un test de backfill)npm testtous vertstsc --noEmitclean// TODO: asset_typerestant dans le codeDécisions à prendre pendant l'implémentation
CHECK(kind != 'priced' OR asset_type IS NOT NULL)est techniquement faisable mais empêcherait les UPDATE séquentiels). On valide côté TS.Spec source
reports/DAILY-REPORT-2026-04-27.md— section « Needs-clarification », point 1.ADR 0011 (Providers best-effort Yahoo) — confirme la séparation stock/crypto pour les providers.
Depends on
maximus referenced this issue2026-05-04 00:38:30 +00:00