公司间规则最容易被想象成“公司 A 开了票,公司 B 自动生成一张对应单据”。如果只是复制表头表体,这件事当然不难;难的是复制之后,两边是否仍然各自符合本公司会计语义。account_inter_company_rules 就是在解决这个问题。
主要参考:
enterprise/account_inter_company_rules/models/account_move.pyenterprise/account_inter_company_rules/models/res_company.pyenterprise/account_inter_company_rules/tests/test_inter_company_invoice.py
一、跨公司镜像的第一步不是复制,而是路由
源码会先判断目标公司、对应 partner、适用规则和触发条件。也就是说,系统首先回答的是“这张单据该不该在对方公司出现、应该挂到谁名下”,而不是直接 copy 一份 move。
二、税与分析分布不能原封不动搬运
一张公司间销售发票到了另一家公司,税位不一定还能沿用原公司配置;analytic distribution 也可能引用了目标公司根本不存在的分析账户。account_move.py 里对这些字段会做过滤或重算,这一步非常关键,因为它决定了镜像单据是“长得像”还是“真的能过账”。
三、配置集中在 company,但语义落在 move
res_company.py 决定哪些规则开启、如何找到对应公司与伙伴;真正落单、生成镜像凭证、避免重复生成,则在 move 侧发生。实施时如果只盯公司配置界面,却不追 move 创建链路,就很容易解释不了“为什么这张触发了,那张没触发”。
四、测试告诉你最值得防什么
test_inter_company_invoice.py 不是在炫耀自动化,而是在防止几类事故:重复镜像、公司边界错乱、税和 analytic 带错、取消或修改后的不一致。这些边界比“自动生成成功”本身更重要。
五、实战建议
- 先统一公司间 partner 映射,再启用自动镜像。
- 上线前检查目标公司税、科目、分析账户是否真的存在,别指望系统替你补基础数据。
- 把“镜像失败”分成三类排查:路由没命中、字段无法映射、生成后无法过账。
六、结论
公司间发票的难点从来不是复制,而是翻译。account_inter_company_rules 的价值,就是把一家公司里的业务单据翻译成另一家公司也能成立的会计对象。
DISCUSSION
评论区