Files
junhong_cmp_fiber/.scratch/ur40-off-shelf-package-renewal/issues/01-unified-package-purchasability-and-history-eligibility.md
2026-07-22 17:49:25 +09:00

22 lines
3.2 KiB
Markdown
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.
# 01 — 建立统一套餐可售决策与真实历史资格
**What to build:** 系统可以基于调用主体、资产当前归属与世代、套餐、销售渠道和操作场景,统一给出 `normal``renew_only``disabled` 的购买决策、稳定中文原因及当前有效价格。下架续费资格只来自当前客户在同一资产、当前世代、同一套餐上的真实有效购买历史,不会被退款、撤销、转手或异常使用记录误放行。
**Blocked by:** None — can start immediately
**Status:** ready-for-agent
**架构通道:** 主通道为复杂写前置 Domain Policy辅助通道为 Infrastructure Port/Adapter查询侧只能消费同一策略能力进行投影。
**完整业务边界:** 本票收口 UR#40 的套餐可售决策、真实历史资格与当前渠道定价语义,为 C 端 Query、C 端创建订单及其他购买入口提供唯一接缝。明确不迁移未触碰的订单创建、支付、退款、资产生命周期或套餐管理用例,不新增资格表、缓存、快照或续费订单类型。
- [ ] 策略输入显式包含 actor、asset、当前 generation、package、sales channel 和 operation context不使用 `is_renewal` 等隐式布尔开关,也不信任调用方提供的客户、资产类型、店铺或上下架结论。
- [ ] 套餐全局禁用时固定返回 `disabled`;平台渠道读取套餐上下架状态,代理渠道要求当前资产店铺对应的分配记录存在、未软删除、已启用,并读取其独立上下架状态。
- [ ] 正常在售且满足既有系列、赠送套餐、主套餐/加油包组合及价格规则时返回 `normal`;渠道下架时仅个人客户本人在 C 端续费场景可以进入历史资格判断,其他主体和场景固定拒绝。
- [ ] 有效历史通过 `EXISTS` 或等价批量查询判断,只接受当前资产、当前世代、同一套餐、未软删除且状态为待生效、生效中、已用完或已过期的使用记录;已失效记录不产生资格。
- [ ] 历史资格同时联合订单与退款事实:待支付、取消、退款、已有 `refund_id`、撤销后失效、赠送、后台发放或其他无真实个人购买事实的记录均不得产生资格,不能只依赖单个可能滞后的状态字段。
- [ ] 平台渠道使用下单时套餐当前有效零售价;代理渠道使用当前有效分配零售价并校验不低于当前授权成本价;历史订单价格和使用记录实付金额不参与定价。
- [ ] 决策返回稳定原因,至少覆盖套餐已禁用、套餐已下架仅历史用户可续费、当前资产无该套餐有效历史、当前渠道未授权该套餐、套餐价格配置异常及既有主套餐/加油包限制,调用方不需要解析文案推导状态。
- [ ] 单元与 PostgreSQL 集成测试覆盖平台/代理、启用/禁用、上架/下架、分配缺失/禁用/软删除、价格异常、赠送,以及历史状态、退款撤销、资产、套餐、客户和世代隔离矩阵。
- [ ] 使用真实查询计划核验历史资格查询;只有确认现有生产结构缺少适用索引时,才通过可升降级迁移补充覆盖资产、世代、套餐、状态和软删除条件的普通或部分索引,且不建立外键。