feat(balance): add asset_type column to balance_categories #170
No reviewers
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#170
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-169-asset-type-balance-categories"
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?
Summary
Adds an explicit
asset_typecolumn ('stock' | 'crypto') tobalance_categoriesso PriceFetchControl can route to the right provider without symbol heuristics. Closes the schema gap flagged inreports/DAILY-REPORT-2026-04-27.md(PR #167 hardcoded'stock'because the schema didn't expose stock-vs-crypto).Changes
src-tauri/src/lib.rs— additiveALTER TABLE+ backfill for the two priced seeds. Touches no v9 SQL (checksum preserved).consolidated_schema.sql— column + seed values for fresh profiles.BalanceAssetTypealias,asset_typefield onBalanceCategoryandcategory_asset_typeonBalanceAccountWithCategory. Service validates priced creation requires asset_type and coerces simple kind to NULL.kind = priced, blocks submit until picked, resets on kind switch.account.category_asset_type; hides PriceFetchControl when NULL on a priced row (legacy custom rows). Both TODO references removed.balance.category.assetType.*(FR + EN).[Unreleased] / Addedentry.Test plan
cargo test --lib— 69 passed (4 new v10 migration tests: column add, seed backfill, legacy row stays NULL, CHECK rejects invalid value)npm test— 3701 passed (6 new vitest cases on createBalanceCategory + listBalanceAccounts SELECT assertion)npx tsc --noEmit— cleannpm run build— clean (vite build + tsc)Notes
src/commands/return_calculator.rs - line 12is unrelated (introduced in commitc9cdb5a).cargo test --libis green;cargo test --docis broken onmainalready.@testing-library/react+ jsdom (consistent with PR #167 / autopilot decisions). The render guard is a one-line boolean expression — covered by manual QA.UpdateBalanceCategoryInputacceptsasset_typeso a future issue can add the UI without touching the service.Fixes #169
Priced balance categories now carry an explicit `asset_type` ('stock' | 'crypto') so PriceFetchControl can route to the right provider without symbol heuristics. ETH = Ethan Allen NYSE AND Ethereum crypto are no longer ambiguous. Migration v10 adds a nullable column and backfills the two seeded priced categories (key='stock','crypto'). Legacy custom priced rows stay NULL until the user edits the category — SnapshotLineRow hides the price-fetch button when asset_type is NULL on a priced row, so manual entry remains available. Service-side validation rejects priced creation without asset_type ('asset_type_required') and rejects values outside ('stock','crypto') ('asset_type_invalid'). Simple kind coerces asset_type to NULL. The CategoryVariant of AccountForm shows the selector only when kind=priced, requires it on submit, and resets it on kind switch. i18n keys added under balance.category.assetType.* (FR + EN). Tests: - 4 new Rust migration tests in lib.rs (column add, seed backfill, legacy row stays NULL, CHECK rejects 'gold') - 6 new vitest cases on createBalanceCategory + listBalanceAccounts asserts c.asset_type AS category_asset_type in the join - balance-flow integration test updated to pass asset_type='stock' No new test for SnapshotLineRow render guard — project lacks @testing-library/react + jsdom; the guard is one boolean expression covered by manual QA per autopilot decisions in PR #167. Fixes #169Verdict — APPROVE
Summary — Migration v10 additive impeccable, validation en triple défense (UI bloque submit → service
normalizeAssetTypeForKind→ SQL CHECK), suppression des deux TODO et du hardcode"stock"dansSnapshotLineRow. Tests Rust (4 cas) et TS (6 cas) couvrent les chemins critiques.Points vérifiés
is_seed = 1(les rangées custom restent NULL — comportement attendu et testé).consolidated_schema.sql: convergent avec v10 (nouveaux profils ↔ profils migrés produisent le même état).normalizeAssetTypeForKindcoerce simple→NULL et exige priced. Codes d'erreur typés (asset_type_required,asset_type_invalid).AccountForm:handleKindChangeresetasset_typeau switch priced→simple, submit bloqué tant que asset_type manquant sur priced.SnapshotLineRow: guardaccount.category_asset_typecache PriceFetchControl sur lignes legacy NULL. Plus de hardcode.listBalanceAccounts: SELECT threadc.asset_type AS category_asset_type, type TypeScript aligné.balance.category.assetType.*.Suggestions non-bloquantes
src/services/balance.service.ts:614-619— le JSDoc deUpdateBalanceCategoryInput.asset_typedit "The service rejects an explicitnullwhen the existing kind is priced". C'est exact, mais le mot "rejects" est un peu ambigu — ça lève en réalitéBalanceServiceError("asset_type_required"). Préciser le code d'erreur dans le commentaire aiderait à la découvrabilité.Edit-category UI — la PR mentionne (à raison) qu'il n'y a pas de UI d'édition pour les catégories. Le service est prêt (
UpdateBalanceCategoryInput.asset_typeaccepté), donc tracker une issue de suivi pour permettre aux utilisateurs de remplir le NULL sur leurs lignes legacy custom (sinon elles restent en saisie manuelle pour toujours).Doctest cassé sur main — bien noté dans la PR. Le pré-existant
cargo test --docsurreturn_calculator.rs:12n'est pas dans le scope. À adresser dans une PR séparée.LGTM, merge quand tu veux.