O guia completo para integração Power BI + Odoo

Conecte o Power BI ao Odoo ERP para análises avançadas. Consultas diretas do PostgreSQL, tabelas principais, painéis de vendas/estoque/RH e configuração de atualização incremental.

E
ECOSIRE Research and Development Team
|17 de março de 202629 min de leitura6.5k Palavras|

Parte da nossa série Data Analytics & BI

Leia o guia completo

O guia completo para integração Power BI + Odoo

Odoo é uma das plataformas ERP de código aberto mais poderosas do mundo, com mais de 12 milhões de usuários e 43 módulos oficiais que cobrem tudo, desde vendas e estoque até fabricação e recursos humanos. O Power BI é a plataforma de business intelligence líder do setor, com mais de 300 milhões de usuários ativos mensais. No entanto, surpreendentemente poucas organizações ligam estes dois sistemas – deixando um enorme valor analítico em cima da mesa.

O motivo é simples: Odoo tem seus próprios relatórios integrados e a maioria das consultorias de Power BI se concentra em integrações com Microsoft Dynamics, SAP ou Salesforce. Muito poucas empresas têm profundo conhecimento em ambas as plataformas. Na ECOSIRE, criamos e implantamos mais de 43 módulos Odoo e mantemos profundo conhecimento em Power BI, tornando a combinação Odoo + Power BI uma de nossas principais especializações. Este guia resume tudo o que aprendemos com dezenas de integrações do mundo real.


Principais conclusões

  • O banco de dados PostgreSQL do Odoo pode ser conectado diretamente ao Power BI Desktop usando o conector PostgreSQL nativo, oferecendo acesso total a todas as tabelas e campos
  • As cinco tabelas Odoo mais valiosas para análise são sale_order, account_move, stock_picking, hr_employee e mrp_production --- juntas elas cobrem 80% das necessidades de relatórios executivos
  • A atualização incremental no Power BI pode reduzir o tempo de carregamento de dados do Odoo de horas para minutos, buscando apenas os registros que foram alterados desde a última atualização
  • Os endpoints OData e a API externa do Odoo fornecem alternativas compatíveis com a nuvem quando o acesso direto ao banco de dados não está disponível
  • A segurança em nível de linha no Power BI pode espelhar os controles de acesso multiempresa do Odoo, garantindo que os usuários vejam apenas os dados de suas empresas atribuídas
  • Consultas SQL personalizadas no banco de dados PostgreSQL do Odoo superam as importações de tabelas genéricas em 5 a 10 vezes porque você pode filtrar, juntar e agregar no nível do banco de dados
  • Uma implantação bem projetada do Odoo + Power BI substitui dezenas de relatórios de planilhas por uma única plataforma analítica governada

Por que Odoo + Power BI é uma combinação poderosa

As limitações dos relatórios integrados do Odoo

Odoo vem com várias ferramentas de relatório: visualizações dinâmicas, visualizações gráficas e um painel integrado. Para as operações do dia-a-dia, estes são adequados. Mas eles ficam aquém da análise empresarial em vários aspectos críticos.

Primeiro, as visualizações dinâmicas do Odoo não podem combinar dados de vários módulos em uma única visualização. Você não pode sobrepor a receita de vendas com o giro de estoque e o rendimento de fabricação em um gráfico. Os relatórios de cada módulo são isolados.

Em segundo lugar, o Odoo não possui funções de inteligência temporal. Comparações ano a ano, médias contínuas, totais acumulados e cálculos acumulados no período exigem desenvolvimento personalizado ou exportações manuais de planilhas.

Terceiro, Odoo não tem conceito de modelo de dados governado. Não há definições compartilhadas para métricas como “receita” ou “valor de vida útil do cliente”. Cada usuário cria sua própria interpretação, gerando números conflitantes nas reuniões de gestão.

Quarto, os recursos de visualização do Odoo são limitados a gráficos básicos de barras, gráficos de linhas e gráficos de pizza. Mapas de calor, gráficos de dispersão, gráficos em cascata, árvores de decomposição e cartões de KPI não estão disponíveis.

O que o Power BI adiciona

O Power BI aborda cada uma dessas limitações. Ele se conecta ao banco de dados PostgreSQL (ou API) do Odoo e cria um modelo semântico unificado em todos os módulos. As fórmulas DAX fornecem inteligência temporal, funções estatísticas e lógica de negócios complexa. A biblioteca de visualização inclui mais de 300 tipos de gráficos. E os recursos de governança do Power BI – espaços de trabalho, segurança em nível de linha, endosso, rótulos de confidencialidade – fornecem gerenciamento de dados de nível empresarial.

A combinação oferece a excelência operacional do Odoo para o trabalho diário e a profundidade analítica do Power BI para a tomada de decisões estratégicas. As equipes de operações continuam trabalhando no Odoo; executivos e analistas obtêm painéis do Power BI que são atualizados automaticamente.


