基于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
相关产品推荐
相关产品推荐

