schema: migration v17 — le format d'import complet sur import_sources #323
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#323
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?
Refs:
spec-decisions-import-csv-format.md+spec-plan-import-csv-format.md(racine du repo).Contexte
import_sourcesne porte niamount_modenisign_convention(src-tauri/src/database/consolidated_schema.sql:8-20). Ces deux champs n'existent que surimport_config_templates(:147-159). C'est cette asymetrie qui cause le bug racine du chantier :useImportWizard.ts:323ecritsignConvention: "negative_expense"en dur a la restauration d'une source, et une source reglee en montants positifs revient au defaut inverse au deuxieme import.Cette issue pose le socle de donnees. Elle ne change aucun comportement observable : le backfill reproduit exactement la regle appliquee aujourd'hui a la volee.
Taches
src-tauri/src/lib.rs, sur le modele des v14/v15 :ALTER TABLE import_sources ADD COLUMN amount_mode TEXT NOT NULL DEFAULT 'single';ALTER TABLE import_sources ADD COLUMN sign_convention TEXT NOT NULL DEFAULT 'negative_expense';ALTER TABLE import_sources ADD COLUMN header_signature TEXT;ALTER TABLE import_sources ADD COLUMN template_id INTEGER REFERENCES import_config_templates(id) ON DELETE SET NULL;UPDATE import_sources SET amount_mode = 'debit_credit' WHERE column_mapping LIKE '%debitAmount%';consolidated_schema.sql(nouveaux profils)V17_SQLcote tests, sur le patternV13_SQLaV16_SQLdebitAmount->debit_credit, sans ->single)Points d'attention
CHECKsuramount_mode, contrairement au pattern de la v15 surbalance_accounts.kind. Ecart assume et decide : le troisieme mode de montant (montant absolu + colonne indicateurD/C) est hors scope mais doit pouvoir etre ajoute sans migration.LIKE '%debitAmount%'et nonjson_extract, pour ne dependre d'aucune extension JSON1 dans le SQLite embarque.Criteres d'acceptation
cargo testvert, migrations v1-v16 intactesRevision /review-spec — 2026-08-13
Corrections a appliquer, issues de la revue 3 experts :
CHECK(decision tranchee, revise le corps ci-dessus) :amount_mode TEXT NOT NULL DEFAULT 'single' CHECK (amount_mode IN ('single','debit_credit','absolute_indicator'))sign_convention TEXT NOT NULL DEFAULT 'negative_expense' CHECK (sign_convention IN ('negative_expense','positive_expense'))La valeur
absolute_indicatorest admise d'emblee : le 3e mode reste ajoutable sans migration, et la base oppose quand meme une garantie a une valeur corrompue.template_idest une etiquette de provenance — jamais relue comme format. Les huit colonnes de la source font foi.get_new_profile_init_sqls'execute APRES toutes les migrations et le script n'utilise queCREATE TABLE IF NOT EXISTS, donc les colonnes ajoutees la sont inertes en production. Les nouveaux profils les recoivent de la v17 seule ; le miroir sert au test de parite.V10_SQL..V16_SQLsont des copies manuelles ; les checksums ne vivent qu'au runtime dans_sqlx_migrations). La verifier revient a : chaines SQL v1-v16 absentes du diff +V17_SQLapplique sur une base v16 peuplee.DEFAULT,CHECK), sur le modele deconsolidated_schema_has_holdings_tables_and_kind_at_parity(lib.rs:2824).Depends on #326
Fichiers concernes
src-tauri/src/lib.rs— migration v17 + constanteV17_SQL+ testssrc-tauri/src/database/consolidated_schema.sql— miroir des 4 colonnes (definition de reference testee)Decisions prises en planification
formatToRow/formatFromRowetmapRowvivent danssrc/utils/importFormat.ts— meme dossier queamountParser,dateParseretcsvAutoDetect, qui portent deja la logique pure du domaine. Les types restent danssrc/shared/types/.deleteImportWithTransactionspuis re-import. Ne jamais muter des montants deja ecrits.spec-decisions-import-csv-format.mdetspec-plan-import-csv-format.mdsont committees a la racine (force-add, precedent PR #295) : elles sont lisibles depuis un worktree.Spec source
spec-plan-import-csv-format.md+spec-decisions-import-csv-format.md(racine du repo, committees).