Métodos de conexão: banco de dados direto vs API

Existem três métodos principais para conectar o Power BI ao Odoo. Cada um tem vantagens e desvantagens dependendo do seu modelo de hospedagem e requisitos de segurança.

Método 1: Conexão direta do PostgreSQL

Este é o método preferido para implantações Odoo locais ou auto-hospedadas. Odoo armazena todos os dados no PostgreSQL e o Power BI possui um conector PostgreSQL nativo.

Vantagens:

  • Desempenho de consulta mais rápido (sem sobrecarga de API)
  • Acesso total a todas as tabelas e campos, incluindo módulos personalizados
  • Suporta consultas SQL complexas com junções e agregações no nível do banco de dados
  • Permite atualização incremental (requer uma coluna de data e hora)
  • Sem licença Odoo ou limites de taxa de API

Etapas de configuração:

  1. Abra o Power BI Desktop e selecione Obter dados e, em seguida, banco de dados PostgreSQL
  2. Insira o nome do host do servidor Odoo e o nome do banco de dados (normalmente o nome da instância do Odoo)
  3. Use um usuário de banco de dados somente leitura (nunca a conta de administrador do Odoo)
  4. Selecione o modo de importação para a maioria dos cenários ou DirectQuery para necessidades em tempo real
  5. Navegue na lista de tabelas ou use uma consulta SQL personalizada

Parâmetros de cadeia de conexão:

ParâmetroValor típico
Servidorseu-odoo-server.com:5432
Banco de dadosodoo_produção
Nome de usuáriopowerbi_readonly
Senha(armazenado em credenciais)
Modo SSLExigir (para produção)
Tempo limite do comando600 (segundos, para consultas grandes)

Criando um usuário somente leitura no 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;

Esta abordagem garante que o Power BI possa ler todas as tabelas atuais e futuras sem qualquer acesso de escrita à sua base de dados de produção.

Método 2: API externa Odoo (XML-RPC / JSON-RPC)

Odoo expõe uma API completa para leitura e gravação de dados. O Power BI pode consumir isso por meio de conectores personalizados ou scripts Python.

Vantagens:

  • Funciona com Odoo.sh e Odoo Online (não é necessário acesso direto ao banco de dados)
  • Respeita as regras de controle de acesso e regras de registro do Odoo
  • Não há necessidade de expor a porta do banco de dados externamente

Desvantagens:

  • Significativamente mais lento que consultas diretas ao banco de dados (10-100x para grandes conjuntos de dados)
  • Os limites de taxa de API podem limitar extrações de alto volume
  • Requer uma função personalizada do Power Query ou uma etapa intermediária de ETL
  • Paginação adiciona complexidade

Para o endpoint JSON-RPC do Odoo, uma função típica do Power Query M chamaria https://your-odoo.com/jsonrpc com autenticação e depois paginaria os resultados. Isso funciona, mas torna-se impraticável para tabelas com mais de 50.000 registros.

Método 3: Endpoints OData por meio de módulos do conector Odoo

Vários módulos da comunidade Odoo expõem feeds OData que o Power BI pode consumir nativamente. O conector OData no Power BI oferece suporte imediato à autenticação e paginação.

Quando usar este método:

  • Implantações Odoo Online / Odoo.sh onde o acesso ao banco de dados é restrito
  • Cenários que exigem a lógica de negócios do Odoo (campos computados, regras de acesso) nos dados
  • Conjuntos de dados menores (menos de 100.000 registros por entidade)

Para a maioria das implantações empresariais, o Método 1 (PostgreSQL direto) é altamente recomendado. A diferença de desempenho é substancial e a flexibilidade das consultas SQL permite moldar os dados na origem.


Tabelas Odoo Essenciais para Power BI

O banco de dados PostgreSQL do Odoo contém centenas de tabelas. Compreender as tabelas principais e seus relacionamentos é fundamental para a construção de modelos eficazes do Power BI. Abaixo estão as tabelas que alimentam 80% dos painéis executivos.

Tabelas do Módulo de Vendas

TabelaFinalidadeCampos-chave
pedido_vendaOrdens de venda (cabeçalhos)id, nome, parceiro_id, data_pedido, quantidade_total, estado, empresa_id, usuário_id
linha_pedido_vendaItens de linha de ordem de vendaorder_id, product_id, product_uom_qty, price_unit, price_subtotal, desconto
parceiro_resClientes e fornecedoresid, nome, email, id_país, id_categoria, classificação_cliente, classificação_fornecedor
produto_produtoVariantes do produtoid, código_padrão, preço_lista, preço_padrão, categ_id, ativo
modelo_de_produtoModelos de produtosid, nome, tipo, venda_ok, compra_ok

