订阅带伙伴权益时,很多实施会只盯着 subscription_state:关闭了就没权益,开启了就有权益。sale_subscription_partnership 的源码提醒你,真正的权益边界在 partner 主数据上:commercial partner 的 grade_id 和特定 pricelist 要跟着订阅生命周期回写。
主要参考源码:
enterprise/sale_subscription_partnership/models/sale_order.py
一、取消与关闭都会触发权益移除
_action_cancel() 和 set_close() 在执行父层逻辑后都会调 _remove_partnership()。它不是只改订单字段,而是检查 partner 当前 grade_id 是否等于这张订阅的 assigned_grade_id;如果是,就把 grade 清掉,并在价目表仍等于该等级默认价目表时一并清空。
二、续费和重开会重新把权益加回去
_confirm_renewal() 会 _add_partnership(),set_open() 则只对 progress state 中的订阅执行加回。也就是说,权益恢复既取决于动作类型,也取决于订阅是否真的回到有效进行中状态。
三、为什么不能只看订单状态
因为权益最终落点不是订单,而是 partner:
- grade 影响伙伴身份;
- pricelist 影响后续报价和价格;
- commercial partner 还会影响同公司联系人共享同一权益口径。
如果只改 subscription_state,而不回写 partner,销售和门户价格就会继续沿用旧权益。
四、这条链路真正跨了哪些边界
- 订阅单生命周期;
- commercial partner 等级;
- partner 默认价目表;
- 后续销售报价与权益口径。
这正是典型的“跨模块链路”:订阅动作影响的不只是订阅本身,而是后续整个销售主数据口径。
五、结论
订阅伙伴关系不是“关单就停权益”。企业版真正做的是把cancel / close / renew / reopen 四类动作映射到 partner grade 与 pricelist 的回写规则里,让权益变化在销售主数据上真正落地。
DISCUSSION
评论区