CREATE TABLE IF NOT EXISTS ledger_reconciliation_sessions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id TEXT NOT NULL, account_number TEXT NOT NULL, period TEXT NOT NULL, fiscal_year INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'open', bank_balance NUMERIC(19, 4), ledger_balance NUMERIC(19, 4), difference NUMERIC(19, 4), trace_id UUID NOT NULL, metadata JSONB NOT NULL DEFAULT '{}', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), completed_at TIMESTAMPTZ ); CREATE INDEX idx_recon_sessions_tenant ON ledger_reconciliation_sessions(tenant_id); CREATE INDEX idx_recon_sessions_account ON ledger_reconciliation_sessions(account_number); CREATE INDEX idx_recon_sessions_period ON ledger_reconciliation_sessions(period, fiscal_year); CREATE INDEX idx_recon_sessions_status ON ledger_reconciliation_sessions(status); CREATE TABLE IF NOT EXISTS ledger_reconciliation_matches ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), session_id UUID NOT NULL REFERENCES ledger_reconciliation_sessions(id) ON DELETE CASCADE, transaction_id TEXT NOT NULL, entry_id UUID NOT NULL, line_account TEXT NOT NULL, match_type TEXT NOT NULL DEFAULT 'manual', confidence NUMERIC(5, 4), matched_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), matched_by TEXT ); CREATE INDEX idx_recon_matches_session ON ledger_reconciliation_matches(session_id); CREATE INDEX idx_recon_matches_txn ON ledger_reconciliation_matches(transaction_id); CREATE INDEX idx_recon_matches_entry ON ledger_reconciliation_matches(entry_id); CREATE TABLE IF NOT EXISTS ledger_bank_transactions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), session_id UUID REFERENCES ledger_reconciliation_sessions(id) ON DELETE SET NULL, transaction_id TEXT NOT NULL UNIQUE, transaction_date DATE NOT NULL, description TEXT, amount NUMERIC(19, 4) NOT NULL, currency TEXT NOT NULL DEFAULT 'SEK', reference TEXT, matched_entry_id TEXT, account_number TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_bank_txn_session ON ledger_bank_transactions(session_id); CREATE INDEX idx_bank_txn_matched ON ledger_bank_transactions(matched_entry_id); CREATE INDEX idx_bank_txn_account ON ledger_bank_transactions(account_number); CREATE TABLE IF NOT EXISTS ledger_audit_log ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), table_name TEXT NOT NULL, record_id TEXT NOT NULL, action TEXT NOT NULL, old_values JSONB, new_values JSONB, changed_by TEXT NOT NULL, changed_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX idx_audit_table ON ledger_audit_log(table_name, record_id); CREATE INDEX idx_audit_changed_at ON ledger_audit_log(changed_at);