Relacionamentos principais: sale_order.partner_id vincula-se a res_partner.id. sale_order_line.product_id vincula-se a product_product.id. product_product.product_tmpl_id vincula-se a product_template.id.

Uma consulta típica de análise de vendas une essas tabelas para produzir uma tabela de fatos desnormalizada:

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;

Tabelas do Módulo de Contabilidade

TabelaFinalidadeCampos-chave
conta_moveFaturas, contas, lançamentos contábeis manuaisid, nome, tipo_movimentação, id_parceiro, data_fatura, valor_total, estado, estado_pagamento
conta_move_lineLinhas de lançamento no diáriomove_id, account_id, débito, crédito, saldo, data, parceiro_id
conta_contaPlano de contasid, código, nome, tipo_de_conta
conta_pagamentoPagamentosid, id_parceiro, valor, data, estado, tipo de pagamento
diário_da_contaDiários (bancários, de vendas, etc.)id, nome, tipo, código

Distinção crítica: No Odoo, account_move armazena faturas (move_type = 'out_invoice'), contas de fornecedores ('in_invoice'), notas de crédito ('out_refund', 'in_refund') e lançamentos contábeis manuais ('entry'). Sempre filtre por move_type nas suas consultas do Power BI.

O campo payment_state em account_move informa se uma fatura é 'não_paga', 'em_pagamento', 'paga', 'parcial' ou 'estornada'. Isso é essencial para painéis de vencimento de contas a receber.

Tabelas do Módulo de Inventário

TabelaFinalidadeCampos-chave
seleção de estoqueOrdens de entrega, recebimentos, transferências internasid, nome, parceiro_id, data_programada, data_concluído, estado, picking_type_id
stock_moveMovimentos individuais de produtospicking_id, product_id, product_uom_qty, quantidade, estado, data
estoque_quantEstoque disponível atualid_do_produto, id_do_local, quantidade, quantidade_reservada
localização_de_estoqueArmazéns, zonas, contentoresid, nome, uso, location_id (pai)
estoque_armazémDefinições de armazémid, nome, código, parceiro_id

Inventário em tempo real: stock_quant sempre reflete o estado atual do estoque. Para análise histórica de inventário, você precisa consultar stock_move com filtros de data e calcular saldos correntes.

Tabelas de módulos de fabricação

TabelaFinalidadeCampos-chave
mrp_produçãoOrdens de fabricoid, nome, id_produto, quantidade_produto, data_início, data_finalizada, estado
mrp_bomListas de materiaisid, product_tmpl_id, product_qty, tipo
mrp_bom_lineComponentes da lista técnicabom_id, produto_id, produto_qty
mrp_workorderOperações de ordens de serviçoID_de_produção, ID_do_centro de trabalho, duração, estado
mrp_workcenterCentros de trabalho / máquinasid, nome, capacidade, eficiência de tempo

Cálculo de OEE: A eficácia geral do equipamento pode ser derivada dos registros mrp_workorder comparando a duração planejada com a duração real, analisando os motivos do tempo de inatividade e monitorando as métricas de qualidade.

Tabelas de Recursos Humanos

TabelaFinalidadeCampos-chave
hr_funcionárioRegistros de funcionáriosid, nome, departamento_id, job_id, work_email, ativo
departamento_hrDepartamentosid, nome, parent_id, manager_id
contrato_hrContratos de trabalhoID_do_funcionário, salário, data_início, data_fim, estado
hr_leavePedidos de folgafuncionário_id, feriado_status_id, data_de, data_até, estado
atendimento_hrRegistros de entrada/saída de relógioID_do_funcionário, check_in, check_out, horas trabalhadas

Construindo o modelo de dados do Power BI

Design de esquema em estrela

O modelo de dados mais eficaz para análise Odoo segue um padrão de esquema em estrela. As tabelas de fatos (ordens de vendas, faturas, movimentações de estoque, ordens de produção) ficam no centro. Tabelas de dimensões (produtos, clientes, datas, funcionários, locais) os cercam.

Tabelas de fatos recomendadas:

  1. Fact_Sales — de sale_order + sale_order_line (grão: uma linha por linha de pedido)
  2. Fact_Invoices — de account_move + account_move_line (grão: uma linha por linha do diário)
  3. Fact_Inventory — de stock_move (grãos: uma linha por movimentação de estoque)
  4. Fact_Production — de mrp_production + mrp_workorder (grão: uma linha por ordem de serviço)
  5. Fact_Attendance — de hr_attendance (grão: uma linha por par de entrada/saída de clock)

Tabelas de dimensões compartilhadas:

  1. Dim_Date — uma tabela de calendário gerada no Power BI (essencial para inteligência de tempo)
  2. Dim_Customer — de res_partner (filtrado para customer_rank > 0)
  3. Dim_Product — de product_product + product_template + product_category
  4. Dim_Employee — de hr_employee + hr_department + hr_job
  5. Dim_Location — de stock_location + stock_warehouse
  6. Dim_Company — de res_company (para implantações Odoo multiempresas)

