Skip to main content

myFAB Rapport docx

myFAB · Rapport DOCX — Référence rapide

Prérequis : pip install docxtpl docxcompose htmldocx · LibreOffice requis pour le mode PDF


Créer un paramétrage

Technique → Rapport DOCX → Configurations → Nouveau

Champ Valeur attendue Obligatoire
Nom du rapport Libellé affiché dans l'interface
Code rapport Identifiant technique unique, sans espaces — ex : declaration_conformite_ce
Modèle Modèle Odoo cible (ex : sale.order, mrp.production)
Champ nom fichier Champ Char du modèle utilisé pour nommer le fichier
Template DOCX Fichier .docx avec balises Jinja2
Préfixe Texte ajouté au début du nom de fichier généré
Mode de fusion composer (DOCX unique) · zip (un fichier/enregistrement) · pdf (via LibreOffice)
Nom fichier impression Formule Jinja — ex : {{ docs.name }}
Autoescape Activer si le template contient <, > ou &

Publier via le bouton Publier — tous les champs passent en lecture seule.
Pour modifier : Dépublier d'abord.


Syntaxe du template

Champs

{{docs.nom_du_champ}}
{{docs.relation_id.champ}}

Fonctions utilitaires

Fonction Description
{{spelled_out(docs.champ)}} Nombre en toutes lettres
{{formatdate(docs.champ)}} Date formatée (Babel, fr_FR par défaut)
{{fdate(docs.champ, "%d/%m/%Y")}} Date avec format personnalisé
{{fnum(docs.champ, " ", ",", 2)}} Numérique — fnum(val, sep_milliers, sep_décimal, décimales)
{{parsehtml(docs.champ)}} HTML → texte brut
{{p html2docx(docs.champ)}} HTML → sous-document Word
{{convert_currency(docs.champ, docs.currency_id)}} Montant avec devise
{{render_image(docs.champ, width=30, height=30)}} Image binaire (mm)
{{r rich_text(docs.champ)}} Texte enrichi
{{p add_subdoc(docs.champ)}} Sous-document DOCX binaire
{{replace_image('nom', docs.champ)}} Remplacement d'image dans le template

Langue surchargeable par fonction : {{formatdate(docs.champ, lang='en_US')}}


Boucles dans un tableau

Chaque directive {%tr %} doit occuper une ligne entière du tableau, avec une cellule fusionnée sur toute la largeur.

{%tr for line in docs.order_line_ids %}
  {{line.product_id.display_name}}  |  {{line.qty}}  |  {{line.price_unit}}
{%tr endfor %}
  • Les lignes for et endfor sont supprimées du rendu final.
  • Les champs s'accèdent via la variable de boucle (line).

Conditions dans un tableau

Utiliser impérativement if / else / endif — deux blocs if séparés provoquent une TemplateSyntaxError.

{%tr for line in docs.order_line_ids %}
{%tr if not line.uom_qty %}
  [cellule fusionnée] {{line.product_id.display_name}}   ← ligne de section
{%tr else %}
  {{line.product_id.display_name}}  |  {{line.uom_qty}}  |  {{line.price_unit}}
{%tr endif %}
{%tr endfor %}

Ordre obligatoire : forifelseendifendfor

Préférer not line.champ à line.champ == 0 pour couvrir 0, 0.0, False et None.

La directive {%tr if %} et le contenu {{champ}} doivent être dans deux <w:r> séparés dans le XML Word — sinon le contenu ne s'affiche pas.


Mode PDF

Configurer le chemin LibreOffice dans Paramètres → Technique → Paramètres système :

OS Valeur
Linux /usr/bin/libreoffice
Windows C:\Program Files\LibreOffice\program\soffice.exe

Clé : default_libreoffice_path


Erreurs courantes

Erreur Cause Solution
TemplateSyntaxError: unknown tag 'endif' Deux blocs if séparés dans un for Remplacer par if / else / endif
Ligne fusionnée vide {%tr if %} et {{champ}} dans le même <w:r> Les séparer en deux runs distincts
Condition == 0 ignorée Le champ est un float (0.0 != 0) Utiliser not line.champ
Erreur 500 générique Erreur Python non affichée journalctl -u odoo -n 100 ou tail -f /var/log/odoo/odoo.log
PDF non généré LibreOffice absent ou mal configuré Installer + configurer default_libreoffice_path