@luquimbo/bi-superpowers 5.0.0 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.claude-plugin/marketplace.json +5 -3
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.claude-plugin/skill-manifest.json +23 -7
  4. package/.plugin/plugin.json +1 -1
  5. package/AGENTS.md +124 -26
  6. package/CHANGELOG.md +494 -16
  7. package/README.md +33 -117
  8. package/bin/cli.js +1 -1
  9. package/bin/commands/diff.js +2 -2
  10. package/bin/commands/install.js +58 -45
  11. package/bin/commands/lint.js +2 -2
  12. package/bin/commands/validate-projects.js +1 -1
  13. package/bin/lib/generators/claude-plugin.js +14 -5
  14. package/bin/lib/generators/shared.js +9 -5
  15. package/bin/lib/mcp-config.js +22 -2
  16. package/bin/lib/skills.js +8 -8
  17. package/bin/mcp/powerbi-modeling-launcher.js +8 -4
  18. package/bin/postinstall.js +14 -12
  19. package/bin/utils/mcp-detect.js +11 -11
  20. package/commands/bi-connect.md +34 -17
  21. package/commands/bi-dax.md +385 -0
  22. package/commands/bi-kickoff.md +75 -44
  23. package/commands/bi-modeling.md +395 -0
  24. package/commands/bi-performance.md +455 -0
  25. package/commands/bi-start.md +30 -18
  26. package/desktop-extension/manifest.json +2 -2
  27. package/package.json +6 -3
  28. package/skills/bi-connect/SKILL.md +34 -17
  29. package/skills/bi-connect/scripts/update-check.js +1 -1
  30. package/skills/bi-dax/SKILL.md +387 -0
  31. package/skills/{bi-report → bi-dax}/scripts/update-check.js +1 -1
  32. package/skills/bi-kickoff/SKILL.md +75 -44
  33. package/skills/bi-kickoff/scripts/update-check.js +1 -1
  34. package/skills/bi-modeling/SKILL.md +397 -0
  35. package/skills/bi-modeling/scripts/update-check.js +403 -0
  36. package/skills/bi-performance/SKILL.md +457 -0
  37. package/skills/bi-performance/scripts/install-tabular-editor.ps1 +90 -0
  38. package/skills/bi-performance/scripts/run-bpa.ps1 +161 -0
  39. package/skills/bi-performance/scripts/update-check.js +403 -0
  40. package/skills/bi-start/SKILL.md +31 -19
  41. package/skills/bi-start/scripts/update-check.js +1 -1
  42. package/src/content/base.md +13 -8
  43. package/src/content/routing.md +1 -5
  44. package/src/content/skills/bi-connect.md +32 -15
  45. package/src/content/skills/bi-dax.md +358 -0
  46. package/src/content/skills/bi-kickoff.md +73 -42
  47. package/src/content/skills/bi-modeling.md +368 -0
  48. package/src/content/skills/bi-performance/SKILL.md +428 -0
  49. package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +90 -0
  50. package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +161 -0
  51. package/src/content/skills/bi-start.md +30 -18
  52. package/templates/sales/AGENTS.md +33 -0
  53. package/templates/sales/sales-template.Report/.platform +11 -0
  54. package/templates/sales/sales-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
  55. package/templates/sales/sales-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
  56. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/page.json +123 -0
  57. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/10420560e5b8c5235857/visual.json +16 -0
  58. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2181c54a94f0c67abb2d/visual.json +283 -0
  59. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/24eba6a7af0b59974ef5/visual.json +703 -0
  60. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/26db24c91e5b615a5c29/mobile.json +11 -0
  61. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/26db24c91e5b615a5c29/visual.json +528 -0
  62. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2ec652d0956901dd2afd/mobile.json +11 -0
  63. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2ec652d0956901dd2afd/visual.json +324 -0
  64. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/45dda4e0b159becf2dcd/mobile.json +11 -0
  65. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/45dda4e0b159becf2dcd/visual.json +359 -0
  66. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4ca8800cf1539ad423f2/visual.json +468 -0
  67. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4f5704218eb88f7cdff6/mobile.json +29 -0
  68. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4f5704218eb88f7cdff6/visual.json +241 -0
  69. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/54d3fdbedbbb863a9d7a/visual.json +575 -0
  70. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/68043403e96ca8ed23e8/visual.json +575 -0
  71. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/80b54a678ef36a250994/visual.json +351 -0
  72. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/814f624b6056dc4c8de5/mobile.json +11 -0
  73. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/814f624b6056dc4c8de5/visual.json +421 -0
  74. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/85e1cc13559f4e107ede/visual.json +681 -0
  75. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8686961b837e855963fe/mobile.json +11 -0
  76. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8686961b837e855963fe/visual.json +720 -0
  77. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8d302c5b7e87e8cb57bb/visual.json +590 -0
  78. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a02c5b30f2e757637d78/mobile.json +11 -0
  79. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a02c5b30f2e757637d78/visual.json +102 -0
  80. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a405d29e7744c770d445/visual.json +575 -0
  81. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/b0dc2036d3cf2baafb35/mobile.json +11 -0
  82. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/b0dc2036d3cf2baafb35/visual.json +333 -0
  83. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/cdd696baaf3b80b326f8/mobile.json +11 -0
  84. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/cdd696baaf3b80b326f8/visual.json +468 -0
  85. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/ff77ca1bafff5bfe5044/mobile.json +11 -0
  86. package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/ff77ca1bafff5bfe5044/visual.json +523 -0
  87. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
  88. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +681 -0
  89. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +351 -0
  90. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
  91. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
  92. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
  93. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +102 -0
  94. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
  95. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
  96. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
  97. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
  98. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +685 -0
  99. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/85090dcdf75ac2487d1e/visual.json +283 -0
  100. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
  101. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +590 -0
  102. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
  103. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +528 -0
  104. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a90aaa3e3117494f18f8/mobile.json +11 -0
  105. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a90aaa3e3117494f18f8/visual.json +523 -0
  106. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
  107. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +720 -0
  108. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
  109. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1230 -0
  110. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b06ef80aa78cabcef8a6/mobile.json +11 -0
  111. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b06ef80aa78cabcef8a6/visual.json +324 -0
  112. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/d97979633a91e041107e/mobile.json +11 -0
  113. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/d97979633a91e041107e/visual.json +421 -0
  114. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
  115. package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
  116. package/templates/sales/sales-template.Report/definition/pages/pages.json +8 -0
  117. package/templates/sales/sales-template.Report/definition/report.json +89 -0
  118. package/templates/sales/sales-template.Report/definition/version.json +4 -0
  119. package/templates/sales/sales-template.Report/definition.pbir +9 -0
  120. package/templates/sales/sales-template.SemanticModel/.pbi/editorSettings.json +8 -0
  121. package/templates/sales/sales-template.SemanticModel/.platform +11 -0
  122. package/templates/sales/sales-template.SemanticModel/DAXQueries/.pbi/daxQueries.json +9 -0
  123. package/templates/sales/sales-template.SemanticModel/DAXQueries/Calendar445MonthNr.dax +0 -0
  124. package/templates/sales/sales-template.SemanticModel/DAXQueries/Consulta 1.dax +6 -0
  125. package/templates/sales/sales-template.SemanticModel/DAXQueries/Consulta 2.dax +32 -0
  126. package/templates/sales/sales-template.SemanticModel/definition/cultures/es-AR.tmdl +7324 -0
  127. package/templates/sales/sales-template.SemanticModel/definition/database.tmdl +3 -0
  128. package/templates/sales/sales-template.SemanticModel/definition/expressions.tmdl +233 -0
  129. package/templates/sales/sales-template.SemanticModel/definition/functions.tmdl +247 -0
  130. package/templates/sales/sales-template.SemanticModel/definition/model.tmdl +46 -0
  131. package/templates/sales/sales-template.SemanticModel/definition/relationships.tmdl +16 -0
  132. package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Comparaciones.tmdl +194 -0
  133. package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Dimensiones ventas.tmdl +71 -0
  134. package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Ejes temporales.tmdl +67 -0
  135. package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Per/303/255odos.tmdl" +318 -0
  136. package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista de calendario.tmdl +36 -0
  137. package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista del valor.tmdl +87 -0
  138. package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista temporal.tmdl +62 -0
  139. package/templates/sales/sales-template.SemanticModel/definition/tables/Calendario.tmdl +198 -0
  140. package/templates/sales/sales-template.SemanticModel/definition/tables/Canales.tmdl +59 -0
  141. package/templates/sales/sales-template.SemanticModel/definition/tables/Clientes.tmdl +120 -0
  142. package/templates/sales/sales-template.SemanticModel/definition/tables/Modelo Configuraci/303/263n.tmdl" +48 -0
  143. package/templates/sales/sales-template.SemanticModel/definition/tables/Monedas.tmdl +43 -0
  144. package/templates/sales/sales-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +553 -0
  145. package/templates/sales/sales-template.SemanticModel/definition/tables/Productos.tmdl +73 -0
  146. package/templates/sales/sales-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +66 -0
  147. package/templates/sales/sales-template.SemanticModel/definition/tables/Ventas.tmdl +133 -0
  148. package/templates/sales/sales-template.SemanticModel/definition.pbism +5 -0
  149. package/templates/sales/sales-template.SemanticModel/diagramLayout.json +239 -0
  150. package/templates/sales/sales-template.pbip +14 -0
  151. package/theme/BISuperpowers.json +3888 -0
  152. package/commands/bi-report.md +0 -403
  153. package/skills/bi-report/SKILL.md +0 -405
  154. package/skills/bi-report/references/cli-commands.md +0 -184
  155. package/skills/bi-report/references/cli-setup.md +0 -101
  156. package/skills/bi-report/references/close-write-open-pattern.md +0 -80
  157. package/skills/bi-report/references/layouts/finance.md +0 -65
  158. package/skills/bi-report/references/layouts/generic.md +0 -46
  159. package/skills/bi-report/references/layouts/hr.md +0 -48
  160. package/skills/bi-report/references/layouts/marketing.md +0 -45
  161. package/skills/bi-report/references/layouts/operations.md +0 -44
  162. package/skills/bi-report/references/layouts/sales.md +0 -50
  163. package/skills/bi-report/references/native-visuals.md +0 -341
  164. package/skills/bi-report/references/pbi-desktop-installation.md +0 -87
  165. package/skills/bi-report/references/pbir-preview-activation.md +0 -40
  166. package/skills/bi-report/references/slicer.md +0 -89
  167. package/skills/bi-report/references/textbox.md +0 -101
  168. package/skills/bi-report/references/themes/BISuperpowers.json +0 -915
  169. package/skills/bi-report/references/troubleshooting.md +0 -135
  170. package/skills/bi-report/references/visual-types.md +0 -78
  171. package/skills/bi-report/scripts/apply-theme.js +0 -243
  172. package/skills/bi-report/scripts/create-visual.js +0 -942
  173. package/skills/bi-report/scripts/ensure-pbi-cli.sh +0 -41
  174. package/skills/bi-report/scripts/validate-pbir.js +0 -351
  175. package/src/content/skills/bi-report/SKILL.md +0 -376
  176. package/src/content/skills/bi-report/references/cli-commands.md +0 -184
  177. package/src/content/skills/bi-report/references/cli-setup.md +0 -101
  178. package/src/content/skills/bi-report/references/close-write-open-pattern.md +0 -80
  179. package/src/content/skills/bi-report/references/layouts/finance.md +0 -65
  180. package/src/content/skills/bi-report/references/layouts/generic.md +0 -46
  181. package/src/content/skills/bi-report/references/layouts/hr.md +0 -48
  182. package/src/content/skills/bi-report/references/layouts/marketing.md +0 -45
  183. package/src/content/skills/bi-report/references/layouts/operations.md +0 -44
  184. package/src/content/skills/bi-report/references/layouts/sales.md +0 -50
  185. package/src/content/skills/bi-report/references/native-visuals.md +0 -341
  186. package/src/content/skills/bi-report/references/pbi-desktop-installation.md +0 -87
  187. package/src/content/skills/bi-report/references/pbir-preview-activation.md +0 -40
  188. package/src/content/skills/bi-report/references/slicer.md +0 -89
  189. package/src/content/skills/bi-report/references/textbox.md +0 -101
  190. package/src/content/skills/bi-report/references/themes/BISuperpowers.json +0 -915
  191. package/src/content/skills/bi-report/references/troubleshooting.md +0 -135
  192. package/src/content/skills/bi-report/references/visual-types.md +0 -78
  193. package/src/content/skills/bi-report/scripts/apply-theme.js +0 -243
  194. package/src/content/skills/bi-report/scripts/create-visual.js +0 -942
  195. package/src/content/skills/bi-report/scripts/ensure-pbi-cli.sh +0 -41
  196. package/src/content/skills/bi-report/scripts/validate-pbir.js +0 -351