Criando a dimensão de data

Odoo não possui uma tabela de dimensão de data dedicada. Você deve criar um no Power BI usando 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")
)

Marque esta tabela como uma tabela de datas no Power BI e crie relacionamentos de cada coluna de data da tabela de fatos para Dim_Date[Data]. Ajuste o mês de início do ano fiscal para corresponder à sua organização.

Lidando com a estrutura multiempresarial do Odoo

Odoo suporta configurações multiempresas onde um único banco de dados atende múltiplas entidades legais. Cada tabela transacional inclui uma chave estrangeira company_id. No Power BI, crie uma tabela Dim_Company a partir de res_company e estabeleça relacionamentos com cada tabela de fatos.

Para segurança em nível de linha, use o recurso RLS do Power BI para filtrar Dim_Company com base na atribuição de empresa do usuário conectado. Isso reflete os controles de acesso multiempresa do Odoo na camada de BI.


Receitas do painel: análise de vendas

Painel Executivo de Vendas

Este painel responde às cinco perguntas que todo CEO faz: Quanta receita este mês? Estamos no caminho certo para o trimestre? Quais produtos estão ganhando? Quais vendedores estão apresentando desempenho? Onde estão nossos clientes?

Medidas para criar:

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

Layout visual:

  • Linha 1: Quatro cartões KPI (Receita MTD, Receita QTD, Receita YTD, Crescimento%)
  • Linha 2: Gráfico de linhas (receita mensal, ano atual versus ano anterior) e gráfico de barras (receita por categoria de produto)
  • Linha 3: Mapa visual (receita por país do cliente) e tabela (10 principais vendedores com receita, contagem de pedidos, tamanho médio do negócio)
  • Linha 4: Gráfico em cascata (ponte de receitas: novos clientes vs existentes vs perdidos) e gráfico de rosca (receita por canal de vendas)

Análise do pipeline de vendas

Se você usa o Odoo CRM junto com o módulo Vendas, conecte a tabela crm_lead para construir painéis de pipeline:

TabelaFinalidadeCampos-chave
crm_leadOportunidades e leadsid, nome, parceiro_id, receita_esperada, probabilidade, stage_id, user_id, date_deadline
estágio_crmEstágios do pipelineid, nome, sequência

Medidas do 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)
)

Receitas do Dashboard: Estoque e Cadeia de Suprimentos

Painel de integridade do inventário

Este painel monitora os níveis de estoque, as taxas de rotatividade e o desempenho da cadeia de suprimentos.

Principais medidas:

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

Visuais:

  • Cartões KPI: valor total do estoque, índice de rotatividade, taxa de ruptura de estoque, itens abaixo do ponto de pedido
  • Gráfico de dispersão: cada produto plotado pela taxa de rotatividade (eixo x) versus margem (eixo y), dimensionado pela contribuição de receita --- este é o visual da análise ABC-XYZ
  • Gráfico de barras: 20 principais produtos por valor de estoque (identifica capital vinculado a estoque de baixa movimentação)
  • Tabela: Itens abaixo do ponto de reabastecimento com estoque atual, demanda diária e data estimada de ruptura de estoque

Desempenho de entrega

A partir de stock_picking, meça a entrega no prazo:

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

Receitas do Dashboard: Fabricação

Painel de desempenho de produção

Para fabricantes que executam o Odoo Manufacturing, as tabelas mrp_production e mrp_workorder fornecem dados operacionais ricos.

Cálculo de OEE (Eficácia Geral do Equipamento):

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]

Visuais:

  • Gráficos de medidores: OEE, Disponibilidade, Desempenho, Qualidade (cada um com limites alvo: verde acima de 85%, amarelo 60-85%, vermelho abaixo de 60%)
  • Gráfico de linhas: tendência OEE por semana, com limites de controle
  • Gráfico de barras agrupadas: OEE por centro de trabalho, revelando quais máquinas apresentam desempenho inferior
  • Tabela: Ordens de produção com duração planejada versus real, variação e quantidade de refugo

Utilização do Centro de Trabalho

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
)

Este painel ajuda os gerentes de produção a identificar gargalos nos centros de trabalho e otimizar a programação. Quando combinado com os dados do módulo de planejamento do Odoo, você pode criar modelos de planejamento de capacidade que prevêem quando você atingirá a utilização máxima.


Receitas do Dashboard: RH e Força de Trabalho

Painel de análise da força de trabalho

Painéis de RH criados a partir de dados Odoo fornecem insights pelos quais a maioria dos sistemas HRIS cobra preços premium.

Medidas de número de funcionários e rotatividade:

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

Análise de ausência 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
)

Análise de presença 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)
)

Configuração de atualização incremental

