【问题标题】:How to create an invoice in odoo via odoo-xmlrpc in node?如何通过节点中的 odoo-xmlrpc 在 odoo 中创建发票?
【发布时间】:2019-06-27 09:48:34
【问题描述】:

我正在使用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 中创建了一张发票,但它没有添加任何行。我认为 invoice_line 属性在某种程度上是错误的,但我没有找到问题所在。我本来希望在发票中看到一行,总金额为 15 欧元。

【问题讨论】:

  • 我认为正确的字段名称是invoice_line_ids 而不是invoice_line
  • 更改为 invoice_line_ids 会导致执行错误。 XML_RPC 错误 - KeyError: 0 ,所以我认为这意味着未找到指向 invoice_line 正确方向的密钥
  • odoo source code可以看到正确的字段名是invoice_line_ids,模型中没有引用invoice_line。 “KeyError: 0”似乎表明 Odoo 无法解释您传递的值。我认为 JS 中没有元组类型。也许(0, '', { 'account_id': 162, [...]}) 的值没有意义......
  • 也许可以试试[0, '', { 'account_id': 162, ...}](用括号代替大括号)
  • 'invoice_line_ids': [[0, '', { 'account_id': 162, 'name': "AAA", 'quantity': parseFloat('3'), 'price_unit': parseFloat ('5') }],[0, '', { 'account_id': 162, 'name': "AAA", 'quantity': parseFloat('3'), 'price_unit': parseFloat('5') }]] - 这个可行,所以我想我需要使用 0 来表示需要先创建该行。

标签: node.js odoo xml-rpc invoice


【解决方案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- 为每一行创建税务条目(首先找到发票的 lineIds)

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,但没有错误消息。发票状态也不会转换为“已确认”。

【讨论】:

    【解决方案2】:

    One2many 和 Many2many 字段可以设置为神奇的三元组或这些三元组的更好的 A LIST。由于您在这里使用 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 的税添加到 many2many 关系中。只需提供多个 ID 即可为关系添加更多 ID。

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

    【讨论】:

    • 非常感谢,这已经澄清了很多。我现在可以添加税号,并且我也可以在 UI 中看到它,即税已分配。但是,金额并未按应有的方式更新。我是否需要单独触发或设置任何其他字段?我很难想象我需要手动计算所有金额并手动设置(很容易出错)。再次感谢您的任何提示。
    猜你喜欢
    • 2017-07-22
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多