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)
+
+
Subgrupo
Monto
% 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)
+
+
Rubro
Saldo
+
+
+
Composición del pasivo
+
+
Rubro
Saldo
+
+
+
+
+
+
+
+ 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 0000000..6be4a9f
Binary files /dev/null and b/Dashboards MARMOTECH/Radiografia_Marmotech_PBIP.zip differ
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 @@
-
+