1. Consultar la información desde el ERP
Un ERP guarda miles de pedidos, facturas y movimientos. Su valor está en poder consultarlos para decidir: qué cliente compra más, qué producto deja más margen o qué comercial convierte mejor. Odoo ofrece varias herramientas sin programar, y por debajo todo es una base de datos PostgreSQL consultable con SQL.
Los datos del ERP son una mina 💎
| Herramienta en Odoo | Para qué |
|---|---|
| Búsqueda y filtros | Filtrar registros (facturas vencidas, pedidos de este mes) y guardar los filtros como favoritos |
| Agrupar por | Agrupar listas por cliente, comercial, mes o etapa, con subtotales |
| Vista pivote | Tabla dinámica: filas × columnas × medidas (como en una hoja de cálculo) |
| Vista gráfica | Barras, líneas y tartas a partir de la misma búsqueda |
| Tableros (Dashboards) | Reunir varias vistas pivote y gráficos en una página |
| Exportar | Descargar cualquier listado a Excel/CSV eligiendo los campos (incluso de modelos relacionados) |
| Informes PDF | Documentos generados con plantillas QWeb: facturas, albaranes, pedidos |
| Hojas de cálculo (Enterprise) | Hojas enlazadas a los datos del ERP que se actualizan solas |
2. El modelo de datos por debajo
Cada modelo de Odoo es una tabla de PostgreSQL: res.partner → res_partner, sale.order → sale_order, sale.order.line → sale_order_line, account.move → account_move, crm.lead → crm_lead, product.product → product_product. Los campos Many2one son columnas _id con clave ajena, y los Many2many usan tablas intermedias.
1-- Ventas confirmadas por cliente en la base de datos real de Odoo (solo lectura)
2SELECT rp.name AS cliente, COUNT(so.id) AS pedidos, SUM(so.amount_untaxed) AS base_imponible
3 FROM sale_order so
4 JOIN res_partner rp ON rp.id = so.partner_id
5 WHERE so.state = 'sale'
6 GROUP BY rp.name
7 ORDER BY base_imponible DESC;Leer sí, escribir no
Acceder por la API
Desde otros programas (una web, un script de informes, otra aplicación) se accede con la API externa XML-RPC o JSON-RPC, que respeta los permisos del usuario:
1import xmlrpc.client
2
3URL, BD, USUARIO, CLAVE = "https://erp.empresa.es", "empresa", "informes@empresa.es", "clave-api"
4
5common = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/common")
6uid = common.authenticate(BD, USUARIO, CLAVE, {})
7models = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/object")
8
9# Facturas de cliente publicadas y pendientes de cobro
10facturas = models.execute_kw(BD, uid, CLAVE, "account.move", "search_read",
11 [[("move_type", "=", "out_invoice"), ("state", "=", "posted"),
12 ("payment_state", "in", ["not_paid", "partial"])]],
13 {"fields": ["name", "partner_id", "amount_residual", "invoice_date_due"], "order": "invoice_date_due"})
14
15for f in facturas:
16 print(f"{f['name']:<15} {f['partner_id'][1]:<30} {f['amount_residual']:>10.2f} € vence {f['invoice_date_due']}")
17
18# Ventas agrupadas por comercial (lo mismo que la vista pivote)
19grupos = models.execute_kw(BD, uid, CLAVE, "sale.order", "read_group",
20 [[("state", "=", "sale")], ["amount_total:sum"], ["user_id"]])3. Inteligencia de negocio (BI)
La inteligencia de negocio es el conjunto de técnicas y herramientas para transformar los datos en información útil para decidir. Sus piezas:
- Fuentes: el ERP, el CRM, la tienda online, hojas de cálculo…
- ETL (extraer, transformar, cargar): procesos que copian y limpian los datos periódicamente.
- Almacén de datos (data warehouse): base de datos para análisis, con modelo en estrella (una tabla de hechos, como las ventas, rodeada de dimensiones: cliente, producto, tiempo, comercial).
- Análisis: consultas, cubos OLAP (análisis multidimensional), minería de datos.
- Presentación: informes y cuadros de mando con indicadores (KPI).
| KPI habitual | Cálculo | Área |
|---|---|---|
| Facturación | Suma de las ventas facturadas del periodo | Ventas |
| Margen bruto | (Ventas − coste de lo vendido) / ventas | Dirección |
| Ticket medio | Facturación / número de pedidos | Ventas |
| Tasa de conversión | Oportunidades ganadas / oportunidades cerradas | CRM |
| Periodo medio de cobro | Saldo de clientes / ventas × 365 | Finanzas |
| Rotación de stock | Coste de lo vendido / stock medio | Almacén |
| Tasa de abandono (churn) | Clientes perdidos / clientes al inicio | CRM |
Herramientas de BI habituales: Power BI, Tableau, Looker Studio y libres como Metabase o Apache Superset, que se conectan a PostgreSQL. Un buen cuadro de mando muestra pocos indicadores, comparados con un objetivo o con el periodo anterior, y permite profundizar (drill-down) hasta el detalle.
4. Retos: consultas de negocio sobre un ERP
La base de datos simplificada de una consultora que vende licencias, servicios y hardware a empresas de La Rioja tiene clientes, comerciales, productos, pedidos con sus líneas (con descuento en %) y oportunidades del CRM. El importe de una línea es cantidad × precio_unitario × (1 − descuento / 100). Escribe cada consulta y compruébala: se ejecuta en tu navegador con SQLite.
Muestra la facturación de cada mes (solo pedidos en estado «facturado»): el mes en formato AAAA-MM y el importe total de sus líneas aplicando el descuento, redondeado a 2 decimales, ordenado por mes.
Muestra el nombre y la facturación (pedidos facturados, con descuento, 2 decimales) de los tres clientes que más han facturado, de mayor a menor.
Calcula, para los pedidos facturados, las ventas (con descuento), el coste (cantidad × coste del producto) y el margen (ventas − coste) de cada categoría de producto, con 2 decimales, ordenado por margen de mayor a menor.
Para cada comercial muestra su nombre, el número de pedidos facturados, la facturación total y el ticket medio (facturación / número de pedidos), con 2 decimales, ordenado por facturación de mayor a menor.
Muestra cuántas oportunidades hay en cada etapa y su importe estimado total, en el orden del embudo: nueva, calificada, propuesta, ganada, perdida (solo las etapas con alguna oportunidad).
Calcula para cada comercial su tasa de conversión: oportunidades ganadas / oportunidades cerradas (ganadas + perdidas) × 100, redondeada a 1 decimal. Muestra el nombre, ganadas, cerradas y tasa, ordenado por tasa de mayor a menor y, a igualdad de tasa, por nombre. Las oportunidades abiertas no cuentan.
Muestra el nombre de los productos que no aparecen en ningún pedido facturado.
Para la campaña de reactivación, muestra el nombre de los clientes cuyo último pedido facturado es anterior al 1 de abril de 2025, junto con la fecha de ese último pedido, ordenados por esa fecha (del más antiguo al más reciente). Los clientes sin ningún pedido facturado no se incluyen.