Adds the SQL foundation for the Bilan (balance sheet) feature: - 5 new tables: balance_categories, balance_accounts, balance_snapshots, balance_snapshot_lines, balance_account_transfers - 7 indexes (category, active partial, snapshot, accounts x2, transaction, snapshot_date) - Seed of 7 standard categories (5 simple + 2 priced) marked is_seed=1 - CHECK(currency = 'CAD') on balance_accounts (MVP — v2 lifts the constraint with a multi-currency rate table) - CHECK kind invariants on balance_snapshot_lines (quantity/unit_price both NULL OR both NOT NULL) - FK transaction_id ON DELETE RESTRICT to preserve reproducibility of Modified Dietz returns calculated on past periods Migration v9 is added inline to the lib.rs Vec<Migration> via a new constant database::BALANCE_SCHEMA backed by balance_schema.sql. The schema is mirrored in consolidated_schema.sql so brand-new profiles get the feature preinstalled without replaying v9. 13 new co-located rusqlite tests validate the migration on a fresh in-memory DB: schema applies cleanly, 7 categories seeded with correct kinds, CHECK rejects invalid currency/kind/direction, UNIQUE rejects duplicate snapshot_date / (snapshot_id,account_id) / (transaction_id, account_id), FK CASCADE on snapshot delete, FK RESTRICT on transaction delete and on category with linked accounts, seed idempotent on replay. Refs #138 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 lines
272 B
Rust
4 lines
272 B
Rust
pub const SCHEMA: &str = include_str!("schema.sql");
|
|
pub const SEED_CATEGORIES: &str = include_str!("seed_categories.sql");
|
|
pub const CONSOLIDATED_SCHEMA: &str = include_str!("consolidated_schema.sql");
|
|
pub const BALANCE_SCHEMA: &str = include_str!("balance_schema.sql");
|