69 lines
3.1 KiB
Python
69 lines
3.1 KiB
Python
"""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("投资目标记录不得自动删除,请使用前向兼容迁移")
|