Para bancos de dados Odoo com milhões de registros, atualizações completas de dados são impraticáveis. O recurso de atualização incremental do Power BI carrega apenas registros novos e alterados, reduzindo o tempo de atualização de horas para minutos.

Pré-requisitos

  • Licença Power BI Pro ou Premium
  • Cada tabela deve ter uma coluna de data e hora confiável (write_date no Odoo é ideal --- é atualizado sempre que um registro é modificado)
  • A fonte de dados deve suportar dobramento de consultas (o PostgreSQL suporta)

Etapas de configuração

Etapa 1: Criar parâmetros RangeStart e RangeEnd

No Power Query, crie dois parâmetros do tipo DateTime:

  • RangeStart: valor padrão = 01/01/2020 12h00
  • RangeEnd: valor padrão = 31/12/2030 12h00

Etapa 2: Filtrar tabelas pelos parâmetros

Para cada tabela de fatos, adicione uma etapa de filtro no Power Query:

= Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd)

Este filtro deve ser dobrado no banco de dados (aparecer no SQL gerado). Verifique clicando com o botão direito na etapa e selecionando "Exibir consulta nativa".

Etapa 3: Definir a política de atualização incremental

Clique com o botão direito na tabela do modelo, selecione Atualização Incremental e configure:

ConfiguraçãoValor recomendado
Armazene linhas no último3 anos
Atualizar linhas no último7 dias
Detectar alterações de dadoscoluna write_date
Atualizar apenas períodos completosHabilitado

Essa configuração armazena três anos de histórico, mas atualiza apenas os últimos sete dias durante cada atualização agendada. A coluna write_date do Odoo é atualizada automaticamente quando qualquer campo em um registro é alterado, tornando-a uma coluna confiável de detecção de alterações.

Impacto no desempenho

CenárioAtualização completaAtualização incremental
1 milhão de linhas de pedidos de vendas12 minutos45 segundos
5 milhões de lançamentos contábeis manuais38 minutos2 minutos
Movimentos de ações de 10 milhões65 minutos4 minutos

O ganho de desempenho é dramático, especialmente para conjuntos de dados de manufatura e inventário que geram grandes volumes de dados transacionais.


Avançado: Multiempresa e Multimoeda

Lidando com implantações Odoo em várias empresas

Muitas implantações do Odoo Enterprise atendem a diversas entidades legais a partir de um único banco de dados. Todo registro transacional possui um campo company_id. No Power BI:

  1. Crie uma tabela Dim_Company a partir de res_company
  2. Estabeleça relacionamentos de company_id de cada tabela de fatos para Dim_Company
  3. Adicione uma segmentação de dados da empresa a cada página do painel
  4. Implemente segurança em nível de linha para que cada usuário veja apenas os dados de sua empresa

Conversão de moeda

Odoo armazena valores na moeda base da empresa. Para relatórios em várias moedas, junte-se à tabela 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;

Como alternativa, mantenha uma tabela Dim_Currency_Rate no Power BI com taxas de câmbio diárias e use o DAX para converter no momento do relatório. Esta abordagem é mais flexível para cenários hipotéticos (por exemplo, “como seriam as receitas com as taxas de câmbio do ano passado?”).


Integração OData e API REST para Odoo Online

Para organizações que usam Odoo Online ou Odoo.sh onde o acesso direto ao PostgreSQL não está disponível, existem métodos de conexão alternativos.

Usando a API JSON-RPC do Odoo

Odoo expõe um endpoint JSON-RPC em /jsonrpc (ou o XML-RPC mais antigo em /xmlrpc/2). Você pode chamar o método search_read para buscar dados:

{
  "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}
    ]
  }
}

No Power BI, você implementaria isso como uma função personalizada do Power Query usando Web.Contents com lógica de paginação. O desafio é o desempenho: cada chamada de API retorna no máximo alguns milhares de registros, e você precisa de várias viagens de ida e volta para grandes conjuntos de dados.

Módulos OData da comunidade

Vários módulos da comunidade Odoo adicionam endpoints OData:

  • BI Connector para Odoo — expõe feeds OData configuráveis
  • Conector Odoo-Power BI — modelos de dados pré-construídos para módulos comuns

Esses módulos simplificam a integração, mas adicionam uma dependência à sua instância do Odoo. Avalie se a conveniência compensa a carga de manutenção de um módulo comunitário.

Abordagem híbrida: exportação de dados agendada

Um meio-termo pragmático é agendar uma exportação noturna de dados do Odoo para um banco de dados temporário ou Azure SQL. Uma ação agendada do Odoo executa um script Python que exporta tabelas principais para CSV ou envia dados via API para um banco de dados SQL do Azure. O Power BI então se conecta ao banco de dados temporário com suporte completo à dobragem de consultas.

