3
votes

Odoo v12 API obtenir la facture PDF

Cette question m'a permis de démarrer avec l'implémentation de mon API C # Odoo. J'ai un code de travail utilisant CookComputing.XmlRpcV2 pour récupérer une liste de factures.

Ce que je voudrais implémenter, c'est la possibilité de récupérer / télécharger un PDF d'une facture sélectionnée. Quelqu'un sait-il de quoi j'ai besoin pour faire cela?

Lorsque je recherche, je trouve des messages de forum indiquant que les rapports ne fonctionnent pas depuis la V11, comme celui-ci . Je ne le vois pas non plus mentionné dans la documentation en ligne de la V12, bien qu'il en soit fait mention au bas de la page pour la V10.

Mise à jour

Quelqu'un a mentionné pour construire une URL:

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

1 est l'ID de la facture. Techniquement, cela fonctionne, mais nécessite que je sois connecté au portail à l'aide du navigateur. Même si je peux me connecter au portail à partir de mon service C #, je ne sais pas où / comment récupérer le jeton d'accès correct. Je peux voir que c'est sous forme de GUID. Est-ce que quelqu'un sait si c'est le même jeton que je pourrais récupérer de l'API REST OAuth2 (qui est un module payant b.t.w.)?


0 commentaires

4 Réponses :


1
votes

J'essaierais d'utiliser / xmlrpc / 2 / object avec le modèle ir.actions.report et la méthode render_qweb_pdf . Gardez à l'esprit que vous aurez besoin d'un enregistrement ir.actions.report , car render_qweb_pdf n'est pas une "méthode modèle" (dans la méthode de classe OOP).


2 commentaires

Comment créer un enregistrement ir.actions.report ?


Vous n'êtes pas obligé de les créer, il y en a déjà un pour les factures.



3
votes

Correct. Vous pouvez télécharger le PDF en le plaçant dans le access_token.

C'est le seul moyen que j'ai réussi à comprendre pour Odoo v.12. après m'être fracassé la tête contre un mur de briques à plusieurs reprises. Mon exemple de langage de programmation est avec Python 3, pas C #, mais je suis sûr que vous pouvez l'adapter.

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

Le access_token peut être trouvé dans la réponse JSON de la facture.

import urllib.request

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

urllib.request.urlretrieve(download_url, pdf_destination)

qui, à condition de récupérer une facture trouvée, vous pouvez utiliser la réponse comme suit:

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"])


1 commentaires

Une idée de la façon dont cela pourrait être fait pour les attachements ir? Je suis capable de créer une URL de la manière des pièces jointes, mais access_token ne semble pas fonctionner, cependant les URL sans access_token fonctionnent correctement dans le navigateur une fois connecté. J'ai essayé d'appeler le portal.share avec ir. pièce jointe comme ctx mais obtenir la réponse `\ 'ir.attachment \' l'objet n'a pas d'attribut \ 'get_base_url \'`



0
votes

La manière la plus simple est d'utiliser la bibliothèque OdooRPC: https://pythonhosted.org/OdooRPC/ref_report. html


1 commentaires

Merci, mais j'utilise C #, pas Python.



1
votes

Je teste actuellement une fonctionnalité similaire, mais avec stock.picking où j'ai besoin d'un formulaire de livraison téléchargé à partir d'une instance distante Odoo et enregistré en tant que pièce jointe code> dans une autre instance. Ce que j'ai fait, c'est d'ajouter cette fonction à stock.picking dans la télécommande Odoo.

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'
})

Puis en l'appelant en utilisant xmlrpc code> et enregistrez-le en tant que pièce jointe

@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

Ce que vous pouvez faire en C # c'est obtenir le base64 et l'enregistrer au format PDF si vous souhaitez procéder de la même manière.


1 commentaires

Merci pour cela, mais malheureusement je n'ai aucun contrôle sur la configuration / installation à distance d'Odoo.