bi-superpowers 1.0.0

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 (276) hide show
  1. package/.claude-plugin/marketplace.json +31 -0
  2. package/.claude-plugin/plugin.json +34 -0
  3. package/.claude-plugin/skill-manifest.json +79 -0
  4. package/.mcp.json +13 -0
  5. package/.plugin/plugin.json +14 -0
  6. package/LICENSE +21 -0
  7. package/README.md +849 -0
  8. package/bin/build-plugin.js +97 -0
  9. package/bin/cli.js +891 -0
  10. package/bin/commands/autoupdate.js +128 -0
  11. package/bin/commands/build-desktop.js +368 -0
  12. package/bin/commands/create-from-template.js +165 -0
  13. package/bin/commands/diff.js +435 -0
  14. package/bin/commands/install.js +542 -0
  15. package/bin/commands/lint.js +441 -0
  16. package/bin/commands/mcp-setup.js +255 -0
  17. package/bin/commands/session-update.js +204 -0
  18. package/bin/commands/smoke-test.js +20 -0
  19. package/bin/commands/uninstall.js +611 -0
  20. package/bin/commands/update-check.js +427 -0
  21. package/bin/commands/validate-cases.js +264 -0
  22. package/bin/commands/validate-projects.js +426 -0
  23. package/bin/commands/watch.js +251 -0
  24. package/bin/lib/agents.js +62 -0
  25. package/bin/lib/base-template-smoke.js +299 -0
  26. package/bin/lib/claude-hooks.js +160 -0
  27. package/bin/lib/generators/claude-plugin.js +529 -0
  28. package/bin/lib/generators/index.js +116 -0
  29. package/bin/lib/generators/shared.js +257 -0
  30. package/bin/lib/mcp-config.js +835 -0
  31. package/bin/lib/microsoft-mcp.js +206 -0
  32. package/bin/lib/powerbi-mcp-session.js +140 -0
  33. package/bin/lib/skills.js +164 -0
  34. package/bin/lib/template-scaffold.js +366 -0
  35. package/bin/mcp/powerbi-modeling-launcher.js +42 -0
  36. package/bin/postinstall.js +50 -0
  37. package/bin/utils/mcp-detect.js +346 -0
  38. package/bin/utils/tui.js +314 -0
  39. package/commands/bi-connect.md +520 -0
  40. package/commands/bi-dax.md +464 -0
  41. package/commands/bi-kickoff.md +550 -0
  42. package/commands/bi-modeling.md +485 -0
  43. package/commands/bi-performance.md +521 -0
  44. package/commands/bi-powerquery.md +229 -0
  45. package/commands/bi-refactor.md +249 -0
  46. package/commands/bi-scorecard.md +268 -0
  47. package/commands/bi-start.md +272 -0
  48. package/config.example.json +23 -0
  49. package/config.json +23 -0
  50. package/desktop-extension/manifest.json +30 -0
  51. package/desktop-extension/package.json +10 -0
  52. package/desktop-extension/server.js +137 -0
  53. package/package.json +94 -0
  54. package/skills/bi-connect/SKILL.md +522 -0
  55. package/skills/bi-connect/scripts/update-check.js +427 -0
  56. package/skills/bi-dax/SKILL.md +466 -0
  57. package/skills/bi-dax/scripts/update-check.js +427 -0
  58. package/skills/bi-kickoff/SKILL.md +552 -0
  59. package/skills/bi-kickoff/references/flow.html +78 -0
  60. package/skills/bi-kickoff/references/flow.md +62 -0
  61. package/skills/bi-kickoff/scripts/update-check.js +427 -0
  62. package/skills/bi-modeling/SKILL.md +487 -0
  63. package/skills/bi-modeling/scripts/update-check.js +427 -0
  64. package/skills/bi-performance/SKILL.md +523 -0
  65. package/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
  66. package/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
  67. package/skills/bi-performance/scripts/update-check.js +427 -0
  68. package/skills/bi-powerquery/SKILL.md +231 -0
  69. package/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
  70. package/skills/bi-powerquery/references/power-query-standards.md +74 -0
  71. package/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
  72. package/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
  73. package/skills/bi-powerquery/scripts/update-check.js +427 -0
  74. package/skills/bi-refactor/SKILL.md +251 -0
  75. package/skills/bi-refactor/references/flow.md +27 -0
  76. package/skills/bi-refactor/scripts/update-check.js +427 -0
  77. package/skills/bi-scorecard/SKILL.md +270 -0
  78. package/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
  79. package/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
  80. package/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
  81. package/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
  82. package/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
  83. package/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
  84. package/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
  85. package/skills/bi-scorecard/scripts/update-check.js +427 -0
  86. package/skills/bi-start/SKILL.md +274 -0
  87. package/skills/bi-start/scripts/update-check.js +427 -0
  88. package/src/content/base.md +197 -0
  89. package/src/content/mcp-requirements.json +57 -0
  90. package/src/content/routing.md +201 -0
  91. package/src/content/skills/bi-connect.md +493 -0
  92. package/src/content/skills/bi-dax.md +437 -0
  93. package/src/content/skills/bi-kickoff/SKILL.md +523 -0
  94. package/src/content/skills/bi-kickoff/references/flow.html +78 -0
  95. package/src/content/skills/bi-kickoff/references/flow.md +62 -0
  96. package/src/content/skills/bi-modeling.md +458 -0
  97. package/src/content/skills/bi-performance/SKILL.md +494 -0
  98. package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
  99. package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
  100. package/src/content/skills/bi-powerquery/SKILL.md +202 -0
  101. package/src/content/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
  102. package/src/content/skills/bi-powerquery/references/power-query-standards.md +74 -0
  103. package/src/content/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
  104. package/src/content/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
  105. package/src/content/skills/bi-refactor/SKILL.md +222 -0
  106. package/src/content/skills/bi-refactor/references/flow.md +27 -0
  107. package/src/content/skills/bi-scorecard/SKILL.md +241 -0
  108. package/src/content/skills/bi-scorecard/examples/base-template-scorecard-blueprint.expected.json +105 -0
  109. package/src/content/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
  110. package/src/content/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
  111. package/src/content/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
  112. package/src/content/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
  113. package/src/content/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
  114. package/src/content/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
  115. package/src/content/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
  116. package/src/content/skills/bi-start.md +266 -0
  117. package/templates/base-template/AGENTS.md +33 -0
  118. package/templates/base-template/base-template.Report/.platform +11 -0
  119. package/templates/base-template/base-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
  120. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/CY18SU07.json +177 -0
  121. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
  122. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleCityPark.json +26 -0
  123. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleDefault.json +26 -0
  124. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleNeutral.json +26 -0
  125. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleOrchid.json +26 -0
  126. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleTidal.json +26 -0
  127. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Bloom.json +139 -0
  128. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CityPark.json +40 -0
  129. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Classroom.json +40 -0
  130. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/ColorblindSafe.json +48 -0
  131. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CopilotDefault.json +1861 -0
  132. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Divergent.json +127 -0
  133. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Electric.json +48 -0
  134. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Frontier.json +136 -0
  135. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/HighContrast.json +40 -0
  136. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Highrise.json +41 -0
  137. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Innovate.json +227 -0
  138. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/NewExecutive.json +41 -0
  139. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Solar.json +33 -0
  140. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Storm.json +25 -0
  141. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Sunset.json +48 -0
  142. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Temperature.json +33 -0
  143. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Tidal.json +100 -0
  144. package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Twilight.json +40 -0
  145. package/templates/base-template/base-template.Report/definition/bookmarks/1d40d43c7ade66e8603c.bookmark.json +2297 -0
  146. package/templates/base-template/base-template.Report/definition/bookmarks/af068ff51c0ca3089ea7.bookmark.json +2300 -0
  147. package/templates/base-template/base-template.Report/definition/bookmarks/bookmarks.json +11 -0
  148. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
  149. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/mobile.json +11 -0
  150. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +669 -0
  151. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/mobile.json +11 -0
  152. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +723 -0
  153. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
  154. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
  155. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
  156. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +109 -0
  157. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/mobile.json +31 -0
  158. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/visual.json +378 -0
  159. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/mobile.json +11 -0
  160. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/visual.json +175 -0
  161. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
  162. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
  163. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
  164. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
  165. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/mobile.json +11 -0
  166. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +690 -0
  167. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/90677f13cea5d1275990/visual.json +17 -0
  168. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/mobile.json +11 -0
  169. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
  170. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/mobile.json +10 -0
  171. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/visual.json +328 -0
  172. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/mobile.json +11 -0
  173. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +578 -0
  174. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
  175. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +432 -0
  176. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
  177. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +801 -0
  178. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
  179. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1318 -0
  180. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b529688fe5a226643322/visual.json +209 -0
  181. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/mobile.json +11 -0
  182. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/visual.json +174 -0
  183. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
  184. package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
  185. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/page.json +130 -0
  186. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/mobile.json +11 -0
  187. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/visual.json +690 -0
  188. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/mobile.json +11 -0
  189. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/visual.json +468 -0
  190. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/mobile.json +11 -0
  191. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/visual.json +359 -0
  192. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/mobile.json +11 -0
  193. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/visual.json +669 -0
  194. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/mobile.json +11 -0
  195. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/visual.json +109 -0
  196. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/31c21f8cbeb3b208940a/visual.json +209 -0
  197. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/3ab72c25062437149b03/visual.json +17 -0
  198. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/mobile.json +11 -0
  199. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/visual.json +788 -0
  200. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/mobile.json +11 -0
  201. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/visual.json +592 -0
  202. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/mobile.json +11 -0
  203. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/visual.json +468 -0
  204. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/mobile.json +11 -0
  205. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/visual.json +1310 -0
  206. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/mobile.json +11 -0
  207. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/visual.json +175 -0
  208. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/mobile.json +11 -0
  209. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/visual.json +516 -0
  210. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d1e86f213a3841d12e20/visual.json +328 -0
  211. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/mobile.json +11 -0
  212. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/visual.json +432 -0
  213. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/mobile.json +11 -0
  214. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/visual.json +241 -0
  215. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/mobile.json +11 -0
  216. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/visual.json +174 -0
  217. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/mobile.json +11 -0
  218. package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/visual.json +333 -0
  219. package/templates/base-template/base-template.Report/definition/pages/pages.json +8 -0
  220. package/templates/base-template/base-template.Report/definition/report.json +89 -0
  221. package/templates/base-template/base-template.Report/definition/version.json +4 -0
  222. package/templates/base-template/base-template.Report/definition.pbir +9 -0
  223. package/templates/base-template/base-template.SemanticModel/.platform +11 -0
  224. package/templates/base-template/base-template.SemanticModel/definition/cultures/es-AR.tmdl +11185 -0
  225. package/templates/base-template/base-template.SemanticModel/definition/database.tmdl +3 -0
  226. package/templates/base-template/base-template.SemanticModel/definition/expressions.tmdl +234 -0
  227. package/templates/base-template/base-template.SemanticModel/definition/functions.tmdl +637 -0
  228. package/templates/base-template/base-template.SemanticModel/definition/model.tmdl +82 -0
  229. package/templates/base-template/base-template.SemanticModel/definition/relationships.tmdl +271 -0
  230. package/templates/base-template/base-template.SemanticModel/definition/tables/Calendario.tmdl +200 -0
  231. package/templates/base-template/base-template.SemanticModel/definition/tables/Campa/303/261as.tmdl +75 -0
  232. package/templates/base-template/base-template.SemanticModel/definition/tables/Canales.tmdl +84 -0
  233. package/templates/base-template/base-template.SemanticModel/definition/tables/Clientes.tmdl +143 -0
  234. package/templates/base-template/base-template.SemanticModel/definition/tables/Devoluciones.tmdl +95 -0
  235. package/templates/base-template/base-template.SemanticModel/definition/tables/Ejecuci/303/263n proyectos.tmdl" +130 -0
  236. package/templates/base-template/base-template.SemanticModel/definition/tables/Entregas.tmdl +122 -0
  237. package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos m/303/251tricas.tmdl" +40 -0
  238. package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos.tmdl +73 -0
  239. package/templates/base-template/base-template.SemanticModel/definition/tables/Horas.tmdl +122 -0
  240. package/templates/base-template/base-template.SemanticModel/definition/tables/Interacciones clientes.tmdl +146 -0
  241. package/templates/base-template/base-template.SemanticModel/definition/tables/Leads.tmdl +119 -0
  242. package/templates/base-template/base-template.SemanticModel/definition/tables/Monedas.tmdl +44 -0
  243. package/templates/base-template/base-template.SemanticModel/definition/tables/Movimientos financieros.tmdl +145 -0
  244. package/templates/base-template/base-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +1294 -0
  245. package/templates/base-template/base-template.SemanticModel/definition/tables/N/303/263mina.tmdl +110 -0
  246. package/templates/base-template/base-template.SemanticModel/definition/tables/Oportunidades.tmdl +135 -0
  247. package/templates/base-template/base-template.SemanticModel/definition/tables/Presupuesto.tmdl +125 -0
  248. package/templates/base-template/base-template.SemanticModel/definition/tables/Productos.tmdl +98 -0
  249. package/templates/base-template/base-template.SemanticModel/definition/tables/Proyectos.tmdl +77 -0
  250. package/templates/base-template/base-template.SemanticModel/definition/tables/Servicios.tmdl +75 -0
  251. package/templates/base-template/base-template.SemanticModel/definition/tables/Tareas proyecto.tmdl +102 -0
  252. package/templates/base-template/base-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +67 -0
  253. package/templates/base-template/base-template.SemanticModel/definition/tables/Ventas.tmdl +180 -0
  254. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux An/303/241lisis dimensiones.tmdl" +38 -0
  255. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Comparaciones.tmdl +227 -0
  256. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Compatibilidad m/303/251trica-dimensi/303/263n.tmdl" +68 -0
  257. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modelo configuraci/303/263n.tmdl" +44 -0
  258. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modo fechas.tmdl +36 -0
  259. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux M/303/251trica-Equipo.tmdl" +102 -0
  260. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Overrides m/303/251trica-dimensi/303/263n.tmdl" +54 -0
  261. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Per/303/255odos.tmdl" +182 -0
  262. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas modo.tmdl +36 -0
  263. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas.tmdl +27 -0
  264. package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Vista de calendario.tmdl +30 -0
  265. package/templates/base-template/base-template.SemanticModel/definition/tables/_GC C/303/241lculo.tmdl" +70 -0
  266. package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Eje X.tmdl +63 -0
  267. package/templates/base-template/base-template.SemanticModel/definition/tables/_GC M/303/251trica.tmdl" +374 -0
  268. package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Tipo c/303/241lculo.tmdl" +223 -0
  269. package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Dimensi/303/263n.tmdl" +98 -0
  270. package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Eje X.tmdl +68 -0
  271. package/templates/base-template/base-template.SemanticModel/definition/tables//303/223rdenes servicio.tmdl" +151 -0
  272. package/templates/base-template/base-template.SemanticModel/definition.pbism +5 -0
  273. package/templates/base-template/base-template.SemanticModel/diagramLayout.json +568 -0
  274. package/templates/base-template/base-template.pbip +14 -0
  275. package/templates/base-template/template.manifest.json +41 -0
  276. package/theme/BISuperpowers.json +3888 -0