Essa abordagem funciona bem para organizações que desejam atualização de dados quase diária sem expor o banco de dados de produção do Odoo a consultas do Power BI.


Exemplos de KPI do mundo real

Aqui estão vinte KPIs que os clientes ECOSIRE frequentemente constroem após conectar o Odoo ao Power BI, organizados por departamento.

KPIs financeiros

  1. Dias de vendas pendentes (DSO) — Média de dias para receber o pagamento, a partir de account_move (data da fatura x data de pagamento)
  2. % de margem bruta — Receita menos CPV dividida pela receita, de sale_order_line (price_subtotal vs product standard_price)
  3. Ciclo de conversão de caixa — DSO + dias de estoque pendente - dias a pagar pendentes
  4. Orçamento versus variação real — Requer uma tabela de orçamento (account_budget no Odoo ou upload manual)
  5. Receita por Funcionário — Receita total dividida pelo número de funcionários ativos

KPIs de vendas

  1. Custo de aquisição de clientes – gastos com marketing divididos por novos clientes adquiridos (requer entrada manual de custos de marketing)
  2. Customer Lifetime Value — Receita média por cliente vezes a duração média do relacionamento
  3. Duração do ciclo de vendas — Dias desde a criação da oportunidade até a conquista (crm_lead)
  4. Taxa de conversão de cotação em pedido — Pedidos confirmados divididos pelo total de cotações
  5. Desconto médio% — Do campo de desconto sale_order_line

KPIs de operações

  1. Taxa de pedido perfeita — Pedidos entregues no prazo, na íntegra, com documentação correta
  2. Precisão de estoque — Contagem real versus contagem do sistema (a partir de ajustes stock_quant)
  3. Confiabilidade do prazo de entrega do fornecedor — Data de recebimento real versus data esperada dos pedidos de compra
  4. Utilização do espaço do armazém — Locais ocupados divididos pelo total de locais
  5. Taxa de retorno — Notas de crédito/reembolsos como porcentagem do total de vendas

KPIs de manufatura

  1. Rendimento na primeira passagem — Unidades que passam na inspeção de qualidade sem retrabalho divididas pelo total de unidades
  2. Aderência ao cronograma — Ordens de produção concluídas na data planejada
  3. % de desperdício de material — matéria-prima consumida além dos requisitos da lista técnica
  4. Utilização do Centro de Trabalho — Horas produtivas reais versus horas disponíveis
  5. Tempo Médio entre Falhas (MTBF) — Tempo médio de operação entre quebras de equipamentos

Cada um desses KPIs requer junções de tabelas específicas e lógica DAX. Serviço de implementação do Power BI da ECOSIRE inclui uma biblioteca de KPI padrão com medidas pré-construídas para todos os vinte.


Otimização de desempenho

Consulta dobrada

A dobragem de consultas é o conceito de desempenho mais importante para integrações Odoo + Power BI. Quando o Power Query "dobra" uma transformação, ele converte a etapa em SQL e a executa no servidor PostgreSQL em vez de no mecanismo do Power BI.

Passos que se dobram:

  • Table.SelectRows (cláusula WHERE)
  • Table.SelectColumns (SELECT colunas específicas)
  • Tabela.Sort (ORDER BY)
  • Tabela.Grupo (GRUPO POR)
  • Tabela.Join (JOIN)
  • Tabela.PrimeiroN (LIMITE)

Etapas que quebram a dobra:

  • Table.AddColumn com funções M personalizadas
  • Tabela.Buffer
  • Table.Pivot / Table.Unpivot (na maioria dos casos)
  • Qualquer etapa que faça referência a uma etapa anterior não dobrável

Prática recomendada: Escreva consultas SQL personalizadas em vez de depender da dobragem do Power Query. Isso lhe dá controle total sobre o SQL enviado ao PostgreSQL e elimina a incerteza de dobramento.

Importação versus DirectQuery

FatorModo de importaçãoConsulta Direta
DesempenhoRápido (dados armazenados em cache localmente)Mais lento (consultas chegam ao Odoo DB ao vivo)
Atualização de dadosAtualização agendada (min 30 min)Em tempo real
Tamanho do modeloLimitado pela memória (1 GB grátis, 10-100 GB Premium)Sem limite de tamanho
Suporte DAXCompletoLimitado (algumas funções indisponíveis)
Impacto no OdooNenhum após atualizaçãoCada interação de relatório consulta o banco de dados
RecomendaçãoUse para a maioria dos cenáriosUse apenas quando o tempo real for essencial

Para a maioria das implantações do Odoo, o modo de importação com atualização incremental fornece o melhor equilíbrio entre desempenho e atualização. O DirectQuery deve ser reservado para painéis operacionais onde dados de 30 minutos são inaceitáveis ​​(por exemplo, uma exibição ao vivo no chão de fábrica).

Modelos Compostos

