Odoo + Power BI: Complete Analytics Integration Guide

Connect Odoo 19 to Power BI for enterprise analytics. Covers DirectQuery, Import mode, data modeling, DAX measures, live dashboards, and deployment architecture.

E
ECOSIRE Research and Development Team
|19 de março de 202611 min de leitura2.4k Palavras|

Parte da nossa série Data Analytics & BI

Leia o guia completo

Odoo + Power BI: Guia completo de integração analítica

O Odoo 19 Enterprise inclui relatórios integrados sólidos, mas para organizações que precisam de análise de autoatendimento, modelagem de dados entre sistemas e visualização de nível empresarial, o Power BI é o complemento natural. Conectar os dados operacionais do Odoo ao mecanismo analítico do Power BI desbloqueia insights que os relatórios nativos do Odoo não podem fornecer.

Este guia cobre todos os aspectos da integração Odoo-Power BI: arquitetura de conexão, práticas recomendadas de modelagem de dados, construção de painéis de negócios importantes, criação de medidas DAX, configuração de atualização incremental e implantação no Microsoft Fabric para escala empresarial.

Principais conclusões

  • Três métodos de conexão: PostgreSQL direto, API REST Odoo e ODBC via exportação do Odoo
  • O modo DirectQuery fornece dados em tempo real; O modo de importação oferece melhor desempenho para grandes conjuntos de dados
  • O esquema PostgreSQL do Odoo requer desnormalização para modelos de dados eficientes do Power BI
  • A atualização incremental reduz o tempo de carregamento para tabelas grandes (account.move, stock.move)
  • A segurança em nível de linha no Power BI reflete o controle de acesso em nível de empresa do Odoo
  • Implantação de gateway necessária para Odoo local; nuvem Odoo se conecta diretamente
  • Microsoft Fabric (Power BI Premium) permite dados Odoo em empresas lakehouse
  • Principais medidas: receita, margem bruta, giro de estoque, vencimento de contas a receber, OEE

Opções de arquitetura de integração

Escolha a arquitetura de conexão correta com base nas necessidades de implantação e geração de relatórios do Odoo.

Opção 1: conexão direta com PostgreSQL (recomendado)

Conecte o Power BI diretamente ao banco de dados PostgreSQL do Odoo usando o conector PostgreSQL:

Prós:

  • Acesso total a todas as tabelas Odoo e dados brutos
  • Melhor desempenho para junções complexas
  • Suporta os modos Importação e DirectQuery

Contras:

  • Requer acesso de rede do Power BI Gateway ao PostgreSQL
  • Mudanças no modelo de dados do Odoo exigem atualização de consultas do Power BI
  • O acesso direto ao banco de dados ignora o controle de acesso do Odoo

Opção 2: API REST Odoo

Conecte-se por meio do conector Web do Power BI usando a API REST do Odoo:

Prós:

  • Funciona sem acesso de rede ao PostgreSQL
  • Respeita os direitos de acesso do Odoo por usuário
  • Não são necessárias credenciais de banco de dados

Contras:

  • Mais lento que o PostgreSQL direto (uma chamada de API por tabela)
  • A limitação de taxa afeta grandes extrações de dados
  • Difícil paginar com eficiência para grandes conjuntos de dados

Opção 3: Exportar para Data Warehouse

Dados ETL Odoo em um data warehouse dedicado (Azure Synapse, Snowflake, BigQuery):

Prós:

  • Desempenho máximo em escala
  • Desacopla BI do ERP
  • Pode integrar vários sistemas de origem

Contras:

  • Maior custo e complexidade de infraestrutura
  • A latência dos dados depende da programação ETL (normalmente de 1 hora a 24 horas)
  • Requer manutenção de pipeline ETL

Arquitetura recomendada para a maioria das organizações: PostgreSQL direto com Power BI Gateway (local) ou conexão direta (nuvem Odoo), modo de importação com atualização incremental, atualização agendada a cada 1-4 horas.


Configurando a conexão PostgreSQL

Etapa 1: acesso à rede

Para Odoo local:

  1. Instale o On-Premises Data Gateway em um servidor com acesso de rede ao PostgreSQL
  2. Configure o gateway com suas credenciais do Microsoft 365
  3. Abra a porta PostgreSQL (5432 ou 5433) do servidor gateway para o servidor Odoo DB

Para nuvem Odoo (AWS, Azure, GCP):

  • Configurar grupo de segurança/firewall para permitir entrada de intervalos de IP do Power BI
  • Ou: use o gateway local em uma VM na nuvem na mesma VPC

Etapa 2: Crie um usuário de banco de dados somente leitura

Nunca conecte o Power BI ao seu usuário principal do banco de dados Odoo. Crie um usuário somente leitura dedicado:

-- 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;

