Apuntes DAM
    Tema 3 de 6SGE · 2º DAM

    Sistemas de Gestión Empresarial

    Gestión de la Información y BI

    Consultas, filtros, vistas pivote y tableros en Odoo, el modelo de datos en PostgreSQL, la API XML-RPC, inteligencia de negocio, KPI y 8 retos SQL autocorregidos sobre una base de datos de ERP.

    70 min lecturaIntermedio

    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 💎

    ⛏️
    Extraer
    Consultas, filtros y exportaciones sacan los datos que interesan.
    🔬
    Refinar
    Agrupar, sumar y cruzar convierte datos sueltos en indicadores.
    📊
    Mostrar
    Informes y cuadros de mando ponen los indicadores delante de quien decide.
    Herramienta en OdooPara qué
    Búsqueda y filtrosFiltrar registros (facturas vencidas, pedidos de este mes) y guardar los filtros como favoritos
    Agrupar porAgrupar listas por cliente, comercial, mes o etapa, con subtotales
    Vista pivoteTabla dinámica: filas × columnas × medidas (como en una hoja de cálculo)
    Vista gráficaBarras, líneas y tartas a partir de la misma búsqueda
    Tableros (Dashboards)Reunir varias vistas pivote y gráficos en una página
    ExportarDescargar cualquier listado a Excel/CSV eligiendo los campos (incluso de modelos relacionados)
    Informes PDFDocumentos 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.

    consulta-odoo.sql
    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

    Consultar PostgreSQL directamente es útil para informes y BI, pero nunca se deben modificar datos con SQL: se saltarían las reglas de negocio, los campos calculados, la contabilidad y el historial. Para escribir se usa la interfaz, la importación o la API. Lo ideal es un usuario de PostgreSQL de solo lectura o una réplica.

    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:

    informe_api.py
    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:

    1. Fuentes: el ERP, el CRM, la tienda online, hojas de cálculo…
    2. ETL (extraer, transformar, cargar): procesos que copian y limpian los datos periódicamente.
    3. 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).
    4. Análisis: consultas, cubos OLAP (análisis multidimensional), minería de datos.
    5. Presentación: informes y cuadros de mando con indicadores (KPI).
    KPI habitualCálculoÁrea
    FacturaciónSuma de las ventas facturadas del periodoVentas
    Margen bruto(Ventas − coste de lo vendido) / ventasDirección
    Ticket medioFacturación / número de pedidosVentas
    Tasa de conversiónOportunidades ganadas / oportunidades cerradasCRM
    Periodo medio de cobroSaldo de clientes / ventas × 365Finanzas
    Rotación de stockCoste de lo vendido / stock medioAlmacén
    Tasa de abandono (churn)Clientes perdidos / clientes al inicioCRM

    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.

    ¿Qué es business intelligence (BI)? — SoftDoit

    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.

    🗄️SQLFacturación por mesFácil

    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.

    🗄️SQLLos tres mejores clientesMedio

    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.

    🗄️SQLMargen bruto por categoríaMedio

    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.

    🗄️SQLRendimiento de los comercialesMedio

    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.

    🗄️SQLEmbudo de ventas del CRMMedio

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

    🗄️SQLTasa de conversión por comercialDifícil

    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.

    🗄️SQLProductos sin ventasFácil

    Muestra el nombre de los productos que no aparecen en ningún pedido facturado.

    🗄️SQLClientes a reactivarDifícil

    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.

    ¿Has terminado este tema?

    Crea una cuenta gratis para guardar qué temas has terminado, subir de nivel y ganar medallas.

    Guardar mi progreso