O Power BI Premium oferece suporte a modelos compostos que combinam tabelas de importação e DirectQuery. Isso é ideal para integrações Odoo onde:

  • Grandes tabelas históricas (pedidos de vendas, lançamentos contábeis manuais) usam o modo de importação com atualização incremental
  • Tabelas pequenas e que mudam rapidamente (stock_quant para inventário ativo) usam DirectQuery
  • A dimensão da data e outras dimensões usam o modo de armazenamento duplo

Solução de problemas comuns

Erros de conexão

"Não é possível conectar-se ao servidor" — Verifique se o PostgreSQL está escutando na porta correta (padrão 5432) e se as regras de firewall permitem conexões de entrada do gateway do Power BI ou do IP do seu desktop. Verifique postgresql.conf para listen_addresses e pg_hba.conf para regras de autenticação do cliente.

"Conexão SSL é necessária" — Adicione sslmode=require à conexão. Para certificados autoassinados, pode ser necessário importar o certificado CA ou definir sslmode=allow (não recomendado para produção).

"Permissão negada para tabela" — O usuário do banco de dados do Power BI não tem privilégios SELECT. Execute GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_readonly; e verifique com \dp table_name no psql.

Problemas de qualidade de dados

Valores NULL em campos críticos — Odoo permite que muitos campos fiquem em branco. Use COALESCE em consultas SQL ou manipule BLANK() em DAX para evitar erros de cálculo.

Registros duplicados — O ORM do Odoo às vezes cria múltiplas versões de registros durante a edição. Filtre por active = true e certifique-se de usar o campo de estado correto para excluir rascunhos e registros cancelados.

Incompatibilidades de fuso horário — Odoo armazena carimbos de data/hora em UTC. O Power BI é exibido no fuso horário local por padrão. Use AT TIME ZONE em consultas PostgreSQL ou DateTimeZone.SwitchZone em Power Query para normalizar.

Problemas de desempenho

Tempos de atualização lentos — Habilite a atualização incremental. Use consultas SQL personalizadas em vez de importar tabelas inteiras. Filtre registros inativos, rascunhos de documentos e dados históricos além da janela de análise.

Tempos de carregamento do relatório superiores a 10 segundos — Verifique se há medidas DAX complexas que iteram em tabelas grandes (SUMX, FILTER com muitas linhas). Use variáveis ​​para evitar cálculos repetidos. Considere pré-agregar dados em visualizações SQL.

Tempos limite do gateway — Aumente o tempo limite do comando na configuração da fonte de dados do gateway. O padrão é 120 segundos; definido como 600 para grandes bancos de dados Odoo.


Considerações de segurança

Segurança do banco de dados

Nunca conecte o Power BI ao Odoo usando o usuário administrador do banco de dados Odoo. Crie um usuário somente leitura dedicado conforme mostrado anteriormente. Considere estas medidas adicionais:

  • Restrições em nível de linha: Use PostgreSQL CREATE POLICY para limitar o acesso do usuário somente leitura se você não quiser que o Power BI acesse todas as tabelas (por exemplo, excluindo hr_payslip)
  • Mascaramento de coluna: crie visualizações que excluam colunas confidenciais (salário, SSN, dados bancários) e conceda acesso do Power BI a visualizações em vez de tabelas base
  • Criptografia de conexão: Sempre use SSL para conexões PostgreSQL, especialmente quando o gateway do Power BI e o banco de dados Odoo estiverem em redes diferentes
  • Registro de auditoria: Habilite PostgreSQL pgaudit para rastrear todas as consultas do usuário do Power BI

Segurança do Power BI

  • Implementar segurança em nível de linha (RLS) no Power BI que espelhe as regras de acesso multiempresa do Odoo
  • Use rótulos de confidencialidade para conjuntos de dados que contenham dados financeiros ou de RH
  • Restringir o acesso ao espaço de trabalho a analistas e consumidores autorizados
  • Desative a exportação de dados em relatórios confidenciais para evitar a exfiltração de dados

Para se aprofundar na segurança do Power BI, consulte nosso guia sobre implementação de segurança em nível de linha.


Juntando tudo: roteiro de implementação

Fase 1: Fundação (Semana 1-2)

  1. Crie o usuário PostgreSQL somente leitura no banco de dados Odoo
  2. Instale e configure o gateway de dados local (se estiver usando o serviço Power BI)
  3. Conecte o Power BI Desktop ao banco de dados Odoo
  4. Importe os cinco grupos principais de tabelas (vendas, contabilidade, estoque, manufatura, RH)
  5. Construa a dimensão de data e estabeleça relacionamentos

Fase 2: Painéis principais (Semanas 3-4)

  1. Construa o painel executivo de vendas (receita, crescimento, principais produtos, pipeline)
  2. Construir o painel financeiro (antiguidade AR, fluxo de caixa, variação orçamentária)
  3. Construa o painel de inventário (níveis de estoque, rotatividade, alertas de novos pedidos)
  4. Configure a atualização incremental para todas as tabelas de fatos
  5. Publique no serviço Power BI e configure a atualização agendada