Etapa 3: Configurar no Power BI Desktop

  1. Abra Power BI Desktop → Obter dados → Banco de dados PostgreSQL
  2. Digite:
  • Servidor: seu host PostgreSQL (e porta, se não for 5432)
  • Banco de dados: o nome do seu banco de dados Odoo
  • Nome de usuário: powerbi_reader
  • Senha: a senha do usuário somente leitura
  1. Selecione o modo de conexão: Importar (recomendado) ou DirectQuery

Principais tabelas Odoo para Power BI

Compreender o esquema PostgreSQL do Odoo é essencial para construir modelos de dados precisos.

Tabelas financeiras:

TabelaDescriçãoCampos-chave
CÓDIGO0Faturas, contas, lançamentos contábeis manuaistipo_movimento, estado, data_da fatura, valor_total, id_moeda
CÓDIGO0Itens de linha em lançamentos contábeis manuaismove_id, account_id, débito, crédito, quantidade, price_subtotal
CÓDIGO0Plano de contascódigo, nome, tipo_de_conta
CÓDIGO0Pagamentos de clientes/fornecedoresvalor, data_de_pagamento, estado, id_do_parceiro

Tabelas de vendas:

TabelaDescriçãoCampos-chave
CÓDIGO0Pedidos de vendasnome, estado, pedido_data, valor_total, id_parceiro, id_usuário
CÓDIGO0Linhas de ordem de vendaid_pedido, id_produto, quantidade_uom_produto, preço_subtotal
CÓDIGO0Oportunidades de CRMnome, stage_id, receita_esperada, probabilidade, user_id

Tabelas de inventário:

TabelaDescriçãoCampos-chave
CÓDIGO0Níveis atuais de estoqueid_do_produto, id_do_local, quantidade
CÓDIGO0Todos os movimentos de inventárioproduct_id, estado, data, quantidade_concluído
CÓDIGO0Documentos de entrega/recebimentopicking_type_id, estado, data_programada
CÓDIGO0Dados mestre do produtonome, preço_lista, id_categ, tipo

RH e folha de pagamento:

TabelaDescriçãoCampos-chave
CÓDIGO0Funcionáriosnome, ID_do_departamento, ID_do_trabalho, ID_da_empresa
CÓDIGO0Horário e presençaID_do_funcionário, check_in, check_out
CÓDIGO0Recibos de vencimentoID_do_funcionário, data_de, data_até, estado

Design do modelo de dados do Power BI

Design de esquema em estrela para dados Odoo:

Converta o esquema normalizado do Odoo em um esquema em estrela para obter desempenho ideal do Power BI:

[Date Table] (dimension)
     ↓
[Sales Fact Table]
     ↓
[Product Dimension] ← [Product Category Dimension]
     ↓
[Customer Dimension] ← [Country Dimension]
     ↓
[Salesperson Dimension]
     ↓
[Company Dimension]

Código M do Power Query – Tabela de fatos de vendas:

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

Medidas essenciais do DAX

Receita e margem:

// 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)

Medidas de estoque:

// 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
)

Vencimento de contas a receber:

// 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
)

Principais páginas do painel

1. Painel Executivo

  • Receita vs orçamento (gráfico de medidor)
  • Tendência da receita (gráfico de linhas, 13 meses consecutivos)
  • % de margem bruta (cartão KPI com tendência)
  • 10 principais clientes por receita (gráfico de barras)
  • Os 10 principais produtos por receita (barra horizontal)
  • Receita por região (mapa preenchido)

2. Pipeline de vendas (CRM)

  • Pipeline por estágio (gráfico de funil)
  • Valor ponderado do pipeline (KPI)
  • Taxa de vitórias/perdas (gráfico de rosca)
  • Tendência do tamanho médio do negócio
  • Desempenho do representante de vendas (tabela matriz)
  • Previsão vs real (combinação linha + barra)

3. Visão Geral Financeira

  • Resumo de P&L (tabela com YTD, YoY)
  • Posição de caixa (KPI)
  • Vencimento de recebíveis (barra empilhada)
  • Vencimento de contas a pagar (barra empilhada)
  • Tendência DSO (gráfico de linhas)

4. Painel de inventário

  • Valor do estoque por categoria (treemap)
  • Giro de estoque por armazém (bar)
  • Estoque lento (tabela: estoque > 90 dias)
  • Itens de risco de ruptura de estoque (tabela: dias de cobertura < 7)
  • Alertas de ponto de reordenamento (cartões)

**5. Painel de RH **

  • Headcount por departamento (bar)
  • Presença vs. horas agendadas (medidor)
  • Deixar utilização do saldo (matriz)
  • Tendência da taxa de rotatividade (linha)

Atualização incremental para tabelas grandes

As tabelas account_move_line, stock_move e mail_message do Odoo crescem para milhões de linhas. A atualização incremental evita recarregamentos de tabela completa em cada atualização.

