|
All checks were successful
PR Check — Rust / rust (pull_request) Successful in 9m27s
`import_sources` carried only the mechanical CSV settings. The two fields that decide how an amount is READ -- `amount_mode` and `sign_convention` -- lived only on `import_config_templates`. That asymmetry is the root bug of this chantier: restoring a saved source re-inferred the mode from the mapping and hardcoded `signConvention: "negative_expense"` (useImportWizard.ts:321-323), so a source configured with positive expenses silently flipped back on its second import. After v17 both tables carry the same eight format fields. v17 is strictly additive -- v1 to v16 are untouched, and the diff is pure insertion. The four columns are defaulted or nullable so the ALTERs are safe on a populated database: - amount_mode / sign_convention carry a CHECK, same pattern as v15 on balance_accounts.kind. amount_mode admits 'absolute_indicator' from the start so the third amount mode ships without another migration, while the database still refuses a corrupted value today. - header_signature stores the normalized header labels seen at the last successful import, for drift detection. - template_id is a provenance tag only, never re-read as format: the eight source columns are authoritative, so editing a template changes no linked source. ON DELETE SET NULL keeps the source and its format when a template goes. The backfill reproduces exactly the rule the wizard applied on the fly, so no source changes behaviour on migration. It tests `column_mapping LIKE '%debitAmount%'` rather than json_extract, so the migration depends on no JSON1 extension in the bundled SQLite. sign_convention is deliberately not backfilled: its DEFAULT restores precisely the value the code hardcoded, the only past convention that can be inferred. The four columns are mirrored into consolidated_schema.sql. They are inert there on the production path -- that script runs after every migration and only uses CREATE TABLE IF NOT EXISTS, so new profiles receive them from v17 -- but it stays the tested reference definition, and a parity test now compares it against the v1->v17 chain column by column, DEFAULT by DEFAULT, CHECK by CHECK and FK by FK. Both halves of that test were mutation-checked to confirm they fail on drift. 5 new tests (111 Rust total): v17 on a populated v16 database with a child row, the backfill against 5 mapping shapes, the CHECKs, the provenance-tag semantics, and the consolidated parity. Resolves #323 |
||
|---|---|---|
| .. | ||
| capabilities | ||
| icons | ||
| src | ||
| .gitignore | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| tauri.conf.json | ||