193 lines
10 KiB
Markdown
193 lines
10 KiB
Markdown
# 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`.
|