Il arrive un moment, sur toute instance en service, où la question posée ne tient dans aucun écran : « combien de clients ont commandé en 2025 mais pas en 2026, par secteur ». La réponse est une requête, et l'ERP n'a pas d'endroit pour la poser.
Douze modules communautaires ouvrent cet endroit — et étendent les formats de sortie au-delà du PDF. Ils terminent le dépôt reporting-engine.
Résumé
Quatre modules traitent les exports SQL : des requêtes en lecture seule définies et exportées depuis l'interface, un export différentiel ne sortant que les lignes changées depuis la dernière exécution, le format Excel — avec injection dans un fichier modèle existant, formules comprises —, et l'envoi automatique par courriel selon une planification.
Un module fournit un cadre d'indicateurs de performance : calculés en Python, par requête SQL sur la base locale, ou par requête sur une base externe, avec leurs catégories, intervalles, seuils et sources de données.
Trois modules traitent les formats : le support des rapports XML, un PDF de formulaire rempli automatiquement depuis les enregistrements, et la délégation de la conversion de format à un serveur externe pour les rapports bureautiques.
Quatre modules enfin traitent la sortie : un PDF protégé par mot de passe, une archive ZIP contenant un PDF par enregistrement, un contexte personnalisé injecté à la génération, et une bibliothèque d'extraction et d'intégration de XML dans un PDF.
L'essentiel
- Des requêtes SQL en lecture seule définies depuis l'interface.
- Un export différentiel : seules les lignes changées.
- Le format Excel, avec injection dans un modèle à formules.
- L'envoi automatique par courriel, selon une planification.
- Des indicateurs calculés en SQL, y compris sur une base externe.
- Un PDF protégé par mot de passe.
- Une archive ZIP : un PDF par enregistrement.
- Un PDF de formulaire rempli depuis les données.
Ce que ces modules ajoutent à l'instance
| Module | Version | Ce qu'il apporte |
|---|---|---|
sql_export | 18.0.1.1.1 | Requêtes SQL en lecture seule exportées en CSV (Tableaux de bord ▸ Export SQL) |
sql_export_delta | 18.0.1.0.0 | Export différentiel : seules les lignes changées depuis le dernier export |
sql_export_excel | 18.0.1.0.1 | Format Excel, avec injection dans un fichier modèle existant |
sql_export_mail | 18.0.1.0.0 | Envoi automatique par courriel selon une planification |
kpi | 18.0.1.0.0 | Indicateurs calculés en Python ou en SQL, locale ou externe |
report_xml | 18.0.1.1.1 | Le support des rapports au format XML |
report_pdf_form | 18.0.1.0.1 | Un PDF à champs de formulaire rempli depuis les données (LGPL-3) |
report_py3o_fusion_server | 18.0.1.0.0 | Conversion de format déléguée à un serveur externe |
report_qweb_encrypt | 18.0.1.0.0 | PDF protégé par mot de passe, saisi ou calculé |
report_pdf_zip_download | 18.0.1.0.0 | Une archive ZIP avec un PDF par enregistrement |
report_context | 18.0.1.0.0 | Un contexte personnalisé injecté à la génération |
pdf_xml_attachment | 18.0.1.0.0 | Bibliothèque : extraire ou intégrer un XML dans un PDF (LGPL-3) |
Les menus : Tableaux de bord ▸ Export SQL, Tableaux de bord ▸ Configuration ▸ Indicateurs Clé de Performance et ses cinq sous-menus, Paramètres ▸ Technique ▸ Analyse ▸ PDF Form Reports, Py3o PDF Export Options et Serveurs Py3o.
Les exports SQL : la question qui ne tient dans aucun écran
Toute instance en service finit par produire une question qu'aucun écran ne couvre. L'alternative habituelle est un export manuel repris dans un tableur, refait chaque mois, avec une formule qui se décale. L'export SQL remplace ce rituel par une requête nommée.
sql_export permet à un utilisateur habilité de définir des requêtes SQL en lecture seule et de les exporter en fichier depuis l'interface. Le mot « habilité » est important : c'est un accès direct à la base, encadré par des droits.
sql_export_deltan'exporte que les lignes changées depuis la dernière exécution. Indispensable quand la requête produit un gros volume et que seuls les nouveaux enregistrements intéressent le destinataire.sql_export_excelgénère le résultat au format Excel, et surtout permet de l'injecter dans un fichier modèle existant — avec ses formules et sa mise en forme. Le tableau de bord du contrôleur de gestion se remplit tout seul.sql_export_mailenvoie automatiquement le fichier par courriel, selon une planification, à une liste d'utilisateurs ou de contacts.
Les trois extensions combinées transforment une requête en abonnement : le vendredi matin, le responsable commercial reçoit son tableau Excel à jour, dans son modèle, sans que personne n'ait rien fait. C'est le reporting qui survit aux absences.
Les indicateurs de performance
kpi fournit un cadre générique pour définir et suivre des indicateurs, calculés de trois façons : en Python, par requête SQL sur la base Odoo, ou par requête SQL sur une base de données externe.
Il apporte un référentiel complet sous Tableaux de bord ▸ Configuration ▸ Indicateurs Clé de Performance : les indicateurs, leurs catégories, leurs intervalles de rafraîchissement, leurs seuils et leurs sources de données.
La possibilité d'interroger une base externe est ce qui le distingue : un indicateur peut venir d'un outil métier qui n'est pas dans Odoo — une machine, un logiciel de caisse, un système historique.
Les seuils sont la partie qui fait la différence entre un chiffre et un indicateur : un taux de service à 94 % ne dit rien sans savoir qu'on vise 97 % et qu'on alerte sous 92 %.
Le module dépend du connecteur de bases externes et du moteur de tableur d'Odoo.
Les formats de sortie
report_xmlétend le moteur de rapports au format XML. Il ne produit aucun rapport métier lui-même : c'est un socle, dont dépendent les modules d'échanges de données et de facturation électronique.report_pdf_form(LGPL-3) permet d'utiliser un PDF à champs de formulaire comme modèle de rapport, rempli automatiquement depuis les enregistrements. Référentiel sous PDF Form Reports.report_py3o_fusion_serverdélègue la conversion de format des rapports bureautiques — ODT et ODS vers PDF ou DOCX — à un serveur externe, au lieu d'invoquer un convertisseur local à chaque génération.
Le PDF de formulaire résout un cas très concret : un formulaire administratif officiel, fourni en PDF par une administration, qu'il faut remplir avec des données de l'ERP. Recréer ce formulaire en gabarit serait absurde et juridiquement risqué.
La délégation de conversion répond à un problème de charge : convertir un document bureautique mobilise un processus lourd, et cent conversions simultanées saturent un serveur.
Protéger, grouper, contextualiser
report_qweb_encrypt permet de protéger par mot de passe les rapports PDF générés. Le mot de passe peut être saisi à l'impression ou calculé automatiquement à partir des données.
Un bulletin de paie, un relevé de compte ou un courrier nominatif envoyé par courriel sans protection est une fuite de données en attente. Un mot de passe calculé — date de naissance, numéro de client — n'est pas inviolable, mais il transforme un envoi au mauvais destinataire en non-événement.
report_pdf_zip_downloadgénère une archive ZIP contenant un PDF par enregistrement quand plusieurs enregistrements sont imprimés. Si un seul l'est, le PDF sort normalement.report_contextinjecte un contexte personnalisé à la génération d'un rapport, globalement ou pour un rapport donné.pdf_xml_attachment(LGPL-3) est une bibliothèque sans écran : elle expose des fonctions pour extraire un XML embarqué dans un PDF ou pour en intégrer un.
Le dernier est la brique technique du format Factur-X, où la facture est un PDF contenant un XML — traité dans Factur-X et EN 16931.
L'archive ZIP répond à un besoin banal : imprimer deux cents factures et obtenir deux cents fichiers nommés, au lieu d'un PDF de six cents pages qu'il faut découper.
Limites connues
sql_exportdonne un accès SQL direct à la base : le droit d'écrire des requêtes doit être réservé, et chaque requête relue. Une requête lourde bloque la base pendant son exécution.- Les requêtes SQL contournent les règles d'accès d'Odoo : une requête voit tout, y compris ce que son auteur ne devrait pas voir.
- L'export différentiel suppose une clé stable dans la requête : sans elle, le delta est faux.
sql_export_mailenvoie des données par courriel : vérifier les destinataires et le contenu avant de planifier.kpidépend du connecteur de bases externes et du moteur de tableur : deux briques lourdes.- Le mot de passe de PDF calculé depuis les données est faible par construction : il protège d'une erreur d'envoi, pas d'un attaquant.
- Le serveur de conversion externe est un service de plus à exploiter : surveillance et mises à jour comprises.
- L'archive ZIP charge tous les PDF en mémoire : à éprouver sur le volume réel avant d'en faire un usage courant.
Identité technique
Les douze modules viennent du dépôt OCA reporting-engine, branche 18.0 — dont les 34 modules sont désormais tous documentés ici. Dix sont en AGPL-3, deux en LGPL-3. Les dépendances : sql_request_abstract et spreadsheet_dashboard pour les exports SQL, base_external_dbsource pour les indicateurs sur base externe, report_py3o pour la conversion bureautique, web pour les formats de sortie.
L'autre fiche du dépôt : vos documents PDF.
Questions fréquentes
Peut-on exécuter une requête SQL depuis Odoo ?
Oui, avec sql_export : un utilisateur habilité définit des requêtes en lecture seule et les exporte depuis Tableaux de bord ▸ Export SQL. C'est un accès direct à la base, donc à réserver : une requête voit tout, y compris ce que son auteur ne devrait pas voir, et contourne les règles d'accès d'Odoo.
Peut-on recevoir un rapport Excel automatiquement chaque semaine ?
Oui, en combinant sql_export, sql_export_excel et sql_export_mail : la requête s'injecte dans un fichier Excel modèle avec ses formules, et part par courriel selon une planification. Le vendredi matin, le destinataire reçoit son tableau à jour sans que personne n'ait rien fait.
Peut-on protéger par mot de passe un PDF généré par Odoo ?
Oui : report_qweb_encrypt protège les rapports PDF, avec un mot de passe saisi à l'impression ou calculé depuis les données. Un mot de passe calculé n'est pas inviolable, mais il transforme un envoi au mauvais destinataire en non-événement.
Peut-on imprimer deux cents factures en fichiers séparés ?
Oui, avec report_pdf_zip_download : il génère une archive ZIP contenant un PDF par enregistrement. Si un seul enregistrement est imprimé, le PDF sort normalement. À éprouver sur le volume réel : l'archive charge tous les PDF en mémoire.
Peut-on remplir un formulaire PDF officiel depuis les données Odoo ?
Oui : report_pdf_form utilise un PDF à champs de formulaire comme modèle de rapport et le remplit depuis les enregistrements. Recréer un formulaire administratif officiel sous forme de gabarit serait absurde et juridiquement risqué.
Se faire accompagner
L'export SQL est le module le plus utile et le plus dangereux de ce dépôt : il répond à toutes les questions qu'aucun écran ne couvre, et il contourne toutes les règles d'accès de l'ERP. Les deux à la fois.
Nous l'installons donc avec un droit réservé, une relecture de chaque requête, et une convention de nommage — puis nous transformons les requêtes utiles en envois planifiés, parce qu'un rapport qu'on ne doit pas demander est un rapport qu'on lit. Voir les prestations d'Atalios Consulting ou demander un rappel.
Pour aller plus loin
En résumé
Toute instance en service finit par produire une question qu'aucun écran ne couvre. Douze modules ouvrent cet endroit : requêtes SQL exportées en Excel et envoyées par courriel, indicateurs calculés sur base externe, PDF chiffré, archive ZIP. Parlons de votre reporting.