Parte de nuestra serie Data Analytics & BI
Leer la guía completaLa guía completa para la integración de Power BI + Odoo
Odoo es una de las plataformas ERP de código abierto más potentes del mundo, con más de 12 millones de usuarios y 43 módulos oficiales que cubren todo, desde ventas e inventario hasta fabricación y recursos humanos. Power BI es la plataforma de inteligencia empresarial líder en la industria con más de 300 millones de usuarios activos mensuales. Sin embargo, sorprendentemente pocas organizaciones conectan estos dos sistemas, lo que deja un enorme valor analítico sobre la mesa.
La razón es sencilla: Odoo tiene sus propios informes integrados y la mayoría de las consultorías de Power BI se centran en integraciones de Microsoft Dynamics, SAP o Salesforce. Muy pocas empresas tienen una experiencia profunda en ambas plataformas. En ECOSIRE, hemos creado e implementado más de 43 módulos de Odoo y mantenemos una profunda experiencia en Power BI, lo que hace que la combinación de Odoo + Power BI sea una de nuestras principales especializaciones. Esta guía resume todo lo que hemos aprendido de docenas de integraciones del mundo real.
Conclusiones clave
- La base de datos PostgreSQL de Odoo se puede conectar directamente a Power BI Desktop utilizando el conector PostgreSQL nativo, lo que le brinda acceso completo a cada tabla y campo.
- Las cinco tablas de Odoo más valiosas para análisis son sale_order, account_move, stock_picking, hr_employee y mrp_production. Juntas cubren el 80 por ciento de las necesidades de informes ejecutivos.
- La actualización incremental en Power BI puede reducir los tiempos de carga de datos de Odoo de horas a minutos al recuperar solo los registros que cambiaron desde la última actualización.
- Los puntos finales de OData y la API externa de Odoo brindan alternativas amigables con la nube cuando el acceso directo a la base de datos no está disponible
- La seguridad a nivel de fila en Power BI puede reflejar los controles de acceso multiempresa de Odoo, garantizando que los usuarios solo vean datos de sus empresas asignadas.
- Las consultas SQL personalizadas contra la base de datos PostgreSQL de Odoo superan las importaciones de tablas genéricas entre 5 y 10 veces porque puede filtrar, unir y agregar a nivel de base de datos.
- Una implementación de Odoo + Power BI bien diseñada reemplaza docenas de informes de hojas de cálculo con una única plataforma de análisis gobernada
Por qué Odoo + Power BI es una combinación poderosa
Las limitaciones de los informes integrados de Odoo
Odoo viene con varias herramientas de generación de informes: vistas dinámicas, vistas de gráficos y un panel integrado. Para las operaciones del día a día, estos son adecuados. Pero se quedan cortos en cuanto a análisis empresarial en varios aspectos críticos.
Primero, las vistas dinámicas de Odoo no pueden combinar datos de múltiples módulos en una sola visualización. No se pueden superponer los ingresos por ventas con la rotación de inventario y el rendimiento de fabricación en un solo gráfico. Los informes de cada módulo están aislados.
En segundo lugar, Odoo carece de funciones de inteligencia del tiempo. Las comparaciones año tras año, los promedios móviles, los totales acumulados y los cálculos del período hasta la fecha requieren un desarrollo personalizado o exportaciones manuales de hojas de cálculo.
En tercer lugar, Odoo no tiene el concepto de modelo de datos gobernado. No existen definiciones compartidas para métricas como "ingresos" o "valor de vida del cliente". Cada usuario crea su propia interpretación, lo que genera números contradictorios en las reuniones de gestión.
Cuarto, las capacidades de visualización de Odoo se limitan a gráficos de barras, gráficos de líneas y gráficos circulares básicos. Los mapas de calor, los diagramas de dispersión, los gráficos en cascada, los árboles de descomposición y las tarjetas KPI no están disponibles.
Qué agrega Power BI
Power BI aborda cada una de estas limitaciones. Se conecta a la base de datos PostgreSQL (o API) de Odoo y crea un modelo semántico unificado en todos los módulos. Las fórmulas DAX proporcionan inteligencia temporal, funciones estadísticas y una lógica empresarial compleja. La biblioteca de visualización incluye más de 300 tipos de gráficos. Y las características de gobierno de Power BI (espacios de trabajo, seguridad a nivel de fila, aprobación, etiquetas de confidencialidad) brindan administración de datos de nivel empresarial.
La combinación le brinda la excelencia operativa de Odoo para el trabajo diario y la profundidad analítica de Power BI para la toma de decisiones estratégicas. Los equipos de operaciones continúan trabajando en Odoo; Los ejecutivos y analistas obtienen paneles de Power BI que se actualizan automáticamente.
Métodos de conexión: base de datos directa frente a API
Existen tres métodos principales para conectar Power BI a Odoo. Cada uno tiene sus ventajas y desventajas según su modelo de alojamiento y sus requisitos de seguridad.
Método 1: conexión directa a PostgreSQL
Este es el método preferido para implementaciones de Odoo locales o autohospedadas. Odoo almacena todos los datos en PostgreSQL y Power BI tiene un conector PostgreSQL nativo.
Ventajas:
- Rendimiento de consultas más rápido (sin sobrecarga de API)
- Acceso completo a todas las tablas y campos, incluidos módulos personalizados
- Admite consultas SQL complejas con uniones y agregaciones a nivel de base de datos
- Permite la actualización incremental (requiere una columna de fecha y hora)
- Sin licencia de Odoo ni límites de tasa de API
Pasos de configuración:
- Abra Power BI Desktop y seleccione Obtener datos y luego base de datos PostgreSQL.
- Ingrese el nombre de host de su servidor Odoo y el nombre de la base de datos (generalmente el nombre de la instancia de Odoo)
- Utilice un usuario de base de datos de solo lectura (nunca la cuenta de administrador de Odoo)
- Seleccione el modo Importar para la mayoría de los escenarios o DirectQuery para necesidades en tiempo real.
- Navegue por la lista de tablas o utilice una consulta SQL personalizada
Parámetros de la cadena de conexión:
| Parámetro | Valor típico |
|---|---|
| Servidor | su-servidor-odoo.com:5432 |
| Base de datos | odoo_producción |
| Nombre de usuario | powerbi_readonly |
| Contraseña | (almacenado en credenciales) |
| Modo SSL | Requerir (para producción) |
| Tiempo de espera del comando | 600 (segundos, para consultas grandes) |
Creando un usuario de solo lectura en 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;
Este enfoque garantiza que Power BI pueda leer todas las tablas actuales y futuras sin ningún acceso de escritura a su base de datos de producción.
Método 2: API externa de Odoo (XML-RPC / JSON-RPC)
Odoo expone una API completa para leer y escribir datos. Power BI puede consumir esto a través de conectores personalizados o scripts de Python.
Ventajas:
- Funciona con Odoo.sh y Odoo Online (no se necesita acceso directo a la base de datos)
- Respeta las reglas de control de acceso y las reglas de registro de Odoo.
- No es necesario exponer el puerto de la base de datos externamente
Desventajas:
- Significativamente más lento que las consultas directas a bases de datos (10-100 veces para conjuntos de datos grandes)
- Los límites de tasa API pueden limitar las extracciones de gran volumen
- Requiere una función de Power Query personalizada o un paso ETL intermedio
- La paginación añade complejidad
Para el punto final JSON-RPC de Odoo, una función típica de Power Query M llamaría a https://your-odoo.com/jsonrpc con autenticación y luego paginaría los resultados. Esto funciona, pero resulta poco práctico para tablas con más de 50.000 registros.
Método 3: Puntos finales de OData a través de módulos conectores de Odoo
Varios módulos de la comunidad de Odoo exponen fuentes de OData que Power BI puede consumir de forma nativa. El conector OData en Power BI admite autenticación y paginación de forma inmediata.
Cuándo utilizar este método:
- Implementaciones de Odoo Online/Odoo.sh donde el acceso a la base de datos está restringido
- Escenarios que requieren la lógica de negocios de Odoo (campos calculados, reglas de acceso) en los datos.
- Conjuntos de datos más pequeños (menos de 100.000 registros por entidad)
Para la mayoría de las implementaciones empresariales, se recomienda encarecidamente el Método 1 (PostgreSQL directo). La diferencia de rendimiento es sustancial y la flexibilidad de las consultas SQL le permite dar forma a los datos en el origen.
Tablas esenciales de Odoo para Power BI
La base de datos PostgreSQL de Odoo contiene cientos de tablas. Comprender las tablas principales y sus relaciones es fundamental para crear modelos de Power BI eficaces. A continuación se muestran las tablas que impulsan el 80 por ciento de los paneles ejecutivos.
Tablas del módulo de ventas
| Mesa | Propósito | Campos clave |
|---|---|---|
| pedido_venta | Órdenes de venta (encabezados) | id, nombre, id_socio, pedido_fecha, importe_total, estado, id_empresa, id_usuario |
| línea_pedido_venta | Partidas de pedidos de venta | order_id, product_id, product_uom_qty, precio_unidad, precio_subtotal, descuento |
| res_partner | Clientes y proveedores | id, nombre, correo electrónico, id_país, id_categoría, rango_cliente, rango_proveedor |
| producto_producto | Variantes de producto | id, código_predeterminado, precio_lista, precio_estándar, id_categ, activo |
| plantilla_producto | Plantillas de productos | id, nombre, tipo, venta_ok, compra_ok |
Relaciones clave: sale_order.partner_id enlaza con res_partner.id. sale_order_line.product_id enlaces a product_product.id. product_product.product_tmpl_id enlaza con product_template.id.
Una consulta típica de análisis de ventas une estas tablas para generar una tabla de hechos 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;
Tablas del módulo de contabilidad
| Mesa | Propósito | Campos clave |
|---|---|---|
| movimiento_cuenta | Facturas, recibos, asientos de diario | id, nombre, tipo_movimiento, id_socio, fecha_factura, importe_total, estado, estado_pago |
| cuenta_move_line | Líneas de entrada del diario | move_id, account_id, débito, crédito, saldo, fecha, socio_id |
| cuenta_cuenta | Plan de cuentas | id, código, nombre, tipo_cuenta |
| pago_cuenta | Pagos | id, socio_id, monto, fecha, estado, tipo_pago |
| diario_cuenta | Diarios (banco, ventas, etc.) | id, nombre, tipo, código |
Distinción crítica: En Odoo, account_move almacena facturas (move_type = 'out_invoice'), facturas de proveedores ('in_invoice'), notas de crédito ('out_refund', 'in_refund') y asientos de diario ('entry'). Filtre siempre por tipo_movimiento en sus consultas de Power BI.
El campo payment_state en account_move le indica si una factura está "no_pagada", "en_pago", "pagada", "parcial" o "revertida". Esto es esencial para los paneles de control de antigüedad de las cuentas por cobrar.
Tablas del módulo de inventario
| Mesa | Propósito | Campos clave |
|---|---|---|
| selección_de_stock | Órdenes de entrega, recibos, transferencias internas | id, nombre, id_socio, fecha_programada, fecha_hecha, estado, id_tipo_recogida |
| stock_move | Movimientos de productos individuales | picks_id, product_id, product_uom_qty, cantidad, estado, fecha |
| stock_quant | Inventario disponible actual | id_producto, id_ubicación, cantidad, cantidad_reservada |
| ubicación_stock | Almacenes, zonas, contenedores | id, nombre, uso, ubicación_id (padre) |
| almacén_stock | Definiciones de warehouse | id, nombre, código, socio_id |
Inventario en tiempo real: stock_quant siempre refleja el estado actual del inventario. Para el análisis histórico de inventario, debe consultar stock_move con filtros de fecha y calcular los saldos corrientes.
Tablas del módulo de fabricación
| Mesa | Propósito | Campos clave |
|---|---|---|
| mrp_producción | Órdenes de fabricación | id, nombre, id_producto, cantidad_producto, fecha_inicio, fecha_finalización, estado |
| mrp_bom | Listas de materiales | id, product_tmpl_id, product_qty, tipo |
| mrp_bom_line | Componentes de la lista de materiales | bom_id, product_id, product_qty |
| mrp_workorder | Operaciones de orden de trabajo | Production_id, workcenter_id, duración, estado |
| mrp_workcenter | Centros de trabajo/máquinas | id, nombre, capacidad, time_efficiency |
Cálculo de OEE: La eficacia general del equipo se puede derivar de los registros de mrp_workorder comparando la duración planificada con la duración real, analizando los motivos del tiempo de inactividad y realizando un seguimiento de las métricas de calidad.
Mesas de Recursos Humanos
| Mesa | Propósito | Campos clave |
|---|---|---|
| hr_empleado | Registros de empleados | id, nombre, id_departamento, id_trabajo, correo electrónico_trabajo, activo |
| departamento_hr | Departamentos | id, nombre, id_padre, id_administrador |
| contrato_hr | Contratos de trabajo | empleado_id, salario, fecha_inicio, fecha_fin, estado |
| hr_leave | Solicitudes de tiempo libre | id_empleado, id_estado_vacaciones, fecha_desde, fecha_hasta, estado |
| hr_asistencia | Registros de entrada/salida | empleado_id, check_in, check_out, horas_trabajadas |
Creación del modelo de datos de Power BI
Diseño de esquema en estrella
El modelo de datos más eficaz para el análisis de Odoo sigue un patrón de esquema en estrella. Las tablas de hechos (órdenes de venta, facturas, movimientos de existencias, órdenes de producción) se encuentran en el centro. Los rodean tablas de dimensiones (productos, clientes, fechas, empleados, ubicaciones).
Tablas de hechos recomendadas:
- Fact_Sales — de sale_order + sale_order_line (grano: una fila por línea de pedido)
- Fact_Invoices — de account_move + account_move_line (grano: una fila por línea del diario)
- Fact_Inventory — de stock_move (grano: una fila por movimiento de stock)
- Fact_Production — de mrp_production + mrp_workorder (grano: una fila por orden de trabajo)
- Fact_Attendance — de hr_attendance (grano: una fila por par de entrada/salida)
Tablas de dimensiones compartidas:
- Dim_Date: una tabla de calendario generada en Power BI (esencial para la inteligencia del tiempo)
- Dim_Customer — de res_partner (filtrado a customer_rank > 0)
- Dim_Product — de producto_producto + plantilla_producto + categoría_producto
- Dim_Employee — de hr_employee + hr_department + hr_job
- Dim_Location — desde stock_location + stock_warehouse
- Dim_Company — de res_company (para implementaciones de Odoo multiempresa)
Creando la dimensión de fecha
Odoo no tiene una tabla de dimensiones de fecha dedicada. Debe crear uno en 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 tabla como una tabla de fechas en Power BI y cree relaciones desde la columna de fecha de cada tabla de hechos hasta Dim_Date[Fecha]. Ajuste el mes de inicio del año fiscal para que coincida con su organización.
Manejo de la estructura multiempresa de Odoo
Odoo admite configuraciones de múltiples empresas donde una única base de datos sirve a múltiples entidades legales. Cada tabla transaccional incluye una clave externa company_id. En Power BI, cree una tabla Dim_Company a partir de res_company y establezca relaciones con cada tabla de hechos.
Para seguridad a nivel de fila, use la característica RLS de Power BI para filtrar Dim_Company según la asignación de empresa del usuario que inició sesión. Esto refleja los controles de acceso multiempresa de Odoo en la capa de BI.
Recetas de paneles: análisis de ventas
Panel de ventas ejecutivo
Este panel responde a las cinco preguntas que todo director ejecutivo hace: ¿Cuántos ingresos este mes? ¿Estamos bien encaminados para el trimestre? ¿Qué productos están ganando? ¿Qué vendedores se están desempeñando? ¿Dónde están nuestros clientes?
Medidas a crear:
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])
Diseño visual:
- Fila 1: Cuatro tarjetas KPI (Ingresos MTD, Ingresos QTD, Ingresos YTD, % de crecimiento)
- Fila 2: Gráfico de líneas (ingresos mensuales, año actual versus año anterior) y gráfico de barras (ingresos por categoría de producto)
- Fila 3: Mapa visual (ingresos por país del cliente) y tabla (10 vendedores principales con ingresos, recuento de pedidos, tamaño promedio de las transacciones)
- Fila 4: Gráfico en cascada (puente de ingresos: nuevos clientes versus existentes versus perdidos) y gráfico de anillos (ingresos por canal de ventas)
Análisis del canal de ventas
Si usa Odoo CRM junto con el módulo de Ventas, conecte la tabla crm_lead para crear paneles de control de canalizaciones:
| Mesa | Propósito | Campos clave |
|---|---|---|
| crm_lead | Oportunidades y clientes potenciales | id, nombre, id_socio, ingresos_esperados, probabilidad, id_etapa, id_usuario, fecha_fecha límite |
| crm_stage | Etapas del oleoducto | id, nombre, secuencia |
Medidas en tramitación:
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)
)
Recetas de paneles: inventario y cadena de suministro
Panel de estado del inventario
Este panel monitorea los niveles de existencias, las tasas de rotación y el desempeño de la cadena de suministro.
Medidas clave:
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])
)
Imágenes:
- Tarjetas KPI: valor total del inventario, índice de rotación, tasa de desabastecimiento, artículos por debajo del punto de reorden
- Diagrama de dispersión: cada producto se representa según la tasa de rotación (eje x) frente al margen (eje y), dimensionado según la contribución a los ingresos. Este es el análisis visual ABC-XYZ.
- Gráfico de barras: 20 productos principales por valor de inventario (identifica el capital inmovilizado en existencias de lento movimiento)
- Tabla: Artículos por debajo del punto de pedido con stock actual, demanda diaria y fecha estimada de desabastecimiento
Rendimiento de entrega
Desde stock_picking, medir la entrega a tiempo:
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)
)
Recetas de paneles: fabricación
Panel de rendimiento de producción
Para los fabricantes que ejecutan Odoo Manufacturing, las tablas mrp_production y mrp_workorder proporcionan datos operativos enriquecidos.
Cálculo de OEE (eficacia general del equipo):
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]
Imágenes:
- Gráficos de calibre: OEE, disponibilidad, rendimiento, calidad (cada uno con umbrales objetivo: verde por encima del 85 %, amarillo entre 60 y 85 %, rojo por debajo del 60 %).
- Gráfico de líneas: tendencia OEE por semana, con límites de control
- Gráfico de barras agrupadas: OEE por centro de trabajo, que revela qué máquinas tienen un rendimiento inferior
- Tabla: Órdenes de producción con duración, variación y cantidad de desechos planificada versus real
Utilización del centro de trabajo
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 panel ayuda a los gerentes de producción a identificar centros de trabajo con cuellos de botella y optimizar la programación. Cuando se combina con los datos del módulo de planificación de Odoo, puede crear modelos de planificación de capacidad que pronostiquen cuándo alcanzará la máxima utilización.
Recetas de paneles: recursos humanos y fuerza laboral
Panel de análisis de la fuerza laboral
Los paneles de control de recursos humanos creados a partir de datos de Odoo brindan información por la que la mayoría de los sistemas HRIS cobran precios superiores.
Medidas de plantilla y rotación:
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álisis de ausencias 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álisis de asistencia 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)
)
Configuración de actualización incremental
Para bases de datos de Odoo con millones de registros, las actualizaciones completas de datos no son prácticas. La función de actualización incremental de Power BI carga solo registros nuevos y modificados, lo que reduce los tiempos de actualización de horas a minutos.
Requisitos previos
- Licencia Power BI Pro o Premium
- Cada tabla debe tener una columna de fecha y hora confiable (write_date en Odoo es ideal: se actualiza cada vez que se modifica un registro)
- La fuente de datos debe admitir el plegado de consultas (PostgreSQL lo hace)
Pasos de configuración
Paso 1: Crear parámetros RangeStart y RangeEnd
En Power Query, cree dos parámetros de tipo DateTime:
- RangeStart: valor predeterminado = 1/1/2020 12:00:00 a.m.
- RangeEnd: valor predeterminado = 31/12/2030 12:00:00 a.m.
Paso 2: Filtrar tablas por parámetros
Para cada tabla de hechos, agregue un paso de filtro en Power Query:
= Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd)
Este filtro debe plegarse a la base de datos (aparece en el SQL generado). Verifique haciendo clic derecho en el paso y seleccionando "Ver consulta nativa".
Paso 3: Definir la política de actualización incremental
Haga clic derecho en la tabla en el modelo, seleccione Actualización incremental y configure:
| Configuración | Valor recomendado |
|---|---|
| Almacenar filas en el último | 3 años |
| Actualizar filas en el último | 7 días |
| Detectar cambios de datos | columna write_date |
| Actualizar sólo períodos completos | Habilitado |
Esta configuración almacena tres años de historial pero solo actualiza los últimos siete días durante cada actualización programada. La columna write_date de Odoo se actualiza automáticamente cuando cambia cualquier campo de un registro, lo que la convierte en una columna confiable de detección de cambios.
Impacto en el rendimiento
| Escenario | Actualización completa | Actualización incremental |
|---|---|---|
| 1 millón de líneas de pedidos de ventas | 12 minutos | 45 segundos |
| 5 millones de asientos de diario | 38 minutos | 2 minutos |
| 10 millones de movimientos bursátiles | 65 minutos | 4 minutos |
La ganancia de rendimiento es espectacular, especialmente para los conjuntos de datos de fabricación e inventario que generan grandes volúmenes de datos transaccionales.
Avanzado: Multiempresa y Multimoneda
Manejo de implementaciones de Odoo entre empresas
Muchas implementaciones de Odoo Enterprise sirven a múltiples entidades legales desde una única base de datos. Cada registro transaccional tiene un campo company_id. En PowerBI:
- Cree una tabla
Dim_Companya partir deres_company - Establezca relaciones desde el company_id de cada tabla de hechos hasta Dim_Company.
- Agregue una segmentación de empresa a cada página del panel
- Implemente seguridad a nivel de fila para que cada usuario solo vea los datos de su empresa.
Conversión de moneda
Odoo almacena montos en la moneda base de la empresa. Para informes en varias monedas, únase a la tabla 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, mantenga una tabla Dim_Currency_Rate en Power BI con tipos de cambio diarios y use DAX para convertir en el momento del informe. Este enfoque es más flexible para escenarios hipotéticos (por ejemplo, "¿cómo serían los ingresos con los tipos de cambio del año pasado?").
Integración de OData y API REST para Odoo Online
Para las organizaciones que utilizan Odoo Online u Odoo.sh donde el acceso directo a PostgreSQL no está disponible, existen métodos de conexión alternativos.
Usando la API JSON-RPC de Odoo
Odoo expone un punto final JSON-RPC en /jsonrpc (o el XML-RPC anterior en /xmlrpc/2). Puede llamar al método search_read para recuperar datos:
{
"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}
]
}
}
En Power BI, implementaría esto como una función de Power Query personalizada usando Web.Contents con lógica de paginación. El desafío es el rendimiento: cada llamada API devuelve como máximo unos pocos miles de registros y se necesitan múltiples viajes de ida y vuelta para grandes conjuntos de datos.
Módulos comunitarios OData
Varios módulos de la comunidad de Odoo agregan puntos finales de OData:
- Conector BI para Odoo: expone feeds OData configurables
- Conector Odoo-Power BI: modelos de datos prediseñados para módulos comunes
Estos módulos simplifican la integración pero agregan una dependencia a su instancia de Odoo. Evalúe si la conveniencia supera la carga de mantenimiento de un módulo comunitario.
Enfoque híbrido: exportación de datos programada
Un término medio pragmático es programar una exportación de datos nocturna desde Odoo a una base de datos provisional o Azure SQL. Una acción programada de Odoo ejecuta un script de Python que exporta tablas clave a CSV o envía datos a través de API a una base de datos SQL de Azure. Luego, Power BI se conecta a la base de datos provisional con soporte completo para el plegado de consultas.
Este enfoque funciona bien para organizaciones que desean tener datos actualizados casi a diario sin exponer la base de datos de producción de Odoo a consultas de Power BI.
Ejemplos de KPI del mundo real
Aquí hay veinte KPI que los clientes de ECOSIRE crean con frecuencia después de conectar Odoo a Power BI, organizados por departamento.
KPI financieros
- Días de ventas pendientes (DSO): promedio de días para cobrar el pago, desde account_move (fecha de factura versus fecha de pago)
- % de margen bruto: ingresos menos COGS divididos por los ingresos, de sale_order_line (price_subtotal vs product standard_price)
- Ciclo de conversión de efectivo: DSO + Días de inventario pendientes - Días por pagar pendientes
- Presupuesto versus variación real: requiere una tabla de presupuesto (account_budget en Odoo o una carga manual)
- Ingresos por empleado: ingresos totales divididos por la plantilla activa
KPI de ventas
- Costo de adquisición de clientes: gasto en marketing dividido por los nuevos clientes adquiridos (requiere entrada manual de costos de marketing)
- Valor de por vida del cliente: ingreso promedio por cliente multiplicado por la duración promedio de la relación
- Duración del ciclo de ventas: días desde la creación de la oportunidad hasta su obtención (crm_lead)
- Tasa de conversión de cotización a pedido: pedidos confirmados divididos por el total de cotizaciones
- % de descuento promedio: desde el campo de descuento sale_order_line
KPI de operaciones
- Tasa de pedido perfecta: pedidos entregados a tiempo, en su totalidad y con la documentación correcta
- Precisión del inventario: recuento real versus recuento del sistema (a partir de ajustes de stock_quant)
- Confiabilidad del plazo de entrega del proveedor: fecha de recepción real versus fecha esperada de las órdenes de compra
- Utilización del espacio del almacén: ubicaciones ocupadas divididas por ubicaciones totales
- Tasa de retorno: notas de crédito/reembolsos como porcentaje de las ventas totales
KPI de fabricación
- Rendimiento del primer paso: unidades que pasan la inspección de calidad sin retrabajo divididas por el total de unidades
- Cumplimiento del cronograma: órdenes de producción completadas en la fecha planificada
- % de desperdicio de material: materia prima consumida más allá de los requisitos de la lista de materiales
- Utilización del centro de trabajo: horas productivas reales versus horas disponibles
- Tiempo medio entre fallas (MTBF): tiempo de funcionamiento promedio entre averías del equipo
Cada uno de estos KPI requiere combinaciones de tablas específicas y lógica DAX. El servicio de implementación de Power BI de ECOSIRE incluye una biblioteca de KPI estándar con medidas prediseñadas para los veinte.
Optimización del rendimiento
Plegado de consultas
El plegado de consultas es el concepto de rendimiento más importante para las integraciones de Odoo + Power BI. Cuando Power Query "pliega" una transformación, traduce el paso a SQL y lo ejecuta en el servidor PostgreSQL en lugar de en el motor Power BI.
Pasos que se pliegan:
- Table.SelectRows (cláusula WHERE)
- Table.SelectColumns (SELECCIONAR columnas específicas)
- Tabla.Ordenar (ORDENAR POR)
- Tabla.Grupo (GRUPO POR)
- Tabla.Unirse (UNIRSE)
- Tabla.FirstN (LÍMITE)
Pasos que rompen el plegado:
- Table.AddColumn con funciones M personalizadas
- Tabla.Buffer
- Table.Pivot / Table.Unpivot (en la mayoría de los casos)
- Cualquier paso que haga referencia a un paso anterior no plegable.
Prácticas recomendadas: Escriba consultas SQL personalizadas en lugar de depender del plegado de Power Query. Esto le brinda control total sobre el SQL enviado a PostgreSQL y elimina la incertidumbre en el plegado.
Importar frente a DirectQuery
| factor | Modo de importación | Consulta directa |
|---|---|---|
| Rendimiento | Rápido (datos almacenados en caché localmente) | Más lento (las consultas llegan a Odoo DB en vivo) |
| Actualización de datos | Actualización programada (min 30 min) | En tiempo real |
| Tamaño del modelo | Limitado por memoria (1 GB gratis, 10-100 GB Premium) | Sin límite de tamaño |
| Soporte DAX | Completo | Limitado (algunas funciones no disponibles) |
| Impacto en Odoo | Ninguno después de la actualización | Cada interacción del informe consulta la base de datos |
| Recomendación | Uso para la mayoría de escenarios | Úselo solo cuando el tiempo real sea esencial |
Para la mayoría de las implementaciones de Odoo, el modo Importar con actualización incremental proporciona el mejor equilibrio entre rendimiento y actualización. DirectQuery debe reservarse para paneles operativos donde los datos de 30 minutos de antigüedad son inaceptables (por ejemplo, una visualización en vivo del piso de fabricación).
Modelos compuestos
Power BI Premium admite modelos compuestos que combinan tablas Import y DirectQuery. Esto es ideal para integraciones de Odoo donde:
- Las tablas históricas grandes (órdenes de venta, asientos de diario) utilizan el modo Importación con actualización incremental
- Las tablas pequeñas y que cambian rápidamente (stock_quant para inventario activo) utilizan DirectQuery
- La dimensión de fecha y otras dimensiones utilizan el modo de almacenamiento dual
Solución de problemas comunes
Errores de conexión
"No se puede conectar al servidor": verifique que PostgreSQL esté escuchando en el puerto correcto (predeterminado 5432) y que las reglas del firewall permitan conexiones entrantes desde la puerta de enlace de Power BI o la IP de su escritorio. Marque postgresql.conf para listen_addresses y pg_hba.conf para conocer las reglas de autenticación del cliente.
"Se requiere conexión SSL": agregue sslmode=require a la conexión. Para certificados autofirmados, es posible que deba importar el certificado de CA o configurar sslmode=allow (no recomendado para producción).
"Permiso denegado para la tabla": el usuario de la base de datos de Power BI carece de privilegios SELECT. Ejecute GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_readonly; y verifique con \dp table_name en psql.
Problemas de calidad de datos
Valores NULL en campos críticos — Odoo permite que muchos campos estén en blanco. Utilice COALESCE en consultas SQL o maneje BLANK() en DAX para evitar errores de cálculo.
Registros duplicados: el ORM de Odoo a veces crea múltiples versiones de registros durante la edición. Filtre por active = true y asegúrese de utilizar el campo de estado correcto para excluir borradores y registros cancelados.
No coinciden las zonas horarias — Odoo almacena marcas de tiempo en UTC. Power BI se muestra en la zona horaria local de forma predeterminada. Utilice AT TIME ZONE en consultas de PostgreSQL o DateTimeZone.SwitchZone en Power Query para normalizar.
Problemas de rendimiento
Tiempos de actualización lentos: habilite la actualización incremental. Utilice consultas SQL personalizadas en lugar de importar tablas enteras. Filtre registros inactivos, borradores de documentos y datos históricos más allá de su ventana de análisis.
Tiempos de carga del informe superiores a 10 segundos: compruebe si hay medidas DAX complejas que se repiten en tablas grandes (SUMX, FILTER con muchas filas). Utilice variables para evitar cálculos repetidos. Considere la posibilidad de agregar datos previamente en vistas SQL.
Tiempos de espera de la puerta de enlace: aumente el tiempo de espera del comando en la configuración de la fuente de datos de la puerta de enlace. El valor predeterminado es 120 segundos; establecido en 600 para bases de datos grandes de Odoo.
Consideraciones de seguridad
Seguridad de la base de datos
Nunca conecte Power BI a Odoo utilizando el usuario de la base de datos de administrador de Odoo. Cree un usuario dedicado de solo lectura como se mostró anteriormente. Considere estas medidas adicionales:
- Restricciones a nivel de fila: Utilice PostgreSQL
CREATE POLICYpara limitar el acceso del usuario de solo lectura si no desea que Power BI acceda a todas las tablas (por ejemplo, excluyendo hr_payslip) - Enmascaramiento de columnas: cree vistas que excluyan columnas confidenciales (salario, número de seguro social, detalles bancarios) y otorgue acceso a Power BI a las vistas en lugar de a las tablas base.
- Cifrado de conexión: Utilice siempre SSL para conexiones PostgreSQL, especialmente cuando la puerta de enlace de Power BI y la base de datos de Odoo están en redes diferentes.
- Registro de auditoría: Habilite PostgreSQL
pgauditpara realizar un seguimiento de todas las consultas del usuario de Power BI
Seguridad de Power BI
- Implementar seguridad a nivel de fila (RLS) en Power BI que refleje las reglas de acceso multiempresa de Odoo.
- Utilice etiquetas de confidencialidad para conjuntos de datos que contengan datos financieros o de recursos humanos.
- Restringir el acceso al espacio de trabajo a analistas y consumidores autorizados.
- Deshabilite la exportación de datos en informes confidenciales para evitar la filtración de datos.
Para obtener más información sobre la seguridad de Power BI, consulte nuestra guía sobre implementación de seguridad a nivel de fila.
Poniéndolo todo junto: hoja de ruta de implementación
Fase 1: Fundación (Semana 1-2)
- Cree el usuario PostgreSQL de solo lectura en la base de datos Odoo
- Instale y configure la puerta de enlace de datos local (si usa el servicio Power BI)
- Conecte Power BI Desktop a la base de datos de Odoo
- Importe los cinco grupos de tablas principales (ventas, contabilidad, inventario, fabricación, recursos humanos)
- Construya la dimensión de la fecha y establezca relaciones.
Fase 2: Paneles principales (semana 3-4)
- Cree el panel de ventas ejecutivo (ingresos, crecimiento, productos principales, cartera de proyectos)
- Cree el panel de finanzas (antigüedad de AR, flujo de caja, variación del presupuesto)
- Cree el panel de inventario (niveles de existencias, rotación, alertas de reorden)
- Configure la actualización incremental para todas las tablas de hechos.
- Publicar en el servicio Power BI y configurar la actualización programada
Fase 3: Análisis avanzado (semana 5-6)
- Cree paneles de control de fabricación (OEE, utilización, programación de producción)
- Cree paneles de control de recursos humanos (recuento de personal, desgaste, asistencia, ausencia)
- Implementar seguridad a nivel de fila para el aislamiento de datos de varias empresas.
- Cree un diseño optimizado para dispositivos móviles para paneles de control clave
- Configure alertas de datos para KPI críticos (desabastecimientos, facturas vencidas, retrasos en la producción)
Fase 4: Gobernanza y escala (semana 7-8)
- Establecer convenciones de nomenclatura de espacios de trabajo y certificación de contenido.
- Capacite a los usuarios avanzados sobre la creación de informes de autoservicio
- Documentar el modelo de datos y la lógica de cálculo.
- Configure el monitoreo de uso para realizar un seguimiento de la adopción.
- Planifique fuentes de datos adicionales (plataformas de marketing, comercio electrónico, IoT)
El servicio de integración Power BI + Odoo de ECOSIRE sigue esta hoja de ruta y normalmente entrega el primer panel ejecutivo en dos semanas. La doble experiencia de nuestro equipo en el modelo de datos de Odoo y el motor analítico de Power BI garantiza que usted obtenga análisis precisos, eficaces y gobernados desde el primer día.
Preguntas frecuentes
¿Puedo conectar Power BI a Odoo Online o solo a Odoo autohospedado?
Puedes conectarte a ambos, pero el método es diferente. Odoo autohospedado le brinda acceso directo a PostgreSQL, que es más rápido y flexible. Odoo Online y Odoo.sh no exponen la base de datos directamente, por lo que necesita usar la API JSON-RPC de Odoo, un módulo conector OData comunitario o una exportación de datos programada a una base de datos provisional. Para Odoo Online con grandes conjuntos de datos, se recomienda el enfoque de base de datos provisional porque la extracción basada en API es lenta para tablas con más de 50.000 registros.
¿Con qué frecuencia Power BI puede actualizar los datos de Odoo?
Con Power BI Pro, puede programar hasta 8 actualizaciones por día (cada 3 horas). Con Power BI Premium, puede programar hasta 48 actualizaciones por día (cada 30 minutos). Para datos en tiempo real, use el modo DirectQuery, pero tenga en cuenta que cada interacción con el informe consultará su base de datos Odoo directamente. La actualización incremental reduce el tiempo que lleva cada actualización, lo que hace que las actualizaciones más frecuentes sean prácticas sin sobrecargar la base de datos.
¿Las consultas de Power BI ralentizarán nuestro sistema Odoo?
Si usa el modo Importar (recomendado), las consultas de Power BI solo se ejecutan durante las actualizaciones programadas, normalmente durante las horas de menor actividad. El impacto en el rendimiento de Odoo es mínimo. Si usa DirectQuery, cada interacción del informe genera consultas en vivo en su base de datos Odoo, lo que puede afectar el rendimiento durante el horario comercial. Las mitigaciones incluyen el uso de una réplica de lectura, la configuración de tiempos de espera de consultas y el diseño de consultas SQL eficientes que utilizan índices.
¿Necesito saber SQL para configurar la integración?
El conocimiento básico de SQL es útil pero no es estrictamente necesario. La interfaz Power Query de Power BI le permite seleccionar tablas y aplicar filtros visualmente. Sin embargo, para obtener un rendimiento y una calidad de datos óptimos, se recomiendan encarecidamente las consultas SQL personalizadas. Le permiten unir tablas previamente, filtrar registros innecesarios y dar forma a los datos en el nivel de la base de datos. Si su equipo carece de experiencia en SQL, considere contratar a un especialista para la configuración inicial y luego mantener los informes con las herramientas visuales de Power BI.
¿En qué se diferencia el servicio Odoo + Power BI de ECOSIRE de la consultoría genérica de Power BI?
La mayoría de las empresas consultoras de Power BI tienen experiencia en Power BI pero un conocimiento limitado del modelo de datos de Odoo. Pasan semanas realizando ingeniería inversa en las relaciones de las tablas, entendiendo las convenciones específicas de Odoo (como la estructura dual producto_producto / producto_plantilla) y descubriendo qué campos son significativos. ECOSIRE ha creado e implementado más de 43 módulos de Odoo y mantiene una profunda experiencia en ambas plataformas. Proporcionamos modelos de datos prediseñados, una biblioteca de KPI estándar con más de 50 medidas y optimizaciones específicas de Odoo, como actualización incremental en columnas write_date. Esta doble experiencia reduce el tiempo de implementación entre un 40 y un 60 por ciento en comparación con los equipos que aprenden el modelo de datos de Odoo desde cero.
Escrito por
ECOSIRE Research and Development Team
Construyendo productos digitales de nivel empresarial en ECOSIRE. Compartiendo perspectivas sobre integraciones Odoo, automatización de eCommerce y soluciones empresariales impulsadas por IA.
Artículos relacionados
Funciones de IA de Power BI: Copilot, AutoML y análisis predictivo
Domine las funciones de IA de Power BI, que incluyen Copilot para informes en lenguaje natural, AutoML para predicciones, detección de anomalías y narrativas inteligentes. Guía de licencias.
Guía completa para el desarrollo de paneles de Power BI
Aprenda a crear paneles de Power BI eficaces con diseño de KPI, prácticas recomendadas visuales, páginas de acceso a detalles, marcadores, diseños móviles y seguridad RLS.
Modelado de datos de Power BI: diseño de esquemas en estrella para inteligencia empresarial
Domine el modelado de datos de Power BI con diseño de esquemas en estrella, tablas de hechos y dimensiones, medidas DAX, grupos de cálculo, inteligencia temporal y modelos compuestos.
Más de Data Analytics & BI
Guía completa para el desarrollo de paneles de Power BI
Aprenda a crear paneles de Power BI eficaces con diseño de KPI, prácticas recomendadas visuales, páginas de acceso a detalles, marcadores, diseños móviles y seguridad RLS.
Fórmulas DAX que todo usuario empresarial debería conocer
Domine 20 fórmulas DAX esenciales para Power BI. CALCULATE, inteligencia del tiempo, RANKX, transición de contexto, iteradores y ejemplos prácticos de negocios.
Power BI Embedded: agregar análisis a su aplicación
Incorpore análisis de Power BI en su aplicación SaaS. Cubre autenticación, RLS multiinquilino, tamaño de capacidad, SDK de JavaScript, temas personalizados y precios de Fabric.
Migración de Excel a Power BI: guía paso a paso
Guía completa para migrar de Excel a Power BI que cubre la traducción de fórmulas, la creación de modelos de datos, Power Query, la validación y el desmantelamiento.
Medición del ROI de la IA en las empresas: un marco que realmente funciona
Un marco práctico para medir el retorno de la inversión en IA que cubre ahorros directos, ganancias de productividad, impacto en los ingresos y valor estratégico en todos los departamentos.
Creación de paneles de informes financieros: KPI, diseño e integración de ERP
Diseñe paneles de informes financieros que impulsen las decisiones. Descubra qué KPI realizar un seguimiento, principios de diseño de paneles y mejores prácticas de integración de ERP.