如何通过node中的odoo-xmlrpc在odoo中创建发票?

问题描述 投票:0回答:2

我正在使用 https://www.npmjs.com/package/odoo-xmlrpc 在 odoo 10 中创建发票。我可以创建发票,但我无法将发票 line_items 添加到发票中。

//connect to odoo
var odoo = new Odoo({
  url: "xxx",
  port: 443,
  db: "xxx",
  username: 'apiuser123456',
  password: 'xxx'
});


odoo.connect(function (err) {
  if (err) { return console.log(err); }
  console.log('Connected to Odoo server.');
  var inParams = [];
  inParams.push({
    'partner_id': 119,
    'account_id': 162,
    'invoice_line': [(0, '', { 'account_id': 162, 'name': "AAA", 'quantity': parseFloat('3'), 'price_unit': parseFloat('5') })]
  });
  var params = [];
  params.push(inParams);
  odoo.execute_kw('account.invoice', 'create', params, function (err2, value2) {
    if (err2) { return console.log(err2); }

  });
});

这段代码实际上在odoo中创建了一张发票,但它没有添加任何行。我认为发票行属性有某种错误,但我未能找到问题。我本希望在发票中看到一行,总金额为 15 欧元。

node.js odoo xml-rpc invoice
2个回答
1
投票

最后这就是我解决它的方法:

1- 添加上面列出的invoice_line_tax_ids:

invoiceLines = [
  { 'account_id': 162, 'name': "Product A", 'quantity': 1, 'price_unit': 17, 'product_id': 1 },
  { 'product_id': 1, 'account_id': 162, 'name': "Product B", 'quantity': 1, 'price_unit': 17 }
]

-------------------
// partnerId is an id of an existing partner in odoo

function createInvoiceObj(partnerId, lineEntries) {

  inParams = [];
  params = [];
  inParams.push({
    'partner_id': partnerId,
    'account_id': 162,
    'invoice_line_ids': lineEntries
  });  
  params.push(inParams);
  odoo.execute_kw('account.invoice', 'create', params, function (err, invoiceId) {
    if (err) { throws('error during execution createInvoiceObj() ' + err); }
    return createTax(invoiceId);
  });
}

2-为每行创建税务条目(首先找到发票的 lineId)

function createTax(invoiceId) {
  var inParams = [];  
  var params = [];
  inParams.push([['invoice_id', '=', invoiceId]]);
  params.push(inParams);
  odoo.execute_kw('account.invoice.line', 'search', params, function (err, invoiceLineIds) {
    if (err) { return console.log(err); }
    invoiceLineId = invoiceLineIds[0];

    inParams = [];
    inParams.push(invoiceLineIds);
    inParams.push({ 'invoice_line_tax_ids': [[6, 0, [12]]] })
    params = [];
    params.push(inParams);

    odoo.execute_kw('account.invoice.line', 'write', params, function (err, value) {
      if (err) { return console.log('Error during execution ' + err); }
      return compute_taxes(invoiceId)
    });


  });
}

3-触发发票税计算

function compute_taxes(invoiceId) {
    inParams = [];
    params = [];
    inParams.push(invoiceId);
    params.push(inParams);

    odoo.execute_kw('account.invoice', 'compute_taxes', params, function (err, result) {
      if (err) { return console.log(err); }  
      return invoice_open(invoiceId)
    });

  }

所以最后的magix修复是调用compute_taxes函数。但是,我尝试采取下一步并自动确认发票,但这仍然失败。我使用了invoice_open工作流程,但这没有显示结果:

function invoice_open(invoiceId) {

  var params = [];
  params.push(invoiceId);

  odoo.exec_workflow('account.invoice', 'invoice_open', params, function (err, value) {
    if (err) { return console.log("Error during execution " + err); }
console.log('Result invoice_open: ' + value); 
  });

}

此函数始终返回

false
但没有错误消息。发票状态也没有转换为“已确认”。


1
投票

One2many 和 Many2many 字段可以使用神奇的三元组或更好的三元组列表来设置。由于您在这里使用 JavaScript,我建议使用列表三元组 ->

[MagicNumber, ID or nothing, List of IDs, nothing or values dictionary]

所以对于发票行来说应该是

'invoice_line_ids': [[0, 0, {'field1': value1, 'fieldn': valuen}],
                     [0, 0, {'field1': value1, 'fieldn': valuen}]] 

这将添加两个全新创建的发票行。

这同样适用于 Many2many 字段,例如发票行上的税费

'invoice_line_tax_ids': [[6, 0, [12]]]

这会将 ID 为 12 的税添加到多对多关系中。只需提供多个 ID 即可向关系添加更多内容。

小提示:这些神奇的三元组可以在官方文档中找到,也可以直接在代码中作为文档字符串找到

BaseModel.write()

编辑:在新版本中,Odoo 引入了类

Command
来以更易读的方式处理这些三元组。 doc 对此进行了描述:

One2many
Many2many
字段需要特殊命令来操作 他们实现的关系。

在内部,每个命令都是一个 3 元素元组,其中第一个元素 是标识命令的强制整数,第二个元素 是要应用命令的相关记录 ID(命令 更新、删除、取消链接和链接)或者 0(命令创建、清除和 set),第三个元素是要写入记录的值 (命令创建和更新)相关的新 ID 列表 记录(命令集),或者 0(命令删除、取消链接、链接和 清楚)。

通过 Python,我们鼓励开发人员通过各种方式编写新命令 该命名空间的函数。我们还鼓励开发者使用 比较第一个元素时的命令标识符常量名称 现有命令。

通过RPC,无法使用函数或命令 常量名称。需要改为写入文字 3 元素 元组,其中第一个元素是整数标识符 命令。

创建=0

更新=1

删除=2

取消链接= 3

链接 = 4

清除 = 5

设置 = 6

© www.soinside.com 2019 - 2024. All rights reserved.