Fait partie de notre série Data Analytics & BI
Lire le guide completLe guide complet de l'intégration Power BI + Odoo
Odoo est l'une des plateformes ERP open source les plus puissantes au monde, avec plus de 12 millions d'utilisateurs et 43 modules officiels couvrant tout, des ventes et des stocks à la fabrication et aux ressources humaines. Power BI est la plateforme de business intelligence leader du secteur avec plus de 300 millions d'utilisateurs actifs mensuels. Pourtant, étonnamment, peu d’organisations connectent ces deux systèmes, ce qui laisse une énorme valeur analytique sur la table.
La raison est simple : Odoo dispose de ses propres rapports intégrés et la plupart des cabinets de conseil Power BI se concentrent sur les intégrations Microsoft Dynamics, SAP ou Salesforce. Très peu d’entreprises possèdent une expertise approfondie des deux plateformes. Chez ECOSIRE, nous avons construit et déployé plus de 43 modules Odoo et maintenons une expertise approfondie de Power BI, faisant de la combinaison Odoo + Power BI l'une de nos principales spécialisations. Ce guide distille tout ce que nous avons appris de dizaines d'intégrations réelles.
Points clés à retenir
- La base de données PostgreSQL d'Odoo peut être connectée directement à Power BI Desktop à l'aide du connecteur PostgreSQL natif, vous donnant un accès complet à chaque table et champ
- Les cinq tables Odoo les plus précieuses pour l'analyse sont sale_order, account_move, stock_picking, hr_employee et mrp_production --- ensemble, elles couvrent 80 % des besoins de reporting des dirigeants.
- L'actualisation incrémentielle dans Power BI peut réduire les temps de chargement des données Odoo de plusieurs heures à quelques minutes en récupérant uniquement les enregistrements modifiés depuis la dernière actualisation.
- Les points de terminaison OData et l'API externe d'Odoo offrent des alternatives conviviales pour le cloud lorsque l'accès direct à la base de données n'est pas disponible
- La sécurité au niveau des lignes dans Power BI peut refléter les contrôles d'accès multi-entreprises d'Odoo, garantissant que les utilisateurs ne voient que les données de leurs entreprises assignées
- Les requêtes SQL personnalisées sur la base de données PostgreSQL d'Odoo surpassent de 5 à 10 fois les importations de tables génériques car vous pouvez filtrer, joindre et agréger au niveau de la base de données.
- Un déploiement Odoo + Power BI bien conçu remplace des dizaines de rapports de feuilles de calcul par une seule plateforme d'analyse gouvernée
Pourquoi Odoo + Power BI est une combinaison puissante
Les limites des rapports intégrés d'Odoo
Odoo est livré avec plusieurs outils de reporting : des vues pivots, des vues graphiques et un tableau de bord intégré. Pour les opérations quotidiennes, celles-ci sont adéquates. Mais ils ne parviennent pas à répondre aux besoins d’analyse d’entreprise à plusieurs égards.
Premièrement, les vues pivot d'Odoo ne peuvent pas combiner les données de plusieurs modules dans une seule visualisation. Vous ne pouvez pas superposer le chiffre d’affaires avec la rotation des stocks et le débit de fabrication dans un seul graphique. Les rapports de chaque module sont cloisonnés.
Deuxièmement, Odoo manque de fonctions d'intelligence temporelle. Les comparaisons d'une année sur l'autre, les moyennes mobiles, les totaux cumulés et les calculs périodiques nécessitent un développement personnalisé ou des exportations manuelles de feuilles de calcul.
Troisièmement, Odoo n'a aucune notion de modèle de données gouverné. Il n'existe pas de définitions communes pour des mesures telles que le « revenu » ou la « valeur à vie du client ». Chaque utilisateur crée sa propre interprétation, ce qui conduit à des chiffres contradictoires lors des réunions de direction.
Quatrièmement, les capacités de visualisation d'Odoo sont limitées aux graphiques à barres, aux graphiques linéaires et aux diagrammes circulaires de base. Les cartes thermiques, les nuages de points, les graphiques en cascade, les arbres de décomposition et les cartes KPI ne sont pas disponibles.
Ce que Power BI ajoute
Power BI répond à chacune de ces limitations. Il se connecte à la base de données PostgreSQL (ou API) d'Odoo et crée un modèle sémantique unifié sur tous les modules. Les formules DAX fournissent une intelligence temporelle, des fonctions statistiques et une logique métier complexe. La bibliothèque de visualisation comprend plus de 300 types de graphiques. Et les fonctionnalités de gouvernance de Power BI (espaces de travail, sécurité au niveau des lignes, approbation, étiquettes de sensibilité) permettent une gestion des données de niveau entreprise.
La combinaison vous offre l'excellence opérationnelle d'Odoo pour le travail quotidien et la profondeur analytique de Power BI pour la prise de décision stratégique. Les équipes opérationnelles continuent de travailler sur Odoo ; les dirigeants et les analystes disposent de tableaux de bord Power BI qui se mettent à jour automatiquement.
Méthodes de connexion : base de données directe vs API
Il existe trois méthodes principales pour connecter Power BI à Odoo. Chacun comporte des compromis en fonction de votre modèle d’hébergement et de vos exigences de sécurité.
Méthode 1 : connexion directe à PostgreSQL
Il s'agit de la méthode privilégiée pour les déploiements Odoo sur site ou auto-hébergés. Odoo stocke toutes les données dans PostgreSQL et Power BI dispose d'un connecteur PostgreSQL natif.
Avantages :
- Performances de requête les plus rapides (pas de surcharge API)
- Accès complet à chaque table et champ, y compris les modules personnalisés
- Prend en charge les requêtes SQL complexes avec des jointures et des agrégations au niveau de la base de données
- Permet l'actualisation incrémentielle (nécessite une colonne datetime)
- Pas de licence Odoo ni de limites de débit API
Étapes de configuration :
- Ouvrez Power BI Desktop et sélectionnez Obtenir des données, puis Base de données PostgreSQL
- Entrez le nom d'hôte de votre serveur Odoo et le nom de la base de données (généralement le nom de l'instance Odoo)
- Utilisez un utilisateur de base de données en lecture seule (jamais le compte administrateur Odoo)
- Sélectionnez le mode Importer pour la plupart des scénarios ou DirectQuery pour les besoins en temps réel
- Parcourez la liste des tables ou utilisez une requête SQL personnalisée
Paramètres de la chaîne de connexion :
| Paramètre | Valeur typique |
|---|---|
| Serveur | votre-odoo-server.com:5432 |
| Base de données | odoo_production |
| Nom d'utilisateur | powerbi_readonly |
| Mot de passe | (stocké dans les informations d'identification) |
| Mode SSL | Exiger (pour la production) |
| Expiration du délai de commande | 600 (secondes, pour les requêtes volumineuses) |
Création d'un utilisateur en lecture seule dans PostgreSQL :
CREATE ROLE powerbi_readonly WITH LOGIN PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE odoo_production TO powerbi_readonly;
GRANT USAGE ON SCHEMA public TO powerbi_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO powerbi_readonly;
Cette approche garantit que Power BI peut lire toutes les tables actuelles et futures sans aucun accès en écriture à votre base de données de production.
Méthode 2 : API externe Odoo (XML-RPC / JSON-RPC)
Odoo expose une API complète pour lire et écrire des données. Power BI peut consommer cela via des connecteurs personnalisés ou des scripts Python.
Avantages :
- Fonctionne avec Odoo.sh et Odoo Online (aucun accès direct à la base de données n'est nécessaire)
- Respecte les règles de contrôle d'accès et les règles d'enregistrement d'Odoo
- Pas besoin d'exposer le port de la base de données en externe
Inconvénients :
- Nettement plus lent que les requêtes directes de base de données (10 à 100 fois pour les grands ensembles de données)
- Les limites de débit de l'API peuvent limiter les extraits à grand volume
- Nécessite une fonction Power Query personnalisée ou une étape ETL intermédiaire
- La pagination ajoute de la complexité
Pour le point de terminaison JSON-RPC d'Odoo, une fonction Power Query M typique appellerait https://your-odoo.com/jsonrpc avec authentification, puis paginerait les résultats. Cela fonctionne mais devient peu pratique pour les tables contenant plus de 50 000 enregistrements.
Méthode 3 : points de terminaison OData via les modules de connecteur Odoo
Plusieurs modules de la communauté Odoo exposent des flux OData que Power BI peut consommer de manière native. Le connecteur OData dans Power BI prend en charge l’authentification et la pagination dès le départ.
Quand utiliser cette méthode :
- Déploiements Odoo Online / Odoo.sh où l'accès à la base de données est restreint
- Scénarios nécessitant la logique métier d'Odoo (champs calculés, règles d'accès) dans les données
- Ensembles de données plus petits (moins de 100 000 enregistrements par entité)
Pour la plupart des déploiements d'entreprise, la méthode 1 (PostgreSQL direct) est fortement recommandée. La différence de performances est substantielle et la flexibilité des requêtes SQL vous permet de mettre en forme les données à la source.
Tables Odoo essentielles pour Power BI
La base de données PostgreSQL d'Odoo contient des centaines de tables. Comprendre les tables principales et leurs relations est essentiel pour créer des modèles Power BI efficaces. Vous trouverez ci-dessous les tableaux qui alimentent 80 % des tableaux de bord exécutifs.
Tableaux des modules de vente
| Tableau | Objectif | Champs clés |
|---|---|---|
| sale_order | Commandes clients (en-têtes) | identifiant, nom, partenaire_id, date_order, montant_total, état, company_id, user_id |
| sale_order_line | Éléments de ligne de commande client | order_id, product_id, product_uom_qty, price_unit, price_subtotal, remise |
| res_partenaire | Clients et fournisseurs | identifiant, nom, e-mail, country_id,category_id, customer_rank, supplier_rank |
| produit_produit | Variantes de produits | id, default_code, list_price, standard_price, categ_id, actif |
| modèle_produit | Modèles de produits | identifiant, nom, type, sale_ok, Purchase_ok |
Relations clés : sale_order.partner_id est lié à res_partner.id. sale_order_line.product_id est lié à product_product.id. product_product.product_tmpl_id est lié à product_template.id.
Une requête d'analyse des ventes typique joint ces tables pour produire une table de faits dénormalisée :
SELECT
so.id AS order_id,
so.name AS order_number,
so.date_order,
so.state,
rp.name AS customer_name,
rp.country_id,
rc.name AS country_name,
sol.product_id,
pt.name AS product_name,
pc.name AS product_category,
sol.product_uom_qty AS quantity,
sol.price_unit,
sol.discount,
sol.price_subtotal AS line_total,
so.amount_total AS order_total,
ru.login AS salesperson
FROM sale_order so
JOIN sale_order_line sol ON sol.order_id = so.id
JOIN res_partner rp ON so.partner_id = rp.id
LEFT JOIN res_country rc ON rp.country_id = rc.id
JOIN product_product pp ON sol.product_id = pp.id
JOIN product_template pt ON pp.product_tmpl_id = pt.id
LEFT JOIN product_category pc ON pt.categ_id = pc.id
LEFT JOIN res_users ru ON so.user_id = ru.id
WHERE so.state IN ('sale', 'done')
ORDER BY so.date_order DESC;
Tableaux du module de comptabilité
| Tableau | Objectif | Champs clés |
|---|---|---|
| compte_move | Factures, factures, écritures de journal | identifiant, nom, type_déplacement, identifiant_partenaire, date_facture, montant_total, état, état_paiement |
| compte_move_line | Lignes d'écriture de journal | move_id, account_id, débit, crédit, solde, date, Partner_id |
| compte_compte | Plan comptable | identifiant, code, nom, type_compte |
| compte_paiement | Paiements | identifiant, identifiant_partenaire, montant, date, état, type_paiement |
| compte_journal | Journaux (banque, ventes, etc.) | identifiant, nom, type, code |
Distinction critique : Dans Odoo, account_move stocke les factures (move_type = 'out_invoice'), les factures des fournisseurs ("in_invoice"), les notes de crédit ("out_refund", "in_refund") et les écritures de journal ("entry"). Filtrez toujours par move_type dans vos requêtes Power BI.
Le champ payment_state sur account_move vous indique si une facture est « non_payée », « en_paiement », « payée », « partielle » ou « annulée ». Ceci est essentiel pour les tableaux de bord chronologiques des comptes clients.
Tableaux du module d'inventaire
| Tableau | Objectif | Champs clés |
|---|---|---|
| sélection_de_stocks | Bons de livraison, réceptions, virements internes | identifiant, nom, partenaire_id, date_programmée, date_done, état, picking_type_id |
| stock_move | Déplacements de produits individuels | picking_id, product_id, product_uom_qty, quantité, état, date |
| stock_quant | Inventaire disponible actuel | product_id, location_id, quantité, réservé_quantité |
| emplacement_stock | Entrepôts, zones, bacs | identifiant, nom, utilisation, location_id (parent) |
| stock_entrepôt | Définitions d'entrepôt | identifiant, nom, code, partenaire_id |
Inventaire en temps réel : stock_quant reflète toujours l'état actuel de l'inventaire. Pour l'analyse historique des stocks, vous devez interroger stock_move avec des filtres de date et calculer les soldes courants.
Tableaux des modules de fabrication
| Tableau | Objectif | Champs clés |
|---|---|---|
| mrp_production | Commandes de fabrication | identifiant, nom, product_id, product_qty, date_start, date_finished, state |
| mrp_bom | Nomenclatures | id, product_tmpl_id, product_qty, tapez |
| mrp_bom_line | Composants de nomenclature | bom_id, product_id, product_qty |
| mrp_workorder | Opérations de bons de travail | production_id, workcenter_id, durée, état |
| mrp_workcenter | Centres de travail / machines | identifiant, nom, capacité, time_effiency |
Calcul OEE : L'efficacité globale de l'équipement peut être dérivée des enregistrements mrp_workorder en comparant la durée planifiée à la durée réelle, en analysant les raisons des temps d'arrêt et en suivant les mesures de qualité.
Tableaux des ressources humaines
| Tableau | Objectif | Champs clés |
|---|---|---|
| hr_employee | Dossiers des employés | identifiant, nom, Department_id, job_id, work_email, actif |
| département_hr | Départements | identifiant, nom, parent_id, manager_id |
| hr_contrat | Contrats de travail | employ_id, salaire, date_start, date_end, état |
| hr_leave | Demandes de congés | employ_id, vacation_status_id, date_from, date_to, state |
| hr_présence | Enregistrements d'entrée/sortie | id_employé, check_in, check_out, heures_travaillées |
Création du modèle de données Power BI
Conception de schéma en étoile
Le modèle de données le plus efficace pour l'analyse Odoo suit un modèle de schéma en étoile. Les tableaux de faits (commandes clients, factures, mouvements de stock, ordres de production) se trouvent au centre. Des tableaux de dimensions (produits, clients, dates, employés, lieux) les entourent.
Tableaux de faits recommandés :
- Fact_Sales — de sale_order + sale_order_line (grain : une ligne par ligne de commande)
- Fact_Invoices — de account_move + account_move_line (grain : une ligne par ligne de journal)
- Fact_Inventory — de stock_move (grain : une ligne par mouvement de stock)
- Fact_Production — de mrp_production + mrp_workorder (grain : une ligne par bon de travail)
- Fact_Attendance — de hr_attendance (grain : une ligne par paire d'entrée/sortie d'horloge)
Tableaux de dimensions partagés :
- Dim_Date — une table de calendrier générée dans Power BI (essentielle pour l'intelligence temporelle)
- Dim_Customer — de res_partner (filtré sur customer_rank > 0)
- Dim_Product — de product_product + product_template + product_category
- Dim_Employee — de hr_employee + hr_department + hr_job
- Dim_Location — de stock_location + stock_warehouse
- Dim_Company — de res_company (pour les déploiements Odoo multi-entreprises)
Création de la dimension Date
Odoo n'a pas de table de dimension de date dédiée. Vous devez en créer un dans Power BI à l'aide de DAX :
Dim_Date =
ADDCOLUMNS(
CALENDAR(DATE(2020, 1, 1), DATE(2030, 12, 31)),
"Year", YEAR([Date]),
"Quarter", "Q" & QUARTER([Date]),
"Month", FORMAT([Date], "MMMM"),
"MonthNumber", MONTH([Date]),
"WeekNumber", WEEKNUM([Date]),
"DayOfWeek", FORMAT([Date], "dddd"),
"FiscalYear", IF(MONTH([Date]) >= 4, YEAR([Date]), YEAR([Date]) - 1),
"FiscalQuarter", "FQ" & SWITCH(TRUE(),
MONTH([Date]) >= 10, 3,
MONTH([Date]) >= 7, 2,
MONTH([Date]) >= 4, 1,
4
),
"IsWeekend", IF(WEEKDAY([Date], 2) > 5, TRUE(), FALSE()),
"YearMonth", FORMAT([Date], "YYYY-MM")
)
Marquez cette table comme table de dates dans Power BI et créez des relations entre la colonne de date de chaque table de faits et Dim_Date[Date]. Ajustez le mois de début de l’année fiscale en fonction de votre organisation.
Gérer la structure multi-entreprises d'Odoo
Odoo prend en charge les configurations multi-entreprises dans lesquelles une seule base de données dessert plusieurs entités juridiques. Chaque table transactionnelle comprend une clé étrangère company_id. Dans Power BI, créez une table Dim_Company à partir de res_company et établissez des relations avec chaque table de faits.
Pour la sécurité au niveau des lignes, utilisez la fonctionnalité RLS de Power BI pour filtrer Dim_Company en fonction de l'affectation de l'entreprise de l'utilisateur connecté. Cela reflète les contrôles d'accès multi-entreprises d'Odoo dans la couche BI.
Recettes de tableau de bord : analyses des ventes
Tableau de bord des ventes exécutives
Ce tableau de bord répond aux cinq questions que se pose tout PDG : combien de revenus ce mois-ci ? Sommes-nous sur la bonne voie pour le trimestre ? Quels produits sont gagnants ? Quels vendeurs sont performants ? Où sont nos clients ?
Mesures à créer :
Total Revenue = SUM(Fact_Sales[line_total])
Revenue MTD =
TOTALMTD([Total Revenue], Dim_Date[Date])
Revenue QTD =
TOTALQTD([Total Revenue], Dim_Date[Date])
Revenue YTD =
TOTALYTD([Total Revenue], Dim_Date[Date])
Revenue PY =
CALCULATE([Total Revenue], SAMEPERIODLASTYEAR(Dim_Date[Date]))
Revenue Growth % =
DIVIDE([Total Revenue] - [Revenue PY], [Revenue PY], 0)
Average Order Value =
DIVIDE([Total Revenue], DISTINCTCOUNT(Fact_Sales[order_id]))
Orders Count =
DISTINCTCOUNT(Fact_Sales[order_id])
Disposition des visuels :
- Ligne 1 : Quatre cartes KPI (Revenu MTD, Revenue QTD, Revenue YTD, Growth %)
- Ligne 2 : Graphique linéaire (revenu mensuel, année en cours par rapport à l'année précédente) et graphique à barres (revenu par catégorie de produits)
- Ligne 3 : visuel de la carte (revenus par pays du client) et tableau (10 principaux vendeurs avec chiffre d'affaires, nombre de commandes, taille moyenne des transactions)
- Ligne 4 : graphique en cascade (pont de revenus : nouveaux clients, existants et perdus) et graphique en anneau (revenus par canal de vente)
Analyse du pipeline de ventes
Si vous utilisez Odoo CRM avec le module Ventes, connectez la table crm_lead pour créer des tableaux de bord de pipeline :
| Tableau | Objectif | Champs clés |
|---|---|---|
| crm_lead | Opportunités et pistes | identifiant, nom, partenaire_id, revenu_attendu, probabilité, stage_id, user_id, date_deadline |
| crm_stage | Étapes du pipeline | identifiant, nom, séquence |
Mesures du pipeline :
Pipeline Value =
SUMX(
FILTER(Fact_Pipeline, Fact_Pipeline[active] = TRUE()),
Fact_Pipeline[expected_revenue] * Fact_Pipeline[probability] / 100
)
Win Rate =
DIVIDE(
CALCULATE(COUNTROWS(Fact_Pipeline), Fact_Pipeline[stage_name] = "Won"),
CALCULATE(COUNTROWS(Fact_Pipeline),
OR(Fact_Pipeline[stage_name] = "Won", Fact_Pipeline[stage_name] = "Lost")
)
)
Average Sales Cycle Days =
AVERAGEX(
FILTER(Fact_Pipeline, Fact_Pipeline[stage_name] = "Won"),
DATEDIFF(Fact_Pipeline[create_date], Fact_Pipeline[date_closed], DAY)
)
Recettes du tableau de bord : inventaire et chaîne d'approvisionnement
Tableau de bord de l'état de l'inventaire
Ce tableau de bord surveille les niveaux de stock, les taux de rotation et les performances de la chaîne d'approvisionnement.
Mesures clés :
Inventory Value =
SUMX(Fact_Inventory_Current, Fact_Inventory_Current[quantity] * RELATED(Dim_Product[standard_price]))
Inventory Turnover =
DIVIDE(
[COGS Trailing 12 Months],
[Average Inventory Value]
)
Days of Inventory =
DIVIDE(365, [Inventory Turnover])
Stockout Rate =
DIVIDE(
CALCULATE(COUNTROWS(Dim_Product), Dim_Product[on_hand_qty] <= 0, Dim_Product[active] = TRUE()),
CALCULATE(COUNTROWS(Dim_Product), Dim_Product[active] = TRUE())
)
Reorder Point Items =
CALCULATE(
COUNTROWS(Dim_Product),
FILTER(Dim_Product, Dim_Product[on_hand_qty] <= Dim_Product[reorder_min])
)
Visuels :
- Cartes KPI : valeur totale des stocks, taux de rotation, taux de rupture de stock, articles en dessous du point de commande
- Nuage de points : chaque produit est représenté par taux de rotation (axe des x) par rapport à la marge (axe des y), dimensionné par contribution aux revenus --- il s'agit du visuel d'analyse ABC-XYZ
- Graphique à barres : 20 principaux produits par valeur de stock (identifie le capital immobilisé dans des stocks à rotation lente)
- Tableau : Articles en dessous du point de commande avec le stock actuel, la demande quotidienne et la date de rupture de stock estimée
Performances de livraison
À partir de stock_picking, mesurez la livraison à temps :
On-Time Delivery Rate =
DIVIDE(
CALCULATE(
COUNTROWS(Fact_Deliveries),
Fact_Deliveries[date_done] <= Fact_Deliveries[scheduled_date]
),
COUNTROWS(Fact_Deliveries)
)
Average Lead Time Days =
AVERAGEX(
Fact_Deliveries,
DATEDIFF(Fact_Deliveries[create_date], Fact_Deliveries[date_done], DAY)
)
Recettes du tableau de bord : Fabrication
Tableau de bord des performances de production
Pour les fabricants exécutant Odoo Manufacturing, les tables mrp_production et mrp_workorder fournissent de riches données opérationnelles.
Calcul OEE (Efficacité Globale de l'Equipement) :
Availability =
DIVIDE(
[Actual Production Time],
[Planned Production Time]
)
Performance Rate =
DIVIDE(
[Ideal Cycle Time] * [Total Units Produced],
[Actual Production Time]
)
Quality Rate =
DIVIDE(
[Good Units],
[Total Units Produced]
)
OEE = [Availability] * [Performance Rate] * [Quality Rate]
Visuels :
- Graphiques de jauge : OEE, Disponibilité, Performance, Qualité (chacun avec des seuils cibles : vert supérieur à 85 %, jaune 60-85 %, rouge inférieur à 60 %)
- Graphique linéaire : tendance OEE par semaine, avec limites de contrôle
- Graphique à barres groupées : OEE par poste de travail, révélant quelles machines sont sous-performantes
- Tableau : Ordres de fabrication avec durée planifiée par rapport à la durée réelle, écart et quantité de rebut
Utilisation du poste de travail
Utilization Rate =
DIVIDE(
SUM(Fact_WorkOrders[duration_minutes]),
[Available Minutes Per Period]
)
Downtime Hours =
DIVIDE(
[Available Minutes Per Period] - SUM(Fact_WorkOrders[duration_minutes]),
60
)
Ce tableau de bord aide les responsables de production à identifier les postes de travail goulots d'étranglement et à optimiser la planification. En combinaison avec les données du module de planification d'Odoo, vous pouvez créer des modèles de planification de capacité qui prévoient le moment où vous atteindrez une utilisation maximale.
Recettes du tableau de bord : RH et main-d'œuvre
Tableau de bord d'analyse des effectifs
Les tableaux de bord RH construits à partir des données Odoo fournissent des informations pour lesquelles la plupart des systèmes SIRH facturent des prix plus élevés.
Mesures d'effectif et de chiffre d'affaires :
Active Employees =
CALCULATE(
COUNTROWS(Dim_Employee),
Dim_Employee[active] = TRUE()
)
Attrition Rate =
DIVIDE(
CALCULATE(
COUNTROWS(Dim_Employee),
Dim_Employee[departure_date] <> BLANK(),
YEAR(Dim_Employee[departure_date]) = YEAR(TODAY())
),
[Average Headcount],
0
)
Average Tenure Years =
AVERAGEX(
FILTER(Dim_Employee, Dim_Employee[active] = TRUE()),
DATEDIFF(Dim_Employee[contract_start_date], TODAY(), DAY) / 365.25
)
Cost Per Employee =
DIVIDE(
SUM(Fact_Payroll[total_cost]),
[Active Employees]
)
Analyse des absences de hr_leave :
Absence Rate =
DIVIDE(
SUM(Fact_Leaves[number_of_days]),
[Working Days In Period] * [Active Employees]
)
Bradford Factor =
SUMX(
Dim_Employee,
VAR AbsenceSpells = CALCULATE(COUNTROWS(Fact_Leaves), Fact_Leaves[state] = "validate")
VAR TotalDays = CALCULATE(SUM(Fact_Leaves[number_of_days]), Fact_Leaves[state] = "validate")
RETURN AbsenceSpells * AbsenceSpells * TotalDays
)
Analyse des présences de hr_attendance :
Average Daily Hours =
AVERAGEX(
VALUES(Dim_Date[Date]),
CALCULATE(SUM(Fact_Attendance[worked_hours]))
)
Overtime Hours =
SUMX(
Fact_Attendance,
IF(Fact_Attendance[worked_hours] > 8, Fact_Attendance[worked_hours] - 8, 0)
)
Configuration de l'actualisation incrémentielle
Pour les bases de données Odoo contenant des millions d’enregistrements, les actualisations complètes des données ne sont pas pratiques. La fonctionnalité d'actualisation incrémentielle de Power BI charge uniquement les enregistrements nouveaux et modifiés, réduisant ainsi les temps d'actualisation de quelques heures à quelques minutes.
Prérequis
- Licence Power BI Pro ou Premium
- Chaque table doit avoir une colonne datetime fiable (write_date dans Odoo est idéal --- elle se met à jour chaque fois qu'un enregistrement est modifié)
- La source de données doit prendre en charge le repliement des requêtes (PostgreSQL le fait)
Étapes de configuration
Étape 1 : Créer les paramètres RangeStart et RangeEnd
Dans Power Query, créez deux paramètres de type DateTime :
- RangeStart : valeur par défaut = 1/1/2020 00:00:00
- RangeEnd : valeur par défaut = 31/12/2030 00:00:00
Étape 2 : Filtrer les tableaux par paramètres
Pour chaque table de faits, ajoutez une étape de filtre dans Power Query :
= Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd)
Ce filtre doit se plier à la base de données (apparaître dans le SQL généré). Vérifiez en cliquant avec le bouton droit sur l'étape et en sélectionnant « Afficher la requête native ».
Étape 3 : Définir la politique d'actualisation incrémentielle
Cliquez avec le bouton droit sur la table dans le modèle, sélectionnez Actualisation incrémentielle et configurez :
| Paramètre | Valeur recommandée |
|---|---|
| Stocker les lignes dans le dernier | 3 ans |
| Actualiser les lignes du dernier | 7 jours |
| Détecter les modifications de données | colonne write_date |
| Actualiser uniquement les périodes complètes | Activé |
Cette configuration stocke trois années d'historique mais actualise uniquement les sept derniers jours lors de chaque actualisation planifiée. La colonne write_date d'Odoo se met automatiquement à jour lorsqu'un champ d'un enregistrement change, ce qui en fait une colonne de détection de changement fiable.
Impact sur les performances
| Scénario | Actualisation complète | Actualisation incrémentielle |
|---|---|---|
| 1 million de lignes de commande client | 12 minutes | 45 secondes |
| 5 millions d'entrées de journal | 38 minutes | 2 minutes |
| 10 millions de mouvements de stock | 65 minutes | 4 minutes |
Le gain de performances est considérable, en particulier pour les ensembles de données de fabrication et d'inventaire qui génèrent de gros volumes de données transactionnelles.
Avancé : Multi-Entreprises et Multi-Devises
Gestion des déploiements Odoo multi-entreprises
De nombreux déploiements Odoo Enterprise servent plusieurs entités juridiques à partir d'une seule base de données. Chaque enregistrement transactionnel possède un champ company_id. Dans Power BI :
- Créez une table
Dim_Companyà partir deres_company - Établissez des relations entre le company_id de chaque table de faits et Dim_Company
- Ajoutez un slicer d'entreprise à chaque page du tableau de bord
- Implémentez la sécurité au niveau des lignes afin que chaque utilisateur ne voie que les données de son entreprise
Conversion de devises
Odoo stocke les montants dans la devise de base de l'entreprise. Pour les rapports multidevises, rejoignez la table res_currency_rate :
SELECT
so.id,
so.amount_total AS amount_local,
so.amount_total / COALESCE(
(SELECT rate FROM res_currency_rate
WHERE currency_id = so.currency_id
AND name <= so.date_order::date
ORDER BY name DESC LIMIT 1),
1
) AS amount_usd
FROM sale_order so;
Vous pouvez également conserver une table Dim_Currency_Rate dans Power BI avec les taux de change quotidiens et utiliser DAX pour effectuer la conversion au moment du rapport. Cette approche est plus flexible pour les scénarios hypothétiques (par exemple, « à quoi ressembleraient les revenus aux taux de change de l'année dernière ? »).
Intégration d'API OData et REST pour Odoo Online
Pour les organisations utilisant Odoo Online ou Odoo.sh où l'accès direct à PostgreSQL n'est pas disponible, il existe des méthodes de connexion alternatives.
Utilisation de l'API JSON-RPC d'Odoo
Odoo expose un point de terminaison JSON-RPC à /jsonrpc (ou l'ancien XML-RPC à /xmlrpc/2). Vous pouvez appeler la méthode search_read pour récupérer des données :
{
"jsonrpc": "2.0",
"method": "call",
"params": {
"service": "object",
"method": "execute_kw",
"args": [
"your_database",
2,
"your_api_key",
"sale.order",
"search_read",
[[["state", "in", ["sale", "done"]]]],
{"fields": ["name", "partner_id", "date_order", "amount_total", "state"],
"limit": 1000, "offset": 0}
]
}
}
Dans Power BI, vous implémenterez cela en tant que fonction Power Query personnalisée en utilisant Web.Contents avec une logique de pagination. Le défi réside dans les performances : chaque appel d'API renvoie au maximum quelques milliers d'enregistrements et vous avez besoin de plusieurs allers-retours pour les grands ensembles de données.
Modules OData communautaires
Plusieurs modules de la communauté Odoo ajoutent des points de terminaison OData :
- BI Connector for Odoo — expose des flux OData configurables
- Odoo-Power BI Connector — modèles de données prédéfinis pour les modules communs
Ces modules simplifient l'intégration mais ajoutent une dépendance à votre instance Odoo. Évaluez si la commodité l’emporte sur la charge de maintenance d’un module communautaire.
Approche hybride : exportation de données planifiée
Un compromis pragmatique consiste à planifier une exportation nocturne des données d'Odoo vers une base de données intermédiaire ou Azure SQL. Une action planifiée Odoo exécute un script Python qui exporte les tables de clés au format CSV ou transmet les données via une API vers une base de données Azure SQL. Power BI se connecte ensuite à la base de données intermédiaire avec une prise en charge complète du repliement des requêtes.
Cette approche fonctionne bien pour les organisations qui souhaitent une fraîcheur des données quasi quotidienne sans exposer la base de données de production d'Odoo aux requêtes Power BI.
Exemples de KPI du monde réel
Voici vingt KPI que les clients ECOSIRE construisent fréquemment après avoir connecté Odoo à Power BI, organisés par département.
KPI financiers
- ** Days Sales Outstanding (DSO) ** – Nombre moyen de jours pour encaisser le paiement, à partir de account_move (date de facture vs date de paiement)
- % de marge brute — Revenu moins COGS divisé par le chiffre d'affaires, à partir de sale_order_line (price_subtotal vs product standard_price)
- Cycle de conversion en espèces — DSO + Jours d'inventaire impayés - Jours payables impayés
- Écart entre budget et réel — Nécessite un tableau budgétaire (account_budget dans Odoo ou un téléchargement manuel)
- Revenu par employé — Revenu total divisé par l'effectif actif
KPI de vente
- Coût d'acquisition client — Dépenses marketing divisées par les nouveaux clients acquis (nécessite une saisie manuelle des coûts marketing)
- Valeur à vie du client — Revenu moyen par client multiplié par la durée moyenne de la relation
- Durée du cycle de vente — Jours entre la création de l'opportunité et le gain (crm_lead)
- Taux de conversion devis en commande — Commandes confirmées divisées par le total des devis
- % de remise moyenne — À partir du champ de remise sale_order_line
KPI opérationnels
- Taux de commande parfait — Commandes livrées à temps, dans leur intégralité, avec la documentation correcte
- Précision de l'inventaire — Nombre réel par rapport au nombre de systèmes (à partir des ajustements stock_quant)
- Fiabilité des délais de livraison des fournisseurs — Date de réception réelle par rapport à la date prévue des bons de commande
- Utilisation de l'espace d'entrepôt — Emplacements occupés divisés par le nombre total d'emplacements
- Taux de retour — Notes de crédit/remboursements en pourcentage des ventes totales
KPI de fabrication
- Rendement au premier passage — Unités ayant réussi l'inspection de qualité sans retouche divisée par le nombre total d'unités
- Respect du calendrier — Ordres de production terminés à la date prévue
- % de déchets de matériaux — Matières premières consommées au-delà des exigences de la nomenclature
- Utilisation du poste de travail — Heures productives réelles par rapport aux heures disponibles
- Mean Time Between Failures (MTBF) — Durée de fonctionnement moyenne entre les pannes d'équipement
Chacun de ces KPI nécessite des jointures de tables spécifiques et une logique DAX. Le service de mise en œuvre Power BI d'ECOSIRE comprend une bibliothèque de KPI standard avec des mesures prédéfinies pour les vingt.
Optimisation des performances
Pliage des requêtes
Le repliement des requêtes est le concept de performances le plus important pour les intégrations Odoo + Power BI. Lorsque Power Query « plie » une transformation, il traduit l'étape en SQL et l'exécute sur le serveur PostgreSQL plutôt que dans le moteur Power BI.
Étapes qui se plient :
- Table.SelectRows (clause WHERE)
- Table.SelectColumns (colonnes spécifiques SELECT)
- Table.Tri (ORDER PAR)
- Table.Groupe (GROUPE PAR)
- Table.Join (JOIN)
- Table.FirstN (LIMITE)
Étapes qui interrompent le pliage :
- Table.AddColumn avec fonctions M personnalisées
- Table.Buffer
- Table.Pivot / Table.Unpivot (dans la plupart des cas)
- Toute étape faisant référence à une étape préalable non pliable
Bonne pratique : Écrivez des requêtes SQL personnalisées au lieu de vous fier au repliement de Power Query. Cela vous donne un contrôle total sur le SQL envoyé à PostgreSQL et élimine l'incertitude relative au repliement.
Importation et DirectQuery
| Facteur | Mode d'importation | Requête directe |
|---|---|---|
| Performances | Rapide (données mises en cache localement) | Plus lent (les requêtes touchent Odoo DB en direct) |
| Fraîcheur des données | Actualisation programmée (min 30 min) | En temps réel |
| Taille du modèle | Limité par la mémoire (1 Go gratuit, 10-100 Go Premium) | Aucune limite de taille |
| Prise en charge du DAX | Complet | Limité (certaines fonctions indisponibles) |
| Impact sur Odoo | Aucun après actualisation | Chaque interaction de rapport interroge la base de données |
| Recommandation | Utiliser pour la plupart des scénarios | À utiliser uniquement lorsque le temps réel est essentiel |
Pour la plupart des déploiements Odoo, le mode Importation avec actualisation incrémentielle offre le meilleur équilibre entre performances et fraîcheur. DirectQuery doit être réservé aux tableaux de bord opérationnels où les données datant de 30 minutes sont inacceptables (par exemple, un affichage en direct d'un atelier de fabrication).
Modèles composites
Power BI Premium prend en charge les modèles composites qui combinent les tables Import et DirectQuery. C'est idéal pour les intégrations Odoo où :
- Les grands tableaux historiques (commandes clients, écritures de journal) utilisent le mode Import avec actualisation incrémentielle
- Les petites tables à évolution rapide (stock_quant pour l'inventaire en direct) utilisent DirectQuery
- La dimension date et les autres dimensions utilisent le mode de stockage double
Dépannage des problèmes courants
Erreurs de connexion
"Impossible de se connecter au serveur" : vérifiez que PostgreSQL écoute sur le bon port (5432 par défaut) et que les règles de pare-feu autorisent les connexions entrantes à partir de la passerelle Power BI ou de l'adresse IP de votre bureau. Vérifiez postgresql.conf pour listen_addresses et pg_hba.conf pour les règles d'authentification client.
"Une connexion SSL est requise" — Ajoutez sslmode=require à la connexion. Pour les certificats auto-signés, vous devrez peut-être importer le certificat CA ou définir sslmode=allow (non recommandé pour la production).
"Autorisation refusée pour la table" : l'utilisateur de la base de données Power BI ne dispose pas des privilèges SELECT. Exécutez GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_readonly; et vérifiez avec \dp table_name dans psql.
Problèmes de qualité des données
Valeurs NULL dans les champs critiques — Odoo permet à de nombreux champs d'être vides. Utilisez COALESCE dans les requêtes SQL ou gérez BLANK() dans DAX pour éviter les erreurs de calcul.
Enregistrements en double — L'ORM d'Odoo crée parfois plusieurs versions d'enregistrements lors de l'édition. Filtrez par active = true et assurez-vous que vous utilisez le bon champ d'état pour exclure les brouillons et les enregistrements annulés.
Incompatibilités de fuseau horaire — Odoo stocke les horodatages au format UTC. Power BI s'affiche par défaut dans le fuseau horaire local. Utilisez AT TIME ZONE dans les requêtes PostgreSQL ou DateTimeZone.SwitchZone dans Power Query pour normaliser.
Problèmes de performances
Temps d'actualisation lents : activez l'actualisation incrémentielle. Utilisez des requêtes SQL personnalisées au lieu d'importer des tables entières. Filtrez les enregistrements inactifs, les brouillons de documents et les données historiques au-delà de votre fenêtre d'analyse.
Rapportez les temps de chargement supérieurs à 10 secondes — Recherchez les mesures DAX complexes qui itèrent sur de grandes tables (SUMX, FILTER avec de nombreuses lignes). Utilisez des variables pour éviter les calculs répétés. Envisagez de pré-agréger les données dans les vues SQL.
Délai d'expiration de la passerelle : augmentez le délai d'expiration de la commande dans la configuration de la source de données de la passerelle. La valeur par défaut est 120 secondes ; défini sur 600 pour les grandes bases de données Odoo.
Considérations de sécurité
Sécurité de la base de données
Ne connectez jamais Power BI à Odoo en utilisant l’utilisateur de la base de données administrateur Odoo. Créez un utilisateur dédié en lecture seule, comme indiqué précédemment. Considérez ces mesures supplémentaires :
- Restrictions au niveau des lignes : Utilisez PostgreSQL
CREATE POLICYpour limiter l'accès de l'utilisateur en lecture seule si vous ne souhaitez pas que Power BI accède à toutes les tables (par exemple, à l'exclusion de hr_payslip) - Masquage des colonnes : Créez des vues qui excluent les colonnes sensibles (salaire, SSN, coordonnées bancaires) et accordez à Power BI l'accès aux vues au lieu des tables de base.
- Cryptage des connexions : Utilisez toujours SSL pour les connexions PostgreSQL, en particulier lorsque la passerelle Power BI et la base de données Odoo se trouvent sur des réseaux différents
- Journalisation d'audit : Activez PostgreSQL
pgauditpour suivre toutes les requêtes de l'utilisateur Power BI
Sécurité Power BI
- Implémenter une sécurité au niveau des lignes (RLS) dans Power BI qui reflète les règles d'accès multi-entreprises d'Odoo
- Utiliser des étiquettes de sensibilité pour les ensembles de données contenant des données financières ou RH
- Restreindre l'accès à l'espace de travail aux analystes et aux consommateurs autorisés
- Désactivez l'exportation de données sur les rapports sensibles pour empêcher l'exfiltration de données
Pour une analyse approfondie de la sécurité Power BI, consultez notre guide sur implémentation de la sécurité au niveau des lignes.
Rassembler tout cela : feuille de route de mise en œuvre
Phase 1 : Fondation (Semaine 1-2)
- Créez l'utilisateur PostgreSQL en lecture seule sur la base de données Odoo
- Installez et configurez la passerelle de données sur site (si vous utilisez le service Power BI)
- Connectez Power BI Desktop à la base de données Odoo
- Importez les cinq groupes de tables principaux (ventes, comptabilité, inventaire, fabrication, RH)
- Construisez la dimension de date et établissez des relations
Phase 2 : Tableaux de bord de base (semaine 3-4)
- Construire le tableau de bord des ventes exécutives (revenus, croissance, meilleurs produits, pipeline)
- Construire le tableau de bord financier (vieillissement AR, flux de trésorerie, écart budgétaire)
- Construire le tableau de bord des stocks (niveaux de stocks, chiffre d'affaires, alertes de réapprovisionnement)
- Configurez l'actualisation incrémentielle pour toutes les tables de faits
- Publiez sur le service Power BI et configurez l'actualisation planifiée
Phase 3 : Analyses avancées (semaines 5 et 6)
- Construire des tableaux de bord de fabrication (OEE, utilisation, planification de la production)
- Construire des tableaux de bord RH (effectif, attrition, présences, absences)
- Implémentez la sécurité au niveau des lignes pour l'isolation des données multi-entreprises
- Créez une présentation optimisée pour les mobiles pour les tableaux de bord clés
- Configurez des alertes de données pour les KPI critiques (ruptures de stock, factures en retard, retards de production)
Phase 4 : Gouvernance et échelle (semaine 7-8)
- Établir des conventions de dénomination des espaces de travail et une certification du contenu
- Formez les utilisateurs expérimentés à la création de rapports en libre-service
- Documenter le modèle de données et la logique de calcul
- Configurez la surveillance de l'utilisation pour suivre l'adoption
- Prévoyez des sources de données supplémentaires (plateformes marketing, eCommerce, IoT)
Le service d'intégration Power BI + Odoo d'ECOSIRE suit cette feuille de route et fournit généralement le premier tableau de bord exécutif dans un délai de deux semaines. La double expertise de notre équipe dans le modèle de données d'Odoo et le moteur analytique de Power BI garantit que vous obtenez des analyses précises, performantes et gouvernées dès le premier jour.
##FAQ
Puis-je connecter Power BI à Odoo Online, ou uniquement à Odoo auto-hébergé ?
Vous pouvez vous connecter aux deux, mais la méthode diffère. Odoo auto-hébergé vous offre un accès direct à PostgreSQL, qui est plus rapide et plus flexible. Odoo Online et Odoo.sh n'exposent pas la base de données directement, vous devez donc utiliser l'API JSON-RPC d'Odoo, un module de connecteur OData communautaire ou une exportation de données planifiée vers une base de données intermédiaire. Pour Odoo Online avec de grands ensembles de données, l'approche de base de données intermédiaire est recommandée car l'extraction basée sur l'API est lente pour les tables contenant plus de 50 000 enregistrements.
À quelle fréquence Power BI peut-il actualiser les données d'Odoo ?
Avec Power BI Pro, vous pouvez programmer jusqu'à 8 actualisations par jour (toutes les 3 heures). Avec Power BI Premium, vous pouvez programmer jusqu'à 48 actualisations par jour (toutes les 30 minutes). Pour les données en temps réel, utilisez le mode DirectQuery, mais sachez que chaque interaction de rapport interrogera directement votre base de données Odoo. L'actualisation incrémentielle réduit le temps nécessaire à chaque actualisation, ce qui rend les actualisations plus fréquentes pratiques sans surcharger la base de données.
Les requêtes Power BI ralentiront-elles notre système Odoo ?
Si vous utilisez le mode Importation (recommandé), les requêtes Power BI s'exécutent uniquement lors des actualisations planifiées, généralement pendant les heures creuses. L'impact sur les performances d'Odoo est minime. Si vous utilisez DirectQuery, chaque interaction de rapport génère des requêtes en direct sur votre base de données Odoo, ce qui peut avoir un impact sur les performances pendant les heures de bureau. Les atténuations incluent l'utilisation d'un réplica en lecture, la configuration des délais d'expiration des requêtes et la conception de requêtes SQL efficaces utilisant des index.
Dois-je connaître SQL pour configurer l'intégration ?
Des connaissances de base en SQL sont utiles mais pas strictement requises. L'interface Power Query de Power BI vous permet de sélectionner des tables et d'appliquer des filtres visuellement. Toutefois, pour des performances et une qualité de données optimales, les requêtes SQL personnalisées sont fortement recommandées. Ils vous permettent de pré-joindre des tables, de filtrer les enregistrements inutiles et de mettre en forme les données au niveau de la base de données. Si votre équipe manque d'expertise SQL, envisagez d'engager un spécialiste pour la configuration initiale, puis de gérer les rapports avec les outils visuels de Power BI.
En quoi le service Odoo + Power BI d'ECOSIRE diffère-t-il du conseil Power BI générique ?
La plupart des cabinets de conseil Power BI ont une expertise en Power BI mais une connaissance limitée du modèle de données d'Odoo. Ils passent des semaines à faire de la rétro-ingénierie des relations entre les tables, à comprendre les conventions spécifiques à Odoo (comme la structure double product_product / product_template) et à déterminer quels champs sont significatifs. ECOSIRE a construit et déployé plus de 43 modules Odoo et maintient une expertise approfondie dans les deux plateformes. Nous fournissons des modèles de données prédéfinis, une bibliothèque KPI standard avec plus de 50 mesures et des optimisations spécifiques à Odoo comme l'actualisation incrémentielle des colonnes write_date. Cette double expertise réduit le temps de mise en œuvre de 40 à 60 % par rapport aux équipes apprenant le modèle de données d'Odoo à partir de zéro.
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
Fonctionnalités Power BI AI : Copilot, AutoML et analyse prédictive
Maîtrisez les fonctionnalités de Power BI AI, notamment Copilot pour les rapports en langage naturel, AutoML pour les prédictions, la détection d'anomalies et les récits intelligents. Guide des licences.
Guide complet de développement de tableaux de bord Power BI
Découvrez comment créer des tableaux de bord Power BI efficaces avec une conception KPI, des bonnes pratiques visuelles, des pages d'accès au détail, des signets, des mises en page mobiles et la sécurité RLS.
Modélisation de données Power BI : conception de schémas en étoile pour la Business Intelligence
Maîtrisez la modélisation des données Power BI avec la conception de schémas en étoile, les tableaux de faits et de dimensions, les mesures DAX, les groupes de calcul, l'intelligence temporelle et les modèles composites.
Plus de Data Analytics & BI
Guide complet de développement de tableaux de bord Power BI
Découvrez comment créer des tableaux de bord Power BI efficaces avec une conception KPI, des bonnes pratiques visuelles, des pages d'accès au détail, des signets, des mises en page mobiles et la sécurité RLS.
Formules DAX que tout utilisateur professionnel devrait connaître
Maîtrisez 20 formules DAX essentielles pour Power BI. CALCULATE, intelligence temporelle, RANKX, transition de contexte, itérateurs et exemples commerciaux pratiques.
Power BI Embedded : ajouter des analyses à votre application
Intégrez les analyses Power BI dans votre application SaaS. Couvre l'authentification, le RLS multi-tenant, le dimensionnement de la capacité, le SDK JavaScript, les thèmes personnalisés et la tarification Fabric.
Migration d'Excel vers Power BI : guide étape par étape
Guide complet de migration d'Excel vers Power BI couvrant la traduction de formules, la création de modèles de données, Power Query, la validation et la mise hors service.
Mesurer le retour sur investissement de l'IA en entreprise : un cadre qui fonctionne réellement
Un cadre pratique pour mesurer le retour sur investissement de l’IA couvrant les économies directes, les gains de productivité, l’impact sur les revenus et la valeur stratégique dans tous les départements.
Création de tableaux de bord de reporting financier : KPI, conception et intégration ERP
Concevez des tableaux de bord de reporting financier qui guident les décisions. Découvrez les KPI à suivre, les principes de conception de tableaux de bord et les meilleures pratiques d'intégration ERP.