Files
MBS/Dashboards MARMOTECH/Guia_Dashboard_Presidencia_PowerBI.md
T

193 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`.