Files
group_fqcd_jr/alembic/versions/20260910_advisor_investment_goal.py
T

69 lines
3.1 KiB
Python
Raw Normal View History

"""add advisory investment goal table
Compatibility proof: this revision only creates ``advisor_investment_goal``. It does not
alter, rename, delete, or reuse any table or field defined by the immutable baseline.
``client_facing_content`` is referenced as its existing, unchanged content-review resource.
"""
from alembic import op
revision = "20260910_advisor_investment_goal"
down_revision = "20260910_drop_review_separation"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.execute(
"""
CREATE TABLE advisor_investment_goal (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
goal_no VARCHAR(36) NOT NULL,
customer_id BIGINT UNSIGNED NOT NULL,
status VARCHAR(24) NOT NULL,
annualized_return_lower_pct DECIMAL(7,4) NOT NULL,
annualized_return_upper_pct DECIMAL(7,4) NOT NULL,
max_drawdown_pct DECIMAL(7,4) NOT NULL,
liquidity_requirement VARCHAR(32) NOT NULL,
investment_horizon_months INT UNSIGNED NOT NULL,
benchmark_name VARCHAR(128) NOT NULL,
notes TEXT NULL,
source VARCHAR(16) NOT NULL,
goal_book_content_id BIGINT UNSIGNED NOT NULL,
created_by BIGINT UNSIGNED NOT NULL,
confirmed_by BIGINT UNSIGNED NULL,
confirmed_at DATETIME(6) NULL,
created_at DATETIME(6) NOT NULL,
updated_at DATETIME(6) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_advisor_investment_goal_no (goal_no),
UNIQUE KEY uk_advisor_investment_goal_book (goal_book_content_id),
KEY idx_advisor_investment_goal_customer_status (customer_id, status, created_at),
CONSTRAINT chk_advisor_investment_goal_status
CHECK (status IN ('pending_confirmation', 'confirmed', 'superseded')),
CONSTRAINT chk_advisor_investment_goal_return_range
CHECK (annualized_return_lower_pct <= annualized_return_upper_pct),
CONSTRAINT chk_advisor_investment_goal_return_lower
CHECK (annualized_return_lower_pct BETWEEN 0 AND 100),
CONSTRAINT chk_advisor_investment_goal_return_upper
CHECK (annualized_return_upper_pct BETWEEN 0 AND 100),
CONSTRAINT chk_advisor_investment_goal_drawdown
CHECK (max_drawdown_pct BETWEEN 0 AND 100),
CONSTRAINT chk_advisor_investment_goal_horizon
CHECK (investment_horizon_months BETWEEN 1 AND 600),
CONSTRAINT fk_advisor_investment_goal_customer
FOREIGN KEY (customer_id) REFERENCES sys_user(id),
CONSTRAINT fk_advisor_investment_goal_book
FOREIGN KEY (goal_book_content_id) REFERENCES client_facing_content(id),
CONSTRAINT fk_advisor_investment_goal_creator
FOREIGN KEY (created_by) REFERENCES sys_user(id),
CONSTRAINT fk_advisor_investment_goal_confirmer
FOREIGN KEY (confirmed_by) REFERENCES sys_user(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
"""
)
def downgrade() -> None:
raise RuntimeError("投资目标记录不得自动删除,请使用前向兼容迁移")