Fait partie de notre série Data Analytics & BI
Lire le guide completOdoo + Power BI : Guide complet d'intégration d'Analytics
Odoo 19 Enterprise inclut de solides rapports intégrés, mais pour les organisations qui ont besoin d'analyses en libre-service, de modélisation de données inter-systèmes et de visualisation de niveau entreprise, Power BI est le complément naturel. La connexion des données opérationnelles d'Odoo au moteur analytique de Power BI permet d'accéder à des informations que les rapports natifs d'Odoo ne peuvent pas fournir.
Ce guide couvre tous les aspects de l'intégration Odoo-Power BI : architecture de connexion, meilleures pratiques de modélisation des données, création de tableaux de bord commerciaux clés, création de mesures DAX, configuration d'actualisation incrémentielle et déploiement dans Microsoft Fabric à l'échelle de l'entreprise.
Points clés à retenir
- Trois méthodes de connexion : PostgreSQL direct, API REST Odoo et ODBC via l'export d'Odoo
- Le mode DirectQuery fournit des données en temps réel ; Le mode d'importation offre de meilleures performances pour les grands ensembles de données
- Le schéma PostgreSQL d'Odoo nécessite une dénormalisation pour des modèles de données Power BI efficaces
- L'actualisation incrémentielle réduit le temps de chargement des grandes tables (account.move, stock.move)
- La sécurité au niveau des lignes dans Power BI reflète le contrôle d'accès au niveau de l'entreprise d'Odoo
- Déploiement de passerelle requis pour Odoo sur site ; cloud Odoo se connecte directement
- Microsoft Fabric (Power BI Premium) active les données Odoo dans le Lakehouse de l'entreprise
- Mesures clés : chiffre d'affaires, marge brute, rotation des stocks, ancienneté des créances, OEE
Options d'architecture d'intégration
Choisissez la bonne architecture de connexion en fonction de vos besoins de déploiement et de reporting Odoo.
Option 1 : connexion directe à PostgreSQL (recommandée)
Connectez Power BI directement à la base de données PostgreSQL d'Odoo à l'aide du connecteur PostgreSQL :
Avantages :
- Accès complet à toutes les tables et données brutes Odoo
- Meilleures performances pour les jointures complexes
- Prend en charge les modes Import et DirectQuery
Inconvénients :
- Nécessite un accès réseau de Power BI Gateway à PostgreSQL
- Les modifications apportées au modèle de données d'Odoo nécessitent la mise à jour des requêtes Power BI
- L'accès direct à la base de données contourne le contrôle d'accès d'Odoo
Option 2 : API REST Odoo
Connectez-vous via le connecteur Web de Power BI à l'aide de l'API REST d'Odoo :
Avantages :
- Fonctionne sans accès réseau à PostgreSQL
- Respecte les droits d'accès d'Odoo par utilisateur
- Aucune information d'identification de base de données requise
Inconvénients :
- Plus lent que PostgreSQL direct (un appel API par table)
- La limitation du débit affecte les grandes extractions de données
- Difficile de paginer efficacement pour de grands ensembles de données
Option 3 : Exporter vers l'entrepôt de données
Données ETL Odoo dans un entrepôt de données dédié (Azure Synapse, Snowflake, BigQuery) :
Avantages :
- Performances maximales à grande échelle
- Découple la BI de l'ERP
- Peut intégrer plusieurs systèmes sources
Inconvénients :
- Coût et complexité d'infrastructure les plus élevés
- La latence des données dépend du calendrier ETL (généralement de 1 heure à 24 heures)
- Nécessite la maintenance du pipeline ETL
Architecture recommandée pour la plupart des organisations : PostgreSQL direct avec Power BI Gateway (sur site) ou connexion directe (cloud Odoo), mode d'importation avec actualisation incrémentielle, actualisation planifiée toutes les 1 à 4 heures.
Configuration de la connexion PostgreSQL
Étape 1 : Accès au réseau
Pour Odoo sur site :
- Installez la passerelle de données sur site sur un serveur avec accès réseau à PostgreSQL.
- Configurez la passerelle avec vos informations d'identification Microsoft 365
- Ouvrez le port PostgreSQL (5432 ou 5433) du serveur de passerelle vers le serveur Odoo DB
Pour le cloud Odoo (AWS, Azure, GCP) :
- Configurer le groupe de sécurité/pare-feu pour autoriser les entrées provenant des plages IP de Power BI
- Ou : utilisez la passerelle sur site sur une VM cloud dans le même VPC
Étape 2 : Créer un utilisateur de base de données en lecture seule
Ne connectez jamais Power BI à votre utilisateur principal de base de données Odoo. Créez un utilisateur dédié en lecture seule :
-- Create read-only user for Power BI
CREATE USER powerbi_reader WITH PASSWORD 'strong_password_here';
-- Grant connection to database
GRANT CONNECT ON DATABASE your_odoo_db TO powerbi_reader;
-- Grant schema usage
GRANT USAGE ON SCHEMA public TO powerbi_reader;
-- Grant SELECT on all current and future tables
GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO powerbi_reader;
Étape 3 : Configurer dans Power BI Desktop
- Ouvrez Power BI Desktop → Obtenir des données → Base de données PostgreSQL
- Saisissez :
- Serveur : votre hôte PostgreSQL (et port sinon 5432)
- Base de données : le nom de votre base de données Odoo
- Nom d'utilisateur : powerbi_reader
- Mot de passe : le mot de passe de l'utilisateur en lecture seule
- Sélectionnez le mode de connexion : Importer (recommandé) ou DirectQuery
Tableaux clés Odoo pour Power BI
Comprendre le schéma PostgreSQL d'Odoo est essentiel pour créer des modèles de données précis.
Tableaux financiers :
| Tableau | Descriptif | Champs clés |
|---|---|---|
account_move | Factures, factures, écritures de journal | move_type, état, facture_date, montant_total, devise_id |
account_move_line | Postes sur les écritures de journal | move_id, account_id, débit, crédit, quantité, price_subtotal |
account_account | Plan comptable | code, nom, type_compte |
account_payment | Paiements clients/fournisseurs | montant, date_paiement, état, identifiant_partenaire |
Tableaux de ventes :
| Tableau | Descriptif | Champs clés |
|---|---|---|
sale_order | Commandes clients | nom, état, date_order, montant_total, partenaire_id, user_id |
sale_order_line | Lignes d'ordre de vente | order_id, product_id, product_uom_qty, price_subtotal |
crm_lead | Opportunités CRM | nom, stage_id, attendu_revenue, probabilité, user_id |
Tableaux d'inventaire :
| Tableau | Descriptif | Champs clés |
|---|---|---|
stock_quant | Niveaux de stocks actuels | product_id, location_id, quantité |
stock_move | Tous les mouvements de stocks | product_id, état, date, quantité_done |
stock_picking | Documents de livraison/réception | picking_type_id, état, date_programmée |
product_template | Données de base du produit | nom, list_price, categ_id, type |
RH et Paie :
| Tableau | Descriptif | Champs clés |
|---|---|---|
hr_employee | Employés | nom, Department_id, Job_id, Company_id |
hr_attendance | Temps et présence | employ_id, check_in, check_out |
hr_payslip | Fiches de paie | employ_id, date_from, date_to, state |
Conception de modèles de données Power BI
Conception de schéma en étoile pour les données Odoo :
Convertissez le schéma normalisé d'Odoo en schéma en étoile pour des performances Power BI optimales :
[Date Table] (dimension)
↓
[Sales Fact Table]
↓
[Product Dimension] ← [Product Category Dimension]
↓
[Customer Dimension] ← [Country Dimension]
↓
[Salesperson Dimension]
↓
[Company Dimension]
Code Power Query M — Tableau de faits sur les ventes :
let
Source = PostgreSQL.Database("your-odoo-server:5433", "your_db"),
SaleOrderLine = Source{[Schema="public", Item="sale_order_line"]}[Data],
SaleOrder = Source{[Schema="public", Item="sale_order"]}[Data],
ProductTemplate = Source{[Schema="public", Item="product_template"]}[Data],
ProductProduct = Source{[Schema="public", Item="product_product"]}[Data],
// Join order lines with orders
JoinWithOrder = Table.NestedJoin(
SaleOrderLine, {"order_id"},
SaleOrder, {"id"},
"Order", JoinKind.Inner
),
// Expand order columns needed
ExpandOrder = Table.ExpandTableColumn(
JoinWithOrder, "Order",
{"name", "state", "date_order", "partner_id", "user_id", "company_id"},
{"order_name", "order_state", "date_order", "partner_id", "user_id", "company_id"}
),
// Filter: confirmed and done orders only
FilterState = Table.SelectRows(
ExpandOrder,
each [order_state] = "sale" or [order_state] = "done"
),
// Select and rename final columns
SelectColumns = Table.SelectColumns(FilterState, {
"id", "order_id", "product_id", "date_order", "partner_id",
"user_id", "company_id", "product_uom_qty", "price_unit",
"price_subtotal", "price_tax", "price_total"
}),
// Change types
ChangedTypes = Table.TransformColumnTypes(SelectColumns, {
{"date_order", type datetime},
{"price_subtotal", type number},
{"product_uom_qty", type number}
})
in
ChangedTypes
Mesures essentielles du DAX
Revenu et marge :
// Total Revenue (Net)
Revenue = SUMX(SalesFact, SalesFact[price_subtotal])
// Revenue MTD
Revenue MTD =
CALCULATE([Revenue], DATESMTD(DateTable[Date]))
// Revenue YTD
Revenue YTD =
CALCULATE([Revenue], DATESYTD(DateTable[Date]))
// Revenue vs Prior Period
Revenue vs PY =
VAR CurrentRevenue = [Revenue]
VAR PriorYearRevenue =
CALCULATE([Revenue], SAMEPERIODLASTYEAR(DateTable[Date]))
RETURN
DIVIDE(CurrentRevenue - PriorYearRevenue, PriorYearRevenue, 0)
// Gross Margin
Gross Margin =
SUMX(SalesFact,
SalesFact[price_subtotal] -
(RELATED(ProductDim[standard_price]) * SalesFact[product_uom_qty])
)
// Gross Margin %
Gross Margin % =
DIVIDE([Gross Margin], [Revenue], 0)
Mesures d'inventaire :
// Current Stock Value
Stock Value =
SUMX(
StockQuant,
StockQuant[quantity] * RELATED(ProductDim[standard_price])
)
// Inventory Turnover (annualized)
Inventory Turnover =
DIVIDE(
[COGS Annualized],
[Average Inventory Value],
0
)
// Days of Inventory Outstanding
DIO =
DIVIDE(365, [Inventory Turnover], 0)
// Stockout % (products with zero stock)
Stockout Rate =
DIVIDE(
COUNTROWS(FILTER(StockQuant, StockQuant[quantity] <= 0)),
COUNTROWS(StockQuant),
0
)
Âge des créances :
// Current (0-30 days)
AR Current =
CALCULATE(
SUM(ARFact[amount_residual]),
ARFact[days_overdue] <= 0
)
// 1-30 days overdue
AR 1-30 Days =
CALCULATE(
SUM(ARFact[amount_residual]),
ARFact[days_overdue] >= 1 && ARFact[days_overdue] <= 30
)
// Days Sales Outstanding
DSO =
DIVIDE(
SUM(ARFact[amount_residual]),
[Revenue] / 365,
0
)
Pages clés du tableau de bord
1. Tableau de bord exécutif
- Revenus par rapport au budget (graphique de jauge)
- Tendance des revenus (graphique linéaire, 13 mois glissants)
- % de marge brute (carte KPI avec tendance) - 10 principaux clients par chiffre d'affaires (graphique à barres)
- Top 10 des produits par chiffre d'affaires (barre horizontale)
- Revenus par région (carte remplie)
2. Pipeline de ventes (CRM)
- Pipeline par étape (graphique en entonnoir)
- Valeur pondérée du pipeline (KPI)
- Taux de victoires/pertes (graphique en beignet)
- Tendance de la taille moyenne des transactions
- Performance des commerciaux (tableau matriciel)
- Prévisions vs réels (combinaison ligne + barre)
3. Aperçu financier
- Résumé P&L (tableau avec YTD, YoY)
- Situation de trésorerie (KPI)
- Vieillissement des créances (barre empilée)
- Vieillissement des dettes (barre empilée)
- Tendance DSO (graphique linéaire)
4. Tableau de bord d'inventaire
- Valeur du stock par catégorie (treemap)
- Rotation des stocks par entrepôt (bar)
- Inventaire à rotation lente (tableau : stock > 90 jours)
- Articles à risque de rupture de stock (tableau : jours de couverture < 7)
- Réorganiser les alertes de points (cartes)
5. Tableau de bord RH
- Effectif par département (barre)
- Présence par rapport aux heures prévues (jauge)
- Utilisation du solde des congés (matrice)
- Tendance du taux de turnover (ligne)
Actualisation incrémentielle pour les grandes tables
Les tables account_move_line, stock_move et mail_message d'Odoo comptent des millions de lignes. L’actualisation incrémentielle empêche le rechargement de la table complète à chaque actualisation.
Configurer l'actualisation incrémentielle :
- Dans Power Query, ajoutez les paramètres
RangeStartetRangeEnd(type DateTime) - Filtrez votre colonne de date :
Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd) - Cliquez avec le bouton droit sur le tableau dans le volet Champs → Actualisation incrémentielle
- Définir : stocker les 12 derniers mois, actualiser les 3 derniers jours
Tableaux Odoo qui bénéficient le plus de l'actualisation incrémentielle :
account_move_line: filtrer pardatestock_move: filtrer pardatesale_order: filtrer pardate_ordermail_message: filtrer pardate
Sécurité au niveau des lignes
Implémentez la sécurité au niveau des lignes (RLS) dans Power BI pour refléter le contrôle d'accès au niveau de l'entreprise d'Odoo.
// RLS filter: user sees only their assigned companies
[company_id] IN
CALCULATETABLE(
VALUES(UserCompanyMapping[company_id]),
UserCompanyMapping[user_email] = USERPRINCIPALNAME()
)
Créez une table UserCompanyMapping (conservée dans Power BI ou synchronisée depuis Odoo) mappant les adresses e-mail aux identifiants d'entreprise autorisés.
Questions fréquemment posées
Puis-je utiliser DirectQuery avec la base de données PostgreSQL d'Odoo pour les données en temps réel ?
Oui, mais avec des réserves. DirectQuery sur PostgreSQL d'Odoo est réalisable pour les tableaux de bord avec des requêtes simples. Les tableaux de bord complexes comportant de nombreuses mesures seront lents car chaque visuel déclenche de nouvelles requêtes SQL sur votre base de données de production. Pour la plupart des cas d’utilisation, le mode Importation avec actualisation d’une heure constitue le meilleur compromis entre fraîcheur et performances.
Comment gérer les données multidevises d'Odoo dans Power BI ?
Odoo stocke les montants à la fois dans la devise de la transaction et dans la devise de l'entreprise. Utilisez le champ amount_currency pour la devise d'origine et debit/credit (ou price_subtotal) pour l'équivalent dans la devise de l'entreprise. Pour la consolidation au niveau du groupe dans Power BI, utilisez les montants en devise de l'entreprise d'Odoo et appliquez une table de dimension de conversion de devise distincte pour des rapports cohérents.
Quel est l'impact sur les performances de la base de données PostgreSQL d'Odoo lors de l'actualisation de Power BI ?
Une actualisation complète de l’ensemble de données Power BI exécute simultanément plusieurs requêtes analytiques sur PostgreSQL. Pour les grandes bases de données Odoo (> 50 Go), cela peut consommer des E/S et du processeur importants pendant la fenêtre d'actualisation. Bonnes pratiques : planifiez les actualisations pendant les heures creuses (par exemple, de 2 h 00 à 4 h 00), utilisez un réplica en lecture de PostgreSQL pour les requêtes Power BI et implémentez l'actualisation incrémentielle pour minimiser la portée des requêtes.
Puis-je connecter Power BI à la communauté Odoo (version gratuite) via PostgreSQL ?
Oui. Power BI se connecte à n'importe quelle base de données PostgreSQL, quelle que soit l'application qui la gère. Le schéma PostgreSQL de la communauté Odoo est presque identique à celui d'Enterprise (sauf certaines tables réservées à Enterprise). La méthode de connexion est la même ; assurez-vous simplement que l'utilisateur de la base de données en lecture seule a accès à la base de données communautaire.
Comment puis-je synchroniser mon modèle de données Power BI lorsqu'Odoo est mis à niveau vers une nouvelle version ?
Les mises à niveau de version Odoo peuvent renommer ou restructurer les tables de base de données, en particulier pour les modules ayant subi une refactorisation importante. Après toute mise à niveau d'Odoo : exécutez une comparaison des schémas de table entre les anciennes et les nouvelles versions, mettez à jour les requêtes Power Query pour référencer les colonnes renommées et validez toutes les mesures DAX par rapport au nouveau schéma. Créez une vérification des modifications de schéma dans votre runbook de migration.
Prochaines étapes
Construire une intégration Odoo + Power BI de niveau production nécessite une expertise en modélisation de données, des connaissances PostgreSQL et une compréhension approfondie du schéma d'Odoo. Effectué correctement, il fournit une plate-forme d'analyse unifiée qui transforme la façon dont votre équipe de direction prend des décisions.
ECOSIRE propose des solutions d'analyse Odoo + Power BI de bout en bout, depuis l'architecture de base de données et la modélisation des données jusqu'à la conception de tableaux de bord, le développement et le déploiement de DAX. Notre équipe allie l’expertise Odoo et la spécialisation Power BI.
Parlez à ECOSIRE à propos de votre intégration Odoo Analytics →
Découvrez les services Power BI d'ECOSIRE →
Partagez vos besoins en matière de reporting et nous concevrons une architecture Power BI qui donnera à votre équipe de direction une visibilité en temps réel sur toutes les dimensions de vos opérations Odoo.
Rédigé par
ECOSIRE Research and Development Team
Création de produits numériques de niveau entreprise chez ECOSIRE. Partage d'analyses sur les intégrations Odoo, l'automatisation e-commerce et les solutions d'entreprise propulsées par l'IA.
Articles connexes
Odoo Accounting vs QuickBooks: Detailed Comparison 2026
In-depth 2026 comparison of Odoo Accounting vs QuickBooks covering features, pricing, integrations, scalability, and which platform fits your business needs.
Building Financial Dashboards with Power BI
Step-by-step guide to building financial dashboards in Power BI covering data connections to accounting systems, DAX measures for KPIs, P&L visualisations, and best practices.
AI + ERP Integration: How AI is Transforming Enterprise Resource Planning
Learn how AI is transforming ERP systems in 2026—from intelligent automation and predictive analytics to natural language interfaces and autonomous operations.
Plus de Data Analytics & BI
Building Financial Dashboards with Power BI
Step-by-step guide to building financial dashboards in Power BI covering data connections to accounting systems, DAX measures for KPIs, P&L visualisations, and best practices.
Case Study: Power BI Analytics for Multi-Location Retail
How a 14-location retail chain unified their reporting in Power BI connected to Odoo, replacing 40 spreadsheets with one dashboard and cutting reporting time by 78%.
GoHighLevel + Power BI: Advanced Reporting and Analytics
Connect GoHighLevel to Power BI for advanced marketing analytics. Build executive dashboards, track multi-channel ROI, and create automated reports that go beyond GHL's native reporting.
GoHighLevel Reporting and Analytics: Measuring What Matters
Master GoHighLevel reporting and analytics. Learn to build custom dashboards, track ROI across channels, measure funnel conversion, and make data-driven marketing decisions.
Odoo Events Module: Planning, Registration, and Analytics
Complete guide to Odoo 19 Events: create events, manage registrations, sell tickets, track attendance, and analyze event ROI with native ERP integration.
Using OpenClaw AI Agents to Automate Power BI Reports
How OpenClaw AI agents automate Power BI report generation, distribution, and data preparation — delivering analytics at scale without manual BI developer intervention.