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 : for → if → else → endif → endfor

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