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

基于XML-RPC的Odoo Web Service API(PHP)创建发票报错及行添加问题

解决Odoo XML-RPC PHP创建发票并添加发票行的问题

嘿,我之前用PHP通过XML-RPC调用Odoo API创建发票时也踩过类似的坑,咱们一步步把它搞定!

首先,你之前改成空数组能创建发票,是因为Odoo允许生成没有明细行的空发票,但正常业务里咱们肯定需要添加发票行。问题出在发票行字段的格式要求——Odoo的account.move模型中,invoice_line_ids字段需要传入特定的三元组数组结构,而不是普通的字段键值对。

正确的发票行格式说明

Odoo的关联字段(比如这里的发票行)创建新记录时,需要用[0, False, {字段数据}]这样的三元组:

  • 第一个值0:表示创建一条新的关联记录(如果是关联已有记录用4,删除用2,这里咱们用创建新行的0就好)
  • 第二个值False:固定占位符,不用改
  • 第三个值:是发票行(account.move.line)的具体字段数据,比如产品ID、数量、单价、科目ID等

完整的创建发票示例代码

假设你已经完成了Odoo的XML-RPC连接,并且已经拿到了目标客户的partner_id,直接用下面的代码就能创建带发票行的发票:

// 替换成你自己的Odoo连接参数
$db = '你的数据库名';
$uid = '你的用户ID';
$password = '你的密码';
$url = 'http://你的Odoo地址/xmlrpc/2/object';

// 初始化XML-RPC客户端
$client = new \XmlrpcClient($url);

// 假设你已经通过API获取到了客户ID,比如从res.partner模型查询得到的$partner_id
$partner_id = 123;

// 构建发票数据,重点是invoice_line_ids的格式
$invoice_data = [
    'partner_id' => $partner_id,
    'move_type' => 'out_invoice', // 销售发票,采购发票用'in_invoice',按需调整
    'invoice_line_ids' => [
        // 第一行发票明细
        [
            0,
            false,
            [
                'product_id' => 45, // 替换成你的产品ID,可从product.product模型查询
                'quantity' => 3,
                'price_unit' => 80.00,
                'name' => '定制办公桌椅', // 产品名称或明细描述
                'account_id' => 22, // 替换成对应的收入科目ID,从account.account模型查询
            ]
        ],
        // 第二行发票明细(如果需要的话)
        [
            0,
            false,
            [
                'product_id' => 67,
                'quantity' => 1,
                'price_unit' => 200.00,
                'name' => '安装服务费',
                'account_id' => 22,
            ]
        ]
    ]
];

// 调用create方法创建发票
try {
    $invoice_id = $client->execute_kw(
        $db,
        $uid,
        $password,
        'account.move',
        'create',
        [$invoice_data]
    );
    echo "发票创建成功,ID为:" . $invoice_id;
} catch (\Exception $e) {
    echo "创建失败:" . $e->getMessage();
}

几个关键注意点

  • account_id必须正确:这个是发票行对应的会计科目,销售发票要选收入类科目,你可以通过XML-RPC查询account.account模型,筛选user_type_id对应的收入类型来获取正确的ID。
  • 如果不需要关联产品:可以去掉product_id字段,只保留name、quantity、price_unit和account_id,Odoo也能正常生成发票行。
  • move_type的选择:根据业务场景选对应的类型,避免后续出现财务流程问题。

之前你报错的原因大概率是没有按照Odoo要求的三元组格式传递invoice_line_ids,改成这个格式应该就能正常创建带明细的发票了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:27:04