Configurar atualização incremental:

  1. No Power Query, adicione os parâmetros RangeStart e RangeEnd (tipo DateTime)
  2. Filtre sua coluna de data: Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd)
  3. Clique com o botão direito na tabela no painel Campos → Atualização Incremental
  4. Definir: armazenar nos últimos 12 meses, atualizar nos últimos 3 dias

Tabelas Odoo que mais se beneficiam da atualização incremental:

  • account_move_line: filtrar por date
  • stock_move: filtrar por date
  • sale_order: filtrar por date_order
  • mail_message: filtrar por date

Segurança em nível de linha

Implemente a segurança em nível de linha (RLS) no Power BI para espelhar o controle de acesso em nível de empresa do Odoo.

// RLS filter: user sees only their assigned companies
[company_id] IN
    CALCULATETABLE(
        VALUES(UserCompanyMapping[company_id]),
        UserCompanyMapping[user_email] = USERPRINCIPALNAME()
    )

Crie uma tabela UserCompanyMapping (mantida no Power BI ou sincronizada no Odoo) mapeando endereços de e-mail para IDs de empresas autorizadas.


Perguntas frequentes

Posso usar o DirectQuery com o banco de dados PostgreSQL do Odoo para dados em tempo real?

Sim, mas com ressalvas. DirectQuery no PostgreSQL do Odoo é viável para painéis com consultas simples. Painéis complexos com muitas medidas serão lentos porque cada visual aciona novas consultas SQL no seu banco de dados de produção. Para a maioria dos casos de uso, o modo Importação com atualização de 1 hora é a melhor relação entre atualização e desempenho.

Como posso lidar com dados multimoedas do Odoo no Power BI?

Odoo armazena valores na moeda da transação e na moeda da empresa. Use o campo amount_currency para a moeda original e debit/credit (ou price_subtotal) para o equivalente na moeda da empresa. Para consolidação em nível de grupo no Power BI, use os valores monetários da empresa Odoo e aplique uma tabela de dimensão de conversão de moeda separada para relatórios consistentes.

Qual é o impacto no desempenho do banco de dados PostgreSQL do Odoo quando o Power BI é atualizado?

Uma atualização completa do conjunto de dados do Power BI executa várias consultas analíticas simultaneamente no PostgreSQL. Para bancos de dados Odoo grandes (>50 GB), isso pode consumir E/S e CPU significativos durante a janela de atualização. Práticas recomendadas: agende atualizações fora dos horários de pico (por exemplo, das 2h às 4h), use uma réplica de leitura do PostgreSQL para consultas do Power BI e implemente a atualização incremental para minimizar o escopo da consulta.

Posso conectar o Power BI à comunidade Odoo (versão gratuita) via PostgreSQL?

Sim. O Power BI se conecta a qualquer banco de dados PostgreSQL, independentemente de qual aplicativo o gerencia. O esquema PostgreSQL da Comunidade Odoo é quase idêntico ao Enterprise (menos algumas tabelas somente Enterprise). O método de conexão é o mesmo; apenas garanta que o usuário do banco de dados somente leitura tenha acesso ao banco de dados comunitário.

Como mantenho meu modelo de dados do Power BI sincronizado quando o Odoo é atualizado para uma nova versão?

As atualizações de versão do Odoo podem renomear ou reestruturar tabelas de banco de dados, especialmente para módulos que passaram por refatoração significativa. Após qualquer atualização do Odoo: execute uma comparação de esquemas de tabela entre versões antigas e novas, atualize as consultas do Power Query para fazer referência a colunas renomeadas e valide todas as medidas DAX em relação ao novo esquema. Crie uma verificação de alteração de esquema no seu runbook de migração.


Próximas etapas

Construir uma integração Odoo + Power BI de nível de produção requer experiência em modelagem de dados, conhecimento de PostgreSQL e compreensão profunda do esquema do Odoo. Feito corretamente, ele oferece uma plataforma analítica unificada que transforma a forma como sua equipe de liderança toma decisões.

ECOSIRE oferece soluções analíticas Odoo + Power BI de ponta a ponta - desde arquitetura de banco de dados e modelagem de dados até design de painel, desenvolvimento e implantação de DAX. Nossa equipe une a experiência em Odoo e a especialização em Power BI.

Fale com ECOSIRE sobre sua integração Odoo Analytics →

Explore os serviços Power BI da ECOSIRE →

Compartilhe seus requisitos de relatórios e projetaremos uma arquitetura do Power BI que dê à sua equipe de liderança visibilidade em tempo real de todas as dimensões de suas operações Odoo.

E

Escrito por

ECOSIRE Research and Development Team

Construindo produtos digitais de nível empresarial na ECOSIRE. Compartilhando insights sobre integrações Odoo, automação de e-commerce e soluções de negócios com IA.

Converse no WhatsApp