@@ -0,0 +1,102 @@
1
+ /// Hecho demo de tareas, vencimientos y horas por proyecto.
2
+ table 'Tareas proyecto'
3
+ isHidden
4
+ lineageTag: 393fd6ab-52a6-41d9-a09a-5cdda9b7f089
5
+
6
+ column TareaProyectoId
7
+ dataType: string
8
+ isHidden
9
+ lineageTag: 40f7cf37-af7d-40cd-a9eb-a59a299de117
10
+ sourceColumn: TareaProyectoId
11
+
12
+ column Fecha
13
+ dataType: dateTime
14
+ formatString: Long Date
15
+ lineageTag: 0be1a0ee-3600-40d3-a884-21f85ff5b097
16
+ summarizeBy: none
17
+ sourceColumn: Fecha
18
+
19
+ annotation UnderlyingDateTimeDataType = Date
20
+
21
+ annotation SummarizationSetBy = Automatic
22
+
23
+ column ProyectoId
24
+ dataType: string
25
+ isHidden
26
+ lineageTag: 21d6cc18-9a00-426e-aff1-f3d7156250ee
27
+ sourceColumn: ProyectoId
28
+
29
+ column EquipoId
30
+ dataType: string
31
+ isHidden
32
+ lineageTag: faf1b0d3-6e66-4652-a679-2cfbc402d1a4
33
+ sourceColumn: EquipoId
34
+
35
+ column Tareas
36
+ dataType: int64
37
+ lineageTag: 74873a78-91ef-4ad0-b841-6d88d3983133
38
+ sourceColumn: Tareas
39
+
40
+ column 'Tareas Vencidas'
41
+ dataType: int64
42
+ lineageTag: c80cf53a-f3c8-4558-a3ad-0703bb1c402a
43
+ sourceColumn: Tareas Vencidas
44
+
45
+ column Horas
46
+ dataType: double
47
+ lineageTag: 2fd35a77-573d-4da8-aed7-f99989da2774
48
+ sourceColumn: Horas
49
+
50
+ column Data
51
+ dataType: string
52
+ lineageTag: 22acabe1-f075-4840-901e-088e21de4003
53
+ sourceColumn: Data
54
+
55
+ partition 'Tareas proyecto' = m
56
+ mode: import
57
+ queryGroup: 'Sample Dataset\Hechos'
58
+ source =
59
+ let
60
+ EntityCode = (entity as text, n as number) as text =>
61
+ let
62
+ CleanNumber = Number.From(n),
63
+ ToLetters = (value as number) as text =>
64
+ let
65
+ Current = Number.IntegerDivide(value, 1),
66
+ Prefix = if Current < 26 then "" else @ToLetters(Number.IntegerDivide(Current, 26) - 1),
67
+ Suffix = Character.FromNumber(65 + Number.Mod(Current, 26))
68
+ in
69
+ Prefix & Suffix,
70
+ BlockCode = ToLetters(Number.IntegerDivide(CleanNumber - 1, 100)),
71
+ NumberPart = Text.PadStart(Text.From(Number.Mod(CleanNumber - 1, 100) + 1, "en-US"), 2, "0"),
72
+ CheckLetter = Character.FromNumber(65 + Number.Mod(CleanNumber * 7 + Text.Length(entity) + 3, 26))
73
+ in
74
+ entity & BlockCode & NumberPart & CheckLetter,
75
+ CalendarDates = Table.TransformColumnTypes(Table.SelectColumns(Calendario, {"Fecha"}), {{"Fecha", type date}}),
76
+ EndDate = List.Max(CalendarDates[Fecha]),
77
+ StartDate = List.Min(CalendarDates[Fecha]),
78
+ DateWindow = Table.SelectRows(CalendarDates, each [Fecha] >= StartDate and [Fecha] <= EndDate),
79
+ WeekTable = Table.Distinct(Table.AddColumn(DateWindow, "WeekStart", each Date.StartOfWeek([Fecha], Day.Monday), type date)[[WeekStart]]),
80
+ SortedWeeks = Table.Sort(WeekTable, {{"WeekStart", Order.Ascending}}),
81
+ AddSemanaIndex = Table.AddIndexColumn(SortedWeeks, "SemanaIndex", 0, 1, Int64.Type),
82
+ ProjectCount = Table.RowCount(Proyectos),
83
+ EquipoCount = Table.RowCount(Equipos),
84
+ ProjectsBase = Table.FromList(List.Numbers(1, ProjectCount), Splitter.SplitByNothing(), {"ProyectoNr"}),
85
+ EquiposBase = Table.FromList(List.Numbers(1, EquipoCount), Splitter.SplitByNothing(), {"EquipoNr"}),
86
+ AddProjects = Table.AddColumn(AddSemanaIndex, "Proyectos", each ProjectsBase),
87
+ ExpandProjects = Table.ExpandTableColumn(AddProjects, "Proyectos", {"ProyectoNr"}, {"ProyectoNr"}),
88
+ AddEquipos = Table.AddColumn(ExpandProjects, "Equipos", each EquiposBase),
89
+ ExpandEquipos = Table.ExpandTableColumn(AddEquipos, "Equipos", {"EquipoNr"}, {"EquipoNr"}),
90
+ AddValue = Table.AddColumn(ExpandEquipos, "Value", each [SemanaIndex] * ProjectCount * EquipoCount + ([ProyectoNr] - 1) * EquipoCount + [EquipoNr], Int64.Type),
91
+ AddFecha = Table.AddColumn(AddValue, "Fecha", each List.Min({EndDate, List.Max({StartDate, Date.AddDays([WeekStart], Number.Mod([ProyectoNr] + [EquipoNr] + [SemanaIndex], 7))})}), type date),
92
+ #"Con TareaProyectoId" = Table.AddColumn(AddFecha, "TareaProyectoId", each EntityCode("TareaProyecto", [Value]), type text),
93
+ #"Con ProyectoId" = Table.AddColumn(#"Con TareaProyectoId", "ProyectoId", each EntityCode("Proyecto", [ProyectoNr]), type text),
94
+ #"Con EquipoId" = Table.AddColumn(#"Con ProyectoId", "EquipoId", each EntityCode("Equipo", [EquipoNr]), type text),
95
+ #"Con Tareas" = Table.AddColumn(#"Con EquipoId", "Tareas", each 8 + Number.Mod([Value] * 3, 28), Int64.Type),
96
+ #"Con Tareas Vencidas" = Table.AddColumn(#"Con Tareas", "Tareas Vencidas", each Number.Mod([Value] * 2, 9), Int64.Type),
97
+ #"Con Horas" = Table.AddColumn(#"Con Tareas Vencidas", "Horas", each 40 + Number.Mod([Value] * 6, 120), type number),
98
+ #"Con Data" = Table.AddColumn(#"Con Horas", "Data", each "Demo", type text),
99
+ Result = Table.SelectColumns(#"Con Data", {"TareaProyectoId", "Fecha", "ProyectoId", "EquipoId", "Tareas", "Tareas Vencidas", "Horas", "Data"})
100
+ in
101
+ Result
102
+
@@ -0,0 +1,67 @@
1
+ /// Tabla helper sintética de tipos de cambio por fecha y moneda, cargada desde Power Query para validar patrones de conversión de moneda.
2
+ table 'Tipo de cambio'
3
+ isHidden
4
+ lineageTag: 876182f9-6e8d-495e-bf52-13fc9db4ffef
5
+
6
+ column Fecha
7
+ dataType: dateTime
8
+ isHidden
9
+ formatString: Long Date
10
+ lineageTag: a3b5f7ba-ec6d-40f8-a78e-49f5b2f89ec6
11
+ summarizeBy: none
12
+ sourceColumn: Fecha
13
+
14
+ annotation UnderlyingDateTimeDataType = Date
15
+
16
+ column Moneda
17
+ dataType: string
18
+ isHidden
19
+ lineageTag: 6c8a29b7-41d3-4f41-97b8-db3f5f3b1cdc
20
+ summarizeBy: none
21
+ sourceColumn: Moneda
22
+
23
+ column TipoCambioBase
24
+ dataType: double
25
+ formatString: #,0.00
26
+ lineageTag: f7a93c19-5278-4d38-ae49-fef3b8a53173
27
+ summarizeBy: none
28
+ sourceColumn: TipoCambioBase
29
+
30
+ partition TipoCambio = m
31
+ mode: import
32
+ queryGroup: 'Sample Dataset\Hechos'
33
+ source =
34
+ // Tipo de cambio diario. Comparte el rango de fechas con 'Calendario' para que el merge con Ventas no deje huecos.
35
+ let
36
+ BaseCurrency = Text.From(MonedaBase),
37
+ Dates = Table.SelectColumns(Calendario, {"Fecha"}),
38
+ RatesUsd = #table(
39
+ type table [Moneda = text, TipoCambioUSD = number, VariacionDiaria = number],
40
+ {
41
+ { "USD", 1.00, 0.00 },
42
+ { "ARS", 1200.00, 0.15 },
43
+ { "EUR", 0.92, 0.00005 }
44
+ }
45
+ ),
46
+ AddRates = Table.AddColumn(Dates, "Rates", each RatesUsd),
47
+ ExpandRates = Table.ExpandTableColumn(AddRates, "Rates", {"Moneda", "TipoCambioUSD", "VariacionDiaria"}, {"Moneda", "TipoCambioUSD", "VariacionDiaria"}),
48
+ AddRateUsd = Table.AddColumn(
49
+ ExpandRates,
50
+ "RateUsd",
51
+ each if [Moneda] = "USD" then 1.0 else [TipoCambioUSD] + (Duration.Days(Date.From([Fecha]) - #date(2025, 1, 1)) * [VariacionDiaria]),
52
+ type number
53
+ ),
54
+ BaseRows = Table.SelectRows(AddRateUsd, each [Moneda] = BaseCurrency),
55
+ BaseRates = Table.RenameColumns(Table.SelectColumns(BaseRows, {"Fecha", "RateUsd"}), {{"RateUsd", "BaseRateUsd"}}),
56
+ JoinBase = Table.NestedJoin(AddRateUsd, {"Fecha"}, BaseRates, {"Fecha"}, "Base", JoinKind.LeftOuter),
57
+ ExpandBase = Table.ExpandTableColumn(JoinBase, "Base", {"BaseRateUsd"}, {"BaseRateUsd"}),
58
+ AddTipoCambioBase = Table.AddColumn(ExpandBase, "TipoCambioBase", each if [BaseRateUsd] = null or [BaseRateUsd] = 0 then [RateUsd] else [RateUsd] / [BaseRateUsd], type number),
59
+ Result = Table.SelectColumns(AddTipoCambioBase, {"Fecha", "Moneda", "TipoCambioBase"}),
60
+ #"Tipo cambiado" = Table.TransformColumnTypes(Result, {{"Moneda", type text}})
61
+ in
62
+ #"Tipo cambiado"
63
+
64
+ annotation PBI_NavigationStepName = Navegación
65
+
66
+ annotation PBI_ResultType = Exception
67
+
@@ -0,0 +1,180 @@
1
+ /// Tabla de hechos sintética diaria para cuatro años, cargada desde Power Query para que el sample dataset se vea como datos cargados y no como una calculated table DAX.
2
+ table Ventas
3
+ isHidden
4
+ lineageTag: a2225251-5322-4ecc-a4c7-31d8c79492ae
5
+
6
+ column VentaId
7
+ dataType: string
8
+ isHidden
9
+ lineageTag: 4bd71b3e-8108-4d37-b2d6-3df928452bd8
10
+ summarizeBy: none
11
+ sourceColumn: VentaId
12
+
13
+ column Fecha
14
+ dataType: dateTime
15
+ isHidden
16
+ formatString: Long Date
17
+ lineageTag: b9b5582b-9e22-4702-95ae-4c076d8a9b6a
18
+ summarizeBy: none
19
+ sourceColumn: Fecha
20
+
21
+ annotation UnderlyingDateTimeDataType = Date
22
+
23
+ column ProductoId
24
+ dataType: string
25
+ isHidden
26
+ lineageTag: bc56bd54-8364-4544-93b3-24b82f569844
27
+ summarizeBy: none
28
+ sourceColumn: ProductoId
29
+
30
+ column ClienteId
31
+ dataType: string
32
+ isHidden
33
+ lineageTag: f971dc5a-6122-4236-87be-e6e438e4b417
34
+ summarizeBy: none
35
+ sourceColumn: ClienteId
36
+
37
+ column CanalId
38
+ dataType: string
39
+ isHidden
40
+ lineageTag: 1a1f88bb-ca29-4991-9710-bc7b7dce7ac0
41
+ summarizeBy: none
42
+ sourceColumn: CanalId
43
+
44
+ column Moneda
45
+ dataType: string
46
+ isHidden
47
+ lineageTag: 7483d1b9-59e4-4e26-af35-2112c51ae21e
48
+ summarizeBy: none
49
+ sourceColumn: Moneda
50
+
51
+ column Cantidad
52
+ dataType: int64
53
+ isHidden
54
+ lineageTag: 5dc105b0-efe5-481e-b1d9-849c15d1c4e4
55
+ summarizeBy: sum
56
+ sourceColumn: Cantidad
57
+
58
+ column 'Precio Unitario'
59
+ dataType: double
60
+ isHidden
61
+ lineageTag: eaf0739f-c513-42de-82b2-cdfaba859481
62
+ summarizeBy: sum
63
+ sourceColumn: Precio Unitario
64
+
65
+ column 'Costo Unitario'
66
+ dataType: double
67
+ isHidden
68
+ lineageTag: 0e5cc70c-513c-4a7d-88c2-386b06d84e14
69
+ summarizeBy: sum
70
+ sourceColumn: Costo Unitario
71
+
72
+ column 'Venta Bruta'
73
+ dataType: double
74
+ isHidden
75
+ lineageTag: 204a0e32-7adb-468a-a681-a81dca606def
76
+ summarizeBy: sum
77
+ sourceColumn: Venta Bruta
78
+
79
+ column 'Costo Total'
80
+ dataType: double
81
+ isHidden
82
+ lineageTag: 1bd6c879-869a-4bd4-a990-41c6da0b8fef
83
+ summarizeBy: sum
84
+ sourceColumn: Costo Total
85
+
86
+ /// Venta Bruta convertida a la moneda base en Power Query usando el tipo de cambio del día de la venta. Permite que [Ventas Base] sea pure SE (SUM), evitando per-row UDF en el path caliente.
87
+ column 'Venta Bruta Base'
88
+ dataType: double
89
+ isHidden
90
+ lineageTag: b3c4a6b0-e568-430c-be18-8a87f5660137
91
+ summarizeBy: sum
92
+ sourceColumn: Venta Bruta Base
93
+
94
+ /// Costo Total convertido a la moneda base en Power Query.
95
+ column 'Costo Total Base'
96
+ dataType: double
97
+ isHidden
98
+ lineageTag: 22594daa-3f2b-4b73-aaff-b326fa9642d3
99
+ summarizeBy: sum
100
+ sourceColumn: Costo Total Base
101
+
102
+ column Data
103
+ dataType: string
104
+ lineageTag: a854db52-b042-4284-8c90-e0b764c3cdd5
105
+ summarizeBy: none
106
+ sourceColumn: Data
107
+
108
+ partition Ventas = m
109
+ mode: import
110
+ queryGroup: 'Sample Dataset\Hechos'
111
+ source =
112
+ let
113
+ EntityCode = (entity as text, n as number) as text =>
114
+ let
115
+ CleanNumber = Number.From(n),
116
+ ToLetters = (value as number) as text =>
117
+ let
118
+ Current = Number.IntegerDivide(value, 1),
119
+ Prefix = if Current < 26 then "" else @ToLetters(Number.IntegerDivide(Current, 26) - 1),
120
+ Suffix = Character.FromNumber(65 + Number.Mod(Current, 26))
121
+ in
122
+ Prefix & Suffix,
123
+ BlockCode = ToLetters(Number.IntegerDivide(CleanNumber - 1, 100)),
124
+ NumberPart = Text.PadStart(Text.From(Number.Mod(CleanNumber - 1, 100) + 1, "en-US"), 2, "0"),
125
+ CheckLetter = Character.FromNumber(65 + Number.Mod(CleanNumber * 7 + Text.Length(entity) + 3, 26))
126
+ in
127
+ entity & BlockCode & NumberPart & CheckLetter,
128
+ CalendarDates = Table.TransformColumnTypes(Table.SelectColumns(Calendario, {"Fecha"}), {{"Fecha", type date}}),
129
+ EndDate = List.Max(CalendarDates[Fecha]),
130
+ StartDate = List.Min(CalendarDates[Fecha]),
131
+ DateWindow = Table.SelectRows(CalendarDates, each [Fecha] >= StartDate and [Fecha] <= EndDate),
132
+ WeekTable = Table.Distinct(Table.AddColumn(DateWindow, "WeekStart", each Date.StartOfWeek([Fecha], Day.Monday), type date)[[WeekStart]]),
133
+ SortedWeeks = Table.Sort(WeekTable, {{"WeekStart", Order.Ascending}}),
134
+ AddSemanaIndex = Table.AddIndexColumn(SortedWeeks, "SemanaIndex", 0, 1, Int64.Type),
135
+ ClienteCount = Table.RowCount(Clientes),
136
+ ProductCount = Table.RowCount(Productos),
137
+ ChannelCount = Table.RowCount(Canales),
138
+ AddClientes = Table.AddColumn(AddSemanaIndex, "Clientes", each Table.FromList(List.Numbers(1, List.Min({ClienteCount, ([SemanaIndex] + 1) * 2})), Splitter.SplitByNothing(), {"ClienteNr"})),
139
+ ExpandClientes = Table.ExpandTableColumn(AddClientes, "Clientes", {"ClienteNr"}, {"ClienteNr"}),
140
+ AddFecha = Table.AddColumn(ExpandClientes, "Fecha", each List.Min({EndDate, List.Max({StartDate, Date.AddDays([WeekStart], Number.Mod([ClienteNr] + [SemanaIndex], 7))})}), type date),
141
+ AddDiaIndex = Table.AddColumn(AddFecha, "DiaIndex", each Duration.Days([Fecha] - StartDate), Int64.Type),
142
+ AddVentaId = Table.AddColumn(AddDiaIndex, "VentaId", each [SemanaIndex] * ClienteCount + [ClienteNr], Int64.Type),
143
+ AddProductoId = Table.AddColumn(AddVentaId, "ProductoId", each Number.Mod([ClienteNr] + [SemanaIndex] * 3 - 1, ProductCount) + 1, Int64.Type),
144
+ AddCanalId = Table.AddColumn(AddProductoId, "CanalId", each Number.Mod([ClienteNr] + [SemanaIndex] - 1, ChannelCount) + 1, Int64.Type),
145
+ AddData = Table.AddColumn(AddCanalId, "Data", each "Demo", type text),
146
+ AddVentaCodigo = Table.AddColumn(AddData, "VentaCodigo", each EntityCode("Venta", [VentaId]), type text),
147
+ AddProductoCodigo = Table.AddColumn(AddVentaCodigo, "ProductoCodigo", each EntityCode("Producto", [ProductoId]), type text),
148
+ AddClienteCodigo = Table.AddColumn(AddProductoCodigo, "ClienteCodigo", each EntityCode("Cliente", [ClienteNr]), type text),
149
+ AddCanalCodigo = Table.AddColumn(AddClienteCodigo, "CanalCodigo", each EntityCode("Canal", [CanalId]), type text),
150
+ JoinClientes = Table.NestedJoin(AddCanalCodigo, {"ClienteCodigo"}, Clientes, {"ClienteId"}, "Cliente", JoinKind.LeftOuter),
151
+ ExpandClientesDim = Table.ExpandTableColumn(JoinClientes, "Cliente", {"Pais", "Segmento"}, {"Pais", "Segmento"}),
152
+ AddYearNr = Table.AddColumn(ExpandClientesDim, "YearNr", each Date.Year([Fecha]), Int64.Type),
153
+ AddMonthNr = Table.AddColumn(AddYearNr, "MonthNr", each Date.Month([Fecha]), Int64.Type),
154
+ AddMoneda = Table.AddColumn(AddMonthNr, "Moneda", each if [Pais] = "España" then "EUR" else if [Pais] = "Argentina" and Number.Mod([DiaIndex] + [ClienteNr], 4) <> 0 then "ARS" else if List.Contains({"Ecuador", "El Salvador", "Panama", "Uruguay"}, [Pais]) then "USD" else if Number.Mod([DiaIndex] + [ClienteNr] * 2, 5) = 0 then "EUR" else if Number.Mod([DiaIndex] + [ClienteNr] * 3, 7) = 0 then "ARS" else "USD", type text),
155
+ AddYearFactor = Table.AddColumn(AddMoneda, "YearFactor", each if [YearNr] = 2024 then 1.05 else if [YearNr] = 2025 then 1.55 else if [YearNr] = 2026 then 0.92 else 1.0, type number),
156
+ AddCanalFactor = Table.AddColumn(AddYearFactor, "CanalFactor", each if [CanalId] = 1 then 1.65 else if [CanalId] = 2 then 1.10 else if [CanalId] = 3 then 0.74 else if [CanalId] = 4 then 0.48 else 1.0, type number),
157
+ AddCountryFactor = Table.AddColumn(AddCanalFactor, "CountryFactor", each if [Pais] = "Brasil" then 2.50 else if [Pais] = "Mexico" then 2.35 else if [Pais] = "España" then 2.20 else if [Pais] = "Colombia" then 1.75 else if [Pais] = "Argentina" then 1.65 else if [Pais] = "Chile" then 1.55 else if [Pais] = "Peru" then 1.38 else if [Pais] = "Venezuela" then 1.18 else if [Pais] = "Ecuador" then 1.08 else if [Pais] = "Republica Dominicana" then 1.02 else if [Pais] = "Uruguay" then 0.92 else if [Pais] = "Panama" then 0.88 else if [Pais] = "Costa Rica" then 0.80 else if [Pais] = "Guatemala" then 0.76 else if [Pais] = "Paraguay" then 0.62 else if [Pais] = "Bolivia" then 0.58 else if [Pais] = "Honduras" then 0.52 else if [Pais] = "El Salvador" then 0.48 else if [Pais] = "Nicaragua" then 0.40 else if [Pais] = "Cuba" then 0.34 else if [Pais] = "Haiti" then 0.24 else 1.0, type number),
158
+ AddSegmentFactor = Table.AddColumn(AddCountryFactor, "SegmentFactor", each if [Segmento] = "Enterprise" then 2.85 else if [Segmento] = "Mid Market" then 1.15 else if [Segmento] = "SMB" then 0.42 else 1.0, type number),
159
+ AddSeasonFactor = Table.AddColumn(AddSegmentFactor, "SeasonFactor", each if [MonthNr] = 1 then 0.70 else if [MonthNr] = 2 then 0.82 else if [MonthNr] = 3 then 0.95 else if [MonthNr] = 4 then 1.05 else if [MonthNr] = 5 then 1.12 else if [MonthNr] = 6 then 1.18 else if [MonthNr] = 7 then 1.28 else if [MonthNr] = 8 then 1.22 else if [MonthNr] = 9 then 1.08 else if [MonthNr] = 10 then 1.20 else if [MonthNr] = 11 then 1.55 else if [MonthNr] = 12 then 1.85 else 1.0, type number),
160
+ AddNoiseFactor = Table.AddColumn(AddSeasonFactor, "NoiseFactor", each 0.75 + Number.Mod([DiaIndex] * 37 + [ClienteNr] * 17 + [ProductoId] * 23 + [CanalId] * 11, 150) / 100, type number),
161
+ AddCostRate = Table.AddColumn(AddNoiseFactor, "CostRate", each (if [CanalId] = 1 then 0.52 else if [CanalId] = 2 then 0.58 else if [CanalId] = 3 then 0.66 else if [CanalId] = 4 then 0.72 else 0.60) + (if [Segmento] = "Enterprise" then -0.06 else if [Segmento] = "Mid Market" then 0.02 else if [Segmento] = "SMB" then 0.08 else 0), type number),
162
+ AddCantidad = Table.AddColumn(AddCostRate, "Cantidad", each List.Max({1, 1 + Number.Mod([DiaIndex] + [ClienteNr] * 3 + [ProductoId], 7) + (if [CanalId] = 1 then 2 else if [CanalId] = 2 then 1 else 0) + (if [Segmento] = "Enterprise" then 6 else if [Segmento] = "Mid Market" then 2 else 0)}), Int64.Type),
163
+ AddPrecioUnitario = Table.AddColumn(AddCantidad, "Precio Unitario", each let RawPrice = (32 + [ProductoId] * 9 + Number.Mod([ClienteNr] * 7 + [DiaIndex], 45)) * [YearFactor] * [CanalFactor] * [CountryFactor] * [SegmentFactor] * [SeasonFactor] * [NoiseFactor] in List.Max({8, Number.Round(RawPrice, 0)}), type number),
164
+ AddCostoUnitario = Table.AddColumn(AddPrecioUnitario, "Costo Unitario", each let Rate = List.Min({0.88, List.Max({0.28, [CostRate]})}) in List.Max({4, Number.Round([Precio Unitario] * Rate, 0)}), type number),
165
+ AddVentaBruta = Table.AddColumn(AddCostoUnitario, "Venta Bruta", each [Cantidad] * [Precio Unitario], type number),
166
+ AddCostoTotal = Table.AddColumn(AddVentaBruta, "Costo Total", each [Cantidad] * [Costo Unitario], type number),
167
+ MergedRates = Table.NestedJoin(AddCostoTotal, {"Fecha", "Moneda"}, #"Tipo de cambio", {"Fecha", "Moneda"}, "TC", JoinKind.LeftOuter),
168
+ ExpandedRates = Table.ExpandTableColumn(MergedRates, "TC", {"TipoCambioBase"}, {"TasaABase"}),
169
+ AddVentaBrutaBase = Table.AddColumn(ExpandedRates, "Venta Bruta Base", each if [Moneda] = MonedaBase then [Venta Bruta] else [Venta Bruta] / (if [TasaABase] = null then 1 else [TasaABase]), type number),
170
+ AddCostoTotalBase = Table.AddColumn(AddVentaBrutaBase, "Costo Total Base", each if [Moneda] = MonedaBase then [Costo Total] else [Costo Total] / (if [TasaABase] = null then 1 else [TasaABase]), type number),
171
+ SelectForOutput = Table.SelectColumns(AddCostoTotalBase, {"Data", "VentaCodigo", "Fecha", "ProductoCodigo", "ClienteCodigo", "CanalCodigo", "Moneda", "Cantidad", "Precio Unitario", "Costo Unitario", "Venta Bruta", "Costo Total", "Venta Bruta Base", "Costo Total Base"}),
172
+ RenameIds = Table.RenameColumns(SelectForOutput, {{"VentaCodigo", "VentaId"}, {"ProductoCodigo", "ProductoId"}, {"ClienteCodigo", "ClienteId"}, {"CanalCodigo", "CanalId"}}),
173
+ Result = Table.TransformColumnTypes(RenameIds, {{"Data", type text}, {"VentaId", type text}, {"ProductoId", type text}, {"ClienteId", type text}, {"CanalId", type text}, {"Fecha", type date}, {"Moneda", type text}, {"Cantidad", Int64.Type}, {"Precio Unitario", type number}, {"Costo Unitario", type number}, {"Venta Bruta", type number}, {"Costo Total", type number}, {"Venta Bruta Base", type number}, {"Costo Total Base", type number}})
174
+ in
175
+ Result
176
+
177
+ annotation PBI_NavigationStepName = Navegación
178
+
179
+ annotation PBI_ResultType = Table
180
+
@@ -0,0 +1,38 @@
1
+ table '_Aux Análisis dimensiones'
2
+ isHidden
3
+ lineageTag: b651789b-c459-4b23-b0dd-95a84f78cc3f
4
+
5
+ column DimensionKey
6
+ lineageTag: 51bf3935-1994-4e3e-ae85-b9723355b648
7
+ isNameInferred
8
+ sourceColumn: [DimensionKey]
9
+
10
+ column Orden
11
+ lineageTag: 4b04f4c9-1ff5-4d97-871e-437290397bf0
12
+ isNameInferred
13
+ sourceColumn: [Orden]
14
+
15
+ column Equipo
16
+ lineageTag: 174560bb-abbf-468f-b024-5dc86a73ce84
17
+ isNameInferred
18
+ sourceColumn: [Equipo]
19
+
20
+ partition '_Aux Análisis dimensiones' = calculated
21
+ mode: import
22
+ source =
23
+ DATATABLE (
24
+ "Equipo", STRING,
25
+ "DimensionKey", STRING,
26
+ "Orden", INTEGER,
27
+ {
28
+ { "Ventas", "cliente", 0 }, { "Ventas", "cliente_pais", 1 }, { "Ventas", "cliente_segmento", 2 }, { "Ventas", "canal", 3 }, { "Ventas", "canal_tipo", 4 }, { "Ventas", "producto", 5 }, { "Ventas", "producto_categoria", 6 }, { "Ventas", "producto_subcategoria", 7 },
29
+ { "Marketing", "campania", 0 }, { "Marketing", "campania_canal", 1 }, { "Marketing", "campania_objetivo", 2 }, { "Marketing", "canal", 3 }, { "Marketing", "canal_tipo", 4 }, { "Marketing", "cliente_segmento", 5 }, { "Marketing", "cliente_pais", 6 },
30
+ { "Clientes", "cliente", 0 }, { "Clientes", "cliente_pais", 1 }, { "Clientes", "cliente_segmento", 2 }, { "Clientes", "canal", 3 }, { "Clientes", "canal_tipo", 4 }, { "Clientes", "producto_categoria", 5 }, { "Clientes", "servicio_linea", 6 },
31
+ { "Operaciones", "cliente", 0 }, { "Operaciones", "cliente_pais", 1 }, { "Operaciones", "canal", 2 }, { "Operaciones", "producto", 3 }, { "Operaciones", "producto_categoria", 4 }, { "Operaciones", "servicio", 5 }, { "Operaciones", "servicio_linea", 6 }, { "Operaciones", "equipo_area", 7 },
32
+ { "Finanzas", "cliente_segmento", 0 }, { "Finanzas", "cliente_pais", 1 }, { "Finanzas", "canal", 2 }, { "Finanzas", "canal_tipo", 3 }, { "Finanzas", "producto_categoria", 4 }, { "Finanzas", "servicio_linea", 5 }, { "Finanzas", "equipo_area", 6 }, { "Finanzas", "proyecto_tipo", 7 },
33
+ { "Producto", "producto", 0 }, { "Producto", "producto_categoria", 1 }, { "Producto", "producto_subcategoria", 2 }, { "Producto", "cliente_segmento", 3 }, { "Producto", "canal", 4 },
34
+ { "Personas", "equipo", 0 }, { "Personas", "equipo_area", 1 }, { "Personas", "proyecto", 2 }, { "Personas", "proyecto_tipo", 3 }, { "Personas", "servicio_linea", 4 },
35
+ { "Proyectos", "proyecto", 0 }, { "Proyectos", "proyecto_tipo", 1 }, { "Proyectos", "proyecto_estado", 2 }, { "Proyectos", "cliente", 3 }, { "Proyectos", "cliente_pais", 4 }, { "Proyectos", "servicio", 5 }, { "Proyectos", "servicio_linea", 6 }, { "Proyectos", "equipo_area", 7 }
36
+ }
37
+ )
38
+
@@ -0,0 +1,227 @@
1
+ /// Presets M desconectados de comparación entre período actual y período previo para el template.
2
+ table '_Aux Comparaciones'
3
+ isHidden
4
+ lineageTag: cd2fa428-f539-4001-8ede-7053e6051eae
5
+
6
+ column 'Vista de calendario'
7
+ dataType: string
8
+ isHidden
9
+ isNullable: false
10
+ lineageTag: 29b8452a-bff7-46a1-ab1c-e7034fb7f43b
11
+ summarizeBy: none
12
+ sourceColumn: Tipo Calendario
13
+
14
+ changedProperty = IsHidden
15
+
16
+ column Orden
17
+ dataType: int64
18
+ isHidden
19
+ isNullable: false
20
+ lineageTag: aa208cd9-679a-4ad9-96cc-2f5bc10a8805
21
+ summarizeBy: none
22
+ sourceColumn: Sort
23
+
24
+ column Comparación
25
+ dataType: string
26
+ isNullable: false
27
+ lineageTag: 6e026f38-c1fe-43fc-93b4-fe3bdd8621d5
28
+ summarizeBy: none
29
+ sourceColumn: Período actual (vs. período previo)
30
+ sortByColumn: Orden
31
+
32
+ column FechaCurrentStart
33
+ dataType: dateTime
34
+ isHidden
35
+ formatString: Long Date
36
+ lineageTag: e1e3bc25-b0e2-4883-af11-eee0d4b50fb0
37
+ summarizeBy: none
38
+ sourceColumn: FechaCurrentStart
39
+
40
+ annotation UnderlyingDateTimeDataType = Date
41
+
42
+ column FechaCurrentEnd
43
+ dataType: dateTime
44
+ isHidden
45
+ formatString: Long Date
46
+ lineageTag: 5815193e-41d6-4189-a051-6bd9af9abb67
47
+ summarizeBy: none
48
+ sourceColumn: FechaCurrentEnd
49
+
50
+ annotation UnderlyingDateTimeDataType = Date
51
+
52
+ column FechaPrevioStart
53
+ dataType: dateTime
54
+ isHidden
55
+ formatString: Long Date
56
+ lineageTag: 0d00d66d-826a-450c-a2cc-7343f0862558
57
+ summarizeBy: none
58
+ sourceColumn: FechaPrevioStart
59
+
60
+ annotation UnderlyingDateTimeDataType = Date
61
+
62
+ column FechaPrevioEnd
63
+ dataType: dateTime
64
+ isHidden
65
+ formatString: Long Date
66
+ lineageTag: 41fab097-df10-4ac3-921e-1d776773c0bf
67
+ summarizeBy: none
68
+ sourceColumn: FechaPrevioEnd
69
+
70
+ annotation UnderlyingDateTimeDataType = Date
71
+
72
+ partition 'Calendar Comparisons' = m
73
+ mode: import
74
+ queryGroup: Calendario
75
+ source =
76
+ let
77
+ PeriodsRaw = Table.Buffer(#"_Aux Períodos"),
78
+ ComparisonPresets = Table.Buffer(#"Comparaciones predefinidas"),
79
+ TypesRaw = Table.Buffer(#"Tipos de calendario"),
80
+ Calendar = Table.Buffer(Calendario),
81
+
82
+ Periods =
83
+ if Table.HasColumns(PeriodsRaw, {"Calendar Type", "Sort", "StartDate", "EndDate"}) then
84
+ Table.RenameColumns(
85
+ Table.SelectColumns(PeriodsRaw, {"Calendar Type", "Sort", "StartDate", "EndDate"}),
86
+ {{"Calendar Type", "CalendarType"}}
87
+ )
88
+ else
89
+ Table.RenameColumns(
90
+ Table.SelectColumns(PeriodsRaw, {"Vista de calendario", "Orden", "FechaInicio", "FechaFin"}),
91
+ {{"Vista de calendario", "CalendarType"}, {"Orden", "Sort"}, {"FechaInicio", "StartDate"}, {"FechaFin", "EndDate"}}
92
+ ),
93
+
94
+ Types =
95
+ if Table.HasColumns(TypesRaw, {"Calendar Type"}) then
96
+ Table.RenameColumns(Table.SelectColumns(TypesRaw, {"Calendar Type"}), {{"Calendar Type", "CalendarType"}})
97
+ else
98
+ Table.RenameColumns(Table.SelectColumns(TypesRaw, {"Vista de calendario"}), {{"Vista de calendario", "CalendarType"}}),
99
+
100
+ RangeBySort = (calendarType as text, sort as number) as record =>
101
+ let
102
+ rows = Table.SelectRows(Periods, each [CalendarType] = calendarType and [Sort] = sort),
103
+ startDate = if Table.IsEmpty(rows) then null else Date.From(rows{0}[StartDate]),
104
+ endDate = if Table.IsEmpty(rows) then null else Date.From(rows{0}[EndDate])
105
+ in
106
+ [Start = startDate, End = endDate],
107
+
108
+ DaysInRange = (startDate as nullable date, endDate as nullable date) as nullable number =>
109
+ if startDate = null or endDate = null then null else Duration.Days(endDate - startDate) + 1,
110
+
111
+ MinDate = (a as nullable date, b as nullable date) as nullable date =>
112
+ if a = null then b else if b = null then a else if a <= b then a else b,
113
+
114
+ KeyForDate = (columnName as text, dateValue as nullable date) as nullable number =>
115
+ let
116
+ rows = if dateValue = null then #table({}, {}) else Table.SelectRows(Calendar, each [Fecha] = dateValue)
117
+ in
118
+ if Table.IsEmpty(rows) then null else Record.Field(rows{0}, columnName),
119
+
120
+ MaxKeyBefore = (columnName as text, key as nullable number) as nullable number =>
121
+ let
122
+ values = if key = null then {} else List.Distinct(List.RemoveNulls(Table.Column(Calendar, columnName))),
123
+ prior = List.Select(values, each _ < key)
124
+ in
125
+ if List.IsEmpty(prior) then null else List.Max(prior),
126
+
127
+ RangeByKey = (columnName as text, key as nullable number) as record =>
128
+ let
129
+ rows = if key = null then #table({}, {}) else Table.SelectRows(Calendar, each Record.Field(_, columnName) = key),
130
+ startDate = if Table.IsEmpty(rows) then null else List.Min(rows[Fecha]),
131
+ endDate = if Table.IsEmpty(rows) then null else List.Max(rows[Fecha])
132
+ in
133
+ [Start = startDate, End = endDate],
134
+
135
+ PreviousPeriodRangeByDate = (calendarType as text, granularity as text, currentStart as nullable date) as record =>
136
+ let
137
+ is445 = calendarType = "Semanal 4-4-5",
138
+ fiscalColumn =
139
+ if granularity = "Month" then "Fiscal445MonthKey"
140
+ else if granularity = "Quarter" then "Fiscal445QuarterKey"
141
+ else if granularity = "Semester" then "Fiscal445SemesterKey"
142
+ else "Fiscal445Year",
143
+ fiscalKey = if is445 then KeyForDate(fiscalColumn, currentStart) else null,
144
+ fiscalPreviousKey = if is445 then MaxKeyBefore(fiscalColumn, fiscalKey) else null,
145
+ fiscalRange = if is445 then RangeByKey(fiscalColumn, fiscalPreviousKey) else [Start = null, End = null],
146
+ gregorianStart =
147
+ if currentStart = null then null
148
+ else if granularity = "Month" then Date.StartOfMonth(Date.AddMonths(currentStart, -1))
149
+ else if granularity = "Quarter" then Date.AddMonths(currentStart, -3)
150
+ else if granularity = "Semester" then Date.AddMonths(currentStart, -6)
151
+ else Date.StartOfYear(Date.AddYears(currentStart, -1)),
152
+ gregorianEnd = if currentStart = null then null else Date.AddDays(currentStart, -1)
153
+ in
154
+ if currentStart = null then [Start = null, End = null] else if is445 then fiscalRange else [Start = gregorianStart, End = gregorianEnd],
155
+
156
+ PreviousFixedRange = (calendarType as text, previousSort as number, offsetDays as nullable number) as record =>
157
+ let
158
+ prior = RangeBySort(calendarType, previousSort),
159
+ priorEnd =
160
+ if prior[Start] = null or prior[End] = null then null
161
+ else if offsetDays = null then prior[End]
162
+ else MinDate(prior[End], Date.AddDays(prior[Start], offsetDays))
163
+ in
164
+ [Start = prior[Start], End = priorEnd],
165
+
166
+ PreviousRange = (calendarType as text, sort as number, currentStart as nullable date, currentEnd as nullable date) as record =>
167
+ let
168
+ days = DaysInRange(currentStart, currentEnd),
169
+ offsetDays = if currentStart = null or currentEnd = null then null else Duration.Days(currentEnd - currentStart),
170
+ result =
171
+ if currentStart = null or currentEnd = null then [Start = null, End = null]
172
+ else if List.Contains({1, 2}, sort) then [Start = Date.AddDays(currentStart, -1), End = Date.AddDays(currentEnd, -1)]
173
+ else if List.Contains({3, 4, 5, 6, 7}, sort) then [Start = Date.AddDays(currentStart, -days), End = Date.AddDays(currentStart, -1)]
174
+ else if sort = 8 then PreviousFixedRange(calendarType, 9, offsetDays)
175
+ else if sort = 9 then [Start = Date.AddDays(currentStart, -7), End = Date.AddDays(currentEnd, -7)]
176
+ else if sort = 10 then PreviousFixedRange(calendarType, 11, offsetDays)
177
+ else if sort = 11 then PreviousPeriodRangeByDate(calendarType, "Month", currentStart)
178
+ else if sort = 12 then PreviousFixedRange(calendarType, 13, offsetDays)
179
+ else if sort = 13 then PreviousPeriodRangeByDate(calendarType, "Quarter", currentStart)
180
+ else if sort = 14 then PreviousFixedRange(calendarType, 15, offsetDays)
181
+ else if sort = 15 then PreviousPeriodRangeByDate(calendarType, "Semester", currentStart)
182
+ else if sort = 16 then PreviousFixedRange(calendarType, 17, offsetDays)
183
+ else if sort = 17 then PreviousPeriodRangeByDate(calendarType, "Year", currentStart)
184
+ else [Start = null, End = null]
185
+ in
186
+ result,
187
+
188
+ WithPresets = Table.AddColumn(Types, "Preset", each ComparisonPresets),
189
+ Base = Table.ExpandTableColumn(
190
+ WithPresets,
191
+ "Preset",
192
+ {"Sort", "Período actual (vs. período previo)"},
193
+ {"Sort", "Período actual (vs. período previo)"}
194
+ ),
195
+ WithCurrentRange = Table.AddColumn(Base, "CurrentRange", each RangeBySort([CalendarType], [Sort]), type record),
196
+ ExpandedCurrent = Table.ExpandRecordColumn(WithCurrentRange, "CurrentRange", {"Start", "End"}, {"FechaCurrentStart", "FechaCurrentEnd"}),
197
+ WithPreviousRange = Table.AddColumn(
198
+ ExpandedCurrent,
199
+ "PreviousRange",
200
+ each PreviousRange([CalendarType], [Sort], [FechaCurrentStart], [FechaCurrentEnd]),
201
+ type record
202
+ ),
203
+ ExpandedPrevious = Table.ExpandRecordColumn(WithPreviousRange, "PreviousRange", {"Start", "End"}, {"FechaPrevioStart", "FechaPrevioEnd"}),
204
+ Selected = Table.SelectColumns(
205
+ ExpandedPrevious,
206
+ {"CalendarType", "Sort", "Período actual (vs. período previo)", "FechaCurrentStart", "FechaCurrentEnd", "FechaPrevioStart", "FechaPrevioEnd"}
207
+ ),
208
+ Renamed = Table.RenameColumns(Selected, {{"CalendarType", "Tipo Calendario"}}),
209
+ Typed = Table.TransformColumnTypes(
210
+ Renamed,
211
+ {
212
+ {"FechaCurrentStart", type date},
213
+ {"FechaCurrentEnd", type date},
214
+ {"FechaPrevioStart", type date},
215
+ {"FechaPrevioEnd", type date},
216
+ {"Tipo Calendario", type text},
217
+ {"Período actual (vs. período previo)", type text},
218
+ {"Sort", Int64.Type}
219
+ }
220
+ )
221
+ in
222
+ Typed
223
+
224
+ annotation PBI_NavigationStepName = Navegación
225
+
226
+ annotation PBI_ResultType = Table
227
+