← Blog / Odoo & ERP

Comment créer et imprimer un document PDF sur Odoo 13 ?

Dans cet article, je vous explique via un exemple concret comment vous pouvez créer et imprimer un rapport PDF à partir d'un wizard avec Odoo v13.

par nasser

Exemple d’application

Imprimer un rapport de production cumulée pour une période précise.

Comment faire pour la réalisation d’un tel rapport ?

  1. Analyser la structure du rapport pour voir quels sont les modules et modèles Odoo qui entreront en jeu

  2. Préparer le code HTML du rapport

  3. Si le rapport doit être imprimé pour une période précise, coder un wizard (fenêtre modale) qui affiche la date de début et la date de fin pour la période voulue.  Sinon, il faudra juste lier l’action du rapport à un bouton comme on va le faire avec le bouton Imprimer (Print) du wizard.

  4. Coder le rapport proprement dit et l’imprimer

NB: Le wizard peut afficher plusieurs autres champs qui permettront d’imprimer le rapport c’est à dire produit, matricule, nom, etc… Bref, n’importe quel champ qui pourra aider à l’impression du rapport.

Création du rapport par la pratique

1. Analyse du rapport

Le rapport de production cumulé dont il est question est un rapport qui est utilisé en production dans la fabrication de pains dans une boulangerie.

Dans un rapport pareil, on voit très bien qu’il met en jeu un tableau à 9 colonnes et que les produits qui y sont présents sont utilisés en production dans le module frabication. De plus il y’a quelques calculs à faire (Moy. par production, Moy. par Produit).

Résultat de l’analyse: Imprimer ce rapport revient à installer le module de fabrication (nom technique: mrp) puis utiliser les champs move_raw_ids (onglet Composants) et finished_move_line_ids (onglet Produits finis) du modèle mrp.production, ainsi que tout autres champs du modèle qui peut être utilisé dans le rapport.

NB: Les champs ne sont pas toujours figés dans un seul modèle. Il peut arriver que vous utilisiez les champs d’autres modèles soit en appelant ce modèle directement en utilisant self.env[nom_du_modele] ou par relation Many2one, One2many ou Many2many. Par exemple, move_line_ids.product_id permet de récupérer le produit lié au champ One2many move_line_ids.

2. Préparation du code HTML du rapport

Préparer le code HTML du rapport revient à coder en HTML/CSS la structure de ce rapport. 

Dans notre cas, il s’agit d’un tableau à 9 colonnes. Généralement, j’utilise le site W3schools pour récupérer le code d’un tableau avant de l’améliorer. Pour celà, il suffit juste de taper sur la barre de recherche Google “html table w3schools” et cliquer sur le lien qui convient, puis aller sur Try it Yourself pour copier le code HTML/CSS du tableau. 

3. Wizard pour l’impression du rapport

Dans ce cas ci, le wizard va contenir uniquement 2 champs: date de début et date de fin, puisqu’il s’agit d’un rapport de production pour une période précise. Maintenant, nous allons créer le wizard pas à pas.

Créer un nouveau module ou utiliser un module existant. Dans mon cas, je vais créer le module px_mrp, et mettre les informations nécessaires dans le fichier manifest du module.

Dans le dossier wizard, créer les modèles et vues du wizard en question

https://gist.github.com/nasser-bloopark/24573d971918a60ea83dc7fe1ddff024

Il faut créer un fichier XML Odoo et y insérer le code suivant:

https://gist.github.com/nasser-bloopark/eb41041028bef4d744e91bb8000fb511

Explication du code

4. Codage et impression du rapport proprement dit

Après avoir affiché le wizard pour l’impression du rapport, l’utilisateur n’aura qu’à entrer les dates de début et date de fin, avant de cliquer sur Imprimer (Print). Lorsqu’il clique dessus, tout un ensemble de logique se déclenche comme la récupération des données dans la BD, leur assignation aux variables nécéssaires et l’impression du rapport avec les données récupérées. Toute cette logique doit être codée dans le dossier report du module.

https://gist.github.com/nasser-bloopark/a4cd61a797673c169dd09ff6641ca0bb

Explication du code:

https://gist.github.com/nasser-bloopark/6222c37b5a514a24a00110504a96755b

On se rend compte que la fonction print_report() retourne une action qui prend en paramètre la définition du rapport dans le XML (px_mrp.report_cumulative_production_report, px_mrp étant le nom du module et report_cumulative_production_report, l’ID de la définition du rapport dans le XML de ce rapport)

Toujours dans le dossier report, il faut créer un fichier XML et y mettre le code correspondant comme celui-ci

Le template

https://gist.github.com/nasser-bloopark/0d1a60e51de77538156b467a060a610a

Le template doit être exactement comme celui ci, avec pour seule différence la définition de l’ID du template (cumulative_production_report) qui est utilisé dans le nom (_name) du rapport dans le modèle Python (report.px_mrp.cumulative_production_report).

Puis, il faut insérer dans la div "page" le code HTML du rapport. Pour afficher les données, il suffit juste de boucler sur l'objet data retournée par le dictionnaire au niveau de l’AbstractModel dans le return de la fonction:

https://gist.github.com/nasser-bloopark/e37c37626280bb2fada6042759231dd6

Au niveau du XML, vous pouvez voir le t-foreach "data" qui permet de boucler sur data et afficher les données via le span t-esc.

On peut aussi voir span t-esc="print_time" qui permet d’afficher la date d’impression du rapport. Vous pouvez voir que print_time est aussi présent dans le return de la classe.

La définition du rapport

Le rapport est définit par le code

https://gist.github.com/nasser-bloopark/58efab1721152833ab60d72311a6fc9f

C’est l’ID de cette action qui est appelé au niveau du print_report() dans return self.env.ref('px_mrp.report_cumulative_production_report').report_action(self, data=data)

Et voici le résultat, il suffit d’y appliquer du CSS et le tour est joué

 

Restez scotchés pour recevoir tous les prochains articles

Des cas concrets en video Rejoindre la chaîne YouTube pour aller plus loin →
Une question ou preoccupation ? Discutons-en ici →