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

ChampValeur attendueObligatoire
Nom du rapportLibellé affiché dans l'interface
Code rapportIdentifiant technique unique, sans espaces — ex : declaration_conformite_ce
ModèleModèle Odoo cible (ex : sale.order, mrp.production)
Champ nom fichierChamp Char du modèle utilisé pour nommer le fichier
Template DOCXFichier .docx avec balises Jinja2
PréfixeTexte ajouté au début du nom de fichier généré
Mode de fusioncomposer (DOCX unique) · zip (un fichier/enregistrement) · pdf (via LibreOffice)
Nom fichier impressionFormule Jinja — ex : {{ docs.name }}
AutoescapeActiver 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

FonctionDescription
{{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 :

OSValeur
Linux/usr/bin/libreoffice
WindowsC:\Program Files\LibreOffice\program\soffice.exe

Clé : default_libreoffice_path


Erreurs courantes

ErreurCauseSolution
TemplateSyntaxError: unknown tag 'endif'Deux blocs if séparés dans un forRemplacer 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éeLe champ est un float (0.0 != 0)Utiliser not line.champ
Erreur 500 génériqueErreur Python non affichéejournalctl -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