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.
- package/.claude-plugin/marketplace.json +31 -0
- package/.claude-plugin/plugin.json +34 -0
- package/.claude-plugin/skill-manifest.json +79 -0
- package/.mcp.json +13 -0
- package/.plugin/plugin.json +14 -0
- package/LICENSE +21 -0
- package/README.md +849 -0
- package/bin/build-plugin.js +97 -0
- package/bin/cli.js +891 -0
- package/bin/commands/autoupdate.js +128 -0
- package/bin/commands/build-desktop.js +368 -0
- package/bin/commands/create-from-template.js +165 -0
- package/bin/commands/diff.js +435 -0
- package/bin/commands/install.js +542 -0
- package/bin/commands/lint.js +441 -0
- package/bin/commands/mcp-setup.js +255 -0
- package/bin/commands/session-update.js +204 -0
- package/bin/commands/smoke-test.js +20 -0
- package/bin/commands/uninstall.js +611 -0
- package/bin/commands/update-check.js +427 -0
- package/bin/commands/validate-cases.js +264 -0
- package/bin/commands/validate-projects.js +426 -0
- package/bin/commands/watch.js +251 -0
- package/bin/lib/agents.js +62 -0
- package/bin/lib/base-template-smoke.js +299 -0
- package/bin/lib/claude-hooks.js +160 -0
- package/bin/lib/generators/claude-plugin.js +529 -0
- package/bin/lib/generators/index.js +116 -0
- package/bin/lib/generators/shared.js +257 -0
- package/bin/lib/mcp-config.js +835 -0
- package/bin/lib/microsoft-mcp.js +206 -0
- package/bin/lib/powerbi-mcp-session.js +140 -0
- package/bin/lib/skills.js +164 -0
- package/bin/lib/template-scaffold.js +366 -0
- package/bin/mcp/powerbi-modeling-launcher.js +42 -0
- package/bin/postinstall.js +50 -0
- package/bin/utils/mcp-detect.js +346 -0
- package/bin/utils/tui.js +314 -0
- package/commands/bi-connect.md +520 -0
- package/commands/bi-dax.md +464 -0
- package/commands/bi-kickoff.md +550 -0
- package/commands/bi-modeling.md +485 -0
- package/commands/bi-performance.md +521 -0
- package/commands/bi-powerquery.md +229 -0
- package/commands/bi-refactor.md +249 -0
- package/commands/bi-scorecard.md +268 -0
- package/commands/bi-start.md +272 -0
- package/config.example.json +23 -0
- package/config.json +23 -0
- package/desktop-extension/manifest.json +30 -0
- package/desktop-extension/package.json +10 -0
- package/desktop-extension/server.js +137 -0
- package/package.json +94 -0
- package/skills/bi-connect/SKILL.md +522 -0
- package/skills/bi-connect/scripts/update-check.js +427 -0
- package/skills/bi-dax/SKILL.md +466 -0
- package/skills/bi-dax/scripts/update-check.js +427 -0
- package/skills/bi-kickoff/SKILL.md +552 -0
- package/skills/bi-kickoff/references/flow.html +78 -0
- package/skills/bi-kickoff/references/flow.md +62 -0
- package/skills/bi-kickoff/scripts/update-check.js +427 -0
- package/skills/bi-modeling/SKILL.md +487 -0
- package/skills/bi-modeling/scripts/update-check.js +427 -0
- package/skills/bi-performance/SKILL.md +523 -0
- package/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
- package/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
- package/skills/bi-performance/scripts/update-check.js +427 -0
- package/skills/bi-powerquery/SKILL.md +231 -0
- package/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
- package/skills/bi-powerquery/references/power-query-standards.md +74 -0
- package/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
- package/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
- package/skills/bi-powerquery/scripts/update-check.js +427 -0
- package/skills/bi-refactor/SKILL.md +251 -0
- package/skills/bi-refactor/references/flow.md +27 -0
- package/skills/bi-refactor/scripts/update-check.js +427 -0
- package/skills/bi-scorecard/SKILL.md +270 -0
- package/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
- package/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
- package/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
- package/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
- package/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
- package/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
- package/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
- package/skills/bi-scorecard/scripts/update-check.js +427 -0
- package/skills/bi-start/SKILL.md +274 -0
- package/skills/bi-start/scripts/update-check.js +427 -0
- package/src/content/base.md +197 -0
- package/src/content/mcp-requirements.json +57 -0
- package/src/content/routing.md +201 -0
- package/src/content/skills/bi-connect.md +493 -0
- package/src/content/skills/bi-dax.md +437 -0
- package/src/content/skills/bi-kickoff/SKILL.md +523 -0
- package/src/content/skills/bi-kickoff/references/flow.html +78 -0
- package/src/content/skills/bi-kickoff/references/flow.md +62 -0
- package/src/content/skills/bi-modeling.md +458 -0
- package/src/content/skills/bi-performance/SKILL.md +494 -0
- package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +159 -0
- package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +265 -0
- package/src/content/skills/bi-powerquery/SKILL.md +202 -0
- package/src/content/skills/bi-powerquery/references/base-template-data-contract.md +323 -0
- package/src/content/skills/bi-powerquery/references/power-query-standards.md +74 -0
- package/src/content/skills/bi-powerquery/scripts/new-powerquery-staging.ps1 +371 -0
- package/src/content/skills/bi-powerquery/scripts/test-powerquery-contract.ps1 +225 -0
- package/src/content/skills/bi-refactor/SKILL.md +222 -0
- package/src/content/skills/bi-refactor/references/flow.md +27 -0
- package/src/content/skills/bi-scorecard/SKILL.md +241 -0
- package/src/content/skills/bi-scorecard/examples/base-template-scorecard-blueprint.expected.json +105 -0
- package/src/content/skills/bi-scorecard/examples/base-template-scorecard-overlay.json +82 -0
- package/src/content/skills/bi-scorecard/scripts/new-scorecard-blueprint-from-base-template.ps1 +124 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goal-status-rules-api.ps1 +39 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goal-values-api.ps1 +48 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-goals-api.ps1 +68 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-rest-common.ps1 +197 -0
- package/src/content/skills/bi-scorecard/scripts/powerbi-scorecards-api.ps1 +53 -0
- package/src/content/skills/bi-start.md +266 -0
- package/templates/base-template/AGENTS.md +33 -0
- package/templates/base-template/base-template.Report/.platform +11 -0
- package/templates/base-template/base-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/CY18SU07.json +177 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleCityPark.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleDefault.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleNeutral.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleOrchid.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/AccessibleTidal.json +26 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Bloom.json +139 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CityPark.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Classroom.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/ColorblindSafe.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/CopilotDefault.json +1861 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Divergent.json +127 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Electric.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Frontier.json +136 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/HighContrast.json +40 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Highrise.json +41 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Innovate.json +227 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/NewExecutive.json +41 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Solar.json +33 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Storm.json +25 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Sunset.json +48 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Temperature.json +33 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Tidal.json +100 -0
- package/templates/base-template/base-template.Report/StaticResources/SharedResources/BuiltInThemes/Twilight.json +40 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/1d40d43c7ade66e8603c.bookmark.json +2297 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/af068ff51c0ca3089ea7.bookmark.json +2300 -0
- package/templates/base-template/base-template.Report/definition/bookmarks/bookmarks.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +669 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +723 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +109 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/mobile.json +31 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/55e10ac7d76a1954f94f/visual.json +378 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/57f52ecf4490f70e4da1/visual.json +175 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +690 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/90677f13cea5d1275990/visual.json +17 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/mobile.json +10 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/9fe17b1971f68443fc15/visual.json +328 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +578 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +432 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +801 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1318 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b529688fe5a226643322/visual.json +209 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/c4c6f332d05e72e2eb06/visual.json +174 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
- package/templates/base-template/base-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/page.json +130 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/07e9c4302e29029c5462/visual.json +690 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/109ceede4bc015b0c006/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/118257e006d472277e10/visual.json +359 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/2caf02e0137c4a1280cc/visual.json +669 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/311e76fe3c9edad68204/visual.json +109 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/31c21f8cbeb3b208940a/visual.json +209 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/3ab72c25062437149b03/visual.json +17 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5959867442abcb0ce2b3/visual.json +788 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/5b96e0f88d192b044a13/visual.json +592 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/64e749a63d0786000e22/visual.json +468 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/7ae1ca604edac6586ad0/visual.json +1310 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/840300733885141a6603/visual.json +175 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/a38448cdb203279273d2/visual.json +516 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d1e86f213a3841d12e20/visual.json +328 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d4a484c1bcc8ee3075e2/visual.json +432 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/d87cb5cf06acca19bbb5/visual.json +241 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/e243da2677209ed69408/visual.json +174 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/mobile.json +11 -0
- package/templates/base-template/base-template.Report/definition/pages/9a5b670b015cab882629/visuals/f3aaf24f5b22b67573b0/visual.json +333 -0
- package/templates/base-template/base-template.Report/definition/pages/pages.json +8 -0
- package/templates/base-template/base-template.Report/definition/report.json +89 -0
- package/templates/base-template/base-template.Report/definition/version.json +4 -0
- package/templates/base-template/base-template.Report/definition.pbir +9 -0
- package/templates/base-template/base-template.SemanticModel/.platform +11 -0
- package/templates/base-template/base-template.SemanticModel/definition/cultures/es-AR.tmdl +11185 -0
- package/templates/base-template/base-template.SemanticModel/definition/database.tmdl +3 -0
- package/templates/base-template/base-template.SemanticModel/definition/expressions.tmdl +234 -0
- package/templates/base-template/base-template.SemanticModel/definition/functions.tmdl +637 -0
- package/templates/base-template/base-template.SemanticModel/definition/model.tmdl +82 -0
- package/templates/base-template/base-template.SemanticModel/definition/relationships.tmdl +271 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Calendario.tmdl +200 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Campa/303/261as.tmdl +75 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Canales.tmdl +84 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Clientes.tmdl +143 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Devoluciones.tmdl +95 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Ejecuci/303/263n proyectos.tmdl" +130 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Entregas.tmdl +122 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos m/303/251tricas.tmdl" +40 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Equipos.tmdl +73 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Horas.tmdl +122 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Interacciones clientes.tmdl +146 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Leads.tmdl +119 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Monedas.tmdl +44 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Movimientos financieros.tmdl +145 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +1294 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/N/303/263mina.tmdl +110 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Oportunidades.tmdl +135 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Presupuesto.tmdl +125 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Productos.tmdl +98 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Proyectos.tmdl +77 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Servicios.tmdl +75 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Tareas proyecto.tmdl +102 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +67 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/Ventas.tmdl +180 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux An/303/241lisis dimensiones.tmdl" +38 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Comparaciones.tmdl +227 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Compatibilidad m/303/251trica-dimensi/303/263n.tmdl" +68 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modelo configuraci/303/263n.tmdl" +44 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Modo fechas.tmdl +36 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux M/303/251trica-Equipo.tmdl" +102 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Overrides m/303/251trica-dimensi/303/263n.tmdl" +54 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Per/303/255odos.tmdl" +182 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas modo.tmdl +36 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Rango fechas.tmdl +27 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_Aux Vista de calendario.tmdl +30 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC C/303/241lculo.tmdl" +70 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Eje X.tmdl +63 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC M/303/251trica.tmdl" +374 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_GC Tipo c/303/241lculo.tmdl" +223 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Dimensi/303/263n.tmdl" +98 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables/_PC Eje X.tmdl +68 -0
- package/templates/base-template/base-template.SemanticModel/definition/tables//303/223rdenes servicio.tmdl" +151 -0
- package/templates/base-template/base-template.SemanticModel/definition.pbism +5 -0
- package/templates/base-template/base-template.SemanticModel/diagramLayout.json +568 -0
- package/templates/base-template/base-template.pbip +14 -0
- package/templates/base-template/template.manifest.json +41 -0
- package/theme/BISuperpowers.json +3888 -0
package/templates/base-template/base-template.SemanticModel/definition/tables/Tareas proyecto.tmdl
ADDED
|
@@ -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
|
+
|
package/templates/base-template/base-template.SemanticModel/definition/tables/Tipo de cambio.tmdl
ADDED
|
@@ -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
|
+
|