Fase 3: Análise Avançada (Semana 5-6)

  1. Construir painéis de fabricação (OEE, utilização, programação de produção)
  2. Crie painéis de RH (número de funcionários, desgaste, presença, ausência)
  3. Implementar segurança em nível de linha para isolamento de dados de várias empresas
  4. Crie um layout otimizado para dispositivos móveis para os principais painéis
  5. Configure alertas de dados para KPIs críticos (rupturas de estoque, faturas vencidas, atrasos na produção)

Fase 4: Governança e Escala (Semanas 7 a 8)

  1. Estabeleça convenções de nomenclatura de espaços de trabalho e certificação de conteúdo
  2. Treine usuários avançados na criação de relatórios de autoatendimento
  3. Documente o modelo de dados e a lógica de cálculo
  4. Configure o monitoramento de uso para rastrear a adoção
  5. Planeje fontes de dados adicionais (plataformas de marketing, comércio eletrônico, IoT)

O serviço de integração Power BI + Odoo da ECOSIRE segue esse roteiro e normalmente entrega o primeiro painel executivo em duas semanas. A dupla experiência de nossa equipe no modelo de dados do Odoo e no mecanismo analítico do Power BI garante que você obtenha análises precisas, de alto desempenho e governadas desde o primeiro dia.


Perguntas frequentes

Posso conectar o Power BI ao Odoo Online ou apenas ao Odoo auto-hospedado?

Você pode se conectar a ambos, mas o método é diferente. O Odoo auto-hospedado oferece acesso direto ao PostgreSQL, que é mais rápido e flexível. Odoo Online e Odoo.sh não expõem o banco de dados diretamente, portanto, você precisa usar a API JSON-RPC do Odoo, um módulo de conector OData da comunidade ou uma exportação de dados agendada para um banco de dados temporário. Para Odoo Online com grandes conjuntos de dados, a abordagem de banco de dados temporário é recomendada porque a extração baseada em API é lenta para tabelas com mais de 50.000 registros.

Com que frequência o Power BI pode atualizar dados do Odoo?

Com o Power BI Pro, você pode agendar até 8 atualizações por dia (a cada 3 horas). Com o Power BI Premium, você pode agendar até 48 atualizações por dia (a cada 30 minutos). Para dados em tempo real, use o modo DirectQuery, mas esteja ciente de que cada interação de relatório consultará diretamente seu banco de dados Odoo. A atualização incremental reduz o tempo que cada atualização leva, tornando práticas atualizações mais frequentes sem sobrecarregar o banco de dados.

As consultas do Power BI deixarão nosso sistema Odoo lento?

Se você usar o modo de importação (recomendado), as consultas do Power BI serão executadas apenas durante as atualizações agendadas, normalmente fora dos horários de pico. O impacto no desempenho do Odoo é mínimo. Se você usar o DirectQuery, cada interação de relatório gerará consultas em tempo real no seu banco de dados Odoo, o que pode afetar o desempenho durante o horário comercial. As mitigações incluem o uso de uma réplica de leitura, a configuração de tempos limite de consulta e o design de consultas SQL eficientes que usam índices.

Preciso saber SQL para configurar a integração?

O conhecimento básico de SQL é útil, mas não estritamente necessário. A interface Power Query do Power BI permite selecionar tabelas e aplicar filtros visualmente. No entanto, para obter desempenho e qualidade de dados ideais, consultas SQL personalizadas são altamente recomendadas. Eles permitem que você pré-junte tabelas, filtre registros desnecessários e modele os dados no nível do banco de dados. Se a sua equipe não tiver experiência em SQL, considere contratar um especialista para a configuração inicial e depois manter os relatórios com as ferramentas visuais do Power BI.

Como o serviço Odoo + Power BI da ECOSIRE difere da consultoria genérica de Power BI?

A maioria das empresas de consultoria em Power BI tem experiência em Power BI, mas conhecimento limitado do modelo de dados do Odoo. Eles passam semanas fazendo engenharia reversa de relacionamentos de tabelas, entendendo convenções específicas do Odoo (como a estrutura dupla product_product / product_template) e descobrindo quais campos são significativos. A ECOSIRE construiu e implantou mais de 43 módulos Odoo e mantém profundo conhecimento em ambas as plataformas. Fornecemos modelos de dados pré-construídos, uma biblioteca de KPI padrão com mais de 50 medidas e otimizações específicas do Odoo, como atualização incremental nas colunas write_date. Essa dupla experiência reduz o tempo de implementação em 40 a 60 por cento em comparação com as equipes que aprendem o modelo de dados do Odoo do zero.

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