@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,3 @@
1
+ database
2
+ compatibilityLevel: 1702
3
+
@@ -0,0 +1,233 @@
1
+ /// Power Query helper that returns the ISO week number for a date. Used by the parallel M period-comparison prototype.
2
+ expression fxTemplateIsoWeek =
3
+ (dateValue as date) as number =>
4
+ let
5
+ // ISO 8601 usa lunes como inicio de semana.
6
+ dayIndex = Date.DayOfWeek(dateValue, Day.Monday),
7
+ // El jueves define a que año ISO pertenece la semana.
8
+ thursday = Date.AddDays(dateValue, 3 - dayIndex),
9
+ isoYear = Date.Year(thursday),
10
+ // El 4 de enero siempre cae dentro de la semana ISO 1.
11
+ firstThursday = #date(isoYear, 1, 4),
12
+ firstWeekStart = Date.StartOfWeek(firstThursday, Day.Monday),
13
+ weekStart = Date.StartOfWeek(dateValue, Day.Monday),
14
+ // Divide los dias transcurridos en bloques de 7 dias.
15
+ week = Number.IntegerDivide(Duration.Days(weekStart - firstWeekStart), 7) + 1
16
+ in
17
+ week
18
+ lineageTag: 8177d19e-7f3b-4eb2-a9b4-13ed978a2925
19
+ queryGroup: Calendario
20
+
21
+ annotation PBI_NavigationStepName = Navegación
22
+
23
+ annotation PBI_ResultType = Function
24
+
25
+ /// Power Query helper matching the template DAX Calendar445Year approximation.
26
+ expression fxTemplateCalendar445Year =
27
+ (dateValue as date) as number =>
28
+ let
29
+ // Reutiliza la misma ancla semanal que el calendario ISO.
30
+ dayIndex = Date.DayOfWeek(dateValue, Day.Monday),
31
+ // Mover al jueves estabiliza semanas que cruzan de año.
32
+ fiscalAnchorDate = Date.AddDays(dateValue, 3 - dayIndex)
33
+ in
34
+ Date.Year(fiscalAnchorDate)
35
+ lineageTag: bc114851-859b-4070-8a1f-94277a765443
36
+ queryGroup: Calendario
37
+
38
+ annotation PBI_NavigationStepName = Navegación
39
+
40
+ annotation PBI_ResultType = Function
41
+
42
+ /// Power Query helper matching the template DAX Calendar445MonthNr 4-4-5 approximation.
43
+ expression fxTemplateCalendar445MonthNr =
44
+ (dateValue as date) as number =>
45
+ let
46
+ // Primero calcula la semana ISO de la fecha.
47
+ weekNr = fxTemplateIsoWeek(dateValue),
48
+ // El patron 4-4-5 agrupa semanas en meses fiscales.
49
+ fiscalMonth =
50
+ if weekNr <= 4 then 1
51
+ else if weekNr <= 8 then 2
52
+ else if weekNr <= 13 then 3
53
+ else if weekNr <= 17 then 4
54
+ else if weekNr <= 21 then 5
55
+ else if weekNr <= 26 then 6
56
+ else if weekNr <= 30 then 7
57
+ else if weekNr <= 34 then 8
58
+ else if weekNr <= 39 then 9
59
+ else if weekNr <= 43 then 10
60
+ else if weekNr <= 47 then 11
61
+ else 12
62
+ in
63
+ fiscalMonth
64
+ lineageTag: 92f3a8a4-5c4d-4efc-a8f9-3a4d0a9d4b9b
65
+ queryGroup: Calendario
66
+
67
+ annotation PBI_NavigationStepName = Navegación
68
+
69
+ annotation PBI_ResultType = Function
70
+
71
+ /// Query helper para listar las vistas de calendario disponibles que alimentan los periodos y comparaciones M.
72
+ expression 'Calendar Types' =
73
+ let
74
+ // Lista las vistas de calendario que el usuario puede elegir.
75
+ Source = #table(
76
+ type table [#"Calendar Type" = text, #"Calendar Type Fields" = text, #"Calendar Type Order" = Int64.Type],
77
+ {
78
+ // Orden 1: calendario fiscal semanal 4-4-5.
79
+ {"Semanal 4-4-5", "Semanal 4-4-5", 1},
80
+ // Orden 2: calendario gregoriano tradicional.
81
+ {"Gregoriano", "Gregoriano", 2}
82
+ }
83
+ )
84
+ in
85
+ Source
86
+ lineageTag: c0c58cf0-e2ee-41ad-b48d-41a4177e34ee
87
+ queryGroup: Calendario
88
+
89
+ annotation PBI_NavigationStepName = Navegación
90
+
91
+ annotation PBI_ResultType = Table
92
+
93
+ /// Query editable por el usuario para elegir que periodos quedan disponibles. Quitar filas aca quita opciones de Aux Periodos al refrescar.
94
+ expression 'Calendar Period Presets' =
95
+ let
96
+ // Catalogo editable de periodos disponibles para el slicer.
97
+ // Si borras una fila, desaparece del modelo al refrescar.
98
+ Source = #table(
99
+ type table [#"Período" = text, Period = text, Sort = Int64.Type],
100
+ {
101
+ {"Hoy", "Today", 1},
102
+ {"Ayer", "Yesterday", 2},
103
+ {"Anteayer", "Before yesterday", 3},
104
+ {"Últimos 7 días", "Last 7 days", 4},
105
+ {"7 días previos", "Previous 7 days", 5},
106
+ {"Últimos 30 días", "Last 30 days", 6},
107
+ {"30 días previos", "Previous 30 days", 7},
108
+ {"Últimos 90 días", "Last 90 days", 8},
109
+ {"90 días previos", "Previous 90 days", 9},
110
+ {"Últimos 180 días", "Last 180 days", 10},
111
+ {"180 días previos", "Previous 180 days", 11},
112
+ {"Últimos 365 días", "Last 365 days", 12},
113
+ {"365 días previos", "Previous 365 days", 13},
114
+ {"Esta semana", "This week", 14},
115
+ {"Semana pasada hasta la fecha", "Last week to date", 15},
116
+ {"Semana pasada completa", "Last week complete", 16},
117
+ {"2 semanas atrás", "2 weeks ago", 17},
118
+ {"Esta semana del año previo", "This week last year", 18},
119
+ {"Semana pasada del año previo", "Last week last year", 19},
120
+ {"Este mes", "This month", 20},
121
+ {"Mes pasado hasta la fecha", "Last month to date", 21},
122
+ {"Mes pasado completo", "Last month complete", 22},
123
+ {"2 meses atrás", "2 months ago", 23},
124
+ {"Este mes del año previo", "This month last year", 24},
125
+ {"Mes pasado del año previo", "Last month last year", 25},
126
+ {"Este trimestre", "This quarter", 26},
127
+ {"Trimestre pasado hasta la fecha", "Last quarter to date", 27},
128
+ {"Trimestre pasado completo", "Last quarter complete", 28},
129
+ {"2 trimestres atrás", "2 quarters ago", 29},
130
+ {"Este trimestre del año previo", "This quarter last year", 30},
131
+ {"Trimestre pasado del año previo", "Last quarter last year", 31},
132
+ {"Este semestre", "This semester", 32},
133
+ {"Semestre pasado", "Last semester", 33},
134
+ {"Semestre pasado hasta la fecha", "Last semester to date", 34},
135
+ {"Semestre pasado completo", "Last semester complete", 35},
136
+ {"2 semestres atrás", "2 semesters ago", 36},
137
+ {"Este semestre del año previo", "This semester last year", 37},
138
+ {"Semestre pasado del año previo", "Last semester last year", 38},
139
+ {"Este año", "This year", 39},
140
+ {"Año pasado completo", "Last year complete", 40},
141
+ {"Año pasado hasta la fecha", "Last year to date", 41},
142
+ {"2 años atrás", "2 years ago", 42},
143
+ {"Histórico", "All time", 43}
144
+ }
145
+ )
146
+ in
147
+ Source
148
+ lineageTag: 9c95f308-8206-4056-86d4-8a2f2b419ee5
149
+ queryGroup: Calendario
150
+
151
+ annotation PBI_NavigationStepName = Navegación
152
+
153
+ annotation PBI_ResultType = Table
154
+
155
+ /// Query editable por el usuario para elegir que comparaciones quedan disponibles. Quitar filas aca quita opciones de Aux Comparaciones al refrescar.
156
+ expression 'Calendar Comparison Presets' =
157
+ let
158
+ // Catalogo editable de comparaciones entre periodo actual y previo.
159
+ // Sort conecta cada comparacion con el mapa de rangos.
160
+ Source = #table(
161
+ type table [Sort = Int64.Type, #"Current period (vs. previous period)" = text, #"Período actual (vs. período previo)" = text],
162
+ {
163
+ {1, "Today (vs. Yesterday)", "Hoy (vs. Ayer)"},
164
+ {2, "Yesterday (vs. Before yesterday)", "Ayer (vs. Anteayer)"},
165
+ {9, "This week (vs. last week to date)", "Este semana (vs. semana pasada hasta la fecha)"},
166
+ {10, "This week (vs. last week complete)", "Este semana (vs. semana pasada completo)"},
167
+ {11, "This week (vs. same week last year to date)", "Este semana (vs. mismo semana del año pasado hasta la fecha)"},
168
+ {12, "Last week (vs. 2 weeks ago)", "Semana pasada (vs. 2 semanas atrás)"},
169
+ {13, "Last week (vs. same week last year)", "Semana pasada (vs. mismo semana del año pasado)"},
170
+ {14, "This month (vs. last month to date)", "Este mes (vs. mes pasado hasta la fecha)"},
171
+ {15, "This month (vs. last month complete)", "Este mes (vs. mes pasado completo)"},
172
+ {16, "This month (vs. same month last year to date)", "Este mes (vs. mismo mes del año pasado hasta la fecha)"},
173
+ {17, "Last month (vs. 2 months ago)", "Mes pasado (vs. 2 meses atrás)"},
174
+ {18, "Last month (vs. same month last year)", "Mes pasado (vs. mismo mes del año pasado)"},
175
+ {19, "This quarter (vs. last quarter to date)", "Este trimestre (vs. trimestre pasado hasta la fecha)"},
176
+ {20, "This quarter (vs. last quarter complete)", "Este trimestre (vs. trimestre pasado completo)"},
177
+ {21, "This quarter (vs. same quarter last year to date)", "Este trimestre (vs. mismo trimestre del año pasado hasta la fecha)"},
178
+ {22, "Last quarter (vs. 2 quarters ago)", "Trimestre pasado (vs. 2 trimestres atrás)"},
179
+ {23, "Last quarter (vs. same quarter last year)", "Trimestre pasado (vs. mismo trimestre del año pasado)"},
180
+ {24, "This semester (vs. last semester to date)", "Este semestre (vs. semestre pasado hasta la fecha)"},
181
+ {25, "This semester (vs. last semester complete)", "Este semestre (vs. semestre pasado completo)"},
182
+ {26, "This semester (vs. same semester last year to date)", "Este semestre (vs. mismo semestre del año pasado hasta la fecha)"},
183
+ {27, "Last semester (vs. 2 semesters ago)", "Semestre pasado (vs. 2 semestres atrás)"},
184
+ {28, "Last semester (vs. same semester last year)", "Semestre pasado (vs. mismo semestre del año pasado)"},
185
+ {29, "This year (vs. last year to date)", "Este año (vs. año pasado hasta la fecha)"},
186
+ {30, "This year (vs. last year complete)", "Este año (vs. año pasado completo)"},
187
+ {31, "This year (vs. All Time)", "Este año (vs. histórico)"},
188
+ {32, "Last year (vs. previous year)", "Año pasado (vs. año anterior)"},
189
+ {33, "All Time (vs. All Time)", "Histórico (vs. Histórico)"}
190
+ }
191
+ )
192
+ in
193
+ Source
194
+ lineageTag: a126c29e-71e5-484a-94f7-ceb252f5c965
195
+ queryGroup: Calendario
196
+
197
+ annotation PBI_NavigationStepName = Navegación
198
+
199
+ annotation PBI_ResultType = Table
200
+
201
+ /// Parametro de Power Query que define la fecha inicial del calendario del template.
202
+ expression FechaInicio =
203
+ // Fecha inicial del calendario del template.
204
+ // Cambiar este parametro agranda o achica la tabla de fechas.
205
+ #date(2023, 1, 1) meta [IsParameterQuery=true, Type="Date", IsParameterQueryRequired=true]
206
+ lineageTag: c49bce2a-539e-46c9-9554-9bba49ca7580
207
+ queryGroup: Params
208
+
209
+ annotation PBI_ResultType = Date
210
+
211
+ annotation PBI_NavigationStepName = Navegación
212
+
213
+ /// Parametro de Power Query que define el offset horario UTC del template. Ejemplo: -3 para Buenos Aires.
214
+ expression ZonaHoraria =
215
+ // Offset UTC usado para calcular la fecha actual del modelo.
216
+ // Buenos Aires usa -3; España suele usar 1 o 2 segun horario.
217
+ -3 meta [IsParameterQuery=true, Type="Number", IsParameterQueryRequired=true]
218
+ lineageTag: f11ac853-0898-4e54-ac32-115848938226
219
+ queryGroup: Params
220
+
221
+ annotation PBI_ResultType = Number
222
+
223
+ annotation PBI_NavigationStepName = Navegación
224
+
225
+ /// Parametro de Power Query que define la moneda base del modelo y la moneda default de visualizacion.
226
+ expression MonedaBase = "USD" meta [IsParameterQuery=true, Type="Text", IsParameterQueryRequired=true]
227
+ lineageTag: 49a97699-aa32-43e9-a7c6-8f42299f36a1
228
+ queryGroup: Params
229
+
230
+ annotation PBI_ResultType = Text
231
+
232
+ annotation PBI_NavigationStepName = Navegación
233
+
@@ -0,0 +1,247 @@
1
+ /// Devuelve el tipo de cambio de una moneda hacia la moneda base definida por MonedaBase para una fecha; la moneda base devuelve 1 sin depender de la tabla de tasas.
2
+ function GetExchangeRate =
3
+ ( currency : STRING, rateDate : DATETIME ) =>
4
+ VAR __BaseCurrency =
5
+ COALESCE (
6
+ MAXX (
7
+ FILTER (
8
+ 'Modelo Configuración',
9
+ 'Modelo Configuración'[Configuración] = "Moneda Base"
10
+ ),
11
+ 'Modelo Configuración'[ValorTexto]
12
+ ),
13
+ "USD"
14
+ )
15
+ VAR __Currency = COALESCE ( currency, __BaseCurrency )
16
+ VAR __SafeDate =
17
+ IF (
18
+ ISBLANK ( rateDate ),
19
+ CALCULATE (
20
+ MAX ( 'Tipo de cambio'[Fecha] ),
21
+ REMOVEFILTERS ( 'Tipo de cambio' )
22
+ ),
23
+ rateDate
24
+ )
25
+ RETURN
26
+ IF (
27
+ __Currency = __BaseCurrency,
28
+ 1,
29
+ VAR __LastAvailableDate =
30
+ CALCULATE (
31
+ MAX ( 'Tipo de cambio'[Fecha] ),
32
+ REMOVEFILTERS ( 'Tipo de cambio' ),
33
+ 'Tipo de cambio'[Moneda] = __Currency,
34
+ 'Tipo de cambio'[Fecha] <= __SafeDate
35
+ )
36
+ VAR __Rate =
37
+ CALCULATE (
38
+ MAX ( 'Tipo de cambio'[TipoCambioBase] ),
39
+ REMOVEFILTERS ( 'Tipo de cambio' ),
40
+ 'Tipo de cambio'[Moneda] = __Currency,
41
+ 'Tipo de cambio'[Fecha] = __LastAvailableDate
42
+ )
43
+ RETURN
44
+ COALESCE ( __Rate, 1 )
45
+ )
46
+ lineageTag: eaeb396c-d336-4383-9809-420213485325
47
+
48
+ /// Convierte un importe desde una moneda origen hacia una moneda destino usando la moneda base definida por MonedaBase como pivote.
49
+ function ConvertCurrency =
50
+ ( amount : NUMERIC, fromCurrency : STRING, toCurrency : STRING, rateDate : DATETIME ) =>
51
+ IF (
52
+ ISBLANK ( amount ),
53
+ BLANK (),
54
+ VAR __BaseCurrency =
55
+ COALESCE (
56
+ MAXX (
57
+ FILTER (
58
+ 'Modelo Configuración',
59
+ 'Modelo Configuración'[Configuración] = "Moneda Base"
60
+ ),
61
+ 'Modelo Configuración'[ValorTexto]
62
+ ),
63
+ "USD"
64
+ )
65
+ VAR __FromCurrency = COALESCE ( fromCurrency, __BaseCurrency )
66
+ VAR __ToCurrency = COALESCE ( toCurrency, __BaseCurrency )
67
+ RETURN
68
+ IF (
69
+ __FromCurrency = __ToCurrency,
70
+ amount,
71
+ VAR __RateToBase = GetExchangeRate ( __FromCurrency, rateDate )
72
+ VAR __RateFromBase = GetExchangeRate ( __ToCurrency, rateDate )
73
+ RETURN
74
+ DIVIDE ( amount, __RateToBase ) * __RateFromBase
75
+ )
76
+ )
77
+ lineageTag: 6015e897-8732-43b5-ba6f-46d586d5ce00
78
+
79
+ /// Devuelve el año fiscal semanal aproximado 4-4-5 para una fecha. Sirve para comparar calendarios de retail contra calendario gregoriano.
80
+ function Calendar445Year =
81
+ ( DateValue : DATETIME ) =>
82
+ // Guardamos la fecha de entrada con un nombre corto para leer mejor el cálculo.
83
+ VAR __Date = DateValue
84
+ // Movemos la fecha hacia el jueves de su semana para estimar el año fiscal semanal.
85
+ VAR __FiscalAnchorDate = __Date - WEEKDAY ( __Date, 2 ) + 4
86
+ // Si la fecha viene en blanco devolvemos BLANK; si no, devolvemos el año fiscal estimado.
87
+ RETURN
88
+ IF ( ISBLANK ( __Date ), BLANK (), YEAR ( __FiscalAnchorDate ) )
89
+ lineageTag: 66eb01d4-c444-474f-8d1b-b3da5cb58aa5
90
+
91
+ /// Devuelve el mes fiscal aproximado de un calendario semanal 4-4-5 para una fecha. Es una aproximación didáctica para el template.
92
+ function Calendar445MonthNr =
93
+ ( DateValue : DATETIME ) =>
94
+ // Guardamos la fecha de entrada con un nombre corto para leer mejor el cálculo.
95
+ VAR __Date = DateValue
96
+ // Calculamos la semana ISO del año para ubicar la fecha dentro del calendario 4-4-5.
97
+ VAR __WeekNr = WEEKNUM ( __Date, 21 )
98
+ // Convertimos el número de semana a un mes fiscal aproximado siguiendo bloques 4-4-5.
99
+ VAR __FiscalMonth =
100
+ SWITCH (
101
+ TRUE (),
102
+ __WeekNr <= 4, 1,
103
+ __WeekNr <= 8, 2,
104
+ __WeekNr <= 13, 3,
105
+ __WeekNr <= 17, 4,
106
+ __WeekNr <= 21, 5,
107
+ __WeekNr <= 26, 6,
108
+ __WeekNr <= 30, 7,
109
+ __WeekNr <= 34, 8,
110
+ __WeekNr <= 39, 9,
111
+ __WeekNr <= 43, 10,
112
+ __WeekNr <= 47, 11,
113
+ 12
114
+ )
115
+ // Si la fecha viene en blanco devolvemos BLANK; si no, devolvemos el mes fiscal calculado.
116
+ RETURN
117
+ IF ( ISBLANK ( __Date ), BLANK (), __FiscalMonth )
118
+ lineageTag: af2ea27b-986e-4cb6-ac7a-fa8721391ea6
119
+
120
+ /// Devuelve una tabla de una fila con el calendario elegido, el rango actual y el rango previo. Las medidas Current/Previous usan esta función para no repetir lógica.
121
+ function CalendarContext =
122
+ () =>
123
+ // Leemos qué vista de calendario eligió el usuario; si no eligió nada usamos Gregoriano.
124
+ VAR __CalendarType =
125
+ SELECTEDVALUE ( 'Aux Vista de calendario'[Vista de calendario], "Gregoriano" )
126
+ // Leemos qué comparación eligió el usuario en el slicer de comparaciones.
127
+ VAR __Comparison =
128
+ SELECTEDVALUE ( 'Aux Comparaciones'[Comparación] )
129
+ // Si el usuario no eligió comparación, buscamos la comparación default para esa vista de calendario.
130
+ VAR __DefaultComparison =
131
+ MAXX (
132
+ FILTER (
133
+ ALL ( 'Aux Comparaciones' ),
134
+ 'Aux Comparaciones'[Vista de calendario] = __CalendarType
135
+ && 'Aux Comparaciones'[Orden] = 14
136
+ ),
137
+ 'Aux Comparaciones'[Comparación]
138
+ )
139
+ // Elegimos la comparación final: la seleccionada por el usuario o la default.
140
+ VAR __SelectedComparison =
141
+ COALESCE ( __Comparison, __DefaultComparison )
142
+ // Filtramos la tabla de comparaciones para quedarnos con una sola definición de rangos.
143
+ VAR __SelectedRows =
144
+ FILTER (
145
+ ALL ( 'Aux Comparaciones' ),
146
+ 'Aux Comparaciones'[Vista de calendario] = __CalendarType
147
+ && 'Aux Comparaciones'[Comparación] = __SelectedComparison
148
+ )
149
+ // Devolvemos solo las columnas necesarias con nombres simples para que las medidas las consuman.
150
+ RETURN
151
+ SELECTCOLUMNS (
152
+ __SelectedRows,
153
+ "Calendar Type", 'Aux Comparaciones'[Vista de calendario],
154
+ "Current Start", 'Aux Comparaciones'[FechaCurrentStart],
155
+ "Current End", 'Aux Comparaciones'[FechaCurrentEnd],
156
+ "Previous Start", 'Aux Comparaciones'[FechaPrevioStart],
157
+ "Previous End", 'Aux Comparaciones'[FechaPrevioEnd]
158
+ )
159
+ lineageTag: 411b9c02-2219-4344-9f91-224e5e3f6185
160
+
161
+ /// Devuelve el formato de la métrica seleccionada usando el símbolo visible de Monedas[Símbolo] cuando la métrica es monetaria.
162
+ function FormatoMetricaSeleccionada =
163
+ () =>
164
+ VAR __MetricFormat =
165
+ SELECTEDVALUE ( 'Métricas'[Formato] )
166
+ VAR __CurrencySymbol =
167
+ SELECTEDVALUE ( Monedas[Símbolo] )
168
+ VAR __Monetary =
169
+ SELECTEDVALUE ( 'Métricas'[Monetaria] )
170
+ RETURN
171
+ SWITCH (
172
+ TRUE (),
173
+ ISBLANK ( __MetricFormat ), BLANK (),
174
+ __Monetary = TRUE () && ISBLANK ( __CurrencySymbol ), "$ " & __MetricFormat,
175
+ __Monetary = TRUE (), __CurrencySymbol & " " & __MetricFormat,
176
+ __MetricFormat
177
+ )
178
+ lineageTag: fa141865-229b-4309-9618-aadd1a4e038f
179
+
180
+ /// Devuelve TRUE si alguna columna de la tabla Calendario está en el eje del visual (Fecha / Año / Trimestre / Mes / Año mes / Semana). Las medidas router (Actual, Anterior) usan esto para decidir si respetar el eje del visual o aplicar el rango completo del período. Centralizar el chequeo evita el bug clásico de "agregué una columna nueva al eje y todas las celdas muestran el mismo total".
181
+ function EjeCalendarioEnContexto =
182
+ () =>
183
+ // Devuelve TRUE si el visual donde corre la medida tiene CUALQUIER columna
184
+ // de la tabla Calendario en su eje. Cada granularidad (Fecha, Año, Trimestre,
185
+ // Mes, Año mes, Semana) cuenta como "hay eje temporal" y la medida router
186
+ // debe respetar el filtro de fecha del visual en lugar de aplicar
187
+ // REMOVEFILTERS(Calendario) que recalcula el total del período en cada celda.
188
+ // Si en el futuro la tabla Calendario crece con más columnas-etiqueta
189
+ // (e.g. Bimestre, Cuatrimestre), agregalas acá — un solo punto de cambio.
190
+ ISINSCOPE ( 'Calendario'[Fecha] )
191
+ || ISINSCOPE ( 'Calendario'[Año] )
192
+ || ISINSCOPE ( 'Calendario'[Trimestre] )
193
+ || ISINSCOPE ( 'Calendario'[Mes] )
194
+ || ISINSCOPE ( 'Calendario'[Año mes] )
195
+ || ISINSCOPE ( 'Calendario'[Semana] )
196
+ lineageTag: 6f9014bc-cbde-419a-a944-6770c550d6e1
197
+
198
+ /// Formatea etiquetas compactas usando el símbolo visible de Monedas[Símbolo] para métricas monetarias y abreviando miles/millones para KPI y bullet charts.
199
+ function FormatoValorEtiqueta =
200
+ ( metricValue : NUMERIC ) =>
201
+ VAR __Value = metricValue
202
+ VAR __MetricFormat =
203
+ SELECTEDVALUE ( 'Métricas'[Formato] )
204
+ VAR __CurrencySymbol =
205
+ SELECTEDVALUE ( Monedas[Símbolo] )
206
+ VAR __Monetary =
207
+ SELECTEDVALUE ( 'Métricas'[Monetaria] )
208
+ VAR __IsPercent =
209
+ CONTAINSSTRING ( COALESCE ( __MetricFormat, "" ), "%" )
210
+ VAR __CurrencyPrefix =
211
+ SWITCH (
212
+ TRUE (),
213
+ __Monetary <> TRUE () || ISBLANK ( __Value ), "",
214
+ ISBLANK ( __CurrencySymbol ), "$ ",
215
+ __CurrencySymbol & " "
216
+ )
217
+ VAR __AbsValue =
218
+ ABS ( __Value )
219
+ VAR __Scale =
220
+ SWITCH (
221
+ TRUE (),
222
+ __IsPercent, 1,
223
+ __AbsValue >= 1000000, 1000000,
224
+ __AbsValue >= 1000, 1000,
225
+ 1
226
+ )
227
+ VAR __Suffix =
228
+ SWITCH (
229
+ TRUE (),
230
+ __IsPercent, "",
231
+ __AbsValue >= 1000000, " mill.",
232
+ __AbsValue >= 1000, " mil",
233
+ ""
234
+ )
235
+ VAR __NumberText =
236
+ SWITCH (
237
+ TRUE (),
238
+ ISBLANK ( __Value ), "-",
239
+ __IsPercent, FORMAT ( __Value, "0.0%" ),
240
+ __Scale = 1000000, FORMAT ( DIVIDE ( __Value, __Scale ), "0.#" ),
241
+ __Scale = 1000, FORMAT ( DIVIDE ( __Value, __Scale ), "#,0" ),
242
+ FORMAT ( __Value, "#,0" )
243
+ )
244
+ RETURN
245
+ IF ( ISBLANK ( __Value ), "-", __CurrencyPrefix & __NumberText & __Suffix )
246
+ lineageTag: 958d9e74-4b91-432d-b3b5-a1d5b0bf7792
247
+
@@ -0,0 +1,46 @@
1
+ model Model
2
+ culture: es-AR
3
+ defaultPowerBIDataSourceVersion: powerBI_V3
4
+ discourageImplicitMeasures
5
+ sourceQueryCulture: es-AR
6
+ dataAccessOptions
7
+ legacyRedirects
8
+ returnErrorValuesAsNull
9
+
10
+ queryGroup Params
11
+
12
+ annotation PBI_QueryGroupOrder = 0
13
+
14
+ queryGroup 'Sample Dataset'
15
+
16
+ annotation PBI_QueryGroupOrder = 1
17
+
18
+ queryGroup Calendario
19
+
20
+ annotation PBI_QueryGroupOrder = 2
21
+
22
+ annotation __PBI_TimeIntelligenceEnabled = 0
23
+
24
+ annotation PBI_ProTooling = ["MCP-PBIModeling","DevMode"]
25
+
26
+ annotation PBI_QueryOrder = ["Calendar Types","Calendar Period Presets","Calendar Comparison Presets","fxTemplateIsoWeek","fxTemplateCalendar445Year","fxTemplateCalendar445MonthNr","Aux Períodos","Aux Comparaciones","Calendario","FechaInicio","Modelo Configuración","ZonaHoraria","MonedaBase","Productos","Canales","Monedas","Clientes","Tipo de cambio","Ventas"]
27
+
28
+ ref table 'Aux Vista de calendario'
29
+ ref table Métricas
30
+ ref table 'Aux Ejes temporales'
31
+ ref table 'Aux Vista del valor'
32
+ ref table 'Aux Vista temporal'
33
+ ref table 'Aux Períodos'
34
+ ref table 'Aux Comparaciones'
35
+ ref table 'Aux Dimensiones ventas'
36
+ ref table Calendario
37
+ ref table 'Modelo Configuración'
38
+ ref table Productos
39
+ ref table Canales
40
+ ref table Monedas
41
+ ref table Clientes
42
+ ref table 'Tipo de cambio'
43
+ ref table Ventas
44
+
45
+ ref cultureInfo es-AR
46
+
@@ -0,0 +1,16 @@
1
+ relationship Ventas_ProductoId_Productos_ProductoId
2
+ fromColumn: Ventas.ProductoId
3
+ toColumn: Productos.ProductoId
4
+
5
+ relationship Ventas_ClienteId_Clientes_ClienteId
6
+ fromColumn: Ventas.ClienteId
7
+ toColumn: Clientes.ClienteId
8
+
9
+ relationship Ventas_CanalId_Canales_CanalId
10
+ fromColumn: Ventas.CanalId
11
+ toColumn: Canales.CanalId
12
+
13
+ relationship Ventas_Fecha_Calendario_Fecha
14
+ fromColumn: Ventas.Fecha
15
+ toColumn: Calendario.Fecha
16
+