Odoo中如何将销售订单自定义one2many字段值传递到发票对应字段
Odoo销售订单自定义头one2many字段传递到发票的实现方案
原生_prepare_invoice方法仅用于构造发票头的基础字段值,_prepare_invoice_line仅用于处理标准销售订单行到发票行的转换逻辑,二者都不包含订单头自定义one2many关联字段的处理逻辑,因此直接重写这两个方法无法实现需求。
实现步骤
第一步:确认字段对应关系
提前定义好两套模型字段:- 销售订单侧:
sale.order模型新增one2many字段x_sale_custom_lines,关联自定义行模型x.sale.custom.line,外键字段为order_id - 发票侧:
account.move模型新增one2many字段x_invoice_custom_lines,关联自定义行模型x.account.move.custom.line,外键字段为move_id
两个自定义行模型的传递字段的类型、约束需保持一致。
- 销售订单侧:
第二步:重写销售订单的
_create_invoices核心方法
该方法是点击「创建发票」按钮后的实际执行入口,在原生逻辑生成发票实例后,追加自定义行的写入逻辑即可,示例代码如下:
from odoo import models class SaleOrderInherit(models.Model): _inherit = 'sale.order' def _create_invoices(self, grouped=False, final=False, date=None): # 执行原生逻辑获取生成的发票记录 moves = super()._create_invoices(grouped=grouped, final=final, date=date) for order in self: # 适配合并开票场景:筛选出当前订单关联的所有发票 related_moves = moves.filtered(lambda m: order in m.line_ids.sale_line_ids.order_id) for move in related_moves: # 构造发票自定义行的写入值列表 custom_line_vals = [] for sale_custom_line in order.x_sale_custom_lines: custom_line_vals.append((0, 0, { # 按实际业务需求补充字段映射 'x_product_id': sale_custom_line.x_product_id.id, 'x_quantity': sale_custom_line.x_quantity, 'x_price': sale_custom_line.x_price, })) # 写入发票自定义one2many字段 move.write({'x_invoice_custom_lines': custom_line_vals}) return moves
- 第三步:验证逻辑
升级对应模块后,新建销售订单填写自定义行,点击创建发票即可看到自定义行自动同步到发票的对应字段。
注意事项
- 如果你的自定义one2many字段绑定在
sale.order.line(销售订单行)上,需同步到account.move.line(发票行)的自定义one2many字段,直接在重写的_prepare_invoice_line方法中追加one2many的构造逻辑即可 - 合并开票场景下需自行调整自定义行的汇总规则,避免重复写入
内容的提问来源于stack exchange,提问作者Sakthi Priya
相关产品推荐
相关产品推荐

