From 48735bbb4ac9f03f138366ab348f279f6251a770 Mon Sep 17 00:00:00 2001 From: Justin Ko Date: Sun, 13 Sep 2026 13:55:49 +0900 Subject: [PATCH] fix(portfolio): align corporate action schema definitions --- .../20260913_0031_corporate_actions.py | 4 +++ app/repositories/postgres.py | 29 ++++++++++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/app/db/alembic/versions/20260913_0031_corporate_actions.py b/app/db/alembic/versions/20260913_0031_corporate_actions.py index 6b529ff..538d3ba 100644 --- a/app/db/alembic/versions/20260913_0031_corporate_actions.py +++ b/app/db/alembic/versions/20260913_0031_corporate_actions.py @@ -22,6 +22,10 @@ def upgrade() -> None: profit_buffer NUMERIC(20,8) NOT NULL, ledger_entry_id BIGINT, UNIQUE (portfolio_id, idempotency_key) )""")) + op.get_bind().execute(text( + "CREATE INDEX IF NOT EXISTS idx_corporate_actions_portfolio " + "ON portfolio_corporate_actions (portfolio_id, effective_date)" + )) def downgrade() -> None: op.get_bind().execute(text("DROP TABLE IF EXISTS portfolio_corporate_actions")) diff --git a/app/repositories/postgres.py b/app/repositories/postgres.py index c08de64..c50e85e 100644 --- a/app/repositories/postgres.py +++ b/app/repositories/postgres.py @@ -336,16 +336,25 @@ class PostgresPortfolioRepository: cur.execute( """ CREATE TABLE IF NOT EXISTS portfolio_corporate_actions ( - corporate_action_id UUID PRIMARY KEY, portfolio_id TEXT NOT NULL, - asset_id UUID, action_type TEXT NOT NULL, effective_date DATE NOT NULL, - recorded_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), actor_user_id TEXT, - evidence_ref TEXT NOT NULL, idempotency_key TEXT NOT NULL, - payload_hash TEXT NOT NULL, quantity_before NUMERIC(20,8) NOT NULL, - quantity_after NUMERIC(20,8) NOT NULL, average_price_before NUMERIC(20,8) NOT NULL, - average_price_after NUMERIC(20,8) NOT NULL, total_cost_basis NUMERIC(20,8) NOT NULL, - cash_balance NUMERIC(20,8) NOT NULL, profit_buffer NUMERIC(20,8) NOT NULL, - ledger_entry_id BIGINT NOT NULL, - UNIQUE(portfolio_id, idempotency_key) + corporate_action_id UUID PRIMARY KEY, + portfolio_id TEXT NOT NULL REFERENCES portfolios(portfolio_id) ON DELETE RESTRICT, + asset_id UUID NOT NULL REFERENCES assets(asset_id) ON DELETE RESTRICT, + action_type TEXT NOT NULL CHECK (action_type = 'stock_consolidation'), + effective_date DATE NOT NULL, + recorded_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + actor_user_id TEXT, + evidence_ref TEXT NOT NULL, + idempotency_key TEXT NOT NULL, + payload_hash TEXT NOT NULL, + quantity_before NUMERIC(20,8) NOT NULL, + quantity_after NUMERIC(20,8) NOT NULL, + average_price_before NUMERIC(20,8) NOT NULL, + average_price_after NUMERIC(20,8) NOT NULL, + total_cost_basis NUMERIC(20,8) NOT NULL, + cash_balance NUMERIC(20,8) NOT NULL, + profit_buffer NUMERIC(20,8) NOT NULL, + ledger_entry_id BIGINT, + UNIQUE (portfolio_id, idempotency_key) ) """ )