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,1294 @@
1
+ /// Tabla desconectada del template para enrutar medidas seleccionables de ventas.
2
+ table Métricas
3
+ lineageTag: f1c7296b-4b19-4310-8f46-a654a261f537
4
+
5
+ /// Moneda destino seleccionada para mostrar importes convertidos. Si no hay selección, usa la moneda base definida por el parámetro MonedaBase.
6
+ measure 'Moneda seleccionada' =
7
+ SELECTEDVALUE (
8
+ Monedas[Moneda], // Moneda elegida cuando hay una sola moneda visible.
9
+ [Moneda base] // Fallback cuando no hay una seleccion unica.
10
+ )
11
+ displayFolder: Auxiliar
12
+ lineageTag: 5bf2e0fa-5bf2-43bc-be26-590f8e1b0aff
13
+
14
+ /// Carrier dinámico para el valor de la métrica seleccionada en el período actual. Lee la métrica activa desde _GC Métrica o desde la tabla Métricas para que funcione en charts, cards y tooltips.
15
+ measure Actual =
16
+ CALCULATE (
17
+ [Métrica activa], // Evalua la metrica seleccionada desde _GC Metrica o desde la tabla Metricas.
18
+ '_GC Tipo cálculo'[Tipo cálculo] = "Actual" // Fuerza el rango de fechas actual del calc group Tipo calculo.
19
+ )
20
+ displayFolder: Auxiliar
21
+ lineageTag: 3ec2726a-08d9-438c-98fe-5cf700866b37
22
+
23
+ formatStringDefinition =
24
+ VAR __MetricName =
25
+ COALESCE (
26
+ SELECTEDVALUE ( '_GC Métrica'[Métrica] ),
27
+ SELECTEDVALUE ( 'Métricas'[Métrica] ),
28
+ "Ventas"
29
+ )
30
+ RETURN
31
+ FormatoMetricaPorNombre ( __MetricName )
32
+
33
+ /// Costo de ventas en la moneda seleccionada. La columna 'Costo Total Base' viene ya convertida a moneda base desde Power Query; la medida hace SUM puro y aplica una sola conversión base->destino al final.
34
+ measure 'Costo de ventas' =
35
+ VAR __MonedaDestino = [Moneda seleccionada] // Moneda elegida por el usuario para ver importes.
36
+ VAR __MonedaBase = [Moneda base] // Moneda base configurada en el modelo.
37
+ VAR __CostoBase = SUM ( Ventas[Costo Total Base] ) // Costo de ventas visible ya convertido a moneda base desde Power Query.
38
+ RETURN
39
+ IF (
40
+ __MonedaDestino = __MonedaBase, // Si destino y base coinciden, no hace falta convertir.
41
+ __CostoBase, // Devuelve el costo de ventas directamente en moneda base.
42
+ __CostoBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) ) // Convierte usando la tasa de la ultima fecha visible.
43
+ )
44
+ displayFolder: Ventas
45
+ lineageTag: bdf3cf39-b975-490d-a90a-4a07f07f8921
46
+
47
+ formatStringDefinition = FormatoMetricaPorNombre ( "Costo de ventas" )
48
+
49
+ /// Ventas menos costo de ventas en la moneda seleccionada.
50
+ measure 'Margen bruto' = [Ventas] - [Costo de ventas] // Margen bruto: ventas visibles menos costo de ventas visible, ambos en la moneda seleccionada.
51
+ displayFolder: Ventas
52
+ lineageTag: fb554d55-eae7-4308-8744-fa8d60fef44d
53
+
54
+ formatStringDefinition = FormatoMetricaPorNombre ( "Margen bruto" )
55
+
56
+ /// Margen bruto dividido por ventas.
57
+ measure 'Margen %' =
58
+ DIVIDE (
59
+ [Margen bruto], // Numerador: dinero que queda despues del costo.
60
+ [Ventas] // Denominador: ventas visibles en el mismo contexto.
61
+ )
62
+ displayFolder: Ventas
63
+ lineageTag: 286165a6-4e9e-4264-9418-e794ef369916
64
+
65
+ formatStringDefinition = FormatoMetricaPorNombre ( "Margen %" )
66
+
67
+ /// Cantidad de unidades vendidas.
68
+ measure 'Unidades vendidas' = SUM ( Ventas[Cantidad] ) // Suma las unidades vendidas visibles por filtros, slicers y eje del visual.
69
+ displayFolder: Producto
70
+ lineageTag: e7f830b2-df93-4991-83ff-03ce6358ec1e
71
+
72
+ formatStringDefinition = FormatoMetricaPorNombre ( "Unidades vendidas" )
73
+
74
+ /// Cantidad de pedidos o líneas comerciales visibles.
75
+ measure Pedidos = COUNTROWS ( Ventas ) // Cuenta las filas visibles de Ventas; en este template cada fila representa una linea/pedido sintetico.
76
+ displayFolder: Ventas
77
+ lineageTag: a804b7f2-306f-46db-a712-d1f1459c9bf6
78
+
79
+ formatStringDefinition = FormatoMetricaPorNombre ( "Pedidos" )
80
+
81
+ /// Ventas divididas por pedidos en la moneda seleccionada.
82
+ measure 'Ticket promedio' =
83
+ DIVIDE (
84
+ [Ventas], // Numerador: ventas visibles en la moneda seleccionada.
85
+ [Pedidos] // Denominador: cantidad de pedidos visibles.
86
+ )
87
+ displayFolder: Ventas
88
+ lineageTag: 61c8a07a-62ca-49e1-a2d6-3db9587ca795
89
+
90
+ formatStringDefinition = FormatoMetricaPorNombre ( "Ticket promedio" )
91
+
92
+ /// Primera fecha del período actual seleccionado.
93
+ measure 'Fecha inicial actual' =
94
+ MAXX (
95
+ CalendarContext (), // Tabla de una fila que contiene los rangos actual y previo seleccionados.
96
+ [Current Start] // Fecha inicial del periodo actual.
97
+ )
98
+ formatString: dd/mm/yyyy
99
+ isHidden
100
+ displayFolder: Auxiliar
101
+ lineageTag: 9512b74d-b5f8-4c16-a523-9d859f85bf41
102
+
103
+ /// Última fecha del período actual seleccionado.
104
+ measure 'Fecha final actual' =
105
+ MAXX (
106
+ CalendarContext (), // Tabla de una fila que contiene los rangos actual y previo seleccionados.
107
+ [Current End] // Fecha final del periodo actual.
108
+ )
109
+ formatString: dd/mm/yyyy
110
+ isHidden
111
+ displayFolder: Auxiliar
112
+ lineageTag: 9491d15a-a1a7-4ded-8161-21474fdaffb6
113
+
114
+ /// Primera fecha del período previo seleccionado.
115
+ measure 'Fecha inicial anterior' =
116
+ MAXX (
117
+ CalendarContext (), // Tabla de una fila que contiene los rangos actual y previo seleccionados.
118
+ [Previous Start] // Fecha inicial del periodo previo comparable.
119
+ )
120
+ formatString: dd/mm/yyyy
121
+ isHidden
122
+ displayFolder: Auxiliar
123
+ lineageTag: ef4de0c9-0fd3-4de8-a970-89642c59064e
124
+
125
+ /// Última fecha del período previo seleccionado.
126
+ measure 'Fecha final anterior' =
127
+ MAXX (
128
+ CalendarContext (), // Tabla de una fila que contiene los rangos actual y previo seleccionados.
129
+ [Previous End] // Fecha final del periodo previo comparable.
130
+ )
131
+ formatString: dd/mm/yyyy
132
+ isHidden
133
+ displayFolder: Auxiliar
134
+ lineageTag: be892c13-b21d-442e-b210-1a53e47debc2
135
+
136
+ /// Título corto con rango actual, rango previo, día abreviado y diferencia de días.
137
+ measure 'Título comparación' =
138
+ VAR __CurrentStart = [Fecha inicial actual]
139
+ VAR __CurrentEnd = [Fecha final actual]
140
+ VAR __PreviousStart = [Fecha inicial anterior]
141
+ VAR __PreviousEnd = [Fecha final anterior]
142
+ VAR __CurrentStartText = SUBSTITUTE ( LOWER ( FORMAT ( __CurrentStart, "ddd d/M/yy", "es-AR" ) ), ".", "" )
143
+ VAR __CurrentEndText = SUBSTITUTE ( LOWER ( FORMAT ( __CurrentEnd, "ddd d/M/yy", "es-AR" ) ), ".", "" )
144
+ VAR __PreviousStartText = SUBSTITUTE ( LOWER ( FORMAT ( __PreviousStart, "ddd d/M/yy", "es-AR" ) ), ".", "" )
145
+ VAR __PreviousEndText = SUBSTITUTE ( LOWER ( FORMAT ( __PreviousEnd, "ddd d/M/yy", "es-AR" ) ), ".", "" )
146
+ VAR __DaysInRange =
147
+ IF (
148
+ NOT ISBLANK ( __CurrentStart ) && NOT ISBLANK ( __CurrentEnd ),
149
+ DATEDIFF ( __CurrentStart, __CurrentEnd, DAY ) + 1
150
+ )
151
+ VAR __HasAllDates =
152
+ NOT ISBLANK ( __CurrentStart )
153
+ && NOT ISBLANK ( __CurrentEnd )
154
+ && NOT ISBLANK ( __PreviousStart )
155
+ && NOT ISBLANK ( __PreviousEnd )
156
+ RETURN
157
+ IF (
158
+ __HasAllDates,
159
+ __CurrentStartText
160
+ & " - "
161
+ & __CurrentEndText
162
+ & " vs "
163
+ & __PreviousStartText
164
+ & " - "
165
+ & __PreviousEndText
166
+ & " - "
167
+ & FORMAT ( __DaysInRange, "#,0" )
168
+ & " días"
169
+ )
170
+ isHidden
171
+ displayFolder: Auxiliar
172
+ lineageTag: 62eb5630-a405-4a36-adf1-48f07b3345fd
173
+
174
+ /// Ventas de clientes cuya primera venta histórica cae dentro del contexto de fechas visible. Devuelve 0 cuando no hay clientes nuevos para que los visuals no queden en blanco.
175
+ measure 'Ventas nuevos clientes' =
176
+ VAR __FechasVisibles = VALUES ( 'Calendario'[Fecha] ) // Fechas visibles despues de slicers, filtros y eje del visual.
177
+ VAR __ClientesNuevos =
178
+ FILTER (
179
+ VALUES ( Clientes[ClienteId] ), // Recorre los clientes visibles por el resto del contexto.
180
+ VAR __PrimeraVentaCliente =
181
+ CALCULATE (
182
+ MIN ( Ventas[Fecha] ), // Primera fecha historica de venta del cliente evaluado.
183
+ REMOVEFILTERS ( 'Calendario' ) // Quita filtros de fecha para mirar toda la historia del cliente.
184
+ )
185
+ RETURN
186
+ CONTAINSROW ( __FechasVisibles, __PrimeraVentaCliente ) // Mantiene al cliente si su primera venta cae en el periodo visible.
187
+ )
188
+ VAR __VentasNuevos = CALCULATE ( [Ventas], __ClientesNuevos ) // Evalua ventas filtrando solo los clientes nuevos.
189
+ RETURN
190
+ COALESCE ( __VentasNuevos, 0 ) // Devuelve cero cuando no hay clientes nuevos para que el visual no quede en blanco.
191
+ displayFolder: Ventas
192
+ lineageTag: eca6420b-769a-4a38-8cf3-67d9056f74f4
193
+
194
+ formatStringDefinition = FormatoMetricaPorNombre ( "Ventas nuevos clientes" )
195
+
196
+ /// Porcentaje de ventas visibles explicado por clientes nuevos. Devuelve 0 cuando no hay ventas o no hay clientes nuevos.
197
+ measure 'Ventas nuevos clientes %' =
198
+ DIVIDE (
199
+ [Ventas nuevos clientes], // Numerador: ventas explicadas por clientes nuevos.
200
+ [Ventas], // Denominador: ventas totales visibles.
201
+ 0 // Si no hay ventas, devuelve cero en lugar de BLANK.
202
+ )
203
+ displayFolder: Ratios
204
+ lineageTag: 44abd84b-93fd-4691-9595-5dd70d5c1ec0
205
+
206
+ formatStringDefinition = FormatoMetricaPorNombre ( "Ventas nuevos clientes %" )
207
+
208
+ /// Título textual para visuals: devuelve el nombre de la métrica seleccionada desde Métricas[Métrica].
209
+ measure 'Título métrica' =
210
+ VAR __MetricName =
211
+ COALESCE (
212
+ SELECTEDVALUE ( '_GC Métrica'[Métrica] ), // Fuente principal: metrica elegida en el slicer del reporte.
213
+ SELECTEDVALUE ( 'Métricas'[Métrica] ), // Fallback: tabla maestra cuando el contexto viene directo desde Metricas.
214
+ "Ventas" // Fallback final para que el titulo nunca quede vacio.
215
+ )
216
+ RETURN
217
+ __MetricName // Texto que Power BI usa como titulo dinamico del visual.
218
+ displayFolder: Auxiliar
219
+ lineageTag: ab43c6f2-0fee-4d37-96fe-ca978cf66ea2
220
+
221
+ /// Subtítulo textual para visuals: devuelve la definición de la métrica seleccionada desde Métricas[Descripción].
222
+ measure 'Subtítulo métrica' =
223
+ VAR __MetricName =
224
+ COALESCE (
225
+ SELECTEDVALUE ( '_GC Métrica'[Métrica] ), // Fuente principal: metrica elegida en el slicer del reporte.
226
+ SELECTEDVALUE ( 'Métricas'[Métrica] ), // Fallback: tabla maestra cuando el contexto viene directo desde Metricas.
227
+ "Ventas" // Fallback final para poder buscar una descripcion.
228
+ )
229
+ RETURN
230
+ LOOKUPVALUE (
231
+ 'Métricas'[Descripción], // Texto descriptivo que se mostrara como subtitulo dinamico.
232
+ 'Métricas'[Métrica], __MetricName // Busca la descripcion de la metrica activa.
233
+ )
234
+ displayFolder: Auxiliar
235
+ lineageTag: eab62d0c-d40b-4b8a-b79c-cec58830ea57
236
+
237
+ /// Moneda base definida por el parámetro Power Query MonedaBase. También es el default de visualización cuando no hay una selección única en Monedas.
238
+ measure 'Moneda base' =
239
+ VAR __ConfiguredCurrency =
240
+ MAXX (
241
+ FILTER (
242
+ ALL ( '_Aux Modelo configuración' ), // Ignora filtros externos para leer la configuracion global del modelo.
243
+ '_Aux Modelo configuración'[Configuración] = "Moneda Base" // Deja solo la fila que guarda la moneda base.
244
+ ),
245
+ '_Aux Modelo configuración'[ValorTexto] // Toma el valor textual de esa fila, por ejemplo USD.
246
+ )
247
+ RETURN
248
+ COALESCE ( __ConfiguredCurrency, "USD" ) // Si la configuracion falta, usa USD para que el modelo siga funcionando.
249
+ isHidden
250
+ displayFolder: Auxiliar
251
+ lineageTag: b65ba356-1fcd-4f55-b408-68e69b6bc77b
252
+
253
+ /// Dispatcher interno usado por helpers de etiquetas y colores. NO usar directamente en visuals principales; los visuals dinámicos deben usar los carriers [Actual] y [Previo] con el calc group '_GC Métrica'.
254
+ measure 'Métrica activa' =
255
+ VAR __MetricName =
256
+ COALESCE (
257
+ SELECTEDVALUE ( '_GC Métrica'[Métrica] ),
258
+ SELECTEDVALUE ( 'Métricas'[Métrica] ),
259
+ "Ventas"
260
+ )
261
+ RETURN
262
+ SWITCH (
263
+ __MetricName,
264
+ "Ventas", [Ventas],
265
+ "Margen bruto", [Margen bruto],
266
+ "Margen %", [Margen %],
267
+ "Pedidos", [Pedidos],
268
+ "Ticket promedio", [Ticket promedio],
269
+ "Pipeline abierto", [Pipeline abierto],
270
+ "Tasa de conversión", [Tasa de conversión],
271
+ "Inversión marketing", [Inversión marketing],
272
+ "Leads", [Leads],
273
+ "MQLs", [MQLs],
274
+ "Costo por lead", [Costo por lead],
275
+ "Tasa lead a cliente", [Tasa lead a cliente],
276
+ "ROAS", [ROAS],
277
+ "Ventas atribuidas", [Ventas atribuidas],
278
+ "Clientes activos", [Clientes activos],
279
+ "Clientes nuevos", [Clientes nuevos],
280
+ "Retención %", [Retención %],
281
+ "Churn %", [Churn %],
282
+ "NPS", [NPS],
283
+ "Reclamos", [Reclamos],
284
+ "Tiempo medio de respuesta", [Tiempo medio de respuesta],
285
+ "Órdenes completadas", [Órdenes completadas],
286
+ "Entregas a tiempo %", [Entregas a tiempo %],
287
+ "Backlog operativo", [Backlog operativo],
288
+ "Tiempo de ciclo", [Tiempo de ciclo],
289
+ "SLA cumplido %", [SLA cumplido %],
290
+ "Retrabajos", [Retrabajos],
291
+ "Capacidad utilizada %", [Capacidad utilizada %],
292
+ "Ingresos", [Ingresos],
293
+ "Gastos operativos", [Gastos operativos],
294
+ "EBITDA", [EBITDA],
295
+ "Margen operativo %", [Margen operativo %],
296
+ "Cash collected", [Cash collected],
297
+ "Cuentas por cobrar", [Cuentas por cobrar],
298
+ "Variación vs presupuesto %", [Variación vs presupuesto %],
299
+ "Productos activos", [Productos activos],
300
+ "Unidades vendidas", [Unidades vendidas],
301
+ "Mix productos %", [Mix productos %],
302
+ "Devoluciones %", [Devoluciones %],
303
+ "Margen por producto", [Margen por producto],
304
+ "Servicios adjuntos %", [Servicios adjuntos %],
305
+ "Productos sin venta", [Productos sin venta],
306
+ "Headcount", [Headcount],
307
+ "Costo laboral", [Costo laboral],
308
+ "Rotación %", [Rotación %],
309
+ "Ausentismo %", [Ausentismo %],
310
+ "Horas trabajadas", [Horas trabajadas],
311
+ "Horas facturables %", [Horas facturables %],
312
+ "Utilización %", [Utilización %],
313
+ "Proyectos activos", [Proyectos activos],
314
+ "Proyectos en riesgo", [Proyectos en riesgo],
315
+ "Avance promedio %", [Avance promedio %],
316
+ "Rentabilidad de proyectos", [Rentabilidad de proyectos],
317
+ "Horas de proyecto", [Horas de proyecto],
318
+ "Desvío presupuesto %", [Desvío presupuesto %],
319
+ "Tareas vencidas", [Tareas vencidas],
320
+ [Ventas]
321
+ )
322
+ isHidden
323
+ displayFolder: Auxiliar
324
+ lineageTag: e650b19e-4e72-4efd-a246-a8c4cb5f52d6
325
+
326
+ /// Devuelve la Tendencia (Sube/Baja es positivo) de la métrica seleccionada. Usado por helpers de color para decidir verde/rojo.
327
+ measure 'Tendencia activa' =
328
+ VAR __MetricName =
329
+ COALESCE (
330
+ SELECTEDVALUE ( '_GC Métrica'[Métrica] ), // Fuente principal: slicer auxiliar de metricas.
331
+ SELECTEDVALUE ( 'Métricas'[Métrica] ), // Fallback: tabla maestra de metricas.
332
+ "Ventas" // Fallback final para buscar tendencia.
333
+ )
334
+ RETURN
335
+ LOOKUPVALUE (
336
+ 'Métricas'[Tendencia], // Columna que indica si subir o bajar es positivo.
337
+ 'Métricas'[Métrica], __MetricName // Busca la fila de metadata de la metrica activa.
338
+ )
339
+ isHidden
340
+ displayFolder: Auxiliar
341
+ lineageTag: 6dce2db1-19ad-4f49-aba6-4808e6f3fe29
342
+
343
+ /// Etiqueta textual para tarjetas KPI: variación porcentual con ícono Unicode de dirección e incluye el valor previo en formato compacto como `Prev.`.
344
+ measure 'Etiqueta tarjeta' =
345
+ VAR __CambioPct = [Etiqueta variación %] // Pieza de variacion porcentual que puede colorearse si se usa separada.
346
+ VAR __Previo = [Etiqueta previo] // Pieza negra con el valor previo abreviado.
347
+ RETURN
348
+ IF (
349
+ ISBLANK ( __CambioPct ), "-", // Si no hay variacion calculable, muestra guion.
350
+ __CambioPct & " " & __Previo // Texto completo para tarjetas existentes: variacion mas previo.
351
+ )
352
+ displayFolder: Auxiliar
353
+ lineageTag: 1f31364d-831d-4e5b-854f-f3c6a9171d7f
354
+
355
+ /// Color para formato condicional de etiquetas de variación: Tremor Green #22C55E cuando la variación es favorable, Tremor Red #EF4444 cuando es desfavorable y Tremor Gray #6B7280 cuando es neutra o no evaluable.
356
+ measure 'Color etiqueta variación' =
357
+ VAR __Actual = CALCULATE ( [Métrica activa], '_GC Tipo cálculo'[Tipo cálculo] = "Actual" ) // Valor de la metrica activa en el periodo actual.
358
+ VAR __Previo = CALCULATE ( [Métrica activa], '_GC Tipo cálculo'[Tipo cálculo] = "Previo" ) // Valor de la metrica activa en el periodo previo.
359
+ VAR __VarPct = DIVIDE ( __Actual - __Previo, __Previo ) // Variacion porcentual segura; devuelve BLANK si previo es cero o vacio.
360
+ VAR __Trend = [Tendencia activa] // Metadata que dice si subir o bajar es positivo.
361
+ VAR __Direction =
362
+ SWITCH (
363
+ TRUE (),
364
+ ISBLANK ( __VarPct ), 0, // Sin variacion calculable, direccion neutra.
365
+ __VarPct > 0, 1, // Variacion positiva.
366
+ __VarPct < 0, -1, // Variacion negativa.
367
+ 0 // Variacion exactamente cero.
368
+ )
369
+ VAR __Score =
370
+ SWITCH (
371
+ TRUE (),
372
+ __Direction = 0 || ISBLANK ( __Trend ), 0, // Sin direccion o tendencia, color neutro.
373
+ __Trend IN { "Baja es positivo", "Negativo", "Negativa" } && __Direction < 0, 1, // Si bajar es bueno y bajo, es favorable.
374
+ __Trend IN { "Baja es positivo", "Negativo", "Negativa" } && __Direction > 0, -1, // Si bajar es bueno y subio, es desfavorable.
375
+ __Trend IN { "Sube es positivo", "Positivo", "Positiva" } && __Direction > 0, 1, // Si subir es bueno y subio, es favorable.
376
+ __Trend IN { "Sube es positivo", "Positivo", "Positiva" } && __Direction < 0, -1, // Si subir es bueno y bajo, es desfavorable.
377
+ 0 // Tendencia no reconocida, color neutro.
378
+ )
379
+ RETURN
380
+ SWITCH (
381
+ TRUE (),
382
+ __Score > 0, "#22C55E", // Favorable: verde.
383
+ __Score < 0, "#EF4444", // Desfavorable: rojo.
384
+ "#6B7280" // Neutro o no evaluable: gris.
385
+ )
386
+ displayFolder: Auxiliar
387
+ lineageTag: a1b430dd-e3c7-4777-98da-a8ab52a43d03
388
+
389
+ /// Color para formato condicional de bullet charts: Tremor Green/Red/Gray según dirección vs. tendencia configurada en Métricas.
390
+ measure 'Color bullet variación' = [Color etiqueta variación] // Reusa la misma regla de color semantico que las demas etiquetas.
391
+ displayFolder: Auxiliar
392
+ lineageTag: 6c9e9cdf-81af-4378-93b9-2e5a628737cd
393
+
394
+ /// Etiqueta compacta para bullet charts: solo ícono Unicode de subida/bajada y variación porcentual. El color se aplica con la medida 'Color bullet variación'.
395
+ measure 'Etiqueta bullet chart' = [Etiqueta variación %] // Etiqueta corta para bullet chart: solo flecha y variacion porcentual.
396
+ displayFolder: Auxiliar
397
+ lineageTag: 0e966a85-3d13-4745-8a42-1069a6b56050
398
+
399
+ /// Etiqueta textual compacta de la métrica activa. Usar en cards KPI cuando se necesita abreviación dinámica por métrica.
400
+ measure 'Etiqueta métrica activa' =
401
+ FormatoValorCompacto (
402
+ [Métrica activa] // Valor numerico de la metrica seleccionada convertido a texto compacto.
403
+ )
404
+ displayFolder: Auxiliar
405
+ lineageTag: 9c82ede2-2e3c-4c5c-8677-e7ceab381482
406
+
407
+ /// Ventas convertidas a la moneda seleccionada.
408
+ measure Ventas =
409
+ VAR __MonedaDestino = [Moneda seleccionada] // Moneda elegida por el usuario para ver importes.
410
+ VAR __MonedaBase = [Moneda base] // Moneda base configurada en el modelo.
411
+ VAR __VentasBase = SUM ( Ventas[Venta Bruta Base] ) // Ventas visibles ya convertidas a moneda base desde Power Query.
412
+ RETURN
413
+ IF (
414
+ __MonedaDestino = __MonedaBase, // Si destino y base coinciden, no hace falta convertir.
415
+ __VentasBase, // Devuelve ventas directamente en moneda base.
416
+ __VentasBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) ) // Convierte usando la tasa de la ultima fecha visible.
417
+ )
418
+ displayFolder: Ventas
419
+ lineageTag: a2d0e778-d4da-41b0-b1fd-e76537c8ef50
420
+
421
+ formatStringDefinition = FormatoMetricaPorNombre ( "Ventas" )
422
+
423
+ /// Carrier dinámico para el valor de la métrica seleccionada en el período previo comparable. Lee la métrica activa desde _GC Métrica o desde la tabla Métricas para que funcione en charts, cards y tooltips.
424
+ measure Previo =
425
+ CALCULATE (
426
+ [Métrica activa], // Evalua la misma metrica seleccionada que usa Actual.
427
+ '_GC Tipo cálculo'[Tipo cálculo] = "Previo" // Fuerza el rango de fechas previo comparable del calc group Tipo calculo.
428
+ )
429
+ displayFolder: Auxiliar
430
+ lineageTag: 606eb290-7693-4839-a654-e01a62abbc0b
431
+
432
+ formatStringDefinition =
433
+ VAR __MetricName =
434
+ COALESCE (
435
+ SELECTEDVALUE ( '_GC Métrica'[Métrica] ),
436
+ SELECTEDVALUE ( 'Métricas'[Métrica] ),
437
+ "Ventas"
438
+ )
439
+ RETURN
440
+ FormatoMetricaPorNombre ( __MetricName )
441
+
442
+ /// Etiqueta textual con solo el cambio absoluto abreviado entre paréntesis. Pensada para mostrarse en negro junto a la pieza coloreada de variación porcentual.
443
+ measure 'Etiqueta var abs' =
444
+ VAR __Actual = CALCULATE ( [Métrica activa], '_GC Tipo cálculo'[Tipo cálculo] = "Actual" ) // Valor de la metrica activa en el periodo actual.
445
+ VAR __Previo = CALCULATE ( [Métrica activa], '_GC Tipo cálculo'[Tipo cálculo] = "Previo" ) // Valor de la metrica activa en el periodo previo.
446
+ VAR __Change = __Actual - __Previo // Cambio absoluto: actual menos previo.
447
+ VAR __ChangeTxt = FormatoValorCompacto ( __Change ) // Cambio absoluto convertido a texto compacto segun la metrica.
448
+ RETURN
449
+ IF (
450
+ ISBLANK ( __Actual ) || ISBLANK ( __Previo ), BLANK (), // Si falta actual o previo, no muestra cambio.
451
+ __ChangeTxt // Devuelve solo el valor del cambio para que el visual lo combine con otras piezas.
452
+ )
453
+ displayFolder: Auxiliar
454
+ lineageTag: 506f228c-1517-4e55-92b1-5170ab28fb5b
455
+
456
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
457
+
458
+ /// Etiqueta textual con solo el ícono de dirección y la variación porcentual. Usar con formato condicional de color; las demás piezas de texto deben quedar en negro.
459
+ measure 'Etiqueta variación %' =
460
+ VAR __Actual = CALCULATE ( [Métrica activa], '_GC Tipo cálculo'[Tipo cálculo] = "Actual" ) // Valor de la metrica activa en el periodo actual.
461
+ VAR __Previo = CALCULATE ( [Métrica activa], '_GC Tipo cálculo'[Tipo cálculo] = "Previo" ) // Valor de la metrica activa en el periodo previo.
462
+ VAR __VarPct = DIVIDE ( __Actual - __Previo, __Previo ) // Variacion porcentual segura; devuelve BLANK si previo es cero o vacio.
463
+ VAR __Icon =
464
+ SWITCH (
465
+ TRUE (),
466
+ ISBLANK ( __VarPct ), BLANK (), // Sin variacion calculable, no muestra icono.
467
+ __VarPct > 0, UNICHAR ( 9650 ), // Variacion positiva: triangulo hacia arriba.
468
+ __VarPct < 0, UNICHAR ( 9660 ), // Variacion negativa: triangulo hacia abajo.
469
+ BLANK () // Variacion cero: no muestra icono.
470
+ )
471
+ VAR __PctTxt = FORMAT ( ABS ( __VarPct ), "0.0%" ) // ABS quita el signo porque la flecha ya marca direccion.
472
+ RETURN
473
+ IF (
474
+ ISBLANK ( __VarPct ), BLANK (), // Sin variacion calculable, no muestra texto.
475
+ IF ( ISBLANK ( __Icon ), __PctTxt, __Icon & " " & __PctTxt ) // Une flecha y porcentaje; si no hay flecha, muestra solo porcentaje.
476
+ )
477
+ displayFolder: Auxiliar
478
+ lineageTag: cf5bd5c1-ff2e-4e8a-9534-1b7d08c5c76d
479
+
480
+ /// Etiqueta textual con solo el valor actual abreviado de la métrica seleccionada. Pensada para mostrarse en negro junto a la pieza coloreada de variación porcentual.
481
+ measure 'Etiqueta actual' =
482
+ VAR __Actual = CALCULATE ( [Métrica activa], '_GC Tipo cálculo'[Tipo cálculo] = "Actual" ) // Valor de la metrica activa en el periodo actual.
483
+ RETURN
484
+ FormatoValorCompacto ( __Actual ) // Convierte el valor actual a texto compacto: moneda, porcentaje o numero.
485
+ displayFolder: Auxiliar
486
+ lineageTag: 489bcfae-60bf-4904-a560-28f12f1f62a2
487
+
488
+ /// Etiqueta textual con solo el valor previo abreviado entre paréntesis. Pensada para mostrarse en negro junto a la pieza coloreada de variación porcentual.
489
+ measure 'Etiqueta previo' =
490
+ VAR __Previo = CALCULATE ( [Métrica activa], '_GC Tipo cálculo'[Tipo cálculo] = "Previo" ) // Valor de la metrica activa en el periodo previo.
491
+ VAR __PrevioTxt = FormatoValorCompacto ( __Previo ) // Valor previo convertido a texto compacto segun la metrica.
492
+ RETURN
493
+ IF (
494
+ ISBLANK ( __Previo ), BLANK (), // Si no hay valor previo, no muestra la pieza.
495
+ "(Prev. " & __PrevioTxt & ")" // Texto final para mostrarse en negro junto a la variacion porcentual.
496
+ )
497
+ displayFolder: Auxiliar
498
+ lineageTag: 26e75ef8-97f8-4f69-bff0-c83d21c1f992
499
+
500
+ /// Alias técnico para visuales existentes que todavía referencian el nombre corto. Devuelve la medida canónica [Etiqueta variación %].
501
+ measure 'Etiqueta var %' = [Etiqueta variación %] // Alias tecnico para visuales que todavia apuntan al nombre anterior.
502
+ displayFolder: Auxiliar
503
+ lineageTag: 2e7766bf-de3d-4eb6-9418-2d4af1a0060c
504
+
505
+ /// Carrier dinámico para el cambio absoluto de la métrica seleccionada: Actual menos Previo en el mismo contexto de filtro/evaluación. Es numérico y sirve en cards, matrices, gráficos, tooltips y consultas DAX.
506
+ measure Variación =
507
+ VAR __Actual =
508
+ CALCULATE (
509
+ [Métrica activa], // Evalua la metrica seleccionada por el slicer o contexto activo, no el carrier base Ventas.
510
+ '_GC Tipo cálculo'[Tipo cálculo] = "Actual" // Aplica el rango actual definido por el contexto de fechas vigente.
511
+ )
512
+ VAR __Previo =
513
+ CALCULATE (
514
+ [Métrica activa], // Evalua la misma metrica seleccionada para mantener consistencia con Actual.
515
+ '_GC Tipo cálculo'[Tipo cálculo] = "Previo" // Aplica el rango previo comparable definido por el contexto de fechas vigente.
516
+ )
517
+ RETURN
518
+ IF (
519
+ NOT ISNUMBER ( __Actual ) || NOT ISNUMBER ( __Previo ), // Si alguno no es numerico, no fuerza cero ni texto.
520
+ BLANK (),
521
+ __Actual - __Previo // Cambio absoluto de la metrica seleccionada en el mismo contexto de filtro.
522
+ )
523
+ displayFolder: Auxiliar
524
+ lineageTag: 937f53e4-8055-499a-9181-713855f79c8a
525
+
526
+ formatStringDefinition =
527
+ VAR __MetricName =
528
+ COALESCE (
529
+ SELECTEDVALUE ( '_GC Métrica'[Métrica] ),
530
+ SELECTEDVALUE ( 'Métricas'[Métrica] ),
531
+ "Ventas"
532
+ )
533
+ RETURN
534
+ FormatoMetricaPorNombre ( __MetricName )
535
+
536
+ /// Carrier dinámico para la variación porcentual de la métrica seleccionada contra Previo en el mismo contexto de filtro/evaluación. Devuelve un valor numérico porcentual, no una etiqueta textual.
537
+ measure 'Variación %' =
538
+ VAR __Actual =
539
+ CALCULATE (
540
+ [Métrica activa], // Evalua la metrica seleccionada por el slicer o contexto activo, no el carrier base Ventas.
541
+ '_GC Tipo cálculo'[Tipo cálculo] = "Actual" // Aplica el rango actual definido por el contexto de fechas vigente.
542
+ )
543
+ VAR __Previo =
544
+ CALCULATE (
545
+ [Métrica activa], // Evalua la misma metrica seleccionada para mantener consistencia con Actual.
546
+ '_GC Tipo cálculo'[Tipo cálculo] = "Previo" // Aplica el rango previo comparable definido por el contexto de fechas vigente.
547
+ )
548
+ RETURN
549
+ IF (
550
+ NOT ISNUMBER ( __Actual ) || NOT ISNUMBER ( __Previo ) || __Previo = 0, // Evita porcentajes sin base comparable.
551
+ BLANK (),
552
+ DIVIDE ( __Actual - __Previo, __Previo ) // Variacion porcentual segura contra el valor previo.
553
+ )
554
+ formatString: 0.0%;-0.0%;0.0%
555
+ displayFolder: Auxiliar
556
+ lineageTag: c7efd075-16cd-47d4-9b4e-a55bd09ef069
557
+
558
+ /// Alias de compatibilidad para visuales que muestran solo el icono de direccion y la variacion porcentual. Devuelve la medida canonica [Etiqueta variación %].
559
+ measure 'Etiqueta cambio %' = [Etiqueta variación %]
560
+ displayFolder: Auxiliar
561
+ lineageTag: 1fd607ad-a298-42ed-a45b-32478d8cef1b
562
+
563
+ /// Alias de compatibilidad para visuales que muestran el cambio absoluto abreviado. Devuelve la medida canonica [Etiqueta var abs].
564
+ measure 'Etiqueta cambio absoluto' = [Etiqueta var abs]
565
+ displayFolder: Auxiliar
566
+ lineageTag: a011f129-ee82-40b8-9b9f-8ba9a5c17ec1
567
+
568
+ /// Importe potencial de oportunidades abiertas en la moneda seleccionada.
569
+ measure 'Pipeline abierto' =
570
+ VAR __MonedaDestino = [Moneda seleccionada]
571
+ VAR __MonedaBase = [Moneda base]
572
+ VAR __ValorBase =
573
+ CALCULATE (
574
+ SUM ( Oportunidades[Importe Potencial Base] ),
575
+ Oportunidades[Estado] = "Abierta"
576
+ )
577
+ RETURN
578
+ IF (
579
+ __MonedaDestino = __MonedaBase,
580
+ __ValorBase,
581
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
582
+ )
583
+ displayFolder: Ventas
584
+ lineageTag: 65543182-8c6d-4f72-b230-99238c163cd5
585
+
586
+ formatStringDefinition = FormatoMetricaPorNombre ( "Pipeline abierto" )
587
+
588
+ /// Oportunidades ganadas divididas por oportunidades totales.
589
+ measure 'Tasa de conversión' =
590
+ DIVIDE (
591
+ CALCULATE ( COUNTROWS ( Oportunidades ), Oportunidades[Estado] = "Ganada" ),
592
+ COUNTROWS ( Oportunidades ),
593
+ 0
594
+ )
595
+ displayFolder: Ventas
596
+ lineageTag: 95c17dad-1a0c-4d22-87d1-d4a6419b8159
597
+
598
+ formatStringDefinition = FormatoMetricaPorNombre ( "Tasa de conversión" )
599
+
600
+ /// Inversión de marketing en la moneda seleccionada.
601
+ measure 'Inversión marketing' =
602
+ VAR __MonedaDestino = [Moneda seleccionada]
603
+ VAR __MonedaBase = [Moneda base]
604
+ VAR __ValorBase = SUM ( Leads[Costo Base] )
605
+ RETURN
606
+ IF (
607
+ __MonedaDestino = __MonedaBase,
608
+ __ValorBase,
609
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
610
+ )
611
+ displayFolder: Marketing
612
+ lineageTag: 7d4bbb57-2543-4fd8-9ec0-b69f3478d4b0
613
+
614
+ formatStringDefinition = FormatoMetricaPorNombre ( "Inversión marketing" )
615
+
616
+ /// Cantidad de leads generados por campañas.
617
+ measure Leads = SUM ( Leads[Leads] )
618
+ displayFolder: Marketing
619
+ lineageTag: 16f1739d-875d-4c20-9662-cc92eac399cd
620
+
621
+ formatStringDefinition = FormatoMetricaPorNombre ( "Leads" )
622
+
623
+ /// Leads calificados por marketing.
624
+ measure MQLs = SUM ( Leads[MQLs] )
625
+ displayFolder: Marketing
626
+ lineageTag: 99f05c1e-f7ad-4dc3-affe-067eaa6b983d
627
+
628
+ formatStringDefinition = FormatoMetricaPorNombre ( "MQLs" )
629
+
630
+ /// Inversión marketing dividida por leads generados.
631
+ measure 'Costo por lead' = DIVIDE ( [Inversión marketing], [Leads], 0 )
632
+ displayFolder: Marketing
633
+ lineageTag: 175b86e1-180c-487c-9b29-2a3fa2246efc
634
+
635
+ formatStringDefinition = FormatoMetricaPorNombre ( "Costo por lead" )
636
+
637
+ /// Clientes ganados divididos por leads generados.
638
+ measure 'Tasa lead a cliente' = DIVIDE ( SUM ( Leads[Clientes ganados] ), [Leads], 0 )
639
+ displayFolder: Marketing
640
+ lineageTag: 843b33cf-5e3e-42fb-a93b-7666fcc780b8
641
+
642
+ formatStringDefinition = FormatoMetricaPorNombre ( "Tasa lead a cliente" )
643
+
644
+ /// Ventas atribuidas divididas por inversión marketing.
645
+ measure ROAS = DIVIDE ( [Ventas atribuidas], [Inversión marketing], 0 )
646
+ displayFolder: Marketing
647
+ lineageTag: cfdc76aa-d88d-4ce8-a7ea-a30b7759a8d9
648
+
649
+ formatStringDefinition = FormatoMetricaPorNombre ( "ROAS" )
650
+
651
+ /// Ventas atribuidas a campañas en la moneda seleccionada.
652
+ measure 'Ventas atribuidas' =
653
+ VAR __MonedaDestino = [Moneda seleccionada]
654
+ VAR __MonedaBase = [Moneda base]
655
+ VAR __ValorBase = SUM ( Leads[Ventas Atribuidas Base] )
656
+ RETURN
657
+ IF (
658
+ __MonedaDestino = __MonedaBase,
659
+ __ValorBase,
660
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
661
+ )
662
+ displayFolder: Marketing
663
+ lineageTag: 79397856-26e9-478d-ae61-a0e82ae12efb
664
+
665
+ formatStringDefinition = FormatoMetricaPorNombre ( "Ventas atribuidas" )
666
+
667
+ /// Clientes con ventas visibles en el período.
668
+ measure 'Clientes activos' = DISTINCTCOUNT ( Ventas[ClienteId] )
669
+ displayFolder: Clientes
670
+ lineageTag: 09ee285c-f9d8-49a1-a355-06c642899837
671
+
672
+ formatStringDefinition = FormatoMetricaPorNombre ( "Clientes activos" )
673
+
674
+ /// Clientes cuya primera venta histórica cae dentro del contexto de fechas visible.
675
+ measure 'Clientes nuevos' =
676
+ VAR __FechasVisibles = VALUES ( 'Calendario'[Fecha] )
677
+ VAR __ClientesNuevos =
678
+ FILTER (
679
+ VALUES ( Clientes[ClienteId] ),
680
+ VAR __PrimeraVentaCliente =
681
+ CALCULATE ( MIN ( Ventas[Fecha] ), REMOVEFILTERS ( 'Calendario' ) )
682
+ RETURN
683
+ CONTAINSROW ( __FechasVisibles, __PrimeraVentaCliente )
684
+ )
685
+ RETURN
686
+ COUNTROWS ( __ClientesNuevos )
687
+ displayFolder: Clientes
688
+ lineageTag: 93c607a3-add3-43b0-b819-b7c0ea12678f
689
+
690
+ formatStringDefinition = FormatoMetricaPorNombre ( "Clientes nuevos" )
691
+
692
+ /// Clientes perdidos divididos por clientes al inicio del período.
693
+ measure 'Churn %' =
694
+ DIVIDE (
695
+ SUM ( 'Interacciones clientes'[Clientes Perdidos] ),
696
+ SUM ( 'Interacciones clientes'[Clientes Inicio] ),
697
+ 0
698
+ )
699
+ displayFolder: Clientes
700
+ lineageTag: 56b9c169-4baa-4f6c-9557-b40cd846d21a
701
+
702
+ formatStringDefinition = FormatoMetricaPorNombre ( "Churn %" )
703
+
704
+ /// Porcentaje de clientes retenidos después del churn observado.
705
+ measure 'Retención %' = 1 - [Churn %]
706
+ displayFolder: Clientes
707
+ lineageTag: aebaf1c7-5698-4f1b-b746-cc5df21cfad5
708
+
709
+ formatStringDefinition = FormatoMetricaPorNombre ( "Retención %" )
710
+
711
+ /// Promedio del indicador de recomendación de clientes.
712
+ measure NPS = AVERAGE ( 'Interacciones clientes'[NPS] )
713
+ displayFolder: Clientes
714
+ lineageTag: e2d9c0f1-44f6-416a-a966-36d2e7f6930f
715
+
716
+ formatStringDefinition = FormatoMetricaPorNombre ( "NPS" )
717
+
718
+ /// Cantidad de reclamos de clientes.
719
+ measure Reclamos = SUM ( 'Interacciones clientes'[Reclamos] )
720
+ displayFolder: Clientes
721
+ lineageTag: 3f2a27c7-2c8f-4b6a-b793-74e55e481cfa
722
+
723
+ formatStringDefinition = FormatoMetricaPorNombre ( "Reclamos" )
724
+
725
+ /// Horas promedio de respuesta al cliente.
726
+ measure 'Tiempo medio de respuesta' = AVERAGE ( 'Interacciones clientes'[Tiempo Respuesta Horas] )
727
+ displayFolder: Clientes
728
+ lineageTag: 99f1ce01-3040-4363-a1c9-1a15bf0ed3bf
729
+
730
+ formatStringDefinition = FormatoMetricaPorNombre ( "Tiempo medio de respuesta" )
731
+
732
+ /// Órdenes de servicio completadas.
733
+ measure 'Órdenes completadas' = SUM ( 'Órdenes servicio'[Órdenes Completadas] )
734
+ displayFolder: Operaciones
735
+ lineageTag: 7cea5bde-e739-4dc3-bfed-0749e0b9da56
736
+
737
+ formatStringDefinition = FormatoMetricaPorNombre ( "Órdenes completadas" )
738
+
739
+ /// Entregas a tiempo divididas por entregas totales.
740
+ measure 'Entregas a tiempo %' =
741
+ DIVIDE (
742
+ SUMX ( Entregas, MIN ( Entregas[Entregas A Tiempo], Entregas[Entregas] ) ),
743
+ SUM ( Entregas[Entregas] ),
744
+ 0
745
+ )
746
+ displayFolder: Operaciones
747
+ lineageTag: 0959f136-a4ee-4a80-b1ca-2584b76623b8
748
+
749
+ formatStringDefinition = FormatoMetricaPorNombre ( "Entregas a tiempo %" )
750
+
751
+ /// Órdenes pendientes de resolver.
752
+ measure 'Backlog operativo' = SUM ( 'Órdenes servicio'[Backlog] )
753
+ displayFolder: Operaciones
754
+ lineageTag: eec008ce-0c27-404a-9384-792c6cac2aad
755
+
756
+ formatStringDefinition = FormatoMetricaPorNombre ( "Backlog operativo" )
757
+
758
+ /// Días promedio de ciclo operativo.
759
+ measure 'Tiempo de ciclo' = AVERAGE ( 'Órdenes servicio'[Tiempo Ciclo Días] )
760
+ displayFolder: Operaciones
761
+ lineageTag: 18c33e5d-d23c-4b0a-9aa4-3f7f351d5297
762
+
763
+ formatStringDefinition = FormatoMetricaPorNombre ( "Tiempo de ciclo" )
764
+
765
+ /// Órdenes con SLA cumplido sobre órdenes totales.
766
+ measure 'SLA cumplido %' =
767
+ DIVIDE (
768
+ SUMX ( 'Órdenes servicio', MIN ( 'Órdenes servicio'[SLA Cumplido], 'Órdenes servicio'[Órdenes] ) ),
769
+ SUM ( 'Órdenes servicio'[Órdenes] ),
770
+ 0
771
+ )
772
+ displayFolder: Operaciones
773
+ lineageTag: d0e1ae0e-c327-4c54-bf67-69e8a1fb695c
774
+
775
+ formatStringDefinition = FormatoMetricaPorNombre ( "SLA cumplido %" )
776
+
777
+ /// Cantidad de retrabajos operativos.
778
+ measure Retrabajos = SUM ( 'Órdenes servicio'[Retrabajos] )
779
+ displayFolder: Operaciones
780
+ lineageTag: 13161d19-b66b-4169-a37a-effa8454fd68
781
+
782
+ formatStringDefinition = FormatoMetricaPorNombre ( "Retrabajos" )
783
+
784
+ /// Horas usadas divididas por horas disponibles.
785
+ measure 'Capacidad utilizada %' =
786
+ MIN (
787
+ 1,
788
+ DIVIDE (
789
+ SUM ( 'Órdenes servicio'[Horas Usadas] ),
790
+ SUM ( 'Órdenes servicio'[Horas Disponibles] ),
791
+ 0
792
+ )
793
+ )
794
+ displayFolder: Operaciones
795
+ lineageTag: fd28400f-39b6-47b5-b9b8-2c7026a9960a
796
+
797
+ formatStringDefinition = FormatoMetricaPorNombre ( "Capacidad utilizada %" )
798
+
799
+ /// Ingresos financieros en la moneda seleccionada.
800
+ measure Ingresos =
801
+ VAR __MonedaDestino = [Moneda seleccionada]
802
+ VAR __MonedaBase = [Moneda base]
803
+ VAR __ValorBase =
804
+ CALCULATE (
805
+ SUM ( 'Movimientos financieros'[Importe Base] ),
806
+ 'Movimientos financieros'[Tipo movimiento] = "Ingreso"
807
+ )
808
+ RETURN
809
+ IF (
810
+ __MonedaDestino = __MonedaBase,
811
+ __ValorBase,
812
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
813
+ )
814
+ displayFolder: Finanzas
815
+ lineageTag: ab69a934-4041-4d0f-93c3-d5486ced0f33
816
+
817
+ formatStringDefinition = FormatoMetricaPorNombre ( "Ingresos" )
818
+
819
+ /// Gastos operativos en la moneda seleccionada.
820
+ measure 'Gastos operativos' =
821
+ VAR __MonedaDestino = [Moneda seleccionada]
822
+ VAR __MonedaBase = [Moneda base]
823
+ VAR __ValorBase =
824
+ CALCULATE (
825
+ SUM ( 'Movimientos financieros'[Importe Base] ),
826
+ 'Movimientos financieros'[Tipo movimiento] = "Gasto operativo"
827
+ )
828
+ RETURN
829
+ IF (
830
+ __MonedaDestino = __MonedaBase,
831
+ __ValorBase,
832
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
833
+ )
834
+ displayFolder: Finanzas
835
+ lineageTag: 6de8a220-603a-4369-91c8-d80d884686a7
836
+
837
+ formatStringDefinition = FormatoMetricaPorNombre ( "Gastos operativos" )
838
+
839
+ /// Ingresos menos gastos operativos.
840
+ measure EBITDA = [Ingresos] - [Gastos operativos]
841
+ displayFolder: Finanzas
842
+ lineageTag: dcbc4eee-4154-4e54-a3bf-5beb029c731e
843
+
844
+ formatStringDefinition = FormatoMetricaPorNombre ( "EBITDA" )
845
+
846
+ /// EBITDA dividido por ingresos.
847
+ measure 'Margen operativo %' = DIVIDE ( [EBITDA], [Ingresos], 0 )
848
+ displayFolder: Finanzas
849
+ lineageTag: b0584055-7bf8-4c22-9b5d-6ccac5a6ef20
850
+
851
+ formatStringDefinition = FormatoMetricaPorNombre ( "Margen operativo %" )
852
+
853
+ /// Cobros registrados en la moneda seleccionada.
854
+ measure 'Cash collected' =
855
+ VAR __MonedaDestino = [Moneda seleccionada]
856
+ VAR __MonedaBase = [Moneda base]
857
+ VAR __ValorBase =
858
+ CALCULATE (
859
+ SUM ( 'Movimientos financieros'[Importe Base] ),
860
+ 'Movimientos financieros'[Tipo movimiento] = "Cobro"
861
+ )
862
+ RETURN
863
+ IF (
864
+ __MonedaDestino = __MonedaBase,
865
+ __ValorBase,
866
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
867
+ )
868
+ displayFolder: Finanzas
869
+ lineageTag: e91416d7-1420-4240-9e4f-6615e9515f21
870
+
871
+ formatStringDefinition = FormatoMetricaPorNombre ( "Cash collected" )
872
+
873
+ /// Saldo de cuentas por cobrar en la moneda seleccionada.
874
+ measure 'Cuentas por cobrar' =
875
+ VAR __MonedaDestino = [Moneda seleccionada]
876
+ VAR __MonedaBase = [Moneda base]
877
+ VAR __ValorBase =
878
+ CALCULATE (
879
+ SUM ( 'Movimientos financieros'[Importe Base] ),
880
+ 'Movimientos financieros'[Tipo movimiento] = "Cuenta por cobrar"
881
+ )
882
+ RETURN
883
+ IF (
884
+ __MonedaDestino = __MonedaBase,
885
+ __ValorBase,
886
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
887
+ )
888
+ displayFolder: Finanzas
889
+ lineageTag: 406ed092-ae8d-4bc8-ac75-89f833cb6a20
890
+
891
+ formatStringDefinition = FormatoMetricaPorNombre ( "Cuentas por cobrar" )
892
+
893
+ /// Presupuesto de ingresos en moneda seleccionada usado por la variación contra presupuesto.
894
+ measure 'Presupuesto ingresos' =
895
+ VAR __MonedaDestino = [Moneda seleccionada]
896
+ VAR __MonedaBase = [Moneda base]
897
+ VAR __ValorBase = SUM ( Presupuesto[Importe Presupuesto Base] )
898
+ RETURN
899
+ IF (
900
+ __MonedaDestino = __MonedaBase,
901
+ __ValorBase,
902
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
903
+ )
904
+ isHidden
905
+ displayFolder: Finanzas
906
+ lineageTag: 6a179a4e-ac7d-48b9-a7f5-39d817d8fe0a
907
+
908
+ formatStringDefinition = FormatoMetricaPorNombre ( "Ingresos" )
909
+
910
+ /// Diferencia porcentual entre ingresos y presupuesto.
911
+ measure 'Variación vs presupuesto %' = DIVIDE ( [Ingresos] - [Presupuesto ingresos], [Presupuesto ingresos], 0 )
912
+ displayFolder: Finanzas
913
+ lineageTag: fbd6529b-13c9-4a95-b9eb-114de185709d
914
+
915
+ formatStringDefinition = FormatoMetricaPorNombre ( "Variación vs presupuesto %" )
916
+
917
+ /// Productos con ventas visibles.
918
+ measure 'Productos activos' = DISTINCTCOUNT ( Ventas[ProductoId] )
919
+ displayFolder: Producto
920
+ lineageTag: c492d76b-e605-469e-919a-f5bcd01a9220
921
+
922
+ formatStringDefinition = FormatoMetricaPorNombre ( "Productos activos" )
923
+
924
+ /// Participación de ventas del producto dentro del total visible.
925
+ measure 'Mix productos %' =
926
+ DIVIDE (
927
+ [Ventas],
928
+ CALCULATE ( [Ventas], REMOVEFILTERS ( Productos ) ),
929
+ 0
930
+ )
931
+ displayFolder: Producto
932
+ lineageTag: 6f1650c6-00d5-4c1a-8a09-5ba7991e0fb6
933
+
934
+ formatStringDefinition = FormatoMetricaPorNombre ( "Mix productos %" )
935
+
936
+ /// Unidades devueltas divididas por unidades vendidas.
937
+ measure 'Devoluciones %' = DIVIDE ( SUM ( Devoluciones[Unidades Devueltas] ), [Unidades vendidas], 0 )
938
+ displayFolder: Producto
939
+ lineageTag: d7a0947a-15fb-4269-ba87-f3548f283602
940
+
941
+ formatStringDefinition = FormatoMetricaPorNombre ( "Devoluciones %" )
942
+
943
+ /// Margen bruto evaluado por producto.
944
+ measure 'Margen por producto' = [Margen bruto]
945
+ displayFolder: Producto
946
+ lineageTag: 6a73cf78-b0e8-4c14-b4d8-2a392ad5a098
947
+
948
+ formatStringDefinition = FormatoMetricaPorNombre ( "Margen por producto" )
949
+
950
+ /// Servicios adjuntos divididos por pedidos.
951
+ measure 'Servicios adjuntos %' = DIVIDE ( SUM ( 'Órdenes servicio'[Servicios Adjuntos] ), [Pedidos], 0 )
952
+ displayFolder: Producto
953
+ lineageTag: e9e8820a-63fa-49db-a74d-32ab185171b6
954
+
955
+ formatStringDefinition = FormatoMetricaPorNombre ( "Servicios adjuntos %" )
956
+
957
+ /// Productos sin ventas en el contexto visible.
958
+ measure 'Productos sin venta' =
959
+ COALESCE (
960
+ COUNTROWS (
961
+ EXCEPT (
962
+ VALUES ( Productos[ProductoId] ),
963
+ CALCULATETABLE ( VALUES ( Ventas[ProductoId] ) )
964
+ )
965
+ ),
966
+ 0
967
+ )
968
+ displayFolder: Producto
969
+ lineageTag: 676fd5d5-2ede-400b-86de-6fe7e83e2bc1
970
+
971
+ formatStringDefinition = FormatoMetricaPorNombre ( "Productos sin venta" )
972
+
973
+ /// Cantidad de personas del equipo.
974
+ measure Headcount = MAX ( 'Nómina'[Headcount] )
975
+ displayFolder: Personas
976
+ lineageTag: 1dcd0198-4c0e-44d1-bf5a-9059a33f7696
977
+
978
+ formatStringDefinition = FormatoMetricaPorNombre ( "Headcount" )
979
+
980
+ /// Costo laboral en la moneda seleccionada.
981
+ measure 'Costo laboral' =
982
+ VAR __MonedaDestino = [Moneda seleccionada]
983
+ VAR __MonedaBase = [Moneda base]
984
+ VAR __ValorBase = SUM ( 'Nómina'[Costo Laboral Base] )
985
+ RETURN
986
+ IF (
987
+ __MonedaDestino = __MonedaBase,
988
+ __ValorBase,
989
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
990
+ )
991
+ displayFolder: Personas
992
+ lineageTag: e86c6100-dcc9-4448-9e4b-4af3e3e0169b
993
+
994
+ formatStringDefinition = FormatoMetricaPorNombre ( "Costo laboral" )
995
+
996
+ /// Bajas divididas por headcount promedio.
997
+ measure 'Rotación %' = DIVIDE ( SUM ( 'Nómina'[Bajas] ), AVERAGE ( 'Nómina'[Headcount] ), 0 )
998
+ displayFolder: Personas
999
+ lineageTag: 05e648ba-d39c-470c-935e-6d8d37dde966
1000
+
1001
+ formatStringDefinition = FormatoMetricaPorNombre ( "Rotación %" )
1002
+
1003
+ /// Horas ausentes divididas por horas planificadas.
1004
+ measure 'Ausentismo %' = DIVIDE ( SUM ( Horas[Horas Ausentes] ), SUM ( Horas[Horas Planificadas] ), 0 )
1005
+ displayFolder: Personas
1006
+ lineageTag: 0a0b7203-941f-4676-ad9f-51add61092a5
1007
+
1008
+ formatStringDefinition = FormatoMetricaPorNombre ( "Ausentismo %" )
1009
+
1010
+ /// Horas trabajadas por los equipos.
1011
+ measure 'Horas trabajadas' = SUM ( Horas[Horas Trabajadas] )
1012
+ displayFolder: Personas
1013
+ lineageTag: 4b31bc13-8c38-4bb3-b33e-957580463c83
1014
+
1015
+ formatStringDefinition = FormatoMetricaPorNombre ( "Horas trabajadas" )
1016
+
1017
+ /// Horas facturables divididas por horas trabajadas.
1018
+ measure 'Horas facturables %' = DIVIDE ( SUM ( Horas[Horas Facturables] ), SUM ( Horas[Horas Trabajadas] ), 0 )
1019
+ displayFolder: Personas
1020
+ lineageTag: e8714fe4-b757-4e38-a2d7-45fe79ef3ae7
1021
+
1022
+ formatStringDefinition = FormatoMetricaPorNombre ( "Horas facturables %" )
1023
+
1024
+ /// Horas facturables divididas por horas disponibles.
1025
+ measure 'Utilización %' = DIVIDE ( SUM ( Horas[Horas Facturables] ), SUM ( Horas[Horas Disponibles] ), 0 )
1026
+ displayFolder: Personas
1027
+ lineageTag: 7df3aa97-5596-4229-a06f-4ae0ead87640
1028
+
1029
+ formatStringDefinition = FormatoMetricaPorNombre ( "Utilización %" )
1030
+
1031
+ /// Proyectos con ejecución activa.
1032
+ measure 'Proyectos activos' =
1033
+ CALCULATE (
1034
+ DISTINCTCOUNT ( 'Ejecución proyectos'[ProyectoId] ),
1035
+ 'Ejecución proyectos'[Estado ejecución] = "Activo"
1036
+ )
1037
+ displayFolder: Proyectos
1038
+ lineageTag: 7573d287-d6a4-4e0b-8509-e74600c5d72f
1039
+
1040
+ formatStringDefinition = FormatoMetricaPorNombre ( "Proyectos activos" )
1041
+
1042
+ /// Proyectos marcados como en riesgo.
1043
+ measure 'Proyectos en riesgo' =
1044
+ CALCULATE (
1045
+ DISTINCTCOUNT ( 'Ejecución proyectos'[ProyectoId] ),
1046
+ 'Ejecución proyectos'[Estado ejecución] = "En riesgo"
1047
+ )
1048
+ displayFolder: Proyectos
1049
+ lineageTag: ad31906c-8f38-48e9-ade8-b4175169d185
1050
+
1051
+ formatStringDefinition = FormatoMetricaPorNombre ( "Proyectos en riesgo" )
1052
+
1053
+ /// Avance promedio de proyectos.
1054
+ measure 'Avance promedio %' = AVERAGE ( 'Ejecución proyectos'[Avance] )
1055
+ displayFolder: Proyectos
1056
+ lineageTag: f51a6d77-cea5-4cae-b472-0318b9863202
1057
+
1058
+ formatStringDefinition = FormatoMetricaPorNombre ( "Avance promedio %" )
1059
+
1060
+ /// Ingresos de proyecto menos costos de proyecto en moneda seleccionada.
1061
+ measure 'Rentabilidad de proyectos' =
1062
+ VAR __MonedaDestino = [Moneda seleccionada]
1063
+ VAR __MonedaBase = [Moneda base]
1064
+ VAR __ValorBase = SUM ( 'Ejecución proyectos'[Ingresos Base] ) - SUM ( 'Ejecución proyectos'[Costos Base] )
1065
+ RETURN
1066
+ IF (
1067
+ __MonedaDestino = __MonedaBase,
1068
+ __ValorBase,
1069
+ __ValorBase * GetExchangeRate ( __MonedaDestino, MAX ( 'Calendario'[Fecha] ) )
1070
+ )
1071
+ displayFolder: Proyectos
1072
+ lineageTag: 5bd5518f-e899-4b46-a227-6105a4f7fd64
1073
+
1074
+ formatStringDefinition = FormatoMetricaPorNombre ( "Rentabilidad de proyectos" )
1075
+
1076
+ /// Horas registradas en tareas de proyecto.
1077
+ measure 'Horas de proyecto' = SUM ( 'Tareas proyecto'[Horas] )
1078
+ displayFolder: Proyectos
1079
+ lineageTag: a23f296d-2a18-4f61-94a3-d4d5e0d6ba7c
1080
+
1081
+ formatStringDefinition = FormatoMetricaPorNombre ( "Horas de proyecto" )
1082
+
1083
+ /// Costos de proyecto contra presupuesto aprobado.
1084
+ measure 'Desvío presupuesto %' =
1085
+ DIVIDE (
1086
+ SUM ( 'Ejecución proyectos'[Costos Base] ) - SUM ( 'Ejecución proyectos'[Presupuesto Base] ),
1087
+ SUM ( 'Ejecución proyectos'[Presupuesto Base] ),
1088
+ 0
1089
+ )
1090
+ displayFolder: Proyectos
1091
+ lineageTag: 35fed7ee-918f-41fe-be63-0b1a2066bd8a
1092
+
1093
+ formatStringDefinition = FormatoMetricaPorNombre ( "Desvío presupuesto %" )
1094
+
1095
+ /// Tareas vencidas de proyectos.
1096
+ measure 'Tareas vencidas' = SUM ( 'Tareas proyecto'[Tareas Vencidas] )
1097
+ displayFolder: Proyectos
1098
+ lineageTag: 6c7f6af9-5574-4279-b062-5befca393d09
1099
+
1100
+ formatStringDefinition = FormatoMetricaPorNombre ( "Tareas vencidas" )
1101
+
1102
+ column Métrica
1103
+ isHidden
1104
+ lineageTag: 748cb7e2-0803-4f55-a9e0-eb44ea479875
1105
+ summarizeBy: none
1106
+ isNameInferred
1107
+ sourceColumn: [Métrica]
1108
+ sortByColumn: Índice
1109
+
1110
+ column Índice
1111
+ isHidden
1112
+ formatString: 0
1113
+ lineageTag: cda91f1e-e9df-4a43-a7e0-93b753a3aa2f
1114
+ summarizeBy: none
1115
+ isNameInferred
1116
+ sourceColumn: [Índice]
1117
+
1118
+ column Formato
1119
+ isHidden
1120
+ lineageTag: 42b9b96a-0e2a-4101-8948-c109fb8060e2
1121
+ summarizeBy: none
1122
+ isNameInferred
1123
+ sourceColumn: [Formato]
1124
+
1125
+ column Tendencia
1126
+ isHidden
1127
+ lineageTag: 2c23d1b2-5d16-4816-9950-7b808c986195
1128
+ summarizeBy: none
1129
+ isNameInferred
1130
+ sourceColumn: [Tendencia]
1131
+
1132
+ column Acumulado
1133
+ isHidden
1134
+ lineageTag: 02dbb720-4ccb-4bf5-8dcb-d968fb47cef0
1135
+ summarizeBy: none
1136
+ isNameInferred
1137
+ sourceColumn: [Acumulado]
1138
+
1139
+ column Descripción
1140
+ isHidden
1141
+ lineageTag: 44a61e89-9050-4664-b8f0-cb86c9afb703
1142
+ summarizeBy: none
1143
+ isNameInferred
1144
+ sourceColumn: [Descripción]
1145
+
1146
+ column Monetaria
1147
+ isHidden
1148
+ lineageTag: 01fbb1bb-8876-49bb-aaa1-6a956dac8ff0
1149
+ isNameInferred
1150
+ sourceColumn: [Monetaria]
1151
+
1152
+ /// Tipo lógico usado por FormatoMetricaPorNombre: Moneda, Porcentaje o Número.
1153
+ column 'Tipo de formato'
1154
+ isHidden
1155
+ lineageTag: 46ade108-cada-4d5f-a3b3-f382978f6025
1156
+ summarizeBy: none
1157
+ isNameInferred
1158
+ sourceColumn: [Tipo de formato]
1159
+
1160
+ /// Cantidad de decimales que debe mostrar la métrica seleccionada en el formato numérico global.
1161
+ column Decimales
1162
+ isHidden
1163
+ formatString: 0
1164
+ lineageTag: 160bf6a8-da93-4dab-a747-30c03eaa281b
1165
+ summarizeBy: none
1166
+ isNameInferred
1167
+ sourceColumn: [Decimales]
1168
+
1169
+ /// Reservado para futuros helpers de etiquetas compactas. No se aplica al formato numérico global para evitar doble escala en cards, ejes y matrices.
1170
+ column Escala
1171
+ isHidden
1172
+ lineageTag: 4553e8fb-f306-4aef-a1c5-06356bafcfe4
1173
+ summarizeBy: none
1174
+ isNameInferred
1175
+ sourceColumn: [Escala]
1176
+
1177
+ /// Reservado para futuros helpers de etiquetas compactas. No se aplica al formato numérico global para evitar doble sufijo en visuals.
1178
+ column Sufijo
1179
+ isHidden
1180
+ lineageTag: 01ac1b35-a6e7-472b-a223-1a86fcce7144
1181
+ summarizeBy: none
1182
+ isNameInferred
1183
+ sourceColumn: [Sufijo]
1184
+
1185
+ /// Cantidad de decimales para etiquetas compactas. No afecta el formato numérico global.
1186
+ column 'Decimales etiqueta'
1187
+ isHidden
1188
+ lineageTag: 1e8a3288-7c8d-4c6f-a07f-850b7f139b39
1189
+ summarizeBy: none
1190
+ isNameInferred
1191
+ sourceColumn: [Decimales etiqueta]
1192
+
1193
+ /// Escala usada solo por helpers textuales compactos: Ninguna, Miles o Millones.
1194
+ column 'Escala etiqueta'
1195
+ isHidden
1196
+ lineageTag: d55ccc16-e3d1-41c0-ae25-2fd8c157855c
1197
+ summarizeBy: none
1198
+ isNameInferred
1199
+ sourceColumn: [Escala etiqueta]
1200
+
1201
+ /// Sufijo usado solo por helpers textuales compactos, por ejemplo M o mil.
1202
+ column 'Sufijo etiqueta'
1203
+ isHidden
1204
+ lineageTag: 0af98f89-bc17-4eb6-b738-3b990d65320c
1205
+ summarizeBy: none
1206
+ isNameInferred
1207
+ sourceColumn: [Sufijo etiqueta]
1208
+
1209
+ column Equipo
1210
+ isHidden
1211
+ lineageTag: c377bcd8-b4a6-4a60-ab93-eba1598e9d3c
1212
+ isNameInferred
1213
+ sourceColumn: [Equipo]
1214
+
1215
+ partition Métricas = calculated
1216
+ mode: import
1217
+ source =
1218
+ // Catalogo demo de Andina Nexus: 8 equipos de empresa, 7 metricas primarias por equipo.
1219
+ DATATABLE (
1220
+ "Métrica", STRING,
1221
+ "Descripción", STRING,
1222
+ "Equipo", STRING,
1223
+ "Índice", INTEGER,
1224
+ "Formato", STRING,
1225
+ "Tipo de formato", STRING,
1226
+ "Decimales", INTEGER,
1227
+ "Escala", STRING,
1228
+ "Sufijo", STRING,
1229
+ "Decimales etiqueta", INTEGER,
1230
+ "Escala etiqueta", STRING,
1231
+ "Sufijo etiqueta", STRING,
1232
+ "Tendencia", STRING,
1233
+ "Monetaria", BOOLEAN,
1234
+ "Acumulado", BOOLEAN,
1235
+ {
1236
+ { "Ventas", "Ventas convertidas a la moneda seleccionada.", "Ventas", 1, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1237
+ { "Margen bruto", "Ventas menos costo de ventas en la moneda seleccionada.", "Ventas", 2, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1238
+ { "Margen %", "Margen bruto dividido por ventas.", "Ventas", 3, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1239
+ { "Pedidos", "Cantidad de pedidos o lineas comerciales visibles.", "Ventas", 4, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, TRUE },
1240
+ { "Ticket promedio", "Ventas divididas por pedidos en la moneda seleccionada.", "Ventas", 5, "#,0", "Moneda", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", TRUE, FALSE },
1241
+ { "Pipeline abierto", "Importe potencial de oportunidades comerciales abiertas.", "Ventas", 6, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1242
+ { "Tasa de conversión", "Oportunidades ganadas divididas por oportunidades totales.", "Ventas", 7, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1243
+ { "Inversión marketing", "Gasto de campañas de marketing en moneda seleccionada.", "Marketing", 8, "#,0", "Moneda", 0, "Ninguna", "", 1, "Miles", "mil", "Baja es positivo", TRUE, TRUE },
1244
+ { "Leads", "Cantidad de leads generados por campañas.", "Marketing", 9, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, TRUE },
1245
+ { "MQLs", "Leads calificados por marketing.", "Marketing", 10, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, TRUE },
1246
+ { "Costo por lead", "Inversión marketing dividida por leads generados.", "Marketing", 11, "#,0", "Moneda", 0, "Ninguna", "", 0, "Ninguna", "", "Baja es positivo", TRUE, FALSE },
1247
+ { "Tasa lead a cliente", "Clientes ganados divididos por leads generados.", "Marketing", 12, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1248
+ { "ROAS", "Ventas atribuidas divididas por inversión marketing.", "Marketing", 13, "0.0", "Número", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1249
+ { "Ventas atribuidas", "Ventas atribuidas a campañas en moneda seleccionada.", "Marketing", 14, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1250
+ { "Clientes activos", "Clientes con ventas visibles en el periodo.", "Clientes", 15, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1251
+ { "Clientes nuevos", "Clientes cuya primera venta cae en el periodo visible.", "Clientes", 16, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1252
+ { "Retención %", "Porcentaje de clientes retenidos despues del churn observado.", "Clientes", 17, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1253
+ { "Churn %", "Clientes perdidos divididos por clientes al inicio del periodo.", "Clientes", 18, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Baja es positivo", FALSE, FALSE },
1254
+ { "NPS", "Promedio del indicador de recomendación de clientes.", "Clientes", 19, "#,0.0", "Número", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1255
+ { "Reclamos", "Cantidad de reclamos de clientes.", "Clientes", 20, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Baja es positivo", FALSE, TRUE },
1256
+ { "Tiempo medio de respuesta", "Horas promedio de respuesta al cliente.", "Clientes", 21, "#,0.0", "Número", 1, "Ninguna", "", 1, "Ninguna", "h", "Baja es positivo", FALSE, FALSE },
1257
+ { "Órdenes completadas", "Órdenes de servicio completadas.", "Operaciones", 22, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, TRUE },
1258
+ { "Entregas a tiempo %", "Entregas a tiempo divididas por entregas totales.", "Operaciones", 23, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1259
+ { "Backlog operativo", "Órdenes pendientes de resolver.", "Operaciones", 24, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Baja es positivo", FALSE, TRUE },
1260
+ { "Tiempo de ciclo", "Días promedio de ciclo operativo.", "Operaciones", 25, "#,0.0", "Número", 1, "Ninguna", "", 1, "Ninguna", "d", "Baja es positivo", FALSE, FALSE },
1261
+ { "SLA cumplido %", "Órdenes con SLA cumplido sobre órdenes totales.", "Operaciones", 26, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1262
+ { "Retrabajos", "Cantidad de retrabajos operativos.", "Operaciones", 27, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Baja es positivo", FALSE, TRUE },
1263
+ { "Capacidad utilizada %", "Horas usadas divididas por horas disponibles.", "Operaciones", 28, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1264
+ { "Ingresos", "Ingresos financieros en moneda seleccionada.", "Finanzas", 29, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1265
+ { "Gastos operativos", "Gastos operativos en moneda seleccionada.", "Finanzas", 30, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Baja es positivo", TRUE, TRUE },
1266
+ { "EBITDA", "Ingresos menos costo de ventas y gastos operativos.", "Finanzas", 31, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1267
+ { "Margen operativo %", "EBITDA dividido por ingresos.", "Finanzas", 32, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1268
+ { "Cash collected", "Cobros registrados en moneda seleccionada.", "Finanzas", 33, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1269
+ { "Cuentas por cobrar", "Saldo de cuentas por cobrar en moneda seleccionada.", "Finanzas", 34, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Baja es positivo", TRUE, TRUE },
1270
+ { "Variación vs presupuesto %", "Diferencia porcentual entre ingresos y presupuesto.", "Finanzas", 35, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1271
+ { "Productos activos", "Productos con ventas visibles.", "Producto", 36, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1272
+ { "Unidades vendidas", "Cantidad de unidades vendidas.", "Producto", 37, "#,0", "Número", 0, "Ninguna", "", 1, "Miles", "mil", "Sube es positivo", FALSE, TRUE },
1273
+ { "Mix productos %", "Participación de ventas del producto dentro del total visible.", "Producto", 38, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1274
+ { "Devoluciones %", "Unidades devueltas divididas por unidades vendidas.", "Producto", 39, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Baja es positivo", FALSE, FALSE },
1275
+ { "Margen por producto", "Margen bruto evaluado por producto.", "Producto", 40, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1276
+ { "Servicios adjuntos %", "Servicios adjuntos divididos por pedidos.", "Producto", 41, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1277
+ { "Productos sin venta", "Productos sin ventas en el contexto visible.", "Producto", 42, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Baja es positivo", FALSE, FALSE },
1278
+ { "Headcount", "Cantidad de personas del equipo.", "Personas", 43, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1279
+ { "Costo laboral", "Costo laboral en moneda seleccionada.", "Personas", 44, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Baja es positivo", TRUE, TRUE },
1280
+ { "Rotación %", "Bajas divididas por headcount promedio.", "Personas", 45, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Baja es positivo", FALSE, FALSE },
1281
+ { "Ausentismo %", "Horas ausentes divididas por horas planificadas.", "Personas", 46, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Baja es positivo", FALSE, FALSE },
1282
+ { "Horas trabajadas", "Horas trabajadas por los equipos.", "Personas", 47, "#,0", "Número", 0, "Ninguna", "", 1, "Miles", "mil", "Sube es positivo", FALSE, TRUE },
1283
+ { "Horas facturables %", "Horas facturables divididas por horas trabajadas.", "Personas", 48, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1284
+ { "Utilización %", "Horas facturables divididas por horas disponibles.", "Personas", 49, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1285
+ { "Proyectos activos", "Proyectos con ejecución activa.", "Proyectos", 50, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1286
+ { "Proyectos en riesgo", "Proyectos marcados como en riesgo.", "Proyectos", 51, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Baja es positivo", FALSE, FALSE },
1287
+ { "Avance promedio %", "Avance promedio de proyectos.", "Proyectos", 52, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Sube es positivo", FALSE, FALSE },
1288
+ { "Rentabilidad de proyectos", "Ingresos de proyecto menos costos de proyecto.", "Proyectos", 53, "#,0", "Moneda", 0, "Ninguna", "", 1, "Millones", "M", "Sube es positivo", TRUE, TRUE },
1289
+ { "Horas de proyecto", "Horas registradas en tareas de proyecto.", "Proyectos", 54, "#,0", "Número", 0, "Ninguna", "", 1, "Miles", "mil", "Sube es positivo", FALSE, TRUE },
1290
+ { "Desvío presupuesto %", "Costos de proyecto contra presupuesto aprobado.", "Proyectos", 55, "0.0%", "Porcentaje", 1, "Ninguna", "", 1, "Ninguna", "", "Baja es positivo", FALSE, FALSE },
1291
+ { "Tareas vencidas", "Tareas vencidas de proyectos.", "Proyectos", 56, "#,0", "Número", 0, "Ninguna", "", 0, "Ninguna", "", "Baja es positivo", FALSE, TRUE }
1292
+ }
1293
+ )
1294
+