diff --git a/Dashboards MARMOTECH/Dashboard_Presidencia_Mockup.html b/Dashboards MARMOTECH/Dashboard_Presidencia_Mockup.html new file mode 100644 index 0000000..a33c45c --- /dev/null +++ b/Dashboards MARMOTECH/Dashboard_Presidencia_Mockup.html @@ -0,0 +1,561 @@ +Radiografía Marmotech + + + + + + +
+
+
+ +
+

Radiografía de la Empresa

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

Ventas Netas

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

Utilidad Bruta

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

Utilidad Operativa

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

Utilidad Neta

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

Estado de Resultados — Cascada

+

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

+ +
+
+

Composición de cada RD$ vendido

+

Estructura del peso de ventas · 2026

+ +
+
+ +
+
+

Comportamiento del periodo actual

+

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

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

Trayectoria anual

+

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

+ +
+
+
+ + +
+
+
+

Gastos Operativos

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

Gasto / Ventas

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

Gerencia mayor peso

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

Mayor alza YoY

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

Gasto por gerencia

+

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

+ +
+ 2026 + 2025 +
+
+
+

Naturaleza del gasto

+

Por subgrupo contable · 2026 (RD$ M)

+ + + +
SubgrupoMonto% ventas
+

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

+
+
+ +
+
+

Gasto mensual — control de eficiencia

+

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

+ +
+
+
+ + +
+
+
+

Activos Totales

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

Razón Corriente

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

Capital de Trabajo

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

Endeudamiento

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

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

+

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

+ +
+
+

Composición del activo

+

al 31-jul-2026 (RD$ M)

+ + + +
RubroSaldo
+

Composición del pasivo

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