From c0f6b23e19345b6f5bac38bee358810f40485ac2 Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Thu, 27 Aug 2026 16:04:05 -0400 Subject: [PATCH] JSOTO adicione la CLASSPATH java al grupo COMUNES --- .../Dashboard_Presidencia_Mockup.html | 561 ++++++++++++++++++ .../Guia_Dashboard_Presidencia_PowerBI.md | 192 ++++++ .../Radiografia_Marmotech_PBIP.zip | Bin 0 -> 25043 bytes .../Radiografia_Marmotech_PBIP/LEEME.txt | 32 + .../Radiografia_Marmotech.Report/.platform | 5 + .../definition.pbir | 4 + .../page.json | 8 + .../visual.json | 13 + .../visual.json | 13 + .../visual.json | 13 + .../visual.json | 14 + .../visual.json | 14 + .../visual.json | 13 + .../page.json | 8 + .../visual.json | 13 + .../visual.json | 13 + .../visual.json | 14 + .../visual.json | 13 + .../visual.json | 13 + .../visual.json | 15 + .../visual.json | 15 + .../visual.json | 13 + .../page.json | 8 + .../visual.json | 13 + .../visual.json | 14 + .../visual.json | 14 + .../visual.json | 15 + .../visual.json | 13 + .../definition/pages/pages.json | 5 + .../definition/report.json | 5 + .../definition/version.json | 3 + .../.platform | 5 + .../definition.pbism | 4 + .../definition/database.tmdl | 2 + .../definition/model.tmdl | 7 + .../definition/relationships.tmdl | 12 + .../definition/tables/DimCalendario.tmdl | 42 ++ .../definition/tables/vwBalanceMensual.tmdl | 81 +++ .../definition/tables/vwGastosDepto.tmdl | 91 +++ .../definition/tables/vwPLMensual.tmdl | 163 +++++ .../Radiografia_Marmotech.pbip | 7 + .../SQL_Vistas_Presidencia.sql | 226 +++++++ .../build_pbip_presidencia.ps1 | 342 +++++++++++ PROYECTO/mbsERP.4pw | 2 +- 44 files changed, 2072 insertions(+), 1 deletion(-) create mode 100644 Dashboards MARMOTECH/Dashboard_Presidencia_Mockup.html create mode 100644 Dashboards MARMOTECH/Guia_Dashboard_Presidencia_PowerBI.md create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP.zip create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/LEEME.txt create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/.platform create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition.pbir create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/page.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/44ff5e53-b511-41e3-bdd8-48225cf9736d/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/a03966b2-7a2b-4724-9b6f-9d2a82dfbf1a/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/aebdc78d-a3c5-45bd-a5a1-33956b52c2af/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/b45f71ca-ef58-4807-9ec8-b326c6cef118/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/b536c95a-a634-4891-9041-14d33dba3e31/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/dfc8665b-ed52-4a78-ad7a-ceec1bd415d6/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/page.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/0001fb8c-bfd0-48b4-8c87-ca2e91ded77e/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/1c8b8064-507f-4d74-aafe-996d0e78abcc/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/41b6bf4e-59e7-43d8-bed5-00903f07cf14/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/7bc4f47e-ea03-4a86-85bc-7b0589403ff3/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/86346a78-aca0-4130-8fcc-df275187d223/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/bf867728-d557-4369-a08f-96be202ea340/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/c16df67e-416b-4acb-8169-fbd21a916682/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/ea44fc7d-26fd-4269-a605-7a460f6078bd/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/page.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/2970078c-5cf9-40ff-ad03-436e7f9d90c1/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/55c25809-9340-4b4f-ab44-ea947df2aa20/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/c5d3dccf-c735-4552-97e3-3409f290ae2c/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/d56cf84c-d5d9-4d14-a4a5-c20b98f0aab6/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/f2193414-6ebe-4c68-bb63-1badcb5ffd09/visual.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/pages.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/report.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/version.json create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/.platform create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition.pbism create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/database.tmdl create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/model.tmdl create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/relationships.tmdl create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/DimCalendario.tmdl create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwBalanceMensual.tmdl create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwGastosDepto.tmdl create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwPLMensual.tmdl create mode 100644 Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.pbip create mode 100644 Dashboards MARMOTECH/SQL_Vistas_Presidencia.sql create mode 100644 Dashboards MARMOTECH/build_pbip_presidencia.ps1 diff --git a/Dashboards MARMOTECH/Dashboard_Presidencia_Mockup.html b/Dashboards MARMOTECH/Dashboard_Presidencia_Mockup.html new file mode 100644 index 0000000..a33c45c --- /dev/null +++ b/Dashboards MARMOTECH/Dashboard_Presidencia_Mockup.html @@ -0,0 +1,561 @@ +Radiografía Marmotech + + + + + + +
+
+
+ +
+

Radiografía de la Empresa

+
Marmotech, S.A. · Cuadro de Mando de Presidencia
+
+
+
+
Periodo
+
Enero – Julio 2026
+
acumulado del año · comparado vs. 2025
+
+
+
+ + + + +
+
+
+

Ventas Netas

+
RD$ 1,375.3 M
+
▼ 1.3% vs. 1,393.1 M (2025)
+
+
+

Utilidad Bruta

+
RD$ 706.9 M
+
▼ 1.4 pp margen 51.4% (52.8%)
+
+
+

Utilidad Operativa

+
RD$ 292.1 M
+
21.2% margen operativo
+
+
+

Utilidad Neta

+
RD$ 219.6 M
+
▼ 21.4% margen 16.0% (20.1%)
+
+
+ +
+
+

Estado de Resultados — Cascada

+

De ventas a utilidad neta · acumulado 2026 (RD$ millones)

+ +
+
+

Composición de cada RD$ vendido

+

Estructura del peso de ventas · 2026

+ +
+
+ +
+
+

Comportamiento del periodo actual

+

Ventas netas (barras) y utilidad neta (línea) por mes · 2026

+ +
+ Ventas netas + Utilidad neta + Margen neto % +
+
+
+

Trayectoria anual

+

Ventas y utilidad neta por año (RD$ M) · 2026 parcial

+ +
+
+
+ + +
+
+
+

Gastos Operativos

+
RD$ 414.7 M
+
▲ 7.1% vs. 387.2 M (2025)
+
+
+

Gasto / Ventas

+
30.2 %
+
▲ 2.4 pp vs. 27.8% (2025)
+
+
+

Gerencia mayor peso

+
Ventas y Mercadeo
+
RD$ 184.5 M · 44% del gasto
+
+
+

Mayor alza YoY

+
Admin. y Materiales
+
▲ 13.3% +12.3 M
+
+
+ +
+
+

Gasto por gerencia

+

2026 vs. 2025 · acumulado ene–jul (RD$ M)

+ +
+ 2026 + 2025 +
+
+
+

Naturaleza del gasto

+

Por subgrupo contable · 2026 (RD$ M)

+ + + +
SubgrupoMonto% ventas
+

El subgrupo 76 Cierre de gastos de fabricación (−325.7 M) es una absorción a costo; reduce el gasto neto operativo.

+
+
+ +
+
+

Gasto mensual — control de eficiencia

+

Gasto operativo por mes y su relación con las ventas · 2026

+ +
+
+
+ + +
+
+
+

Activos Totales

+
RD$ 6,435 M
+
al 31-jul-2026
+
+
+

Razón Corriente

+
2.29 ×
+
sólida activo cte. 3,250 / pasivo cte. 1,420
+
+
+

Capital de Trabajo

+
RD$ 1,830 M
+
holgura de liquidez operativa
+
+
+

Endeudamiento

+
36 %
+
conservador pasivo / activo
+
+
+ +
+
+

De dónde viene y dónde está el capital

+

Activos = Pasivos + Patrimonio + resultado del ejercicio (RD$ M)

+ +
+
+

Composición del activo

+

al 31-jul-2026 (RD$ M)

+ + + +
RubroSaldo
+

Composición del pasivo

