You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 13自定义模块创建发票时invoice_line_ids仅生成单行问题求助

问题原因分析
  • 第一个问题在_prepare_invoice_line方法的逻辑:你在循环additional_services_ids的过程中,每次都覆盖了res变量的值,循环结束后仅返回了最后一行服务对应的字典,而且方法返回的是单个字典,不是多行数据的列表。
  • 第二个问题在create_invoice方法的传参:invoice_line_ids的ORM操作命令列表里,你仅传入了1组(0, 0, 行数据)的命令,自然只会生成1条发票行。
修正后的代码

首先修改_prepare_invoice_line方法,返回所有行对应的ORM命令列表:

def _prepare_invoice_line(self):
    res = []
    for order in self:
        for line in order.additional_services_ids:
            res.append((0, 0, {
                'product_id': line.service_id.id,
                'quantity': line.quantity,
                'name': 'pro',
                'discount': 0,
                'price_unit': line.price_unit,
            }))
    return res

再修改create_invoice方法,直接把返回的命令列表赋值给invoice_line_ids:

def create_invoice(self):
    invoice = self.env['account.move'].create({
        'type': 'out_invoice',
        'state': 'draft',
        'journal_id': 1,
        'partner_id': self.partner_id.id,
        'amount_untaxed': self.package_price,
        'ref': self.name,
        'invoice_origin': self.name,
        'invoice_line_ids': self._prepare_invoice_line()
    })
    return invoice
额外优化建议
  • Odoo中one2many/many2many字段的写入采用ORM三元组命令,(0, 0, 字典)代表新建一条关联记录,需要创建N条行就传入N个对应三元组到列表中即可。
  • 不建议硬编码journal_id的ID值,不同环境的日记帐ID可能不一致,建议通过代码过滤对应类型的销售日记帐再取ID,兼容性更高。
  • 发票的amount_untaxed等合计字段不需要手动赋值,Odoo会根据发票行数据自动计算,手动赋值反而可能出现和行合计不一致的异常。

内容的提问来源于stack exchange,提问作者SH EB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:24:00