@@ -0,0 +1,36 @@
1
+ /// Tabla desconectada del template para alternar entre calendario gregoriano y semanal 4-4-5.
2
+ table 'Aux Vista de calendario'
3
+ lineageTag: 30c2b190-4109-4c7b-ae8c-a4cb2895f15e
4
+
5
+ column 'Vista de calendario'
6
+ lineageTag: 383b4358-0b80-44e6-9b0a-7eb5fe33f262
7
+ summarizeBy: none
8
+ sourceColumn: [Tipo Calendario]
9
+ sortByColumn: 'Orden vista de calendario'
10
+
11
+ column 'Vista de calendario EN'
12
+ isHidden
13
+ lineageTag: 1938c960-4bb8-497f-a416-56690510a5fc
14
+ summarizeBy: none
15
+ sourceColumn: [Tipo Calendario EN]
16
+
17
+ column 'Orden vista de calendario'
18
+ isHidden
19
+ formatString: 0
20
+ lineageTag: be4cbb5b-2720-41cb-aebd-b52005cead4e
21
+ summarizeBy: none
22
+ sourceColumn: [Orden Tipo Calendario]
23
+
24
+ partition 'Vista de calendario' = calculated
25
+ mode: import
26
+ source =
27
+ DATATABLE (
28
+ "Tipo Calendario", STRING,
29
+ "Tipo Calendario EN", STRING,
30
+ "Orden Tipo Calendario", INTEGER,
31
+ {
32
+ { "Gregoriano", "Gregorian", 1 },
33
+ { "Semanal 4-4-5", "4-4-5 Weekly", 2 }
34
+ }
35
+ )
36
+
@@ -0,0 +1,87 @@
1
+ table 'Aux Vista del valor'
2
+ lineageTag: ed02182c-5eee-4e6f-97c7-2dd97712298b
3
+
4
+ /// Permite cambiar cómo se resume la métrica seleccionada: valor o acumulado.
5
+ calculationGroup
6
+ precedence: 10
7
+
8
+ multipleOrEmptySelectionExpression = SELECTEDMEASURE()
9
+
10
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
11
+
12
+ noSelectionExpression = SELECTEDMEASURE()
13
+
14
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
15
+
16
+ /// Muestra la métrica seleccionada con su agregación natural.
17
+ calculationItem Valor = SELECTEDMEASURE()
18
+
19
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
20
+
21
+ /// Acumula la métrica sobre las fechas visibles cuando la métrica lo permite. Sin métrica única en contexto devuelve blanco.
22
+ calculationItem Acumulado =
23
+ VAR __Value = SELECTEDMEASURE()
24
+ VAR __MetricName = SELECTEDVALUE ( 'Métricas'[Métrica] )
25
+ VAR __CanAccumulate = SELECTEDVALUE ( 'Métricas'[Acumulado] )
26
+ VAR __HasTemporalAxis =
27
+ ISINSCOPE ( 'Calendario'[Fecha] )
28
+ || ISINSCOPE ( 'Calendario'[Semana] )
29
+ || ISINSCOPE ( 'Calendario'[Año mes] )
30
+ || ISINSCOPE ( 'Calendario'[Trimestre] )
31
+ || ISINSCOPE ( 'Calendario'[Año] )
32
+ VAR __CalendarContext = CalendarContext ()
33
+ VAR __CurrentStart = MAXX ( __CalendarContext, [Current Start] )
34
+ VAR __CurrentEnd = MAXX ( __CalendarContext, [Current End] )
35
+ VAR __RunningEnd = MIN ( MAX ( 'Calendario'[Fecha] ), __CurrentEnd )
36
+ VAR __RunningDates =
37
+ FILTER (
38
+ ALLSELECTED ( 'Calendario'[Fecha] ),
39
+ 'Calendario'[Fecha] >= __CurrentStart
40
+ && 'Calendario'[Fecha] <= __RunningEnd
41
+ )
42
+ RETURN
43
+ IF (
44
+ NOT ISNUMBER ( __Value ),
45
+ __Value,
46
+ IF (
47
+ ISBLANK ( __MetricName ) || ISBLANK ( __CanAccumulate ),
48
+ BLANK (),
49
+ IF (
50
+ NOT __CanAccumulate,
51
+ BLANK (),
52
+ IF (
53
+ __HasTemporalAxis,
54
+ IF (
55
+ ISSELECTEDMEASURE ( [Periodo Actual] ),
56
+ IF (
57
+ NOT ISBLANK ( __CurrentStart ) && NOT ISBLANK ( __RunningEnd ),
58
+ CALCULATE (
59
+ [Selector métrica],
60
+ REMOVEFILTERS ( 'Aux Vista del valor' ),
61
+ TREATAS ( { __MetricName }, 'Métricas'[Métrica] ),
62
+ REMOVEFILTERS ( 'Calendario' ),
63
+ TREATAS ( __RunningDates, 'Calendario'[Fecha] )
64
+ )
65
+ ),
66
+ CALCULATE (
67
+ SELECTEDMEASURE (),
68
+ FILTER (
69
+ ALLSELECTED ( 'Calendario'[Fecha] ),
70
+ 'Calendario'[Fecha] <= MAX ( 'Calendario'[Fecha] )
71
+ )
72
+ )
73
+ ),
74
+ SELECTEDMEASURE ()
75
+ )
76
+ )
77
+ )
78
+ )
79
+
80
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
81
+
82
+ column 'Vista del valor'
83
+ dataType: string
84
+ lineageTag: f8965a03-4327-4f99-a7bf-a2421b04b8fd
85
+
86
+ partition 'Partition_Vista del valor' = calculationGroup
87
+
@@ -0,0 +1,62 @@
1
+ table 'Aux Vista temporal'
2
+ lineageTag: 0a468eed-913c-45b4-90f9-73a7ca69a446
3
+
4
+ /// Permite aplicar inteligencia de tiempo estándar sobre la métrica seleccionada.
5
+ calculationGroup
6
+ precedence: 20
7
+
8
+ multipleOrEmptySelectionExpression = SELECTEDMEASURE()
9
+
10
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
11
+
12
+ noSelectionExpression = SELECTEDMEASURE()
13
+
14
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
15
+
16
+ /// Muestra el valor actual de la métrica seleccionada.
17
+ calculationItem Actual = SELECTEDMEASURE()
18
+
19
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
20
+
21
+ /// Muestra la métrica seleccionada desplazada un mes hacia atrás.
22
+ calculationItem 'Mes anterior' = CALCULATE ( SELECTEDMEASURE (), DATEADD ( 'Calendario'[Fecha], -1, MONTH ) )
23
+
24
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
25
+
26
+ /// Muestra la métrica seleccionada desplazada un año hacia atrás.
27
+ calculationItem 'Año anterior' = CALCULATE ( SELECTEDMEASURE (), DATEADD ( 'Calendario'[Fecha], -1, YEAR ) )
28
+
29
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
30
+
31
+ /// Muestra la diferencia absoluta contra el mismo período del año anterior.
32
+ calculationItem 'Variación vs año anterior' =
33
+ VAR __Actual = SELECTEDMEASURE()
34
+ VAR __Anterior = CALCULATE ( SELECTEDMEASURE (), DATEADD ( 'Calendario'[Fecha], -1, YEAR ) )
35
+ RETURN
36
+ IF (
37
+ NOT ISNUMBER ( __Actual ) || NOT ISNUMBER ( __Anterior ),
38
+ BLANK (),
39
+ __Actual - __Anterior
40
+ )
41
+
42
+ formatStringDefinition = SELECTEDMEASUREFORMATSTRING()
43
+
44
+ /// Muestra la variación porcentual contra el mismo período del año anterior.
45
+ calculationItem 'Variación % vs año anterior' =
46
+ VAR __Actual = SELECTEDMEASURE()
47
+ VAR __Anterior = CALCULATE ( SELECTEDMEASURE (), DATEADD ( 'Calendario'[Fecha], -1, YEAR ) )
48
+ RETURN
49
+ IF (
50
+ NOT ISNUMBER ( __Actual ) || NOT ISNUMBER ( __Anterior ),
51
+ BLANK (),
52
+ DIVIDE ( __Actual - __Anterior, __Anterior )
53
+ )
54
+
55
+ formatStringDefinition = "0.0%;-0.0%;0.0%"
56
+
57
+ column 'Vista temporal'
58
+ dataType: string
59
+ lineageTag: 30cf2dbe-aa15-4c38-ad93-78f075797f3a
60
+
61
+ partition 'Partition_Vista temporal' = calculationGroup
62
+
@@ -0,0 +1,198 @@
1
+ /// Dimensión de fechas generada en Power Query. Usa el parámetro FechaInicio y mantiene el contrato del calendario original del template.
2
+ table Calendario
3
+ lineageTag: fc2b01ae-35f8-43a7-9daf-840d8d051fc3
4
+ dataCategory: Time
5
+
6
+ column Fecha
7
+ dataType: dateTime
8
+ formatString: ddd d/M
9
+ lineageTag: 1e0ef155-a40c-4313-86f8-b20f516f7e24
10
+ summarizeBy: none
11
+ sourceColumn: Fecha
12
+
13
+ annotation UnderlyingDateTimeDataType = Date
14
+
15
+ column Año
16
+ dataType: int64
17
+ formatString: 0
18
+ lineageTag: 62d06d49-ffb4-4de2-becd-8506d910959b
19
+ summarizeBy: none
20
+ sourceColumn: Año
21
+
22
+ column 'Número de mes'
23
+ dataType: int64
24
+ isHidden
25
+ formatString: 0
26
+ lineageTag: b3fc12e9-9a3f-43a3-a07e-ff07772d83f5
27
+ summarizeBy: none
28
+ sourceColumn: Número de mes
29
+
30
+ column Mes
31
+ dataType: string
32
+ lineageTag: 2302ab09-e96d-41ee-9532-2735fb84f65e
33
+ summarizeBy: none
34
+ sourceColumn: Mes
35
+ sortByColumn: 'Orden año mes'
36
+
37
+ column 'Año mes'
38
+ dataType: string
39
+ lineageTag: ae89004f-54bf-4202-b16c-b4f91cc165f5
40
+ summarizeBy: none
41
+ sourceColumn: Año mes
42
+ sortByColumn: 'Orden año mes'
43
+
44
+ column 'Orden año mes'
45
+ dataType: int64
46
+ isHidden
47
+ formatString: 0
48
+ lineageTag: fc2e5c02-4dc6-4b91-acb3-1a096c35bca1
49
+ summarizeBy: none
50
+ sourceColumn: Orden año mes
51
+
52
+ column Trimestre
53
+ dataType: string
54
+ lineageTag: 81037ded-e661-4e9c-b222-532ceff66df9
55
+ summarizeBy: none
56
+ sourceColumn: Trimestre
57
+ sortByColumn: 'Trimestre Orden'
58
+
59
+ column Semana
60
+ dataType: string
61
+ lineageTag: e127647f-e6dc-4491-bf3b-d39680cef7d7
62
+ summarizeBy: none
63
+ sourceColumn: Semana
64
+ sortByColumn: 'Semana Orden'
65
+
66
+ column 'Trimestre Orden'
67
+ dataType: int64
68
+ isHidden
69
+ formatString: 0
70
+ lineageTag: 76c5b649-a987-4058-b491-1ce85317f2b5
71
+ sourceColumn: Trimestre Orden
72
+
73
+ column 'Semana Orden'
74
+ dataType: int64
75
+ isHidden
76
+ formatString: 0
77
+ lineageTag: d92f289b-1949-48c3-979c-d5b950b4c4ca
78
+ sourceColumn: Semana Orden
79
+
80
+ column Fiscal445Year
81
+ dataType: int64
82
+ isHidden
83
+ lineageTag: eb46cab4-413f-4000-a55d-f84fc7f5da22
84
+ summarizeBy: none
85
+ sourceColumn: Fiscal445Year
86
+
87
+ column Fiscal445MonthNr
88
+ dataType: int64
89
+ isHidden
90
+ lineageTag: 3467957a-082e-4b33-af38-53379e25ce88
91
+ summarizeBy: none
92
+ sourceColumn: Fiscal445MonthNr
93
+
94
+ column Fiscal445QuarterNr
95
+ dataType: int64
96
+ isHidden
97
+ lineageTag: b2d6bdd1-7bd0-4fbc-813e-5d22de24417c
98
+ summarizeBy: none
99
+ sourceColumn: Fiscal445QuarterNr
100
+
101
+ column Fiscal445SemesterNr
102
+ dataType: int64
103
+ isHidden
104
+ lineageTag: bfb0e639-0c4a-4a15-86df-b8116c227bff
105
+ summarizeBy: none
106
+ sourceColumn: Fiscal445SemesterNr
107
+
108
+ column Fiscal445MonthKey
109
+ dataType: int64
110
+ isHidden
111
+ lineageTag: e8f647cd-3033-48c9-a33d-5ccc52b244e6
112
+ summarizeBy: none
113
+ sourceColumn: Fiscal445MonthKey
114
+
115
+ column Fiscal445QuarterKey
116
+ dataType: int64
117
+ isHidden
118
+ lineageTag: c6d09169-b938-4eb6-a30a-7600fa043f55
119
+ summarizeBy: none
120
+ sourceColumn: Fiscal445QuarterKey
121
+
122
+ column Fiscal445SemesterKey
123
+ dataType: int64
124
+ isHidden
125
+ lineageTag: ddb27e62-672c-4cae-8c2b-c7fc38608dcf
126
+ summarizeBy: none
127
+ sourceColumn: Fiscal445SemesterKey
128
+
129
+ /// Drill-down estándar de Calendario: Año -> Trimestre -> Año mes -> Semana -> Fecha. Útil para visuales que permiten expand/collapse temporal.
130
+ hierarchy 'Jerarquía de fechas'
131
+ lineageTag: 1b532d19-e2dc-4b39-9ec0-7fec1f5e6c8b
132
+
133
+ level Año
134
+ lineageTag: 74148cbb-3e80-4d23-bba8-b003b8ecae99
135
+ column: Año
136
+
137
+ level Trimestre
138
+ lineageTag: db5bc9a3-45f2-4a8f-9a63-2c93a1508470
139
+ column: Trimestre
140
+
141
+ level 'Año mes'
142
+ lineageTag: d37f6098-923f-48bf-aea1-4e7b9f00761c
143
+ column: 'Año mes'
144
+
145
+ level Semana
146
+ lineageTag: a6d53cdc-03d4-4237-b8a9-38e6bfed27d1
147
+ column: Semana
148
+
149
+ level Fecha
150
+ lineageTag: 069c9ce9-c661-432c-8793-18b3ebfbd7fa
151
+ column: Fecha
152
+
153
+ partition 'Calendario M' = m
154
+ mode: import
155
+ queryGroup: Calendario
156
+ source =
157
+ let
158
+ // Lee el parametro de zona horaria para calcular Today rolling.
159
+ OffsetHours = Number.From(ZonaHoraria),
160
+ Today = Date.From(DateTimeZone.SwitchZone(DateTimeZone.UtcNow(), OffsetHours)),
161
+ StartDate = Date.From(FechaInicio),
162
+ // Calendario rolling: arranca en FechaInicio y termina en Today (con timezone).
163
+ DateCount = Duration.Days(Today - StartDate) + 1,
164
+ Dates = List.Dates(StartDate, DateCount, #duration(1, 0, 0, 0)),
165
+ Source = Table.FromList(Dates, Splitter.SplitByNothing(), {"Fecha"}),
166
+ TypedDate = Table.TransformColumnTypes(Source, {{"Fecha", type date}}),
167
+ // Etiquetas en espanol para meses abreviados.
168
+ MonthAbbr = {"Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"},
169
+ // Columnas gregorianas visibles (consumidas por DAX, slicers y ejes).
170
+ AddYear = Table.AddColumn(TypedDate, "Año", each Date.Year([Fecha]), Int64.Type),
171
+ AddMonthNumber = Table.AddColumn(AddYear, "Número de mes", each Date.Month([Fecha]), Int64.Type),
172
+ AddMonth = Table.AddColumn(AddMonthNumber, "Mes", each MonthAbbr{[Número de mes] - 1} & " '" & Text.End(Text.From([Año]), 2), type text),
173
+ AddYearMonth = Table.AddColumn(AddMonth, "Año mes", each Text.From([Año]) & "-" & Text.PadStart(Text.From([Número de mes]), 2, "0"), type text),
174
+ AddYearMonthOrder = Table.AddColumn(AddYearMonth, "Orden año mes", each [Año] * 100 + [Número de mes], Int64.Type),
175
+ AddQuarterNumber = Table.AddColumn(AddYearMonthOrder, "Quarter Nr", each Date.QuarterOfYear([Fecha]), Int64.Type),
176
+ AddQuarter = Table.AddColumn(AddQuarterNumber, "Trimestre", each "Q" & Text.From([Quarter Nr]) & " '" & Text.End(Text.From([Año]), 2), type text),
177
+ AddQuarterOrder = Table.AddColumn(AddQuarter, "Trimestre Orden", each [Año] * 10 + [Quarter Nr], Int64.Type),
178
+ // La semana se etiqueta por su fecha de inicio para leerla facil.
179
+ AddWeek = Table.AddColumn(AddQuarterOrder, "Semana", each let weekStart = Date.StartOfWeek([Fecha], Day.Monday) in "S" & Text.PadStart(Text.From(Date.WeekOfYear([Fecha], Day.Monday)), 2, "0") & " (" & Text.From(Date.Day(weekStart)) & "/" & Text.From(Date.Month(weekStart)) & ")", type text),
180
+ AddWeekOrder = Table.AddColumn(AddWeek, "Semana Orden", each let weekStart = Date.StartOfWeek([Fecha], Day.Monday) in Date.Year(weekStart) * 100 + Date.WeekOfYear(weekStart, Day.Monday), Int64.Type),
181
+ // Columnas fiscales 4-4-5 (ocultas, las consume Aux Periodos para construir presets fiscales).
182
+ AddFiscalYear = Table.AddColumn(AddWeekOrder, "Fiscal445Year", each fxTemplateCalendar445Year([Fecha]), Int64.Type),
183
+ AddFiscalMonthNr = Table.AddColumn(AddFiscalYear, "Fiscal445MonthNr", each fxTemplateCalendar445MonthNr([Fecha]), Int64.Type),
184
+ AddFiscalQuarterNr = Table.AddColumn(AddFiscalMonthNr, "Fiscal445QuarterNr", each Number.IntegerDivide([Fiscal445MonthNr] - 1, 3) + 1, Int64.Type),
185
+ AddFiscalSemesterNr = Table.AddColumn(AddFiscalQuarterNr, "Fiscal445SemesterNr", each if [Fiscal445MonthNr] <= 6 then 1 else 2, Int64.Type),
186
+ AddFiscalMonthKey = Table.AddColumn(AddFiscalSemesterNr, "Fiscal445MonthKey", each [Fiscal445Year] * 100 + [Fiscal445MonthNr], Int64.Type),
187
+ AddFiscalQuarterKey = Table.AddColumn(AddFiscalMonthKey, "Fiscal445QuarterKey", each [Fiscal445Year] * 10 + [Fiscal445QuarterNr], Int64.Type),
188
+ AddFiscalSemesterKey = Table.AddColumn(AddFiscalQuarterKey, "Fiscal445SemesterKey", each [Fiscal445Year] * 10 + [Fiscal445SemesterNr], Int64.Type),
189
+ // Quita columnas auxiliares que no deben quedar visibles.
190
+ RemovedHelpers = Table.RemoveColumns(AddFiscalSemesterKey, {"Quarter Nr"}),
191
+ Reordered = Table.ReorderColumns(RemovedHelpers, {"Fecha", "Año", "Número de mes", "Mes", "Año mes", "Orden año mes", "Trimestre", "Semana", "Trimestre Orden", "Semana Orden", "Fiscal445Year", "Fiscal445MonthNr", "Fiscal445QuarterNr", "Fiscal445SemesterNr", "Fiscal445MonthKey", "Fiscal445QuarterKey", "Fiscal445SemesterKey"})
192
+ in
193
+ Reordered
194
+
195
+ annotation PBI_NavigationStepName = Navegación
196
+
197
+ annotation PBI_ResultType = Table
198
+
@@ -0,0 +1,59 @@
1
+ /// Dimension de canales de venta sintética, cargada desde Power Query para que el sample dataset no dependa de DAX calculated tables.
2
+ table Canales
3
+ lineageTag: 8271174d-1f18-43d9-ad8e-370998b8d018
4
+
5
+ column CanalId
6
+ dataType: string
7
+ isHidden
8
+ lineageTag: c9c93f4f-3a85-4e54-ac8d-0a0b70be1d19
9
+ summarizeBy: none
10
+ sourceColumn: CanalId
11
+
12
+ annotation SummarizationSetBy = Automatic
13
+
14
+ column Canal
15
+ dataType: string
16
+ lineageTag: 08a98eb8-a791-4152-95d7-4e19d120f890
17
+ summarizeBy: none
18
+ sourceColumn: Canal
19
+
20
+ column 'Tipo de canal'
21
+ dataType: string
22
+ lineageTag: 0ffdfecc-0590-4bbf-8fe4-88976ec80165
23
+ summarizeBy: none
24
+ sourceColumn: Tipo Canal
25
+
26
+ /// Drill-down de canales: Tipo de canal -> Canal.
27
+ hierarchy 'Jerarquía de canales'
28
+ lineageTag: 71851210-3fe5-4b08-952f-0be1ca0869cc
29
+
30
+ level 'Tipo de canal'
31
+ lineageTag: e384b060-dce2-4831-b447-54f7f783f26d
32
+ column: 'Tipo de canal'
33
+
34
+ level Canal
35
+ lineageTag: 13f2950d-1530-4077-b9d9-418929ea4cfb
36
+ column: Canal
37
+
38
+ partition Canales = m
39
+ mode: import
40
+ queryGroup: 'Sample Dataset'
41
+ source =
42
+ let
43
+ Source = #table(
44
+ type table [CanalId = Int64.Type, Canal = text, #"Tipo Canal" = text],
45
+ {
46
+ { 1, "Directo", "Owned" },
47
+ { 2, "Partner", "Indirecto" },
48
+ { 3, "Marketplace", "Digital" },
49
+ { 4, "Outbound", "Sales-led" }
50
+ }
51
+ ),
52
+ #"Tipo cambiado" = Table.TransformColumnTypes(Source,{{"CanalId", type text}, {"Canal", type text}, {"Tipo Canal", type text}})
53
+ in
54
+ #"Tipo cambiado"
55
+
56
+ annotation PBI_NavigationStepName = Navegación
57
+
58
+ annotation PBI_ResultType = Table
59
+
@@ -0,0 +1,120 @@
1
+ /// Dimensión sintética de clientes con 210 empresas de Latinoamérica y España, cargada desde Power Query para que el sample dataset no dependa de DAX calculated tables.
2
+ table Clientes
3
+ lineageTag: 54ff947e-7506-466e-9b73-bff64c48595f
4
+
5
+ column ClienteId
6
+ dataType: string
7
+ isHidden
8
+ lineageTag: 2f987211-80a8-4f05-9eb7-da2c4dd9ea62
9
+ summarizeBy: none
10
+ sourceColumn: ClienteId
11
+
12
+ annotation SummarizationSetBy = Automatic
13
+
14
+ column Cliente
15
+ dataType: string
16
+ lineageTag: fecfa652-2fa2-473c-864c-7d09d7e648a9
17
+ summarizeBy: none
18
+ sourceColumn: Cliente
19
+
20
+ column Segmento
21
+ dataType: string
22
+ lineageTag: 36d442f5-31d1-4ab8-a1ba-11245bb9ad8f
23
+ summarizeBy: none
24
+ sourceColumn: Segmento
25
+
26
+ column País
27
+ dataType: string
28
+ lineageTag: 42ffd8c8-2cf0-4a05-ba20-6f66604f4ac1
29
+ summarizeBy: none
30
+ sourceColumn: Pais
31
+
32
+ /// Drill-down de clientes por geografía y segmento: País -> Segmento -> Cliente.
33
+ hierarchy 'Jerarquía cliente'
34
+ lineageTag: 1d161dd7-61e9-4d09-a0f7-e3f4f26ebe00
35
+
36
+ level País
37
+ lineageTag: adf1fd83-c944-4965-a35a-ea2004e353c4
38
+ column: País
39
+
40
+ level Segmento
41
+ lineageTag: 48391495-ee0e-4630-9ad5-a9c2c13afd65
42
+ column: Segmento
43
+
44
+ level Cliente
45
+ lineageTag: 9d1261b1-4c3b-4d2e-bc48-424ae929a18d
46
+ column: Cliente
47
+
48
+ partition Clientes = m
49
+ mode: import
50
+ queryGroup: 'Sample Dataset'
51
+ source =
52
+ let
53
+ Base = Table.FromList(List.Numbers(1, 210), Splitter.SplitByNothing(), {"ClienteId"}),
54
+ AddCountryId = Table.AddColumn(Base, "CountryId", each Number.Mod([ClienteId] - 1, 21) + 1, Int64.Type),
55
+ AddCompanySlot = Table.AddColumn(AddCountryId, "CompanySlot", each Number.IntegerDivide([ClienteId] - 1, 21) + 1, Int64.Type),
56
+ AddPais = Table.AddColumn(
57
+ AddCompanySlot,
58
+ "Pais",
59
+ each
60
+ if [CountryId] = 1 then "Argentina"
61
+ else if [CountryId] = 2 then "Bolivia"
62
+ else if [CountryId] = 3 then "Brasil"
63
+ else if [CountryId] = 4 then "Chile"
64
+ else if [CountryId] = 5 then "Colombia"
65
+ else if [CountryId] = 6 then "Costa Rica"
66
+ else if [CountryId] = 7 then "Cuba"
67
+ else if [CountryId] = 8 then "Ecuador"
68
+ else if [CountryId] = 9 then "El Salvador"
69
+ else if [CountryId] = 10 then "Guatemala"
70
+ else if [CountryId] = 11 then "Haiti"
71
+ else if [CountryId] = 12 then "Honduras"
72
+ else if [CountryId] = 13 then "Mexico"
73
+ else if [CountryId] = 14 then "Nicaragua"
74
+ else if [CountryId] = 15 then "Panama"
75
+ else if [CountryId] = 16 then "Paraguay"
76
+ else if [CountryId] = 17 then "Peru"
77
+ else if [CountryId] = 18 then "Republica Dominicana"
78
+ else if [CountryId] = 19 then "Uruguay"
79
+ else if [CountryId] = 20 then "Venezuela"
80
+ else "España",
81
+ type text
82
+ ),
83
+ AddCompanyList = Table.AddColumn(
84
+ AddPais,
85
+ "CompanyList",
86
+ each
87
+ if [CountryId] = 1 then "Mercado Libre|Globant|YPF|Arcor|Techint|Banco Galicia|Aerolineas Argentinas|Telecom Argentina|Banco Macro|Despegar"
88
+ else if [CountryId] = 2 then "YPFB|Banco Nacional de Bolivia|Banco Mercantil Santa Cruz|Entel Bolivia|Cerveceria Boliviana Nacional|Sofia Ltda|PIL Andina|Tigo Bolivia|Fancesa|Imcruz"
89
+ else if [CountryId] = 3 then "Petrobras|Vale|Itau Unibanco|Bradesco|Ambev|Natura|Embraer|Magazine Luiza|Nubank|Localiza"
90
+ else if [CountryId] = 4 then "Cencosud|Falabella|LATAM Airlines|Banco de Chile|SQM|Copec|Enel Chile|Entel Chile|CCU|Ripley"
91
+ else if [CountryId] = 5 then "Ecopetrol|Bancolombia|Grupo Aval|Rappi|Avianca|Grupo Exito|Bavaria|Grupo Sura|Grupo Nutresa|Terpel"
92
+ else if [CountryId] = 6 then "FIFCO|BAC Credomatic|Dos Pinos|Florida Ice and Farm|Banco Nacional de Costa Rica|Kolbi|Auto Mercado|Grupo Purdy|Cafe Britt|Coopenae"
93
+ else if [CountryId] = 7 then "Cubana de Aviacion|ETECSA|Habanos|CIMEX|Gaviota|Havana Club|TRD Caribe|Banco Metropolitano|BioCubaFarma|Cubatur"
94
+ else if [CountryId] = 8 then "Banco Pichincha|Corporacion Favorita|Pronaca|Banco Guayaquil|CNT Ecuador|Tonicorp|La Fabril|Diners Club Ecuador|Supermaxi|Cerveceria Nacional Ecuador"
95
+ else if [CountryId] = 9 then "Grupo Calleja|Banco Agricola|Tigo El Salvador|Avianca El Salvador|La Constancia|Super Selectos|Davivienda El Salvador|Grupo Q|Pollo Campero El Salvador|AES El Salvador"
96
+ else if [CountryId] = 10 then "Pollo Campero|Banco Industrial|Tigo Guatemala|Cementos Progreso|Cerveceria Centro Americana|Grupo Pantaleon|Banco G&T Continental|Corporacion Multi Inversiones|CBC Guatemala|Agexport"
97
+ else if [CountryId] = 11 then "Digicel Haiti|Sogebank|Unibank Haiti|Rhum Barbancourt|Natcom Haiti|Comme Il Faut|Sunrise Airways|Brasserie Nationale d'Haiti|Valerio Canez|Caribbean Bottling"
98
+ else if [CountryId] = 12 then "Banco Atlantida|Tigo Honduras|Ficohsa|Cerveceria Hondurena|Diunsa|Grupo Terra|Supermercados La Colonia|Banco de Occidente Honduras|Lacthosa|Espresso Americano"
99
+ else if [CountryId] = 13 then "America Movil|Cemex|Grupo Bimbo|FEMSA|Banorte|Televisa|Grupo Modelo|Liverpool|Walmex|Aeromexico"
100
+ else if [CountryId] = 14 then "Banpro|Lafise Bancentro|Tigo Nicaragua|Claro Nicaragua|Flor de Cana|Grupo Pellas|Casa Pellas|Cargill Nicaragua|La Colonia Nicaragua|Agricorp"
101
+ else if [CountryId] = 15 then "Copa Airlines|Banco General|Bladex|Cable & Wireless Panama|Grupo Melo|Super 99|Rey Holdings|Cerveceria Nacional Panama|Banistmo|ASSA Seguros"
102
+ else if [CountryId] = 16 then "Banco Continental|Tigo Paraguay|Personal Paraguay|Cervepar|Inverfin|Vision Banco|Superseis|Chacomer|Banco Itau Paraguay|Copetrol"
103
+ else if [CountryId] = 17 then "Alicorp|Interbank|Banco de Credito del Peru|Backus|Credicorp|Ferreycorp|InRetail|Aenza|Volcan|Belcorp"
104
+ else if [CountryId] = 18 then "Grupo Popular|Banco BHD|Cerveceria Nacional Dominicana|Claro Dominicana|Altice Dominicana|Grupo Rica|Casa Brugal|Punta Cana Group|Banreservas|Aerodom"
105
+ else if [CountryId] = 19 then "ANCAP|Antel|Banco Republica|Conaprole|PedidosYa|Zonamerica|Tienda Inglesa|Montevideo Refrescos|Abitab|Ta-Ta"
106
+ else if [CountryId] = 20 then "PDVSA|Empresas Polar|Banco Mercantil|Digitel|Movistar Venezuela|Banesco|Farmatodo|Ron Santa Teresa|CANTV|Avior Airlines"
107
+ else "Telefonica|Santander|BBVA|Inditex|Iberdrola|Repsol|CaixaBank|Ferrovial|Mapfre|Mercadona",
108
+ type text
109
+ ),
110
+ AddCliente = Table.AddColumn(AddCompanyList, "Cliente", each Text.Split([CompanyList], "|"){[CompanySlot] - 1}, type text),
111
+ AddSegmento = Table.AddColumn(AddCliente, "Segmento", each if [CompanySlot] <= 3 then "Enterprise" else if [CompanySlot] <= 7 then "Mid Market" else "SMB", type text),
112
+ Result = Table.SelectColumns(AddSegmento, {"ClienteId", "Cliente", "Segmento", "Pais"}),
113
+ #"Tipo cambiado" = Table.TransformColumnTypes(Result,{{"ClienteId", type text}, {"Cliente", type text}, {"Segmento", type text}, {"Pais", type text}})
114
+ in
115
+ #"Tipo cambiado"
116
+
117
+ annotation PBI_NavigationStepName = Navegación
118
+
119
+ annotation PBI_ResultType = Table
120
+
@@ -0,0 +1,48 @@
1
+ /// Parámetros técnicos del modelo expuestos hacia DAX. Los valores vienen de parámetros de Power Query; Zona Horaria usa offset UTC simple, por ejemplo -3 para Buenos Aires.
2
+ table 'Modelo Configuración'
3
+ isHidden
4
+ lineageTag: 44275a58-c4cf-447c-843f-7a091b2de9dc
5
+
6
+ column Configuración
7
+ dataType: string
8
+ isNullable: false
9
+ lineageTag: 87493a2e-a4f7-4d34-b4a3-42e492eeaa6a
10
+ summarizeBy: none
11
+ sourceColumn: Configuración
12
+
13
+ column Valor
14
+ dataType: double
15
+ lineageTag: 55a982d0-34dd-46e8-ab29-e79506316bac
16
+ summarizeBy: none
17
+ sourceColumn: Valor
18
+
19
+ /// Valor de texto para parametros de modelo que no son numericos, como MonedaBase.
20
+ column ValorTexto
21
+ dataType: string
22
+ isNullable: false
23
+ lineageTag: 6ffd4e9b-4f87-4314-b5df-6e479e1be726
24
+ summarizeBy: none
25
+ sourceColumn: ValorTexto
26
+
27
+ partition 'Modelo Configuración' = m
28
+ mode: import
29
+ queryGroup: Params
30
+ source =
31
+ let
32
+ // Tabla puente para que DAX lea parametros de Power Query.
33
+ Source = #table(
34
+ type table [Configuración = text, Valor = number, ValorTexto = text],
35
+ {
36
+ // Zona Horaria viene del parametro editable ZonaHoraria.
37
+ { "Zona Horaria", Number.From(ZonaHoraria), "" },
38
+ // Moneda Base define la moneda pivote del modelo y el default de visualizacion.
39
+ { "Moneda Base", 0, Text.From(MonedaBase) }
40
+ }
41
+ )
42
+ in
43
+ Source
44
+
45
+ annotation PBI_NavigationStepName = Navegación
46
+
47
+ annotation PBI_ResultType = Table
48
+
@@ -0,0 +1,43 @@
1
+ /// Selector desconectado de moneda de reporte, cargado desde Power Query para mantener el dataset de ejemplo fuera de DAX.
2
+ table Monedas
3
+ lineageTag: b7ee2bd9-23b2-416d-8794-e70029e343e8
4
+
5
+ column Moneda
6
+ dataType: string
7
+ lineageTag: 32e5f3f6-0e89-4a45-99af-d22fed0b43ef
8
+ summarizeBy: none
9
+ sourceColumn: Moneda
10
+
11
+ column Símbolo
12
+ dataType: string
13
+ lineageTag: 94423e83-79d8-496b-8503-771be16c228c
14
+ summarizeBy: none
15
+ sourceColumn: Simbolo
16
+
17
+ column Orden
18
+ dataType: int64
19
+ isHidden
20
+ lineageTag: ba2a6509-9118-492d-a6e6-cb80f60f44be
21
+ summarizeBy: none
22
+ sourceColumn: Orden
23
+
24
+ partition Monedas = m
25
+ mode: import
26
+ queryGroup: 'Sample Dataset'
27
+ source =
28
+ let
29
+ Source = #table(
30
+ type table [Moneda = text, Simbolo = text, Orden = Int64.Type],
31
+ {
32
+ { "USD", "$", 1 },
33
+ { "ARS", "$AR", 2 },
34
+ { "EUR", "€", 3 }
35
+ }
36
+ )
37
+ in
38
+ Source
39
+
40
+ annotation PBI_NavigationStepName = Navegación
41
+
42
+ annotation PBI_ResultType = Table
43
+