+ + + +
RubroSaldo
+
+
+
+ +
+ Prototipo de diseño +   Vista previa del tablero de Power BI. Fuente: MarmotechBI.presidencia.vwPLMensual, vwGastosDepto, vwBalanceMensual — + reproduce el Mayor General Analítico (cgprrp008) y el Análisis de Gastos (cgprrp009). Cifras validadas contra el sistema al 31-jul-2026. +
+
+ + diff --git a/Dashboards MARMOTECH/Guia_Dashboard_Presidencia_PowerBI.md b/Dashboards MARMOTECH/Guia_Dashboard_Presidencia_PowerBI.md new file mode 100644 index 0000000..47eff59 --- /dev/null +++ b/Dashboards MARMOTECH/Guia_Dashboard_Presidencia_PowerBI.md @@ -0,0 +1,192 @@ +# 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`. diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP.zip b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP.zip new file mode 100644 index 0000000000000000000000000000000000000000..6be4a9fde60eba123928d7eed486f94d3c954797 GIT binary patch literal 25043 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 QgZv}IgMvzV_T#7j1GCG;cK`qY literal 0 HcmV?d00001 diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/LEEME.txt b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/LEEME.txt new file mode 100644 index 0000000..6ddd2f2 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/LEEME.txt @@ -0,0 +1,32 @@ +PROYECTO POWER BI — RADIOGRAFÍA MARMOTECH (Dashboard de Presidencia) +==================================================================== + +QUÉ ES ESTO +----------- +Un Proyecto de Power BI (.pbip) en formato de texto: + - Radiografia_Marmotech.SemanticModel -> modelo de datos + TODAS las medidas DAX + - Radiografia_Marmotech.Report -> 3 páginas (Radiografía / Gastos / Estructura) + +Se conecta en vivo a las vistas del esquema "presidencia" en 192.168.40.8 / MarmotechBI. + +CÓMO ABRIRLO Y CONVERTIRLO A .PBIX +---------------------------------- +1. Abrir Power BI Desktop (v2.157 o superior). +2. Archivo -> Abrir -> seleccionar Radiografia_Marmotech.pbip + (o doble clic al .pbip). +3. Si pide credenciales de la base: usar autenticación de Windows (tu usuario jsoto). +4. Actualizar / cargar datos. +5. Archivo -> Guardar como -> elegir tipo ".pbix" -> listo, ya tienes el .pbix. + +REQUISITO (una sola vez, si no abre el reporte) +----------------------------------------------- +Archivo -> Opciones -> Características de vista previa -> + activar "Almacenar informes con el formato de informe mejorado (PBIR)". +Reiniciar Power BI Desktop y volver a abrir el .pbip. + +NOTA +---- +El MODELO (tablas, relaciones y medidas DAX) está completo y es la parte reutilizable. +Si algún visual del reporte necesitara reacomodo, guíate por el prototipo +"Dashboard_Presidencia_Mockup.html" y la "Guia_Dashboard_Presidencia_PowerBI.md": +tienen la disposición exacta y las medidas ya existen en el modelo. diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/.platform b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/.platform new file mode 100644 index 0000000..6a0c39d --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/.platform @@ -0,0 +1,5 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/gitIntegration/platformProperties/2.0.0/schema.json", + "metadata": { "type": "Report", "displayName": "Radiografia_Marmotech" }, + "config": { "version": "2.0", "logicalId": "554add93-b301-4779-a780-de4189e02962" } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition.pbir b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition.pbir new file mode 100644 index 0000000..74ed66b --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition.pbir @@ -0,0 +1,4 @@ +{ + "version": "4.0", + "datasetReference": { "byPath": { "path": "../Radiografia_Marmotech.SemanticModel" } } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/page.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/page.json new file mode 100644 index 0000000..81d6277 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/page.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/page/1.0.0/schema.json", + "name": "8b8f836c-adf6-4122-94af-ca83a95f1186", + "displayName": "Estructura Financiera", + "displayOption": "FitToPage", + "height": 720, + "width": 1280 +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/44ff5e53-b511-41e3-bdd8-48225cf9736d/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/44ff5e53-b511-41e3-bdd8-48225cf9736d/visual.json new file mode 100644 index 0000000..8f51638 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/44ff5e53-b511-41e3-bdd8-48225cf9736d/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "44ff5e53-b511-41e3-bdd8-48225cf9736d", + "position": { "x": 648, "y": 16, "z": 0, "width": 300, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Capital de Trabajo" } }, "queryRef": "vwPLMensual.Capital de Trabajo", "nativeQueryRef": "Capital de Trabajo" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Capital de Trabajo'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/a03966b2-7a2b-4724-9b6f-9d2a82dfbf1a/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/a03966b2-7a2b-4724-9b6f-9d2a82dfbf1a/visual.json new file mode 100644 index 0000000..a772236 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/a03966b2-7a2b-4724-9b6f-9d2a82dfbf1a/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "a03966b2-7a2b-4724-9b6f-9d2a82dfbf1a", + "position": { "x": 16, "y": 16, "z": 0, "width": 300, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Activos" } }, "queryRef": "vwPLMensual.Activos", "nativeQueryRef": "Activos" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Activos Totales'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/aebdc78d-a3c5-45bd-a5a1-33956b52c2af/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/aebdc78d-a3c5-45bd-a5a1-33956b52c2af/visual.json new file mode 100644 index 0000000..07ea9b8 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/aebdc78d-a3c5-45bd-a5a1-33956b52c2af/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "aebdc78d-a3c5-45bd-a5a1-33956b52c2af", + "position": { "x": 964, "y": 16, "z": 0, "width": 300, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Endeudamiento %" } }, "queryRef": "vwPLMensual.Endeudamiento %", "nativeQueryRef": "Endeudamiento %" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Endeudamiento'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/b45f71ca-ef58-4807-9ec8-b326c6cef118/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/b45f71ca-ef58-4807-9ec8-b326c6cef118/visual.json new file mode 100644 index 0000000..e1a1a81 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/b45f71ca-ef58-4807-9ec8-b326c6cef118/visual.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "b45f71ca-ef58-4807-9ec8-b326c6cef118", + "position": { "x": 16, "y": 170, "z": 0, "width": 620, "height": 300, "tabOrder": 0 }, + "visual": { + "visualType": "clusteredColumnChart", + "query": { "queryState": { "Category": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "vwBalanceMensual" } }, "Property": "grupo_desc" } }, "queryRef": "vwBalanceMensual.grupo_desc", "nativeQueryRef": "grupo_desc" } ] }, +"Y": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Saldo (fin periodo)" } }, "queryRef": "vwPLMensual.Saldo (fin periodo)", "nativeQueryRef": "Saldo (fin periodo)" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Activos / Pasivos / Patrimonio'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/b536c95a-a634-4891-9041-14d33dba3e31/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/b536c95a-a634-4891-9041-14d33dba3e31/visual.json new file mode 100644 index 0000000..4262337 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/b536c95a-a634-4891-9041-14d33dba3e31/visual.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "b536c95a-a634-4891-9041-14d33dba3e31", + "position": { "x": 652, "y": 170, "z": 0, "width": 612, "height": 300, "tabOrder": 0 }, + "visual": { + "visualType": "tableEx", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "vwBalanceMensual" } }, "Property": "subgrupo_desc" } }, "queryRef": "vwBalanceMensual.subgrupo_desc", "nativeQueryRef": "subgrupo_desc" }, +{ "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Saldo (fin periodo)" } }, "queryRef": "vwPLMensual.Saldo (fin periodo)", "nativeQueryRef": "Saldo (fin periodo)" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Composicion'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/dfc8665b-ed52-4a78-ad7a-ceec1bd415d6/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/dfc8665b-ed52-4a78-ad7a-ceec1bd415d6/visual.json new file mode 100644 index 0000000..ebefcde --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/8b8f836c-adf6-4122-94af-ca83a95f1186/visuals/dfc8665b-ed52-4a78-ad7a-ceec1bd415d6/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "dfc8665b-ed52-4a78-ad7a-ceec1bd415d6", + "position": { "x": 332, "y": 16, "z": 0, "width": 300, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Razon Corriente" } }, "queryRef": "vwPLMensual.Razon Corriente", "nativeQueryRef": "Razon Corriente" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Razon Corriente'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/page.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/page.json new file mode 100644 index 0000000..fe29715 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/page.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/page/1.0.0/schema.json", + "name": "b1d7c3f7-19f4-4e53-9f46-39c24299735d", + "displayName": "Radiografia", + "displayOption": "FitToPage", + "height": 720, + "width": 1280 +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/0001fb8c-bfd0-48b4-8c87-ca2e91ded77e/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/0001fb8c-bfd0-48b4-8c87-ca2e91ded77e/visual.json new file mode 100644 index 0000000..2d2933b --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/0001fb8c-bfd0-48b4-8c87-ca2e91ded77e/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "0001fb8c-bfd0-48b4-8c87-ca2e91ded77e", + "position": { "x": 16, "y": 16, "z": 0, "width": 280, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Ventas Netas" } }, "queryRef": "vwPLMensual.Ventas Netas", "nativeQueryRef": "Ventas Netas" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Ventas Netas'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/1c8b8064-507f-4d74-aafe-996d0e78abcc/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/1c8b8064-507f-4d74-aafe-996d0e78abcc/visual.json new file mode 100644 index 0000000..ea1c14e --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/1c8b8064-507f-4d74-aafe-996d0e78abcc/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "1c8b8064-507f-4d74-aafe-996d0e78abcc", + "position": { "x": 652, "y": 484, "z": 0, "width": 300, "height": 120, "tabOrder": 0 }, + "visual": { + "visualType": "slicer", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "DimCalendario" } }, "Property": "Anio" } }, "queryRef": "DimCalendario.Anio", "nativeQueryRef": "Anio" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Ano'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/41b6bf4e-59e7-43d8-bed5-00903f07cf14/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/41b6bf4e-59e7-43d8-bed5-00903f07cf14/visual.json new file mode 100644 index 0000000..a023b71 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/41b6bf4e-59e7-43d8-bed5-00903f07cf14/visual.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "41b6bf4e-59e7-43d8-bed5-00903f07cf14", + "position": { "x": 16, "y": 170, "z": 0, "width": 620, "height": 300, "tabOrder": 0 }, + "visual": { + "visualType": "waterfallChart", + "query": { "queryState": { "Category": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "linea" } }, "queryRef": "vwPLMensual.linea", "nativeQueryRef": "linea" } ] }, +"Y": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Utilidad Neta" } }, "queryRef": "vwPLMensual.Utilidad Neta", "nativeQueryRef": "Utilidad Neta" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Estado de Resultados (cascada)'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/7bc4f47e-ea03-4a86-85bc-7b0589403ff3/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/7bc4f47e-ea03-4a86-85bc-7b0589403ff3/visual.json new file mode 100644 index 0000000..104d67a --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/7bc4f47e-ea03-4a86-85bc-7b0589403ff3/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "7bc4f47e-ea03-4a86-85bc-7b0589403ff3", + "position": { "x": 984, "y": 16, "z": 0, "width": 280, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Utilidad Neta" } }, "queryRef": "vwPLMensual.Utilidad Neta", "nativeQueryRef": "Utilidad Neta" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Utilidad Neta'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/86346a78-aca0-4130-8fcc-df275187d223/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/86346a78-aca0-4130-8fcc-df275187d223/visual.json new file mode 100644 index 0000000..44fe1b2 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/86346a78-aca0-4130-8fcc-df275187d223/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "86346a78-aca0-4130-8fcc-df275187d223", + "position": { "x": 688, "y": 16, "z": 0, "width": 280, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Utilidad Operativa" } }, "queryRef": "vwPLMensual.Utilidad Operativa", "nativeQueryRef": "Utilidad Operativa" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Utilidad Operativa'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/bf867728-d557-4369-a08f-96be202ea340/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/bf867728-d557-4369-a08f-96be202ea340/visual.json new file mode 100644 index 0000000..01b4c62 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/bf867728-d557-4369-a08f-96be202ea340/visual.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "bf867728-d557-4369-a08f-96be202ea340", + "position": { "x": 652, "y": 170, "z": 0, "width": 612, "height": 300, "tabOrder": 0 }, + "visual": { + "visualType": "lineClusteredColumnComboChart", + "query": { "queryState": { "Y": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Ventas Netas" } }, "queryRef": "vwPLMensual.Ventas Netas", "nativeQueryRef": "Ventas Netas" } ] }, +"Category": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "DimCalendario" } }, "Property": "Mes" } }, "queryRef": "DimCalendario.Mes", "nativeQueryRef": "Mes" } ] }, +"Y2": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Utilidad Neta" } }, "queryRef": "vwPLMensual.Utilidad Neta", "nativeQueryRef": "Utilidad Neta" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Comportamiento del periodo (Ventas vs Utilidad)'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/c16df67e-416b-4acb-8169-fbd21a916682/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/c16df67e-416b-4acb-8169-fbd21a916682/visual.json new file mode 100644 index 0000000..95620b2 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/c16df67e-416b-4acb-8169-fbd21a916682/visual.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "c16df67e-416b-4acb-8169-fbd21a916682", + "position": { "x": 16, "y": 484, "z": 0, "width": 620, "height": 220, "tabOrder": 0 }, + "visual": { + "visualType": "clusteredColumnChart", + "query": { "queryState": { "Category": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "DimCalendario" } }, "Property": "Anio" } }, "queryRef": "DimCalendario.Anio", "nativeQueryRef": "Anio" } ] }, +"Y": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Ventas Netas" } }, "queryRef": "vwPLMensual.Ventas Netas", "nativeQueryRef": "Ventas Netas" }, +{ "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Utilidad Neta" } }, "queryRef": "vwPLMensual.Utilidad Neta", "nativeQueryRef": "Utilidad Neta" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Trayectoria anual'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/ea44fc7d-26fd-4269-a605-7a460f6078bd/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/ea44fc7d-26fd-4269-a605-7a460f6078bd/visual.json new file mode 100644 index 0000000..125d9f1 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/b1d7c3f7-19f4-4e53-9f46-39c24299735d/visuals/ea44fc7d-26fd-4269-a605-7a460f6078bd/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "ea44fc7d-26fd-4269-a605-7a460f6078bd", + "position": { "x": 312, "y": 16, "z": 0, "width": 280, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Utilidad Bruta" } }, "queryRef": "vwPLMensual.Utilidad Bruta", "nativeQueryRef": "Utilidad Bruta" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Utilidad Bruta'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/page.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/page.json new file mode 100644 index 0000000..8c015a1 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/page.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/page/1.0.0/schema.json", + "name": "e77fc1b2-6848-4091-910e-ab9079a10ae3", + "displayName": "Analisis de Gastos", + "displayOption": "FitToPage", + "height": 720, + "width": 1280 +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/2970078c-5cf9-40ff-ad03-436e7f9d90c1/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/2970078c-5cf9-40ff-ad03-436e7f9d90c1/visual.json new file mode 100644 index 0000000..a0ff65b --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/2970078c-5cf9-40ff-ad03-436e7f9d90c1/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "2970078c-5cf9-40ff-ad03-436e7f9d90c1", + "position": { "x": 16, "y": 16, "z": 0, "width": 300, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Gasto Total" } }, "queryRef": "vwPLMensual.Gasto Total", "nativeQueryRef": "Gasto Total" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Gastos Operativos'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/55c25809-9340-4b4f-ab44-ea947df2aa20/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/55c25809-9340-4b4f-ab44-ea947df2aa20/visual.json new file mode 100644 index 0000000..8839f32 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/55c25809-9340-4b4f-ab44-ea947df2aa20/visual.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "55c25809-9340-4b4f-ab44-ea947df2aa20", + "position": { "x": 16, "y": 484, "z": 0, "width": 1248, "height": 220, "tabOrder": 0 }, + "visual": { + "visualType": "columnChart", + "query": { "queryState": { "Category": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "DimCalendario" } }, "Property": "Mes" } }, "queryRef": "DimCalendario.Mes", "nativeQueryRef": "Mes" } ] }, +"Y": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Gasto Total" } }, "queryRef": "vwPLMensual.Gasto Total", "nativeQueryRef": "Gasto Total" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Gasto mensual'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/c5d3dccf-c735-4552-97e3-3409f290ae2c/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/c5d3dccf-c735-4552-97e3-3409f290ae2c/visual.json new file mode 100644 index 0000000..3ddd0ba --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/c5d3dccf-c735-4552-97e3-3409f290ae2c/visual.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "c5d3dccf-c735-4552-97e3-3409f290ae2c", + "position": { "x": 16, "y": 170, "z": 0, "width": 620, "height": 300, "tabOrder": 0 }, + "visual": { + "visualType": "barChart", + "query": { "queryState": { "Category": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "vwGastosDepto" } }, "Property": "gerencia" } }, "queryRef": "vwGastosDepto.gerencia", "nativeQueryRef": "gerencia" } ] }, +"Y": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Gasto Total" } }, "queryRef": "vwPLMensual.Gasto Total", "nativeQueryRef": "Gasto Total" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Gasto por gerencia'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/d56cf84c-d5d9-4d14-a4a5-c20b98f0aab6/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/d56cf84c-d5d9-4d14-a4a5-c20b98f0aab6/visual.json new file mode 100644 index 0000000..dad96c6 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/d56cf84c-d5d9-4d14-a4a5-c20b98f0aab6/visual.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "d56cf84c-d5d9-4d14-a4a5-c20b98f0aab6", + "position": { "x": 652, "y": 170, "z": 0, "width": 612, "height": 300, "tabOrder": 0 }, + "visual": { + "visualType": "tableEx", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "vwGastosDepto" } }, "Property": "subgrupo_desc" } }, "queryRef": "vwGastosDepto.subgrupo_desc", "nativeQueryRef": "subgrupo_desc" }, +{ "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Gasto Total" } }, "queryRef": "vwPLMensual.Gasto Total", "nativeQueryRef": "Gasto Total" }, +{ "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Gasto % de Ventas" } }, "queryRef": "vwPLMensual.Gasto % de Ventas", "nativeQueryRef": "Gasto % de Ventas" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Naturaleza del gasto'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/f2193414-6ebe-4c68-bb63-1badcb5ffd09/visual.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/f2193414-6ebe-4c68-bb63-1badcb5ffd09/visual.json new file mode 100644 index 0000000..fbb34e5 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/e77fc1b2-6848-4091-910e-ab9079a10ae3/visuals/f2193414-6ebe-4c68-bb63-1badcb5ffd09/visual.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "f2193414-6ebe-4c68-bb63-1badcb5ffd09", + "position": { "x": 332, "y": 16, "z": 0, "width": 300, "height": 140, "tabOrder": 0 }, + "visual": { + "visualType": "card", + "query": { "queryState": { "Values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "vwPLMensual" } }, "Property": "Gasto % de Ventas" } }, "queryRef": "vwPLMensual.Gasto % de Ventas", "nativeQueryRef": "Gasto % de Ventas" } ] } } }, + "drillFilterOtherVisuals": true, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'Gasto / Ventas'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } + } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/pages.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/pages.json new file mode 100644 index 0000000..548e2a7 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/pages/pages.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/pagesMetadata/1.0.0/schema.json", + "pageOrder": [ "b1d7c3f7-19f4-4e53-9f46-39c24299735d", "e77fc1b2-6848-4091-910e-ab9079a10ae3", "8b8f836c-adf6-4122-94af-ca83a95f1186" ], + "activePageName": "b1d7c3f7-19f4-4e53-9f46-39c24299735d" +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/report.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/report.json new file mode 100644 index 0000000..78e514c --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/report.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/report/1.0.0/schema.json", + "themeCollection": { "baseTheme": { "name": "CY24SU10" } }, + "layoutOptimization": "None" +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/version.json b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/version.json new file mode 100644 index 0000000..4928ba5 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.Report/definition/version.json @@ -0,0 +1,3 @@ +{ + "version": "2.0.0" +} diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/.platform b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/.platform new file mode 100644 index 0000000..aedf553 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/.platform @@ -0,0 +1,5 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/fabric/gitIntegration/platformProperties/2.0.0/schema.json", + "metadata": { "type": "SemanticModel", "displayName": "Radiografia_Marmotech" }, + "config": { "version": "2.0", "logicalId": "9189c214-f719-4b14-9985-284d1156b518" } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition.pbism b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition.pbism new file mode 100644 index 0000000..54ad616 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition.pbism @@ -0,0 +1,4 @@ +{ + "version": "4.0", + "settings": {} +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/database.tmdl b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/database.tmdl new file mode 100644 index 0000000..3f68777 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/database.tmdl @@ -0,0 +1,2 @@ +database + compatibilityLevel: 1550 diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/model.tmdl b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/model.tmdl new file mode 100644 index 0000000..d547d8a --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/model.tmdl @@ -0,0 +1,7 @@ +model Model + culture: es-ES + defaultPowerBIDataSourceVersion: powerBI_V3 + sourceQueryCulture: es-ES + +annotation PBI_QueryOrder = ["vwPLMensual","vwGastosDepto","vwBalanceMensual","DimCalendario"] + diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/relationships.tmdl b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/relationships.tmdl new file mode 100644 index 0000000..a2ee8a4 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/relationships.tmdl @@ -0,0 +1,12 @@ +relationship a1bca91e-c68e-40d9-903e-6c0b3084d97e + fromColumn: vwPLMensual.fecha_mes + toColumn: DimCalendario.Date + +relationship b8a2999c-fc54-47de-8f0b-85af0263c75b + fromColumn: vwGastosDepto.fecha_mes + toColumn: DimCalendario.Date + +relationship ea96c86f-8345-4913-b1e6-6823b9a100f4 + fromColumn: vwBalanceMensual.fecha_mes + toColumn: DimCalendario.Date + diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/DimCalendario.tmdl b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/DimCalendario.tmdl new file mode 100644 index 0000000..58d1816 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/DimCalendario.tmdl @@ -0,0 +1,42 @@ +table DimCalendario + column Date + dataType: dateTime + sourceColumn: [Date] + formatString: General Date + summarizeBy: none + + column Anio + dataType: int64 + sourceColumn: [Anio] + summarizeBy: none + + column MesNo + dataType: int64 + sourceColumn: [MesNo] + summarizeBy: none + + column Mes + dataType: string + sourceColumn: [Mes] + summarizeBy: none + + column AnioMes + dataType: string + sourceColumn: [AnioMes] + summarizeBy: none + + column PrimerDiaMes + dataType: dateTime + sourceColumn: [PrimerDiaMes] + formatString: General Date + summarizeBy: none + + column Trimestre + dataType: string + sourceColumn: [Trimestre] + summarizeBy: none + + partition DimCalendario = calculated + mode: import + source = ADDCOLUMNS ( CALENDAR ( DATE ( 2015, 1, 1 ), DATE ( 2028, 12, 31 ) ), "Anio", YEAR ( [Date] ), "MesNo", MONTH ( [Date] ), "Mes", FORMAT ( [Date], "MMM" ), "AnioMes", FORMAT ( [Date], "yyyy-MM" ), "PrimerDiaMes", DATE ( YEAR ( [Date] ), MONTH ( [Date] ), 1 ), "Trimestre", "T" & FORMAT ( [Date], "Q" ) ) + diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwBalanceMensual.tmdl b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwBalanceMensual.tmdl new file mode 100644 index 0000000..896dcb6 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwBalanceMensual.tmdl @@ -0,0 +1,81 @@ +table vwBalanceMensual + column 'ano' + dataType: int64 + sourceColumn: ano + summarizeBy: none + + column 'numero_mes' + dataType: int64 + sourceColumn: numero_mes + summarizeBy: none + + column 'mes' + dataType: string + sourceColumn: mes + summarizeBy: none + + column 'AnoMes' + dataType: string + sourceColumn: AnoMes + summarizeBy: none + + column 'fecha_mes' + dataType: dateTime + sourceColumn: fecha_mes + formatString: General Date + summarizeBy: none + + column 'grupo' + dataType: string + sourceColumn: grupo + summarizeBy: none + + column 'grupo_desc' + dataType: string + sourceColumn: grupo_desc + summarizeBy: none + + column 'subgrupo_cod' + dataType: string + sourceColumn: subgrupo_cod + summarizeBy: none + + column 'subgrupo_desc' + dataType: string + sourceColumn: subgrupo_desc + summarizeBy: none + + column 'cuenta' + dataType: string + sourceColumn: cuenta + summarizeBy: none + + column 'cuenta_desc' + dataType: string + sourceColumn: cuenta_desc + summarizeBy: none + + column 'movimiento_mes' + dataType: decimal + sourceColumn: movimiento_mes + summarizeBy: none + + column 'saldo_natural' + dataType: decimal + sourceColumn: saldo_natural + summarizeBy: none + + column 'saldo_presentacion' + dataType: decimal + sourceColumn: saldo_presentacion + summarizeBy: none + + partition vwBalanceMensual = m + mode: import + source = + let + Origen = Sql.Database("192.168.40.8", "MarmotechBI"), + Datos = Origen{[Schema="presidencia", Item="vwBalanceMensual"]}[Data] + in + Datos + diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwGastosDepto.tmdl b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwGastosDepto.tmdl new file mode 100644 index 0000000..4fe0ed5 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwGastosDepto.tmdl @@ -0,0 +1,91 @@ +table vwGastosDepto + column 'ano' + dataType: int64 + sourceColumn: ano + summarizeBy: none + + column 'numero_mes' + dataType: int64 + sourceColumn: numero_mes + summarizeBy: none + + column 'mes' + dataType: string + sourceColumn: mes + summarizeBy: none + + column 'AnoMes' + dataType: string + sourceColumn: AnoMes + summarizeBy: none + + column 'fecha_mes' + dataType: dateTime + sourceColumn: fecha_mes + formatString: General Date + summarizeBy: none + + column 'gerencia_cod' + dataType: string + sourceColumn: gerencia_cod + summarizeBy: none + + column 'gerencia' + dataType: string + sourceColumn: gerencia + summarizeBy: none + + column 'departamento' + dataType: int64 + sourceColumn: departamento + summarizeBy: none + + column 'depto_nombre' + dataType: string + sourceColumn: depto_nombre + summarizeBy: none + + column 'subgrupo_cod' + dataType: string + sourceColumn: subgrupo_cod + summarizeBy: none + + column 'subgrupo_desc' + dataType: string + sourceColumn: subgrupo_desc + summarizeBy: none + + column 'cuenta' + dataType: string + sourceColumn: cuenta + summarizeBy: none + + column 'cuenta_desc' + dataType: string + sourceColumn: cuenta_desc + summarizeBy: none + + column 'debito' + dataType: decimal + sourceColumn: debito + summarizeBy: none + + column 'credito' + dataType: decimal + sourceColumn: credito + summarizeBy: none + + column 'gasto' + dataType: decimal + sourceColumn: gasto + summarizeBy: none + + partition vwGastosDepto = m + mode: import + source = + let + Origen = Sql.Database("192.168.40.8", "MarmotechBI"), + Datos = Origen{[Schema="presidencia", Item="vwGastosDepto"]}[Data] + in + Datos + diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwPLMensual.tmdl b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwPLMensual.tmdl new file mode 100644 index 0000000..dc8262d --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.SemanticModel/definition/tables/vwPLMensual.tmdl @@ -0,0 +1,163 @@ +table vwPLMensual + column 'ano' + dataType: int64 + sourceColumn: ano + summarizeBy: none + + column 'numero_mes' + dataType: int64 + sourceColumn: numero_mes + summarizeBy: none + + column 'mes' + dataType: string + sourceColumn: mes + summarizeBy: none + + column 'AnoMes' + dataType: string + sourceColumn: AnoMes + summarizeBy: none + + column 'fecha_mes' + dataType: dateTime + sourceColumn: fecha_mes + formatString: General Date + summarizeBy: none + + column 'grupo' + dataType: string + sourceColumn: grupo + summarizeBy: none + + column 'orden_linea' + dataType: int64 + sourceColumn: orden_linea + summarizeBy: none + + column 'linea' + dataType: string + sourceColumn: linea + summarizeBy: none + + column 'subgrupo_cod' + dataType: string + sourceColumn: subgrupo_cod + summarizeBy: none + + column 'subgrupo_desc' + dataType: string + sourceColumn: subgrupo_desc + summarizeBy: none + + column 'cuenta' + dataType: string + sourceColumn: cuenta + summarizeBy: none + + column 'cuenta_desc' + dataType: string + sourceColumn: cuenta_desc + summarizeBy: none + + column 'nivel' + dataType: int64 + sourceColumn: nivel + summarizeBy: none + + column 'debito' + dataType: decimal + sourceColumn: debito + summarizeBy: none + + column 'credito' + dataType: decimal + sourceColumn: credito + summarizeBy: none + + column 'resultado' + dataType: decimal + sourceColumn: resultado + summarizeBy: none + + column 'costo_gasto' + dataType: decimal + sourceColumn: costo_gasto + summarizeBy: none + + + measure 'Ventas Netas' = CALCULATE ( SUM ( vwPLMensual[resultado] ), vwPLMensual[grupo] = "4" ) + formatString: \$ #,0,," M";\$ -#,0,," M";\$ 0 + measure 'Costo de Ventas' = CALCULATE ( SUM ( vwPLMensual[costo_gasto] ), vwPLMensual[grupo] = "5" ) + formatString: \$ #,0,," M" + measure 'Gastos Operativos' = CALCULATE ( SUM ( vwPLMensual[costo_gasto] ), vwPLMensual[grupo] = "7" ) + formatString: \$ #,0,," M" + measure 'Otros Ing. y Gastos' = CALCULATE ( SUM ( vwPLMensual[costo_gasto] ), vwPLMensual[linea] = "Otros Ingresos y Gastos" ) + formatString: \$ #,0,," M" + measure 'ISR' = CALCULATE ( SUM ( vwPLMensual[costo_gasto] ), vwPLMensual[linea] = "Impuesto sobre la Renta" ) + formatString: \$ #,0,," M" + measure 'Utilidad Bruta' = [Ventas Netas] - [Costo de Ventas] + formatString: \$ #,0,," M" + measure 'Utilidad Operativa' = [Utilidad Bruta] - [Gastos Operativos] + formatString: \$ #,0,," M" + measure 'Utilidad antes ISR' = [Utilidad Operativa] - [Otros Ing. y Gastos] + formatString: \$ #,0,," M" + measure 'Utilidad Neta' = SUM ( vwPLMensual[resultado] ) + formatString: \$ #,0,," M" + measure 'Margen Bruto %' = DIVIDE ( [Utilidad Bruta], [Ventas Netas] ) + formatString: 0.0% + measure 'Margen Operativo %' = DIVIDE ( [Utilidad Operativa], [Ventas Netas] ) + formatString: 0.0% + measure 'Margen Neto %' = DIVIDE ( [Utilidad Neta], [Ventas Netas] ) + formatString: 0.0% + measure 'Costo % Ventas' = DIVIDE ( [Costo de Ventas], [Ventas Netas] ) + formatString: 0.0% + measure 'Gastos % Ventas' = DIVIDE ( [Gastos Operativos], [Ventas Netas] ) + formatString: 0.0% + measure 'Ventas AA' = CALCULATE ( [Ventas Netas], SAMEPERIODLASTYEAR ( DimCalendario[Date] ) ) + formatString: \$ #,0,," M" + measure 'Utilidad Neta AA' = CALCULATE ( [Utilidad Neta], SAMEPERIODLASTYEAR ( DimCalendario[Date] ) ) + formatString: \$ #,0,," M" + measure 'Ventas YoY %' = DIVIDE ( [Ventas Netas] - [Ventas AA], [Ventas AA] ) + formatString: 0.0% + measure 'Utilidad YoY %' = DIVIDE ( [Utilidad Neta] - [Utilidad Neta AA], [Utilidad Neta AA] ) + formatString: 0.0% + measure 'Ventas YTD' = TOTALYTD ( [Ventas Netas], DimCalendario[Date] ) + formatString: \$ #,0,," M" + measure 'Utilidad Neta YTD' = TOTALYTD ( [Utilidad Neta], DimCalendario[Date] ) + formatString: \$ #,0,," M" + measure 'Gasto Total' = SUM ( vwGastosDepto[gasto] ) + formatString: \$ #,0,," M" + measure 'Gasto AA' = CALCULATE ( [Gasto Total], SAMEPERIODLASTYEAR ( DimCalendario[Date] ) ) + formatString: \$ #,0,," M" + measure 'Gasto YoY %' = DIVIDE ( [Gasto Total] - [Gasto AA], [Gasto AA] ) + formatString: 0.0% + measure 'Gasto % de Ventas' = DIVIDE ( [Gasto Total], [Ventas Netas] ) + formatString: 0.0% + measure 'Saldo (fin periodo)' = VAR u = MAX ( vwBalanceMensual[fecha_mes] ) RETURN CALCULATE ( SUM ( vwBalanceMensual[saldo_presentacion] ), vwBalanceMensual[fecha_mes] = u ) + formatString: \$ #,0,," M" + measure 'Activos' = CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[grupo] = "1" ) + formatString: \$ #,0,," M" + measure 'Pasivos' = CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[grupo] = "2" ) + formatString: \$ #,0,," M" + measure 'Patrimonio' = CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[grupo] = "3" ) + formatString: \$ #,0,," M" + measure 'Activo Corriente' = CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[subgrupo_cod] = "11" ) + formatString: \$ #,0,," M" + measure 'Pasivo Corriente' = CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[subgrupo_cod] IN {"20","21"} ) + formatString: \$ #,0,," M" + measure 'Razon Corriente' = DIVIDE ( [Activo Corriente], [Pasivo Corriente] ) + formatString: 0.00 + measure 'Capital de Trabajo' = [Activo Corriente] - [Pasivo Corriente] + formatString: \$ #,0,," M" + measure 'Endeudamiento %' = DIVIDE ( [Pasivos], [Activos] ) + formatString: 0.0% + partition vwPLMensual = m + mode: import + source = + let + Origen = Sql.Database("192.168.40.8", "MarmotechBI"), + Datos = Origen{[Schema="presidencia", Item="vwPLMensual"]}[Data] + in + Datos + diff --git a/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.pbip b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.pbip new file mode 100644 index 0000000..b29e537 --- /dev/null +++ b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP/Radiografia_Marmotech.pbip @@ -0,0 +1,7 @@ +{ + "version": "1.0", + "artifacts": [ + { "report": { "path": "Radiografia_Marmotech.Report" } } + ], + "settings": { "enableAutoRecovery": true } +} \ No newline at end of file diff --git a/Dashboards MARMOTECH/SQL_Vistas_Presidencia.sql b/Dashboards MARMOTECH/SQL_Vistas_Presidencia.sql new file mode 100644 index 0000000..991d373 --- /dev/null +++ b/Dashboards MARMOTECH/SQL_Vistas_Presidencia.sql @@ -0,0 +1,226 @@ +/* ============================================================================ + MarmotechBI — Vistas para el Dashboard Ejecutivo de Presidencia + ---------------------------------------------------------------------------- + Autor : Juan F. Soto (jsoto) + Fecha : 2026-08-26 + Servidor : 192.168.40.8 (SQL Server 2016) + Base : MarmotechBI (capa semantica; los datos viven en marmotech.dbo.*) + Objetivo : Radiografia financiera para el Presidente, a partir del + Mayor General Analitico (cgprrp008) y el Analisis de Gastos + por Departamento (cgprrp009). + + Fuente de datos: + marmotech.dbo.cgtb00004 = transacciones contables (debito/credito por cuenta/fecha) + marmotech.dbo.cgtb00001 = catalogo de cuentas (nivel, descripcion) + marmotech.dbo.prdtable = periodos contables (ano, mes -> rango de fechas) + marmotech.dbo.mestable = nombres de meses + marmotech.dbo.adtb00001 = departamentos (nom_dpto) + + Reglas de negocio (validadas contra cgprrp008 / cgprrp009): + * Estado de Resultados por PRIMER DIGITO de la cuenta: + 4 = VENTAS NETA (naturaleza credito) + 5 = COSTO DE VENTAS (naturaleza debito) + 7 = GASTOS (naturaleza debito) + 8 = OTROS INGRESOS Y GASTOS (incluye 88 = IMPUESTO S/RENTA) + * resultado (aporte a la utilidad) = credito - debito + -> Ventas suma positivo; Costo/Gastos/ISR restan; la suma de todas + las lineas = Utilidad Neta del periodo. + * Solo transacciones activas: status_t IS NULL. + * Se EXCLUYE el asiento de cierre anual (ref 'ED.99-001/12YY' y + 'ED.99-002/12YY'); de lo contrario cada ano cerrado netearia a 0 porque + el cierre revierte las cuentas de resultado contra Utilidades Retenidas. + (2026 aun no tiene cierre, por eso muestra saldo operativo real.) + + Seguridad (requisito): estas vistas solo deben ser legibles por jsoto. + Se crean en el esquema [presidencia] y se hace DENY SELECT a [public]. + jsoto (MARMOTECH\jsoto y login SQL jsoto) es sysadmin/db_owner, por lo que + ignora el DENY y conserva acceso; el resto del equipo (db_datareader) queda + bloqueado a nivel de esquema. + ============================================================================ */ + +USE MarmotechBI; +GO + +/* ---- 1. Esquema dedicado ------------------------------------------------- */ +IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = 'presidencia') + EXEC('CREATE SCHEMA presidencia AUTHORIZATION dbo;'); +GO + +/* ---- 2. Estado de Resultados mensual (cgprrp008) ------------------------- */ +/* Grano: ano x mes x cuenta. Un renglon por cuenta contable de resultado. */ +IF OBJECT_ID('presidencia.vwPLMensual','V') IS NOT NULL + DROP VIEW presidencia.vwPLMensual; +GO +CREATE VIEW presidencia.vwPLMensual +AS +WITH mov AS ( + SELECT p.ano, + p.mes AS numero_mes, + b.cuenta_no, + SUM(b.debito) AS debito, + SUM(b.credito) AS credito + FROM marmotech.dbo.cgtb00004 b + INNER JOIN marmotech.dbo.prdtable p + ON b.fecha BETWEEN p.fecha_inicio AND p.fecha_corte + WHERE b.status_t IS NULL + AND LEFT(b.cuenta_no,1) IN ('4','5','7','8') + AND b.ref NOT LIKE 'ED.99-001/12%' -- asiento de cierre anual + AND b.ref NOT LIKE 'ED.99-002/12%' -- asiento de cierre anual (variante) + GROUP BY p.ano, p.mes, b.cuenta_no +) +SELECT + m.ano, + m.numero_mes, + ms.descrip AS mes, + RIGHT('0000'+CONVERT(varchar(4),m.ano),4) + '-' + + RIGHT('00'+CONVERT(varchar(2),m.numero_mes),2) AS AnoMes, + DATEFROMPARTS(m.ano, m.numero_mes, 1) AS fecha_mes, + LEFT(m.cuenta_no,1) AS grupo, + CASE LEFT(m.cuenta_no,1) + WHEN '4' THEN 1 WHEN '5' THEN 2 WHEN '7' THEN 3 + WHEN '8' THEN CASE WHEN m.cuenta_no LIKE '88%' THEN 5 ELSE 4 END + END AS orden_linea, + CASE LEFT(m.cuenta_no,1) + WHEN '4' THEN 'Ventas Netas' + WHEN '5' THEN 'Costo de Ventas' + WHEN '7' THEN 'Gastos Operativos' + WHEN '8' THEN CASE WHEN m.cuenta_no LIKE '88%' + THEN 'Impuesto sobre la Renta' + ELSE 'Otros Ingresos y Gastos' END + END AS linea, + LEFT(m.cuenta_no,2) AS subgrupo_cod, + sg.descripcion AS subgrupo_desc, + m.cuenta_no AS cuenta, + ct.descripcion AS cuenta_desc, + ct.nivel, + m.debito, + m.credito, + CAST(m.credito - m.debito AS decimal(19,2)) AS resultado, -- + = aporta utilidad + CAST(m.debito - m.credito AS decimal(19,2)) AS costo_gasto -- + = costo/gasto +FROM mov m +LEFT JOIN marmotech.dbo.cgtb00001 ct ON ct.cuenta_no = m.cuenta_no +LEFT JOIN marmotech.dbo.cgtb00001 sg ON sg.cuenta_no = LEFT(m.cuenta_no,2) +LEFT JOIN marmotech.dbo.mestable ms ON ms.mes = m.numero_mes; +GO + +/* ---- 3. Analisis de Gastos por Departamento (cgprrp009) ------------------ */ +/* Grano: ano x mes x departamento x cuenta. Solo grupo 7 (GASTOS). */ +IF OBJECT_ID('presidencia.vwGastosDepto','V') IS NOT NULL + DROP VIEW presidencia.vwGastosDepto; +GO +CREATE VIEW presidencia.vwGastosDepto +AS +WITH mov AS ( + SELECT p.ano, + p.mes AS numero_mes, + ISNULL(b.departamento,0) AS departamento, + b.cuenta_no, + SUM(b.debito) AS debito, + SUM(b.credito) AS credito + FROM marmotech.dbo.cgtb00004 b + INNER JOIN marmotech.dbo.prdtable p + ON b.fecha BETWEEN p.fecha_inicio AND p.fecha_corte + WHERE b.status_t IS NULL + AND LEFT(b.cuenta_no,1) = '7' + AND b.ref NOT LIKE 'ED.99-001/12%' + AND b.ref NOT LIKE 'ED.99-002/12%' + GROUP BY p.ano, p.mes, ISNULL(b.departamento,0), b.cuenta_no +) +SELECT + m.ano, + m.numero_mes, + ms.descrip AS mes, + RIGHT('0000'+CONVERT(varchar(4),m.ano),4) + '-' + + RIGHT('00'+CONVERT(varchar(2),m.numero_mes),2) AS AnoMes, + DATEFROMPARTS(m.ano, m.numero_mes, 1) AS fecha_mes, + LEFT(CONVERT(varchar(4),m.departamento),1) AS gerencia_cod, + CASE LEFT(CONVERT(varchar(4),m.departamento),1) + WHEN '1' THEN 'Gerencia General' + WHEN '2' THEN 'Administracion y Materiales' + WHEN '3' THEN 'Gestion Humana' + WHEN '4' THEN 'Ventas y Mercadeo' + WHEN '5' THEN 'Canteras' + WHEN '6' THEN 'Planta / Produccion' + WHEN '7' THEN 'Planta Agregados' + WHEN '8' THEN 'Marmotech en Caribbean' + ELSE 'Sin Departamento' + END AS gerencia, + m.departamento, + ISNULL(ad.nom_dpto,'SIN DEPARTAMENTO') AS depto_nombre, + LEFT(m.cuenta_no,2) AS subgrupo_cod, + sg.descripcion AS subgrupo_desc, + m.cuenta_no AS cuenta, + ct.descripcion AS cuenta_desc, + m.debito, + m.credito, + CAST(m.debito - m.credito AS decimal(19,2)) AS gasto -- + = gasto neto +FROM mov m +LEFT JOIN marmotech.dbo.cgtb00001 ct ON ct.cuenta_no = m.cuenta_no +LEFT JOIN marmotech.dbo.cgtb00001 sg ON sg.cuenta_no = LEFT(m.cuenta_no,2) +LEFT JOIN marmotech.dbo.adtb00001 ad ON ad.departamento = m.departamento +LEFT JOIN marmotech.dbo.mestable ms ON ms.mes = m.numero_mes; +GO + +/* ---- 4. Balance General / Estructura financiera (saldo acumulado) -------- */ +/* Grano: ano x mes x cuenta, grupos 1 (Activos) 2 (Pasivos) 3 (Capital). */ +/* saldo_acumulado = saldo contable al cierre del mes (deb-cred acumulado). */ +IF OBJECT_ID('presidencia.vwBalanceMensual','V') IS NOT NULL + DROP VIEW presidencia.vwBalanceMensual; +GO +CREATE VIEW presidencia.vwBalanceMensual +AS +WITH mov AS ( + SELECT p.ano, + p.mes AS numero_mes, + b.cuenta_no, + SUM(b.debito - b.credito) AS movimiento + FROM marmotech.dbo.cgtb00004 b + INNER JOIN marmotech.dbo.prdtable p + ON b.fecha BETWEEN p.fecha_inicio AND p.fecha_corte + WHERE b.status_t IS NULL + AND LEFT(b.cuenta_no,1) IN ('1','2','3') + GROUP BY p.ano, p.mes, b.cuenta_no +), +acum AS ( + SELECT m.*, + SUM(m.movimiento) OVER (PARTITION BY m.cuenta_no + ORDER BY m.ano, m.numero_mes + ROWS UNBOUNDED PRECEDING) AS saldo_acumulado + FROM mov m +) +SELECT + a.ano, + a.numero_mes, + ms.descrip AS mes, + RIGHT('0000'+CONVERT(varchar(4),a.ano),4) + '-' + + RIGHT('00'+CONVERT(varchar(2),a.numero_mes),2) AS AnoMes, + DATEFROMPARTS(a.ano, a.numero_mes, 1) AS fecha_mes, + LEFT(a.cuenta_no,1) AS grupo, + CASE LEFT(a.cuenta_no,1) WHEN '1' THEN 'Activos' + WHEN '2' THEN 'Pasivos' + WHEN '3' THEN 'Capital' END AS grupo_desc, + LEFT(a.cuenta_no,2) AS subgrupo_cod, + sg.descripcion AS subgrupo_desc, + a.cuenta_no AS cuenta, + ct.descripcion AS cuenta_desc, + CAST(a.movimiento AS decimal(19,2)) AS movimiento_mes, + CAST(a.saldo_acumulado AS decimal(19,2)) AS saldo_natural, -- deb-cred + /* Presentacion: Activos positivos por debito; Pasivos/Capital por credito */ + CAST(CASE WHEN LEFT(a.cuenta_no,1) = '1' THEN a.saldo_acumulado + ELSE -a.saldo_acumulado END AS decimal(19,2)) AS saldo_presentacion +FROM acum a +LEFT JOIN marmotech.dbo.cgtb00001 ct ON ct.cuenta_no = a.cuenta_no +LEFT JOIN marmotech.dbo.cgtb00001 sg ON sg.cuenta_no = LEFT(a.cuenta_no,2) +LEFT JOIN marmotech.dbo.mestable ms ON ms.mes = a.numero_mes; +GO + +/* ---- 5. Seguridad: solo jsoto ------------------------------------------- */ +DENY SELECT ON SCHEMA::presidencia TO [public]; +GO +/* Concesion explicita (documenta la intencion; jsoto ya es db_owner/sysadmin) */ +IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name = 'MARMOTECH\jsoto') + GRANT SELECT ON SCHEMA::presidencia TO [MARMOTECH\jsoto]; +GO +IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name = 'jsoto') + GRANT SELECT ON SCHEMA::presidencia TO [jsoto]; +GO diff --git a/Dashboards MARMOTECH/build_pbip_presidencia.ps1 b/Dashboards MARMOTECH/build_pbip_presidencia.ps1 new file mode 100644 index 0000000..7c222dc --- /dev/null +++ b/Dashboards MARMOTECH/build_pbip_presidencia.ps1 @@ -0,0 +1,342 @@ +<# Genera el proyecto Power BI (.pbip) "Radiografia_Marmotech" + Modelo (TMDL) con las 3 vistas de presidencia + DimCalendario + medidas DAX, + y un reporte (PBIR) con 3 paginas. Abrir el .pbip en Power BI Desktop y + Guardar como .pbix. + Autor: jsoto · 2026-08-26 +#> +param( + [string]$Root = "C:\Users\jsoto\Documents\NACE\proyectos\Fuentes\MARMOTECH\Dashboards MARMOTECH\Radiografia_Marmotech" +) +$ErrorActionPreference = "Stop" +$Name = "Radiografia_Marmotech" +$SM = Join-Path $Root "$Name.SemanticModel" +$RP = Join-Path $Root "$Name.Report" +if(Test-Path $Root){ Remove-Item $Root -Recurse -Force } +New-Item -ItemType Directory -Force -Path $Root,$SM,(Join-Path $SM "definition"),(Join-Path $SM "definition\tables"),$RP,(Join-Path $RP "definition"),(Join-Path $RP "definition\pages") | Out-Null + +function W($path,$content){ + $dir = Split-Path $path -Parent + if(!(Test-Path $dir)){ New-Item -ItemType Directory -Force -Path $dir | Out-Null } + # UTF-8 sin BOM + [System.IO.File]::WriteAllText($path, $content, (New-Object System.Text.UTF8Encoding($false))) +} +function G(){ [guid]::NewGuid().ToString() } +$TAB = [char]9 + +# ---------------- .pbip ---------------- +W (Join-Path $Root "$Name.pbip") @" +{ + "version": "1.0", + "artifacts": [ + { "report": { "path": "$Name.Report" } } + ], + "settings": { "enableAutoRecovery": true } +} +"@ + +# ---------------- SemanticModel/.platform ---------------- +W (Join-Path $SM ".platform") @" +{ + "`$schema": "https://developer.microsoft.com/json-schemas/fabric/gitIntegration/platformProperties/2.0.0/schema.json", + "metadata": { "type": "SemanticModel", "displayName": "$Name" }, + "config": { "version": "2.0", "logicalId": "$(G)" } +} +"@ + +# ---------------- SemanticModel/definition.pbism ---------------- +W (Join-Path $SM "definition.pbism") @" +{ + "version": "4.0", + "settings": {} +} +"@ + +# ---------------- database.tmdl ---------------- +W (Join-Path $SM "definition\database.tmdl") ("database`n${TAB}compatibilityLevel: 1550`n") + +# ---------------- model.tmdl ---------------- +$model = @() +$model += "model Model" +$model += "${TAB}culture: es-ES" +$model += "${TAB}defaultPowerBIDataSourceVersion: powerBI_V3" +$model += "${TAB}sourceQueryCulture: es-ES" +$model += "" +$model += "annotation PBI_QueryOrder = [`"vwPLMensual`",`"vwGastosDepto`",`"vwBalanceMensual`",`"DimCalendario`"]" +$model += "" +W (Join-Path $SM "definition\model.tmdl") (($model -join "`n") + "`n") + +# ---------------- helper: tabla desde vista SQL ---------------- +function Table-Sql($tname,$cols){ + # cols: array de "nombre|tipo" + $l = @() + $l += "table $tname" + foreach($c in $cols){ + $p = $c.Split("|"); $cn=$p[0]; $ct=$p[1] + $l += "${TAB}column '$cn'" + $l += "${TAB}${TAB}dataType: $ct" + $l += "${TAB}${TAB}sourceColumn: $cn" + if($ct -eq "dateTime"){ $l += "${TAB}${TAB}formatString: General Date" } + $l += "${TAB}${TAB}summarizeBy: none" + $l += "" + } + $l += "${TAB}partition $tname = m" + $l += "${TAB}${TAB}mode: import" + $l += "${TAB}${TAB}source =" + $l += "${TAB}${TAB}${TAB}${TAB}let" + $l += "${TAB}${TAB}${TAB}${TAB} Origen = Sql.Database(`"192.168.40.8`", `"MarmotechBI`")," + $l += "${TAB}${TAB}${TAB}${TAB} Datos = Origen{[Schema=`"presidencia`", Item=`"$tname`"]}[Data]" + $l += "${TAB}${TAB}${TAB}${TAB}in" + $l += "${TAB}${TAB}${TAB}${TAB} Datos" + $l += "" + return ($l -join "`n") + "`n" +} + +$plCols = @("ano|int64","numero_mes|int64","mes|string","AnoMes|string","fecha_mes|dateTime","grupo|string","orden_linea|int64","linea|string","subgrupo_cod|string","subgrupo_desc|string","cuenta|string","cuenta_desc|string","nivel|int64","debito|decimal","credito|decimal","resultado|decimal","costo_gasto|decimal") +$gsCols = @("ano|int64","numero_mes|int64","mes|string","AnoMes|string","fecha_mes|dateTime","gerencia_cod|string","gerencia|string","departamento|int64","depto_nombre|string","subgrupo_cod|string","subgrupo_desc|string","cuenta|string","cuenta_desc|string","debito|decimal","credito|decimal","gasto|decimal") +$blCols = @("ano|int64","numero_mes|int64","mes|string","AnoMes|string","fecha_mes|dateTime","grupo|string","grupo_desc|string","subgrupo_cod|string","subgrupo_desc|string","cuenta|string","cuenta_desc|string","movimiento_mes|decimal","saldo_natural|decimal","saldo_presentacion|decimal") + +# --- vwPLMensual (aloja las medidas) --- +$pl = Table-Sql "vwPLMensual" $plCols +# medidas +$M = @() +function Meas($n,$expr,$fmt){ + $s = @() + $s += "${TAB}measure '$n' = $expr" + if($fmt){ $s += "${TAB}${TAB}formatString: $fmt" } + $s += "" + return ($s -join "`n") +} +$m0 = "`n" +$m0 += Meas "Ventas Netas" "CALCULATE ( SUM ( vwPLMensual[resultado] ), vwPLMensual[grupo] = `"4`" )" "\`$ #,0,,`" M`";\`$ -#,0,,`" M`";\`$ 0" +$m0 += Meas "Costo de Ventas" "CALCULATE ( SUM ( vwPLMensual[costo_gasto] ), vwPLMensual[grupo] = `"5`" )" "\`$ #,0,,`" M`"" +$m0 += Meas "Gastos Operativos" "CALCULATE ( SUM ( vwPLMensual[costo_gasto] ), vwPLMensual[grupo] = `"7`" )" "\`$ #,0,,`" M`"" +$m0 += Meas "Otros Ing. y Gastos" "CALCULATE ( SUM ( vwPLMensual[costo_gasto] ), vwPLMensual[linea] = `"Otros Ingresos y Gastos`" )" "\`$ #,0,,`" M`"" +$m0 += Meas "ISR" "CALCULATE ( SUM ( vwPLMensual[costo_gasto] ), vwPLMensual[linea] = `"Impuesto sobre la Renta`" )" "\`$ #,0,,`" M`"" +$m0 += Meas "Utilidad Bruta" "[Ventas Netas] - [Costo de Ventas]" "\`$ #,0,,`" M`"" +$m0 += Meas "Utilidad Operativa" "[Utilidad Bruta] - [Gastos Operativos]" "\`$ #,0,,`" M`"" +$m0 += Meas "Utilidad antes ISR" "[Utilidad Operativa] - [Otros Ing. y Gastos]" "\`$ #,0,,`" M`"" +$m0 += Meas "Utilidad Neta" "SUM ( vwPLMensual[resultado] )" "\`$ #,0,,`" M`"" +$m0 += Meas "Margen Bruto %" "DIVIDE ( [Utilidad Bruta], [Ventas Netas] )" "0.0%" +$m0 += Meas "Margen Operativo %" "DIVIDE ( [Utilidad Operativa], [Ventas Netas] )" "0.0%" +$m0 += Meas "Margen Neto %" "DIVIDE ( [Utilidad Neta], [Ventas Netas] )" "0.0%" +$m0 += Meas "Costo % Ventas" "DIVIDE ( [Costo de Ventas], [Ventas Netas] )" "0.0%" +$m0 += Meas "Gastos % Ventas" "DIVIDE ( [Gastos Operativos], [Ventas Netas] )" "0.0%" +$m0 += Meas "Ventas AA" "CALCULATE ( [Ventas Netas], SAMEPERIODLASTYEAR ( DimCalendario[Date] ) )" "\`$ #,0,,`" M`"" +$m0 += Meas "Utilidad Neta AA" "CALCULATE ( [Utilidad Neta], SAMEPERIODLASTYEAR ( DimCalendario[Date] ) )" "\`$ #,0,,`" M`"" +$m0 += Meas "Ventas YoY %" "DIVIDE ( [Ventas Netas] - [Ventas AA], [Ventas AA] )" "0.0%" +$m0 += Meas "Utilidad YoY %" "DIVIDE ( [Utilidad Neta] - [Utilidad Neta AA], [Utilidad Neta AA] )" "0.0%" +$m0 += Meas "Ventas YTD" "TOTALYTD ( [Ventas Netas], DimCalendario[Date] )" "\`$ #,0,,`" M`"" +$m0 += Meas "Utilidad Neta YTD" "TOTALYTD ( [Utilidad Neta], DimCalendario[Date] )" "\`$ #,0,,`" M`"" +# medidas de gastos +$m0 += Meas "Gasto Total" "SUM ( vwGastosDepto[gasto] )" "\`$ #,0,,`" M`"" +$m0 += Meas "Gasto AA" "CALCULATE ( [Gasto Total], SAMEPERIODLASTYEAR ( DimCalendario[Date] ) )" "\`$ #,0,,`" M`"" +$m0 += Meas "Gasto YoY %" "DIVIDE ( [Gasto Total] - [Gasto AA], [Gasto AA] )" "0.0%" +$m0 += Meas "Gasto % de Ventas" "DIVIDE ( [Gasto Total], [Ventas Netas] )" "0.0%" +# medidas de balance +$m0 += Meas "Saldo (fin periodo)" "VAR u = MAX ( vwBalanceMensual[fecha_mes] ) RETURN CALCULATE ( SUM ( vwBalanceMensual[saldo_presentacion] ), vwBalanceMensual[fecha_mes] = u )" "\`$ #,0,,`" M`"" +$m0 += Meas "Activos" "CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[grupo] = `"1`" )" "\`$ #,0,,`" M`"" +$m0 += Meas "Pasivos" "CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[grupo] = `"2`" )" "\`$ #,0,,`" M`"" +$m0 += Meas "Patrimonio" "CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[grupo] = `"3`" )" "\`$ #,0,,`" M`"" +$m0 += Meas "Activo Corriente" "CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[subgrupo_cod] = `"11`" )" "\`$ #,0,,`" M`"" +$m0 += Meas "Pasivo Corriente" "CALCULATE ( [Saldo (fin periodo)], vwBalanceMensual[subgrupo_cod] IN {`"20`",`"21`"} )" "\`$ #,0,,`" M`"" +$m0 += Meas "Razon Corriente" "DIVIDE ( [Activo Corriente], [Pasivo Corriente] )" "0.00" +$m0 += Meas "Capital de Trabajo" "[Activo Corriente] - [Pasivo Corriente]" "\`$ #,0,,`" M`"" +$m0 += Meas "Endeudamiento %" "DIVIDE ( [Pasivos], [Activos] )" "0.0%" + +# insertar medidas antes de la particion (deben ir dentro de la tabla, antes de 'partition') +$pl = $pl -replace "(?s)(${TAB}partition vwPLMensual = m)", ($m0 + "`$1") +W (Join-Path $SM "definition\tables\vwPLMensual.tmdl") $pl + +W (Join-Path $SM "definition\tables\vwGastosDepto.tmdl") (Table-Sql "vwGastosDepto" $gsCols) +W (Join-Path $SM "definition\tables\vwBalanceMensual.tmdl") (Table-Sql "vwBalanceMensual" $blCols) + +# ---------------- DimCalendario (tabla calculada) ---------------- +$dc = @() +$dc += "table DimCalendario" +foreach($c in @("Date|dateTime","Anio|int64","MesNo|int64","Mes|string","AnioMes|string","PrimerDiaMes|dateTime","Trimestre|string")){ + $p=$c.Split("|");$cn=$p[0];$ct=$p[1] + $dc += "${TAB}column $cn" + $dc += "${TAB}${TAB}dataType: $ct" + $dc += "${TAB}${TAB}sourceColumn: [$cn]" + if($ct -eq "dateTime"){ $dc += "${TAB}${TAB}formatString: General Date" } + $dc += "${TAB}${TAB}summarizeBy: none" + $dc += "" +} +$dax = 'ADDCOLUMNS ( CALENDAR ( DATE ( 2015, 1, 1 ), DATE ( 2028, 12, 31 ) ), "Anio", YEAR ( [Date] ), "MesNo", MONTH ( [Date] ), "Mes", FORMAT ( [Date], "MMM" ), "AnioMes", FORMAT ( [Date], "yyyy-MM" ), "PrimerDiaMes", DATE ( YEAR ( [Date] ), MONTH ( [Date] ), 1 ), "Trimestre", "T" & FORMAT ( [Date], "Q" ) )' +$dc += "${TAB}partition DimCalendario = calculated" +$dc += "${TAB}${TAB}mode: import" +$dc += "${TAB}${TAB}source = $dax" +$dc += "" +W (Join-Path $SM "definition\tables\DimCalendario.tmdl") (($dc -join "`n") + "`n") + +# ---------------- relationships.tmdl ---------------- +$rel = @() +foreach($t in @("vwPLMensual","vwGastosDepto","vwBalanceMensual")){ + $rel += "relationship $(G)" + $rel += "${TAB}fromColumn: $t.fecha_mes" + $rel += "${TAB}toColumn: DimCalendario.Date" + $rel += "" +} +W (Join-Path $SM "definition\relationships.tmdl") (($rel -join "`n") + "`n") + +Write-Output "SemanticModel escrito." + +# ===================================================================== +# REPORTE (PBIR) +# ===================================================================== +W (Join-Path $RP ".platform") @" +{ + "`$schema": "https://developer.microsoft.com/json-schemas/fabric/gitIntegration/platformProperties/2.0.0/schema.json", + "metadata": { "type": "Report", "displayName": "$Name" }, + "config": { "version": "2.0", "logicalId": "$(G)" } +} +"@ + +W (Join-Path $RP "definition.pbir") @" +{ + "version": "4.0", + "datasetReference": { "byPath": { "path": "../$Name.SemanticModel" } } +} +"@ + +# PBIR exige version.json dentro de definition/ +W (Join-Path $RP "definition\version.json") @" +{ + "version": "2.0.0" +} +"@ + +W (Join-Path $RP "definition\report.json") @" +{ + "`$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/report/1.0.0/schema.json", + "themeCollection": { "baseTheme": { "name": "CY24SU10" } }, + "layoutOptimization": "None" +} +"@ + +# ---- helpers de visuales PBIR ---- +function Field-Measure($entity,$prop){ + return @" +{ "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "$entity" } }, "Property": "$prop" } }, "queryRef": "$entity.$prop", "nativeQueryRef": "$prop" } +"@ +} +function Field-Column($entity,$prop){ + return @" +{ "field": { "Column": { "Expression": { "SourceRef": { "Entity": "$entity" } }, "Property": "$prop" } }, "queryRef": "$entity.$prop", "nativeQueryRef": "$prop" } +"@ +} +# roles: hashtable rol -> array de proyecciones json +function Visual($pageDir,$vtype,$x,$y,$w,$h,$roles,$title){ + $vid = G + $vdir = Join-Path $pageDir "visuals\$vid" + New-Item -ItemType Directory -Force -Path $vdir | Out-Null + $projBlocks = @() + foreach($r in $roles.Keys){ + $items = ($roles[$r] -join ",`n") + $projBlocks += "`"$r`": { `"projections`": [ $items ] }" + } + $queryState = ($projBlocks -join ",`n") + $titleObj = "" + if($title){ + $titleObj = @" +, + "objects": { + "title": [ { "properties": { "text": { "expr": { "Literal": { "Value": "'$title'" } } }, "show": { "expr": { "Literal": { "Value": "true" } } } } } ] + } +"@ + } + $json = @" +{ + "`$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/visualContainer/1.0.0/schema.json", + "name": "$vid", + "position": { "x": $x, "y": $y, "z": 0, "width": $w, "height": $h, "tabOrder": 0 }, + "visual": { + "visualType": "$vtype", + "query": { "queryState": { $queryState } }, + "drillFilterOtherVisuals": true$titleObj + } +} +"@ + W (Join-Path $vdir "visual.json") $json + return $vid +} + +$pageIds = @() + +# ============ PAGINA 1: Radiografia ============ +$p1 = G; $pageIds += $p1 +$p1dir = Join-Path $RP "definition\pages\$p1" +New-Item -ItemType Directory -Force -Path $p1dir | Out-Null +W (Join-Path $p1dir "page.json") @" +{ + "`$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/page/1.0.0/schema.json", + "name": "$p1", + "displayName": "Radiografia", + "displayOption": "FitToPage", + "height": 720, + "width": 1280 +} +"@ +[void](Visual $p1dir "card" 16 16 280 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Ventas Netas")) } "Ventas Netas") +[void](Visual $p1dir "card" 312 16 280 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Utilidad Bruta")) } "Utilidad Bruta") +[void](Visual $p1dir "card" 688 16 280 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Utilidad Operativa")) } "Utilidad Operativa") +[void](Visual $p1dir "card" 984 16 280 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Utilidad Neta")) } "Utilidad Neta") +[void](Visual $p1dir "waterfallChart" 16 170 620 300 @{ "Category" = @((Field-Column "vwPLMensual" "linea")); "Y" = @((Field-Measure "vwPLMensual" "Utilidad Neta")) } "Estado de Resultados (cascada)") +[void](Visual $p1dir "lineClusteredColumnComboChart" 652 170 612 300 @{ "Category" = @((Field-Column "DimCalendario" "Mes")); "Y" = @((Field-Measure "vwPLMensual" "Ventas Netas")); "Y2" = @((Field-Measure "vwPLMensual" "Utilidad Neta")) } "Comportamiento del periodo (Ventas vs Utilidad)") +[void](Visual $p1dir "clusteredColumnChart" 16 484 620 220 @{ "Category" = @((Field-Column "DimCalendario" "Anio")); "Y" = @((Field-Measure "vwPLMensual" "Ventas Netas"),(Field-Measure "vwPLMensual" "Utilidad Neta")) } "Trayectoria anual") +[void](Visual $p1dir "slicer" 652 484 300 120 @{ "Values" = @((Field-Column "DimCalendario" "Anio")) } "Ano") + +# ============ PAGINA 2: Gastos ============ +$p2 = G; $pageIds += $p2 +$p2dir = Join-Path $RP "definition\pages\$p2" +New-Item -ItemType Directory -Force -Path $p2dir | Out-Null +W (Join-Path $p2dir "page.json") @" +{ + "`$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/page/1.0.0/schema.json", + "name": "$p2", + "displayName": "Analisis de Gastos", + "displayOption": "FitToPage", + "height": 720, + "width": 1280 +} +"@ +[void](Visual $p2dir "card" 16 16 300 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Gasto Total")) } "Gastos Operativos") +[void](Visual $p2dir "card" 332 16 300 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Gasto % de Ventas")) } "Gasto / Ventas") +[void](Visual $p2dir "barChart" 16 170 620 300 @{ "Category" = @((Field-Column "vwGastosDepto" "gerencia")); "Y" = @((Field-Measure "vwPLMensual" "Gasto Total")) } "Gasto por gerencia") +[void](Visual $p2dir "tableEx" 652 170 612 300 @{ "Values" = @((Field-Column "vwGastosDepto" "subgrupo_desc"),(Field-Measure "vwPLMensual" "Gasto Total"),(Field-Measure "vwPLMensual" "Gasto % de Ventas")) } "Naturaleza del gasto") +[void](Visual $p2dir "columnChart" 16 484 1248 220 @{ "Category" = @((Field-Column "DimCalendario" "Mes")); "Y" = @((Field-Measure "vwPLMensual" "Gasto Total")) } "Gasto mensual") + +# ============ PAGINA 3: Estructura ============ +$p3 = G; $pageIds += $p3 +$p3dir = Join-Path $RP "definition\pages\$p3" +New-Item -ItemType Directory -Force -Path $p3dir | Out-Null +W (Join-Path $p3dir "page.json") @" +{ + "`$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/page/1.0.0/schema.json", + "name": "$p3", + "displayName": "Estructura Financiera", + "displayOption": "FitToPage", + "height": 720, + "width": 1280 +} +"@ +[void](Visual $p3dir "card" 16 16 300 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Activos")) } "Activos Totales") +[void](Visual $p3dir "card" 332 16 300 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Razon Corriente")) } "Razon Corriente") +[void](Visual $p3dir "card" 648 16 300 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Capital de Trabajo")) } "Capital de Trabajo") +[void](Visual $p3dir "card" 964 16 300 140 @{ "Values" = @((Field-Measure "vwPLMensual" "Endeudamiento %")) } "Endeudamiento") +[void](Visual $p3dir "clusteredColumnChart" 16 170 620 300 @{ "Category" = @((Field-Column "vwBalanceMensual" "grupo_desc")); "Y" = @((Field-Measure "vwPLMensual" "Saldo (fin periodo)")) } "Activos / Pasivos / Patrimonio") +[void](Visual $p3dir "tableEx" 652 170 612 300 @{ "Values" = @((Field-Column "vwBalanceMensual" "subgrupo_desc"),(Field-Measure "vwPLMensual" "Saldo (fin periodo)")) } "Composicion") + +# ---------------- pages.json ---------------- +$order = ($pageIds | ForEach-Object { "`"$_`"" }) -join ", " +W (Join-Path $RP "definition\pages\pages.json") @" +{ + "`$schema": "https://developer.microsoft.com/json-schemas/fabric/item/report/definition/pagesMetadata/1.0.0/schema.json", + "pageOrder": [ $order ], + "activePageName": "$($pageIds[0])" +} +"@ + +Write-Output "Reporte escrito." +Write-Output ("PROYECTO GENERADO EN: " + $Root) +Get-ChildItem -Recurse $Root | Measure-Object | ForEach-Object { Write-Output ("Archivos: " + $_.Count) } diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 1af8b6c..d400e1d 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -70,7 +70,7 @@ - +