Как создать счет в odoo через odoo-xmlrpc в узле? - PullRequest
0 голосов
/ 27 июня 2019

Я использую 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 Eur.

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Наконец, вот как я решил:

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 - создать налоговые записи для каждой строки (сначала найдите номера строк для счета)

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, но без сообщения об ошибке. Состояние счета-фактуры также не переводится в «подтвержденное».

0 голосов
/ 27 июня 2019

Поля 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 к соотношению many2many.Просто предоставьте более одного идентификатора, чтобы добавить больше в отношение.

Небольшая подсказка: эти волшебные триплеты можно найти в официальной документации или непосредственно в коде в виде строки документации на BaseModel.write()

...