企业 项目FSM

Odoo 企业版 FSM 周期合同为什么不是“订阅续费后自动建单”:续费、物料入口与任务可见性讲透

现场服务接入订阅后,真正要守住的是周期合同、任务复发、物料销售行和项目利润的上下文连续性。

企业 项目
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 4 阅读

现场服务接入订阅后,真正要守住的是周期合同、任务复发、物料销售行和项目利润的上下文连续性。

主要参考:

- `enterprise/industry_fsm_sale_subscription/models/project_task.py`
  • enterprise/project_sale_subscription/models/sale_order_line.py
  • enterprise/industry_fsm_sale/models/project_task.py
  • enterprise/project_sale_subscription/tests/test_subscription_task.py


    一、这不是单模块按钮,而是一条跨模块链路

    很多人把这个功能理解成某个界面上的一个按钮、一个 smart button,或者一次自动创建。但从源码看,真正重要的是:上游对象先保留业务上下文,中间层做状态/域/权限判断,下游对象再接住这个上下文继续工作。只看最后一个界面动作,很容易把问题看窄。

    二、核心跨链路是怎么跑通的

    1. 订阅型 sale order line 生成项目任务时,会按 recurring plan 或 task template 创建 recurrence,而不是只创建一次 FSM task。
    2. FSM 任务中的物料入口继续沿用 sale line / material 视图,但订阅扩展会在 domain 里排除 recurring_invoice=True 的行。
    3. 因此续费合同负责周期性任务生成,FSM 现场用料只处理一次性可计费材料,两条收入链不会互相污染。

    这就是为什么我把它归类为“跨模块链路”题:这里至少同时牵涉了业务对象、会计/项目/销售对象,以及状态或权限判断,而不是单个模型内部的小机制。

    三、最容易踩错的边界

    • 只有项目允许 recurring tasks 时,订阅节奏才会写进任务 recurrence。
    • FSM 材料视图故意过滤 recurring_invoice 行,避免把周期合同商品误当现场材料重复销售。
    • 订阅结束日期会影响 recurring task 的 repeat_until,不能简单靠人工停用任务。

    这些边界决定了数据是否还能回到正确的模块继续流动。如果边界被自定义绕开,后面最常见的结果就是:报表看起来还能出, drill-down 却已经解释不通。

    四、落地时最值得先验的三件事

    1. 实施现场服务年包/月包时,要先决定哪些费用走 recurring line,哪些走现场材料。
    2. 利润分析里应把订阅收入和现场追加材料分开看。
    3. 现场团队说“续费后怎么没自动带出材料”时,通常不是 bug,而是设计边界。

    五、结论

    订阅续费负责周期,FSM 材料负责现场追加,两条链必须分开又能互相看见。 这也是企业版功能最容易被低估的地方:看上去只是一个入口,实质上是在多个子系统之间持续传递状态、上下文、数据或权限。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。