T-0 / T-0b(门禁 · 2026-09-10) - T-0:sqlite 与 MySQL 结构对齐 —— core_holding 统一为 qty/cost_amount/as_of/pnl_pct + PK + UNIQUE(customer_id, product_id);补 core_product_nav;新增建库自校验 _assert_ddl_aligned()(R-g);test_db.py 增 3 条门禁用例(含反向验证门禁失效) - T-0b:DB 账号分离(D20)—— 新增 scripts/core/00-grant.sql(三账号逐表授权); settings.py 增 3 组账号;db.py 改 get_engine(db, role),缓存键改为 (库名, 角色), 账号未配置回退单账号;core_ro→ro / gateway_repository→rw / risk·session_repository→rw; tests/conftest.py 四处显式 role="admin"(R-e) T-1(数据层) - scripts/core/01-ddl.sql:新建 core_fee_rule / core_share_lot / core_convert_lot_detail; core_trade 加 convert_group_id + idx_convert_group;core_product 加 8 列 + fee_rate 补 COMMENT - 新增 07-seed-fee-rule.sql(赎回费 5 档 × 14 产品,按 22 号文 §10)/ 08-seed-share-lot.sql (58 行持仓 → 61 行批次,Σ remain_qty 恒等于 qty)/ 09-seed-org.sql(管理人 + TA + 申购费率 + 最低持有余额,v1.1 按「管理人全产品线」重排) - reset.ps1 追加 07/08/09;02-mysql-agent专用.sql 追加 risk_convert_detail - tests/_ddl.py 同步 4 表 + 新增 REQUIRED_CONVERT_TABLES 建库门禁 - 新增 scripts/dev/verify_convert_seed.py(pymysql 等价 reset 流程 + 8 条 DoD 断言, 含断言 ⑧「费率档 ↔ product_type 匹配」,越档即 FAIL) T-2 / T-2b(纯函数包 + 示例实算回填) - 新增 app/service/convert/ 7 文件:__init__ / types / calc / fee / nav / lot_bootstrap / errors (纯函数,不查库、不碰 SQL;所有量化显式 ROUND_HALF_UP;lot_bootstrap 用 zlib.crc32 保证 D18 跨进程同源) - 新增 tests/test_convert_calc.py 93 用例(12 类:HALF_UP 反向自证 / 分档边界 / FIFO 含同 confirmed_at 兜底 / 双口径 / 强制全转与强制赎回 / PRD §5.3 全链自证 / 纯函数零 IO 依赖断言) - 重写 scripts/dev/calc_convert_demo.py:去掉脚本内公式副本,改为调用生产 calc.py, 末尾与 PRD §5.3 逐项比对(不一致即退出码 1),兼作一致性门禁 验证 - pytest 609 passed / 3 skipped(516 → +93,零回归) - verify_convert_seed.py 8/8 PASS;calc_convert_demo.py 15/15 与 PRD §5.3 一致 文档:PRD v0.9.1(费率分类修正)· 架构 §7 签名回填 / §8.3 错误码注 / §15 T-2 完成 · 开发计划 §1.5 新增 R-h + §4.2·§4.3 执行记录 · AGENTS.md · docs/memory
89 lines
7.3 KiB
SQL
89 lines
7.3 KiB
SQL
USE jinrong_core;
|
||
|
||
-- ============================================================================
|
||
-- 09-seed-org.sql · 产品机构信息与申购费率
|
||
-- 版本:v1.1(2026-09-10 · T-1 新增;同日按「真实业务」修订 —— 分类归位 + 分组重排)
|
||
-- 依据:
|
||
-- · 证监会公告〔2025〕22 号 §8 申购费率上限(2026-01-01 施行):
|
||
-- 主动偏股型 ≤ 0.80% · 其他混合型 ≤ 0.50% · 指数型/债券型 ≤ 0.30% · 货基 0
|
||
-- · PRD §4.2/§4.3:申购费简化为单一 core_product.subscribe_fee_rate(补差费计算源)
|
||
-- · PRD/架构:同一笔转换要求 **同销售机构 + 同管理人 + 同 TA**
|
||
--
|
||
-- 【v1.1 修订原因 · 分类必须与 product_type 匹配】
|
||
-- v1.0 曾把 `PROD-005827`(`product_type='mixed'`,平衡混合一号)按「主动偏股」取到
|
||
-- **0.80%** 上限 —— 目的是凑出 0.50% 的补差幅度。这是**分类错误**:
|
||
-- 22 号文 §8 的费率档由**产品类型**决定,`mixed` 只能套「其他混合型 ≤0.5%」。
|
||
-- 现修正:`PROD-005827` → **0.0050**;主示例转入方改用**真正的主动偏股产品**
|
||
-- `PROD-003095`(`stock` / R4 / 净值 0.9500 —— 与原示例除数相同,故 §5.3 数字不变)。
|
||
-- ⚠️ 通用规则:**用某一档上限前,先证明该产品确实属于这一档**,不得「看名字像」
|
||
-- 或「为了凑数值差」升档(自检第 12 问)。
|
||
--
|
||
-- 【v1.1 修订原因 · 分组按真实业务重排】
|
||
-- v1.0 的分组是「华夏组全是低风险(债/混合/货基/指数)、易方组全是股票型」——
|
||
-- **不符合真实**:真实的基金管理人都是**全产品线**(同一家公司旗下同时有债基、
|
||
-- 混合、指数、股票、货基)。真实的分组必须以「管理人」为单位、覆盖多风险层级,
|
||
-- 转换约束「同管理人 + 同 TA」才有实际意义。
|
||
-- 现分组:华夏 / 易方 各 6 只、均覆盖多个风险层级;理财与私募单列(真实形态:
|
||
-- 银行理财子公司、私募管理人,与公募不同主体,天然不可与公募互转)。
|
||
--
|
||
-- 【分组与费率一览】
|
||
-- 华夏模拟基金 / TA-CN-001(主演示组,覆盖 5 类)
|
||
-- PROD-110022 稳健债基 A bond R1 0.0030 ← 主示例转出
|
||
-- PROD-110023 信用债精选 bond R2 0.0030
|
||
-- PROD-005827 平衡混合一号 mixed R3 0.0050 ← v1.1 由 0.0080 归位
|
||
-- PROD-000001 现金宝货币 money R1 0.0000 ← 同费率对照组(0)
|
||
-- PROD-510300 沪深300指数 index R3 0.0030 ← 同费率对照组(与 110022 同)
|
||
-- PROD-003095 医药健康精选 stock R4 0.0080 ← 主示例转入(真主动偏股)
|
||
-- 易方模拟基金 / TA-CN-002(覆盖 4 类)
|
||
-- PROD-000002 同业存单基金 bond R1 0.0030
|
||
-- PROD-005828 稳健增利混合 mixed R2 0.0050
|
||
-- PROD-510500 中证500指数 index R4 0.0030
|
||
-- PROD-161725 科技成长主题 stock R4 0.0080
|
||
-- PROD-161726 消费升级主题 stock R4 0.0080
|
||
-- PROD-XYZ999 进取成长五号 stock R5 0.0080
|
||
-- 兴银理财 / TA-CN-003 : PROD-WMG001 稳享180天理财 wealth_mgmt R2 0.0000
|
||
-- 量化私募 / TA-CN-004 : PROD-PRIV01 量化中性私募一号 private_fund R4 0.0000
|
||
--
|
||
-- 【可验证的费率关系(供补差费演示与对照)】
|
||
-- 不同费率对:PROD-110022(0.0030)→ PROD-003095(0.0080)**同属华夏组、可互转** → 补差非 0
|
||
-- 同费率对照:PROD-110022(0.0030)↔ PROD-510300(0.0030)→ 补差 = 0
|
||
-- 零费率对照:PROD-000001(0)→ 任意产品补差非 0;任意 → PROD-000001 补差 = 0
|
||
--
|
||
-- 【跨主体负例保障(「同管理人 + 同 TA」硬约束的反例数据仍然充足)】
|
||
-- CUST-1004 : 161725(易方) + 510300(华夏) → 跨管理人 ✗
|
||
-- CUST-DEMO-A : 510500(易方) + 510300/000001(华夏) → 跨管理人 ✗
|
||
-- CUST-DEMO-B : 161725(易方) + PRIV01(量化私募) → 跨管理人 + 跨机构类型 ✗
|
||
--
|
||
-- 【最低持有余额】让 FR-C15 的两种动作都有数据可触发(否则 DEFAULT 0 使该分支永不进入,
|
||
-- 等于无测试覆盖):PROD-110022 = force_transfer(低于阈值强制全转)
|
||
-- PROD-005827 = force_redeem (低于阈值强制赎回剩余)
|
||
-- ============================================================================
|
||
|
||
-- ---- ① 华夏模拟基金 / TA-CN-001(主演示组 · 全产品线)----
|
||
UPDATE core_product SET fund_company = '华夏模拟基金', ta_code = 'TA-CN-001', subscribe_fee_rate = 0.0030 WHERE product_id = 'PROD-110022';
|
||
UPDATE core_product SET fund_company = '华夏模拟基金', ta_code = 'TA-CN-001', subscribe_fee_rate = 0.0030 WHERE product_id = 'PROD-110023';
|
||
UPDATE core_product SET fund_company = '华夏模拟基金', ta_code = 'TA-CN-001', subscribe_fee_rate = 0.0050 WHERE product_id = 'PROD-005827';
|
||
UPDATE core_product SET fund_company = '华夏模拟基金', ta_code = 'TA-CN-001', subscribe_fee_rate = 0.0000 WHERE product_id = 'PROD-000001';
|
||
UPDATE core_product SET fund_company = '华夏模拟基金', ta_code = 'TA-CN-001', subscribe_fee_rate = 0.0030 WHERE product_id = 'PROD-510300';
|
||
UPDATE core_product SET fund_company = '华夏模拟基金', ta_code = 'TA-CN-001', subscribe_fee_rate = 0.0080 WHERE product_id = 'PROD-003095';
|
||
|
||
-- ---- ② 易方模拟基金 / TA-CN-002(次演示组 · 全产品线)----
|
||
UPDATE core_product SET fund_company = '易方模拟基金', ta_code = 'TA-CN-002', subscribe_fee_rate = 0.0030 WHERE product_id = 'PROD-000002';
|
||
UPDATE core_product SET fund_company = '易方模拟基金', ta_code = 'TA-CN-002', subscribe_fee_rate = 0.0050 WHERE product_id = 'PROD-005828';
|
||
UPDATE core_product SET fund_company = '易方模拟基金', ta_code = 'TA-CN-002', subscribe_fee_rate = 0.0030 WHERE product_id = 'PROD-510500';
|
||
UPDATE core_product SET fund_company = '易方模拟基金', ta_code = 'TA-CN-002', subscribe_fee_rate = 0.0080 WHERE product_id = 'PROD-161725';
|
||
UPDATE core_product SET fund_company = '易方模拟基金', ta_code = 'TA-CN-002', subscribe_fee_rate = 0.0080 WHERE product_id = 'PROD-161726';
|
||
UPDATE core_product SET fund_company = '易方模拟基金', ta_code = 'TA-CN-002', subscribe_fee_rate = 0.0080 WHERE product_id = 'PROD-XYZ999';
|
||
|
||
-- ---- ③ 非同主体产品(真实形态:非公募主体,天然不可与公募互转)----
|
||
UPDATE core_product SET fund_company = '兴银理财', ta_code = 'TA-CN-003', subscribe_fee_rate = 0.0000 WHERE product_id = 'PROD-WMG001';
|
||
UPDATE core_product SET fund_company = '量化私募', ta_code = 'TA-CN-004', subscribe_fee_rate = 0.0000 WHERE product_id = 'PROD-PRIV01';
|
||
|
||
-- ---- ④ 兜底:任何未显式赋值的产品也保证非 NULL(DoD ③)----
|
||
UPDATE core_product SET fund_company = '其他模拟管理人', ta_code = 'TA-CN-099' WHERE fund_company IS NULL;
|
||
UPDATE core_product SET ta_code = 'TA-CN-099' WHERE ta_code IS NULL;
|
||
|
||
-- ---- ⑤ 最低持有余额(FR-C15 两种动作的可触发数据)----
|
||
UPDATE core_product SET min_hold_qty = 1000.0000, min_redeem_qty = 100.0000, min_hold_action = 'force_transfer' WHERE product_id = 'PROD-110022';
|
||
UPDATE core_product SET min_hold_qty = 2000.0000, min_redeem_qty = 200.0000, min_hold_action = 'force_redeem' WHERE product_id = 'PROD-005827';
|