# Dashboard Ejecutivo de Presidencia — Guía de armado en Power BI > Radiografía financiera para el Presidente, basada en el **Mayor General Analítico** (`cgprrp008.4gl`) y el **Análisis de Gastos por Departamento** (`cgprrp009.4gl`). > Datos servidos por la capa BI: **`192.168.40.8 / MarmotechBI`**, esquema **`presidencia`** (vistas creadas por el script `SQL_Vistas_Presidencia.sql`). > Fecha: 2026-08-26 · Autor: jsoto. --- ## 0. Lo que ya está hecho (capa de datos) Se crearon 3 vistas en `MarmotechBI` — restringidas a `jsoto` (`DENY SELECT` a `public` + `GRANT` explícito a `MARMOTECH\jsoto` y `jsoto`; el resto del equipo `db_datareader` **no** las ve): | Vista | Grano | Para qué | Columnas clave | |---|---|---|---| | `presidencia.vwPLMensual` | año × mes × cuenta | Estado de Resultados (cgprrp008) | `ano, numero_mes, mes, AnoMes, fecha_mes, grupo, linea, orden_linea, subgrupo_cod, subgrupo_desc, cuenta, cuenta_desc, debito, credito, resultado, costo_gasto` | | `presidencia.vwGastosDepto` | año × mes × depto × cuenta | Análisis de gastos (cgprrp009) | `…, gerencia_cod, gerencia, departamento, depto_nombre, subgrupo_cod, subgrupo_desc, cuenta, cuenta_desc, debito, credito, gasto` | | `presidencia.vwBalanceMensual` | año × mes × cuenta | Balance / liquidez | `…, grupo, grupo_desc, subgrupo_cod, subgrupo_desc, cuenta, cuenta_desc, movimiento_mes, saldo_natural, saldo_presentacion` | **Reglas de negocio ya aplicadas dentro de las vistas** (no hay que replicarlas en DAX): - Estado de Resultados por **primer dígito** de la cuenta: `4` Ventas · `5` Costo · `7` Gastos · `8` Otros (incl. `88` = ISR). - **`resultado = credito − debito`** → la suma de todas las líneas del P&L = **Utilidad Neta**. Ventas suma positivo; costo, gastos e ISR restan. - Solo transacciones activas (`status_t IS NULL`). - Se **excluye el asiento de cierre anual** (`ref` tipo `ED.99-001/12AA`); sin esto, todo año cerrado neteaba a cero. Validado contra el sistema: julio-2026 reproduce exactamente la imagen del `cgprrp008`. --- ## 1. Conexión y consultas (Power Query / M) **Obtener datos → SQL Server** · Servidor `192.168.40.8` · Base `MarmotechBI` · Modo **Import** (o DirectQuery si se quiere en vivo). Traer las 3 vistas del esquema `presidencia`. Ejemplo de la consulta base (las otras dos son idénticas cambiando el nombre): ```m let Origen = Sql.Database("192.168.40.8", "MarmotechBI"), PL = Origen{[Schema="presidencia", Item="vwPLMensual"]}[Data] in PL ``` ### Tabla de calendario (necesaria para YoY / YTD) Crear una tabla calculada **DimCalendario** (grano día, contigua) y marcarla como *Tabla de fechas*: ```DAX DimCalendario = VAR MinD = DATE(2015,1,1) -- ajustar si se quiere histórico más largo VAR MaxD = DATE(2028,12,31) RETURN ADDCOLUMNS( CALENDAR(MinD, MaxD), "Año", YEAR([Date]), "MesNo", MONTH([Date]), "Mes", FORMAT([Date],"MMM","es-DO"), "AñoMes", FORMAT([Date],"yyyy-MM"), "PrimerDiaMes", DATE(YEAR([Date]),MONTH([Date]),1), "Trimestre", "T" & FORMAT([Date],"Q") ) ``` > Modelado → seleccionar DimCalendario → **Marcar como tabla de fechas** (columna `Date`). --- ## 2. Relaciones (vista *Modelo*) Las vistas traen `fecha_mes` = **primer día del mes**. Relacionar **una sola** dirección, Dimensión (1) → Hecho (\*): | Desde (1) | Columna | Hacia (\*) | Columna | |---|---|---|---| | `DimCalendario` | `Date` | `vwPLMensual` | `fecha_mes` | | `DimCalendario` | `Date` | `vwGastosDepto` | `fecha_mes` | | `DimCalendario` | `Date` | `vwBalanceMensual` | `fecha_mes` | Como cada mes tiene un solo `fecha_mes` (día 1), la relación con el calendario diario funciona perfecto para `TOTALYTD` y `SAMEPERIODLASTYEAR`. Los *slicers* de Año / Mes se ponen sobre **DimCalendario** (`Año`, `Mes`). --- ## 3. Medidas DAX Crear una tabla de medidas vacía (`_Medidas`) o alojarlas en `vwPLMensual`. ### 3.1 Estado de Resultados (base) ```DAX Ventas Netas = CALCULATE( SUM(vwPLMensual[resultado]), vwPLMensual[grupo] = "4" ) Costo de Ventas = CALCULATE( SUM(vwPLMensual[costo_gasto]), vwPLMensual[grupo] = "5" ) Gastos Operativos = CALCULATE( SUM(vwPLMensual[costo_gasto]), vwPLMensual[grupo] = "7" ) Otros Ing. y Gastos = CALCULATE( SUM(vwPLMensual[costo_gasto]), vwPLMensual[linea] = "Otros Ingresos y Gastos" ) ISR = CALCULATE( SUM(vwPLMensual[costo_gasto]), vwPLMensual[linea] = "Impuesto sobre la Renta" ) Utilidad Bruta = [Ventas Netas] - [Costo de Ventas] Utilidad Operativa = [Utilidad Bruta] - [Gastos Operativos] Utilidad antes ISR = [Utilidad Operativa] - [Otros Ing. y Gastos] Utilidad Neta = SUM( vwPLMensual[resultado] ) -- suma de todas las líneas ``` ### 3.2 Márgenes ```DAX Margen Bruto % = DIVIDE( [Utilidad Bruta], [Ventas Netas] ) Margen Operativo % = DIVIDE( [Utilidad Operativa], [Ventas Netas] ) Margen Neto % = DIVIDE( [Utilidad Neta], [Ventas Netas] ) Costo % Ventas = DIVIDE( [Costo de Ventas], [Ventas Netas] ) Gastos % Ventas = DIVIDE( [Gastos Operativos], [Ventas Netas] ) ``` ### 3.3 Comparativos (YoY y YTD) ```DAX Ventas AA = CALCULATE( [Ventas Netas], SAMEPERIODLASTYEAR(DimCalendario[Date]) ) Utilidad Neta AA = CALCULATE( [Utilidad Neta], SAMEPERIODLASTYEAR(DimCalendario[Date]) ) Gastos AA = CALCULATE( [Gastos Operativos], SAMEPERIODLASTYEAR(DimCalendario[Date]) ) Ventas YoY % = DIVIDE( [Ventas Netas] - [Ventas AA], [Ventas AA] ) Utilidad YoY % = DIVIDE( [Utilidad Neta] - [Utilidad Neta AA], [Utilidad Neta AA] ) Gastos YoY % = DIVIDE( [Gastos Operativos] - [Gastos AA], [Gastos AA] ) Ventas YTD = TOTALYTD( [Ventas Netas], DimCalendario[Date] ) Utilidad Neta YTD = TOTALYTD( [Utilidad Neta], DimCalendario[Date] ) ``` ### 3.4 Gastos (vwGastosDepto) ```DAX Gasto Total = SUM( vwGastosDepto[gasto] ) Gasto AA = CALCULATE( [Gasto Total], SAMEPERIODLASTYEAR(DimCalendario[Date]) ) Gasto YoY % = DIVIDE( [Gasto Total] - [Gasto AA], [Gasto AA] ) Gasto % de Ventas = DIVIDE( [Gasto Total], [Ventas Netas] ) ``` ### 3.5 Balance / liquidez (vwBalanceMensual) El saldo del balance es el **saldo acumulado al último mes del contexto**. Medidas: ```DAX Saldo (fin periodo) = VAR ultima = MAX( vwBalanceMensual[fecha_mes] ) RETURN CALCULATE( SUM(vwBalanceMensual[saldo_presentacion]), vwBalanceMensual[fecha_mes] = ultima ) Activos = CALCULATE( [Saldo (fin periodo)], vwBalanceMensual[grupo]="1" ) Pasivos = CALCULATE( [Saldo (fin periodo)], vwBalanceMensual[grupo]="2" ) Patrimonio = CALCULATE( [Saldo (fin periodo)], vwBalanceMensual[grupo]="3" ) Activo Corriente = CALCULATE( [Saldo (fin periodo)], vwBalanceMensual[subgrupo_cod]="11" ) Pasivo Corriente = CALCULATE( [Saldo (fin periodo)], vwBalanceMensual[subgrupo_cod] IN {"20","21"} ) Razón Corriente = DIVIDE( [Activo Corriente], [Pasivo Corriente] ) Capital de Trabajo= [Activo Corriente] - [Pasivo Corriente] Endeudamiento % = DIVIDE( [Pasivos], [Activos] ) ``` --- ## 4. Formato de medidas - Importes: moneda RD$, 0 decimales (o en millones con formato personalizado `#,##0.0,, " M"`). - Porcentajes: 1 decimal. - Activar **tabular-nums** implícito (Power BI ya alinea) y usar la fuente del tema corporativo. --- ## 5. Páginas y visuales (ver prototipo `Dashboard_Presidencia_Mockup.html`) ### Página 1 — **Radiografía** (resumen ejecutivo) - **Fila de KPIs (tarjetas):** Ventas Netas + `Ventas YoY %` · Utilidad Bruta + Margen Bruto % · Utilidad Operativa + Margen Operativo % · Utilidad Neta + `Utilidad YoY %` + Margen Neto %. - **Cascada (Waterfall):** eje = campo `linea` de `vwPLMensual` (orden por `orden_linea`), valor = `[Utilidad Neta]` con desglose por línea → arranca en Ventas y aterriza en Utilidad Neta. (El visual *Waterfall* nativo suma correctamente porque `resultado` ya trae el signo). - **Comportamiento del periodo actual (columnas + línea):** eje `DimCalendario[Mes]`; columnas = `[Ventas Netas]`; línea = `[Utilidad Neta]`; línea secundaria opcional = `[Margen Neto %]`. - **Trayectoria anual (barras agrupadas):** eje `DimCalendario[Año]`; valores `[Ventas Netas]` y `[Utilidad Neta]`. - Slicers: Año, Mes. ### Página 2 — **Análisis de Gastos** (cgprrp009) - KPIs: Gasto Total + `Gasto YoY %` · `Gasto % de Ventas` · gerencia de mayor peso · mayor alza YoY. - **Barras por gerencia:** eje `vwGastosDepto[gerencia]`; valores `[Gasto Total]` y `[Gasto AA]`. *Drill-down* a `depto_nombre` y luego `cuenta_desc`. - **Naturaleza del gasto:** tabla o *treemap* por `subgrupo_desc` con `[Gasto Total]` y `[Gasto % de Ventas]`. (Nota: subgrupo `76 Cierre gtos fabricación` es una absorción negativa a costo). - **Gasto mensual + % de ventas:** columnas `[Gasto Total]` por `Mes` con línea `[Gasto % de Ventas]` (control de eficiencia). ### Página 3 — **Estructura Financiera** (balance / liquidez) - KPIs: Activos · Razón Corriente · Capital de Trabajo · Endeudamiento %. - **Activos = Pasivos + Patrimonio + resultado del ejercicio** (columnas apiladas): la diferencia contra Activos es la utilidad del año en curso aún no cerrada — es normal y se puede rotular como *"Resultado del ejercicio"*. - **Composición del activo / pasivo:** tabla por `subgrupo_desc` con `[Saldo (fin periodo)]`. - **Tendencia del patrimonio:** línea `[Patrimonio]` por `Año`. --- ## 6. Suscripción del Presidente Publicar en el workspace corporativo → **Suscribir** al Presidente (envío por correo con captura del reporte, p. ej. cada lunes). Requiere que el dataset tenga **actualización programada** (gateway sobre `192.168.40.8`). --- ## 7. Ideas de ampliación (opcional, reutilizando vistas existentes) Para una radiografía "de un vistazo" también semanal, se puede añadir una página **Panorama** que combine, con las vistas ya publicadas en `MarmotechBI` (sin crear nada nuevo): - Ventas vs. presupuesto del mes (`vwFactVentas` + `vwFactPresupuesto`). - Cuentas por cobrar y vencido (`vwFactCxC_Real`). - Backlog / órdenes pendientes de despacho (`vwOrdenesPendientesDespacho`). - Producción del periodo (`vwProduccion_pub`). > Se maneja como **modelo aparte** (área comercial) para no mezclar granos; ver `Documentacion_MarmotechBI.md`.