Files
group_xinghuo_jinrong/scripts/core/07-seed-fee-rule.sql
T
GaoYiYuan_0626 c5182f1910 feat(convert): 基金转换 T-0/T-0b 门禁 + T-1 数据层 + T-2/T-2b 纯函数与实算回填
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
2026-09-10 14:45:55 +08:00

108 lines
6.1 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
USE jinrong_core;
-- ============================================================================
-- 07-seed-fee-rule.sql · 赎回费分档种子
-- 版本:v1.0(2026-09-10 · T-1 新增)
-- 依据:证监会公告〔2025〕22 号《公开募集证券投资基金销售费用管理规定》§10
-- (2026-01-01 施行,替代 2013 年 26 号文的分级计入规则)
-- · 持有期 < 7 日 → ≥ 1.5%
-- · 持有期 7 ~ 30 日 → ≥ 1.0%
-- · 持有期 30 ~ 180 日 → ≥ 0.5%
-- · 持有期 ≥ 180 日 → 无强制下限(合同常见 0)
-- · 赎回费全额计入基金财产 → to_fund_ratio 恒 1.0000(旧规 75%/50%/25% 已废止)
-- 区间口径:左闭右开 [min_hold_days, max_hold_days),max_hold_days = NULL 表示无上限;
-- 与 app/service/convert/fee.py 的 pick_fee_rate 完全一致。
-- 说明 1:14 只产品统一灌 5 档,目的是让分档演示/真库集成有数据可查。
-- 分档边界单测(6/7/29/30/179/180/364/365)走纯函数自建种子,**不依赖本文件**。
-- 说明 2:真实货基(PROD-000001)赎回费为 0、指数/债基持满 7 日对个人投资者有豁免,
-- 模拟库未做该豁免(豁免属投资者维度,非产品维度),保持 5 档统一。
-- 说明 3:`fee_type='subscribe'` 的金额分档本期**不启用**(申购费简化在
-- core_product.subscribe_fee_rate,见 09-seed-org.sql),此处不灌数据。
-- ============================================================================
INSERT INTO core_fee_rule (product_id, fee_type, min_hold_days, max_hold_days, rate, to_fund_ratio) VALUES
-- PROD-110022 稳健债基 A(bond)
('PROD-110022', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-110022', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-110022', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-110022', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-110022', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-110023 信用债精选(bond)
('PROD-110023', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-110023', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-110023', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-110023', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-110023', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-005827 平衡混合一号(mixed · 转出主演示产品)
('PROD-005827', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-005827', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-005827', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-005827', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-005827', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-005828 稳健增利混合(mixed)
('PROD-005828', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-005828', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-005828', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-005828', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-005828', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-161725 科技成长主题(stock)
('PROD-161725', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-161725', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-161725', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-161725', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-161725', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-161726 消费升级主题(stock)
('PROD-161726', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-161726', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-161726', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-161726', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-161726', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-003095 医药健康精选(stock)
('PROD-003095', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-003095', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-003095', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-003095', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-003095', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-510300 沪深300指数(index · 转入主演示产品)
('PROD-510300', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-510300', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-510300', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-510300', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-510300', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-510500 中证500指数(index)
('PROD-510500', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-510500', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-510500', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-510500', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-510500', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-XYZ999 进取成长五号(stock)
('PROD-XYZ999', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-XYZ999', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-XYZ999', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-XYZ999', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-XYZ999', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-000001 现金宝货币(money)
('PROD-000001', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-000001', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-000001', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-000001', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-000001', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-000002 同业存单基金(bond)
('PROD-000002', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-000002', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-000002', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-000002', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-000002', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-WMG001 稳享180天理财(wealth_mgmt)
('PROD-WMG001', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-WMG001', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-WMG001', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-WMG001', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-WMG001', 'redeem', 365, NULL, 0.0000, 1.0000),
-- PROD-PRIV01 量化中性私募一号(private_fund)
('PROD-PRIV01', 'redeem', 0, 7, 0.0150, 1.0000),
('PROD-PRIV01', 'redeem', 7, 30, 0.0100, 1.0000),
('PROD-PRIV01', 'redeem', 30, 180, 0.0050, 1.0000),
('PROD-PRIV01', 'redeem', 180, 365, 0.0025, 1.0000),
('PROD-PRIV01', 'redeem', 365, NULL, 0.0000, 1.0000);