Odoo v12 API получить счет-фактуру PDF

Этот вопрос заставил меня начать с моей реализации C # Odoo API. У меня есть рабочий код, использующий CookComputing.XmlRpcV2 для получения списка счетов.

Я хотел бы реализовать возможность получения / загрузки PDF-файла с выбранной накладной. Кто-нибудь знает, что мне нужно, чтобы это сделать?

Когда я ищу, я нахожу сообщения на форуме, в которых говорится, что отчеты не работают с версии 11, например этот. Я также не вижу упоминания об этом в онлайн-документации для V12, хотя есть упоминание об этом внизу страницы для V10.

Обновлять

Кто-то упомянул о создании URL-адреса:

http://localhost:8069/my/invoices/1?report_type=pdf&download=true&access_token=<ACCESSTOKEN>

Где 1 - идентификатор счета. Технически это работает, но требует, чтобы я вошел на портал с помощью браузера. Даже если я могу войти на портал из моей службы C #, я не знаю, где и как получить правильный токен доступа. Я вижу, что это в форме GUID. Кто-нибудь знает, является ли это тем же токеном, который я могу получить из OAuth2 REST API (который является платным модулем b.t.w.)?


person pritaeas    schedule 30.01.2019    source источник


Ответы (4)


Верный. Вы можете скачать PDF-файл, поместив его в access_token.

Это единственный способ, которым мне удалось это выяснить для Odoo v.12. после неоднократного удара головой о кирпичную стену. Мой пример языка программирования - это Python 3, а не C #, но я уверен, что вы сможете его адаптировать.

odoo_url_host = "https://company.odoo.com"

access_token можно найти в ответе JSON на счет.

invoice_id = 1234
models = xmlrpcclient.ServerProxy('{}/xmlrpc/2/object'.format(odoo_url_host))
invoice = models.execute_kw(db, uid, password, "account.invoice", read, [[invoice_id]])

при условии, что вы вернете найденный счет, вы можете использовать ответ следующим образом:

print(invoice["access_token"])

download_url = "%s/%s/my/invoices/%d?report_type=pdf&download=true&access_token=%s" % (odoo_url_host, invoice_id, invoice["access_token"])

Что, если вы просто хотите автоматически загрузить, можно сделать так:

import urllib.request

pdf_destination = "./invoices/invoice-%d.pdf" % invoice_id

urllib.request.urlretrieve(download_url, pdf_destination)

Вам нужно будет изменить способ написания этого кода для Python 2.7.

Кроме того, убедитесь, что вы нажали «поделиться» в счете-фактуре (в odoo), поскольку иногда access_token не создается для этого счета-фактуры и в противном случае возвращает false.

Или, если вы хотите без проблем сгенерировать access_token, выполните это, прежде чем пытаться получить токен доступа:

ctx = {'active_model': 'account.invoice', 'active_id': invoice_id}
print(models.execute_kw(db, uid, password, 'portal.share', 'default_get',[{}],{'context': ctx}))

Это должно дать вам share_link для всего документа, но все, что вам нужно, это сгенерировать access_token. Вы можете извлечь access_token из значения share_link в ответе JSON, если хотите сделать это таким образом. В любом случае :) Удачного кодирования.

person Paul von Hoesslin    schedule 04.09.2019
comment
Есть идеи, как это можно сделать для ir.attachments? Я могу создать URL-адрес способом вложения, но access_token, похоже, не работает, однако URL-адреса без access_token отлично работают в браузере при входе в систему. Пытался вызвать portal.share с ir.attachment как ctx, но получил ответ `\ 'ir.attachment \' объект не имеет атрибута \ 'get_base_url \' ' - person ladrua; 23.09.2020

Я бы попробовал использовать /xmlrpc/2/object с моделью ir.actions.report и методом render_qweb_pdf. Имейте в виду, что вам понадобится ir.actions.report запись, потому что render_qweb_pdf не является «модельным методом» (в методе класса ООП).

person CZoellner    schedule 30.01.2019
comment
Как мне создать ir.actions.report запись? - person pritaeas; 31.01.2019
comment
Создавать их не обязательно, для счетов-фактур уже есть. - person CZoellner; 31.01.2019

В настоящее время я тестирую аналогичную функциональность, но с stock.picking, где мне нужна форма доставки, загруженная с удаленного Odoo экземпляра и сохраненная как attachment в другом экземпляре. Я добавил эту функцию в stock.picking удаленного Odoo.

@api.model
def sd_get_delivery_form(self, uid):
    picking = self.env['stock.picking'].sudo().search([('sd_uid', 'like', uid)], limit=1)
    if picking and picking.sale_id:
        pdf = self.env.ref('sale.action_report_saleorder').sudo().render_qweb_pdf([picking.sale_id.id])
        b64_pdf = base64.b64encode(pdf[0])
        order_pdf = b64_pdf.decode('utf-8')
        return {'file': order_pdf}
    else:
        return False

Затем вызываем его с помощью xmlrpc и сохраняем как вложение

attachment_name = "delivery_order_({})".format(self.id)
self.env['ir.attachment'].create({
    'name': attachment_name,
    'type': 'binary',
    'datas': dt['file'],
    'datas_fname': attachment_name + '.pdf',
    'store_fname': attachment_name,
    'res_model': self._name,
    'res_id': self.id,
    'mimetype': 'application/x-pdf'
})

Что вы можете сделать в C#, так это получить base64 и сохранить его в формате PDF, если вы хотите сделать то же самое.

person lne-io    schedule 10.02.2020
comment
Спасибо за это, но, к сожалению, я не могу контролировать удаленную настройку / установку Odoo. - person pritaeas; 11.02.2020