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
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/// Dimensión demo de equipos internos para analizar personas, operaciones y proyectos sin exponer tablas técnicas al usuario.
|
|
2
|
+
table Equipos
|
|
3
|
+
lineageTag: 7c8aa83b-ccd1-4630-9483-64f58af8013a
|
|
4
|
+
|
|
5
|
+
column EquipoId
|
|
6
|
+
dataType: string
|
|
7
|
+
isHidden
|
|
8
|
+
lineageTag: 6a45ada5-dd38-40a0-a1e3-85780a6f2d19
|
|
9
|
+
sourceColumn: EquipoId
|
|
10
|
+
|
|
11
|
+
column Equipo
|
|
12
|
+
dataType: string
|
|
13
|
+
lineageTag: 0bd52f38-3740-456a-8ba7-9e9d78b37317
|
|
14
|
+
sourceColumn: Equipo
|
|
15
|
+
|
|
16
|
+
column 'Área equipo'
|
|
17
|
+
dataType: string
|
|
18
|
+
lineageTag: 65818ab8-afdf-407b-ac2a-a5f6f37f927a
|
|
19
|
+
sourceColumn: Área equipo
|
|
20
|
+
|
|
21
|
+
column Seniority
|
|
22
|
+
dataType: string
|
|
23
|
+
lineageTag: 745b1120-f8d0-4ee5-99a2-c9d09d90040d
|
|
24
|
+
sourceColumn: Seniority
|
|
25
|
+
|
|
26
|
+
column Data
|
|
27
|
+
dataType: string
|
|
28
|
+
isHidden
|
|
29
|
+
lineageTag: 36ba5ee1-2423-40e5-a472-b6a02f685375
|
|
30
|
+
sourceColumn: Data
|
|
31
|
+
|
|
32
|
+
partition Equipos = m
|
|
33
|
+
mode: import
|
|
34
|
+
queryGroup: 'Sample Dataset\Dimensiones'
|
|
35
|
+
source =
|
|
36
|
+
let
|
|
37
|
+
EntityCode = (entity as text, n as number) as text =>
|
|
38
|
+
let
|
|
39
|
+
CleanNumber = Number.From(n),
|
|
40
|
+
ToLetters = (value as number) as text =>
|
|
41
|
+
let
|
|
42
|
+
Current = Number.IntegerDivide(value, 1),
|
|
43
|
+
Prefix = if Current < 26 then "" else @ToLetters(Number.IntegerDivide(Current, 26) - 1),
|
|
44
|
+
Suffix = Character.FromNumber(65 + Number.Mod(Current, 26))
|
|
45
|
+
in
|
|
46
|
+
Prefix & Suffix,
|
|
47
|
+
BlockCode = ToLetters(Number.IntegerDivide(CleanNumber - 1, 100)),
|
|
48
|
+
NumberPart = Text.PadStart(Text.From(Number.Mod(CleanNumber - 1, 100) + 1, "en-US"), 2, "0"),
|
|
49
|
+
CheckLetter = Character.FromNumber(65 + Number.Mod(CleanNumber * 7 + Text.Length(entity) + 3, 26))
|
|
50
|
+
in
|
|
51
|
+
entity & BlockCode & NumberPart & CheckLetter,
|
|
52
|
+
Source = #table(
|
|
53
|
+
type table [EquipoId = Int64.Type, Equipo = text, #"Área equipo" = text, Seniority = text],
|
|
54
|
+
{
|
|
55
|
+
{1, "Revenue Ops", "Comercial", "Mixto"},
|
|
56
|
+
{2, "Growth Studio", "Marketing", "Mixto"},
|
|
57
|
+
{3, "Customer Success", "Clientes", "Senior"},
|
|
58
|
+
{4, "Delivery Services", "Operaciones", "Mixto"},
|
|
59
|
+
{5, "Finance Lab", "Finanzas", "Senior"},
|
|
60
|
+
{6, "People Ops", "Personas", "Mixto"}
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
#"Tipo cambiado" = Table.TransformColumnTypes(Source, {{"EquipoId", Int64.Type}, {"Equipo", type text}, {"Área equipo", type text}, {"Seniority", type text}}, "es-ES"),
|
|
64
|
+
AddData = Table.AddColumn(#"Tipo cambiado", "Data", each "Demo", type text),
|
|
65
|
+
AddEquipoCodigo = Table.AddColumn(AddData, "EquipoCodigo", each EntityCode("Equipo", [EquipoId]), type text),
|
|
66
|
+
SelectForOutput = Table.SelectColumns(AddEquipoCodigo, {"Data", "EquipoCodigo", "Equipo", "Área equipo", "Seniority"}),
|
|
67
|
+
Result = Table.RenameColumns(SelectForOutput, {{"EquipoCodigo", "EquipoId"}}),
|
|
68
|
+
#"Tipo final" = Table.TransformColumnTypes(Result, {{"Data", type text}, {"EquipoId", type text}, {"Equipo", type text}, {"Área equipo", type text}, {"Seniority", type text}}, "es-ES")
|
|
69
|
+
in
|
|
70
|
+
#"Tipo final"
|
|
71
|
+
|
|
72
|
+
annotation PBI_ResultType = Table
|
|
73
|
+
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/// Hecho demo de horas trabajadas, facturables y ausentes para personas y proyectos.
|
|
2
|
+
table Horas
|
|
3
|
+
isHidden
|
|
4
|
+
lineageTag: 577cea86-a6df-4e83-ac03-0a45f610da10
|
|
5
|
+
|
|
6
|
+
column HoraId
|
|
7
|
+
dataType: string
|
|
8
|
+
isHidden
|
|
9
|
+
lineageTag: a292ee1f-8053-43fa-912b-e3b2552245de
|
|
10
|
+
sourceColumn: HoraId
|
|
11
|
+
|
|
12
|
+
column Fecha
|
|
13
|
+
dataType: dateTime
|
|
14
|
+
formatString: Long Date
|
|
15
|
+
lineageTag: c612c3e0-3ef1-4bc7-bfdd-7f91cd22edc9
|
|
16
|
+
summarizeBy: none
|
|
17
|
+
sourceColumn: Fecha
|
|
18
|
+
|
|
19
|
+
annotation UnderlyingDateTimeDataType = Date
|
|
20
|
+
|
|
21
|
+
annotation SummarizationSetBy = Automatic
|
|
22
|
+
|
|
23
|
+
column EquipoId
|
|
24
|
+
dataType: string
|
|
25
|
+
isHidden
|
|
26
|
+
lineageTag: ec74cdd6-a793-40ce-872e-270b70263a8c
|
|
27
|
+
sourceColumn: EquipoId
|
|
28
|
+
|
|
29
|
+
column ProyectoId
|
|
30
|
+
dataType: string
|
|
31
|
+
isHidden
|
|
32
|
+
lineageTag: c06fcd40-f0fb-4e78-889f-53be32b64d03
|
|
33
|
+
sourceColumn: ProyectoId
|
|
34
|
+
|
|
35
|
+
column ServicioId
|
|
36
|
+
dataType: string
|
|
37
|
+
isHidden
|
|
38
|
+
lineageTag: 97fb1b9b-5347-44ec-9973-ecdf743e01d7
|
|
39
|
+
sourceColumn: ServicioId
|
|
40
|
+
|
|
41
|
+
column 'Horas Planificadas'
|
|
42
|
+
dataType: double
|
|
43
|
+
lineageTag: 2b6cb0b8-6f58-45c3-9d51-6e72d7c2a561
|
|
44
|
+
sourceColumn: Horas Planificadas
|
|
45
|
+
|
|
46
|
+
column 'Horas Trabajadas'
|
|
47
|
+
dataType: double
|
|
48
|
+
lineageTag: e03a2f71-885e-4d01-963e-832b9b698d4a
|
|
49
|
+
sourceColumn: Horas Trabajadas
|
|
50
|
+
|
|
51
|
+
column 'Horas Facturables'
|
|
52
|
+
dataType: double
|
|
53
|
+
lineageTag: bb9488eb-e50e-44aa-a0dd-4ac463150b67
|
|
54
|
+
sourceColumn: Horas Facturables
|
|
55
|
+
|
|
56
|
+
column 'Horas Disponibles'
|
|
57
|
+
dataType: double
|
|
58
|
+
lineageTag: 03b13fc6-6bd5-4658-982e-e203208fc583
|
|
59
|
+
sourceColumn: Horas Disponibles
|
|
60
|
+
|
|
61
|
+
column 'Horas Ausentes'
|
|
62
|
+
dataType: double
|
|
63
|
+
lineageTag: fc01e651-3379-4096-824a-a00249e7c777
|
|
64
|
+
sourceColumn: Horas Ausentes
|
|
65
|
+
|
|
66
|
+
column Data
|
|
67
|
+
dataType: string
|
|
68
|
+
lineageTag: a0aaa98a-7663-4f66-b62e-81c4508dfc19
|
|
69
|
+
sourceColumn: Data
|
|
70
|
+
|
|
71
|
+
partition Horas = m
|
|
72
|
+
mode: import
|
|
73
|
+
queryGroup: 'Sample Dataset\Hechos'
|
|
74
|
+
source =
|
|
75
|
+
let
|
|
76
|
+
EntityCode = (entity as text, n as number) as text =>
|
|
77
|
+
let
|
|
78
|
+
CleanNumber = Number.From(n),
|
|
79
|
+
ToLetters = (value as number) as text =>
|
|
80
|
+
let
|
|
81
|
+
Current = Number.IntegerDivide(value, 1),
|
|
82
|
+
Prefix = if Current < 26 then "" else @ToLetters(Number.IntegerDivide(Current, 26) - 1),
|
|
83
|
+
Suffix = Character.FromNumber(65 + Number.Mod(Current, 26))
|
|
84
|
+
in
|
|
85
|
+
Prefix & Suffix,
|
|
86
|
+
BlockCode = ToLetters(Number.IntegerDivide(CleanNumber - 1, 100)),
|
|
87
|
+
NumberPart = Text.PadStart(Text.From(Number.Mod(CleanNumber - 1, 100) + 1, "en-US"), 2, "0"),
|
|
88
|
+
CheckLetter = Character.FromNumber(65 + Number.Mod(CleanNumber * 7 + Text.Length(entity) + 3, 26))
|
|
89
|
+
in
|
|
90
|
+
entity & BlockCode & NumberPart & CheckLetter,
|
|
91
|
+
CalendarDates = Table.TransformColumnTypes(Table.SelectColumns(Calendario, {"Fecha"}), {{"Fecha", type date}}),
|
|
92
|
+
EndDate = List.Max(CalendarDates[Fecha]),
|
|
93
|
+
StartDate = List.Min(CalendarDates[Fecha]),
|
|
94
|
+
DateWindow = Table.SelectRows(CalendarDates, each [Fecha] >= StartDate and [Fecha] <= EndDate),
|
|
95
|
+
WeekTable = Table.Distinct(Table.AddColumn(DateWindow, "WeekStart", each Date.StartOfWeek([Fecha], Day.Monday), type date)[[WeekStart]]),
|
|
96
|
+
SortedWeeks = Table.Sort(WeekTable, {{"WeekStart", Order.Ascending}}),
|
|
97
|
+
AddSemanaIndex = Table.AddIndexColumn(SortedWeeks, "SemanaIndex", 0, 1, Int64.Type),
|
|
98
|
+
ProjectCount = Table.RowCount(Proyectos),
|
|
99
|
+
EquipoCount = Table.RowCount(Equipos),
|
|
100
|
+
ServiceCount = Table.RowCount(Servicios),
|
|
101
|
+
ProjectsBase = Table.FromList(List.Numbers(1, ProjectCount), Splitter.SplitByNothing(), {"ProyectoNr"}),
|
|
102
|
+
EquiposBase = Table.FromList(List.Numbers(1, EquipoCount), Splitter.SplitByNothing(), {"EquipoNr"}),
|
|
103
|
+
AddProjects = Table.AddColumn(AddSemanaIndex, "Proyectos", each ProjectsBase),
|
|
104
|
+
ExpandProjects = Table.ExpandTableColumn(AddProjects, "Proyectos", {"ProyectoNr"}, {"ProyectoNr"}),
|
|
105
|
+
AddEquipos = Table.AddColumn(ExpandProjects, "Equipos", each EquiposBase),
|
|
106
|
+
ExpandEquipos = Table.ExpandTableColumn(AddEquipos, "Equipos", {"EquipoNr"}, {"EquipoNr"}),
|
|
107
|
+
AddValue = Table.AddColumn(ExpandEquipos, "Value", each [SemanaIndex] * ProjectCount * EquipoCount + ([ProyectoNr] - 1) * EquipoCount + [EquipoNr], Int64.Type),
|
|
108
|
+
AddFecha = Table.AddColumn(AddValue, "Fecha", each List.Min({EndDate, List.Max({StartDate, Date.AddDays([WeekStart], Number.Mod([ProyectoNr] + [EquipoNr] + [SemanaIndex], 7))})}), type date),
|
|
109
|
+
#"Con HoraId" = Table.AddColumn(AddFecha, "HoraId", each EntityCode("Hora", [Value]), type text),
|
|
110
|
+
#"Con EquipoId" = Table.AddColumn(#"Con HoraId", "EquipoId", each EntityCode("Equipo", [EquipoNr]), type text),
|
|
111
|
+
#"Con ProyectoId" = Table.AddColumn(#"Con EquipoId", "ProyectoId", each EntityCode("Proyecto", [ProyectoNr]), type text),
|
|
112
|
+
#"Con ServicioId" = Table.AddColumn(#"Con ProyectoId", "ServicioId", each EntityCode("Servicio", Number.Mod([ProyectoNr] + [EquipoNr] + [SemanaIndex] - 1, ServiceCount) + 1), type text),
|
|
113
|
+
#"Con Horas Planificadas" = Table.AddColumn(#"Con ServicioId", "Horas Planificadas", each 160 + Number.Mod([Value] * 3, 80), type number),
|
|
114
|
+
#"Con Horas Trabajadas" = Table.AddColumn(#"Con Horas Planificadas", "Horas Trabajadas", each 140 + Number.Mod([Value] * 5, 95), type number),
|
|
115
|
+
#"Con Horas Facturables" = Table.AddColumn(#"Con Horas Trabajadas", "Horas Facturables", each 95 + Number.Mod([Value] * 7, 80), type number),
|
|
116
|
+
#"Con Horas Disponibles" = Table.AddColumn(#"Con Horas Facturables", "Horas Disponibles", each 170 + Number.Mod([Value] * 4, 80), type number),
|
|
117
|
+
#"Con Horas Ausentes" = Table.AddColumn(#"Con Horas Disponibles", "Horas Ausentes", each Number.Mod([Value] * 2, 18), type number),
|
|
118
|
+
#"Con Data" = Table.AddColumn(#"Con Horas Ausentes", "Data", each "Demo", type text),
|
|
119
|
+
Result = Table.SelectColumns(#"Con Data", {"HoraId", "Fecha", "EquipoId", "ProyectoId", "ServicioId", "Horas Planificadas", "Horas Trabajadas", "Horas Facturables", "Horas Disponibles", "Horas Ausentes", "Data"})
|
|
120
|
+
in
|
|
121
|
+
Result
|
|
122
|
+
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/// Hecho demo de experiencia de cliente: NPS, reclamos, churn y tiempos de respuesta.
|
|
2
|
+
table 'Interacciones clientes'
|
|
3
|
+
isHidden
|
|
4
|
+
lineageTag: 2776d1db-1190-4678-9b91-419f41c340ea
|
|
5
|
+
|
|
6
|
+
column InteraccionId
|
|
7
|
+
dataType: string
|
|
8
|
+
isHidden
|
|
9
|
+
lineageTag: ab332507-1a7d-4404-9c4b-9873ee7319cd
|
|
10
|
+
sourceColumn: InteraccionId
|
|
11
|
+
|
|
12
|
+
column Fecha
|
|
13
|
+
dataType: dateTime
|
|
14
|
+
formatString: Long Date
|
|
15
|
+
lineageTag: 4a5bb8dd-50c5-4b51-80ab-7e82bbf842b7
|
|
16
|
+
summarizeBy: none
|
|
17
|
+
sourceColumn: Fecha
|
|
18
|
+
|
|
19
|
+
annotation UnderlyingDateTimeDataType = Date
|
|
20
|
+
|
|
21
|
+
annotation SummarizationSetBy = Automatic
|
|
22
|
+
|
|
23
|
+
column ClienteId
|
|
24
|
+
dataType: string
|
|
25
|
+
isHidden
|
|
26
|
+
lineageTag: c992c1e0-ca67-4fed-886b-a280d1e5eb0b
|
|
27
|
+
sourceColumn: ClienteId
|
|
28
|
+
|
|
29
|
+
column CanalId
|
|
30
|
+
dataType: string
|
|
31
|
+
isHidden
|
|
32
|
+
lineageTag: 807e53d7-36b9-4c77-b6b8-55b7ca60d8cf
|
|
33
|
+
sourceColumn: CanalId
|
|
34
|
+
|
|
35
|
+
column ProductoId
|
|
36
|
+
dataType: string
|
|
37
|
+
isHidden
|
|
38
|
+
lineageTag: f55ba5da-eefc-4f0e-ba42-aeacb57cc82a
|
|
39
|
+
sourceColumn: ProductoId
|
|
40
|
+
|
|
41
|
+
column ServicioId
|
|
42
|
+
dataType: string
|
|
43
|
+
isHidden
|
|
44
|
+
lineageTag: a06ec792-7239-434f-bb4b-3246418939c9
|
|
45
|
+
sourceColumn: ServicioId
|
|
46
|
+
|
|
47
|
+
column 'Clientes Inicio'
|
|
48
|
+
dataType: int64
|
|
49
|
+
lineageTag: f1a61690-ff2c-4984-aaf6-5c03246456d7
|
|
50
|
+
sourceColumn: Clientes Inicio
|
|
51
|
+
|
|
52
|
+
column 'Clientes Perdidos'
|
|
53
|
+
dataType: int64
|
|
54
|
+
lineageTag: 899797ed-4df3-4509-a41d-5b082af9979c
|
|
55
|
+
sourceColumn: Clientes Perdidos
|
|
56
|
+
|
|
57
|
+
column NPS
|
|
58
|
+
dataType: int64
|
|
59
|
+
lineageTag: 7aaf516f-6438-4f59-ba3b-fa79b2def3c4
|
|
60
|
+
sourceColumn: NPS
|
|
61
|
+
|
|
62
|
+
column Reclamos
|
|
63
|
+
dataType: int64
|
|
64
|
+
lineageTag: 9b6e0ae4-d231-4714-b7af-030d5d16f80e
|
|
65
|
+
sourceColumn: Reclamos
|
|
66
|
+
|
|
67
|
+
column 'Tiempo Respuesta Horas'
|
|
68
|
+
dataType: double
|
|
69
|
+
lineageTag: 596aad22-eb65-42d8-9a1d-ac01f9d306fe
|
|
70
|
+
sourceColumn: Tiempo Respuesta Horas
|
|
71
|
+
|
|
72
|
+
column Data
|
|
73
|
+
dataType: string
|
|
74
|
+
lineageTag: 4c1c25a9-2f9b-459f-92ac-d5158bf4d7c2
|
|
75
|
+
sourceColumn: Data
|
|
76
|
+
|
|
77
|
+
partition 'Interacciones clientes' = m
|
|
78
|
+
mode: import
|
|
79
|
+
queryGroup: 'Sample Dataset\Hechos'
|
|
80
|
+
source =
|
|
81
|
+
let
|
|
82
|
+
EntityCode = (entity as text, n as number) as text =>
|
|
83
|
+
let
|
|
84
|
+
CleanNumber = Number.From(n),
|
|
85
|
+
ToLetters = (value as number) as text =>
|
|
86
|
+
let
|
|
87
|
+
Current = Number.IntegerDivide(value, 1),
|
|
88
|
+
Prefix = if Current < 26 then "" else @ToLetters(Number.IntegerDivide(Current, 26) - 1),
|
|
89
|
+
Suffix = Character.FromNumber(65 + Number.Mod(Current, 26))
|
|
90
|
+
in
|
|
91
|
+
Prefix & Suffix,
|
|
92
|
+
BlockCode = ToLetters(Number.IntegerDivide(CleanNumber - 1, 100)),
|
|
93
|
+
NumberPart = Text.PadStart(Text.From(Number.Mod(CleanNumber - 1, 100) + 1, "en-US"), 2, "0"),
|
|
94
|
+
CheckLetter = Character.FromNumber(65 + Number.Mod(CleanNumber * 7 + Text.Length(entity) + 3, 26))
|
|
95
|
+
in
|
|
96
|
+
entity & BlockCode & NumberPart & CheckLetter,
|
|
97
|
+
CalendarDates = Table.TransformColumnTypes(Table.SelectColumns(Calendario, {"Fecha"}), {{"Fecha", type date}}),
|
|
98
|
+
EndDate = List.Max(CalendarDates[Fecha]),
|
|
99
|
+
StartDate = List.Min(CalendarDates[Fecha]),
|
|
100
|
+
DateWindow = Table.SelectRows(CalendarDates, each [Fecha] >= StartDate and [Fecha] <= EndDate),
|
|
101
|
+
WeekTable = Table.Distinct(Table.AddColumn(DateWindow, "WeekStart", each Date.StartOfWeek([Fecha], Day.Monday), type date)[[WeekStart]]),
|
|
102
|
+
SortedWeeks = Table.Sort(WeekTable, {{"WeekStart", Order.Ascending}}),
|
|
103
|
+
AddSemanaIndex = Table.AddIndexColumn(SortedWeeks, "SemanaIndex", 0, 1, Int64.Type),
|
|
104
|
+
ClienteCount = Table.RowCount(Clientes),
|
|
105
|
+
ProductCount = Table.RowCount(Productos),
|
|
106
|
+
ServiceCount = Table.RowCount(Servicios),
|
|
107
|
+
ChannelCount = Table.RowCount(Canales),
|
|
108
|
+
ClientesBase = Table.FromList(List.Numbers(1, ClienteCount), Splitter.SplitByNothing(), {"ClienteNr"}),
|
|
109
|
+
AddClientes = Table.AddColumn(AddSemanaIndex, "Clientes", each ClientesBase),
|
|
110
|
+
ExpandClientes = Table.ExpandTableColumn(AddClientes, "Clientes", {"ClienteNr"}, {"ClienteNr"}),
|
|
111
|
+
AddValue = Table.AddColumn(ExpandClientes, "Value", each [SemanaIndex] * ClienteCount + [ClienteNr], Int64.Type),
|
|
112
|
+
AddFecha = Table.AddColumn(AddValue, "Fecha", each List.Min({EndDate, List.Max({StartDate, Date.AddDays([WeekStart], Number.Mod([ClienteNr] + [SemanaIndex], 7))})}), type date),
|
|
113
|
+
#"Con InteraccionId" = Table.AddColumn(AddFecha, "InteraccionId", each EntityCode("Interaccion", [Value]), type text),
|
|
114
|
+
#"Con ClienteId" = Table.AddColumn(#"Con InteraccionId", "ClienteId", each EntityCode("Cliente", [ClienteNr]), type text),
|
|
115
|
+
#"Con CanalId" = Table.AddColumn(#"Con ClienteId", "CanalId", each EntityCode("Canal", Number.Mod([ClienteNr] + [SemanaIndex] - 1, ChannelCount) + 1), type text),
|
|
116
|
+
#"Con ProductoId" = Table.AddColumn(#"Con CanalId", "ProductoId", each EntityCode("Producto", Number.Mod([ClienteNr] + [SemanaIndex] * 3 - 1, ProductCount) + 1), type text),
|
|
117
|
+
#"Con ServicioId" = Table.AddColumn(#"Con ProductoId", "ServicioId", each EntityCode("Servicio", Number.Mod([ClienteNr] + [SemanaIndex] * 5 - 1, ServiceCount) + 1), type text),
|
|
118
|
+
JoinClientes = Table.NestedJoin(#"Con ServicioId", {"ClienteId"}, Clientes, {"ClienteId"}, "Cliente", JoinKind.LeftOuter),
|
|
119
|
+
ExpandClientesDim = Table.ExpandTableColumn(JoinClientes, "Cliente", {"País", "Segmento"}, {"País", "Segmento"}),
|
|
120
|
+
JoinCanales = Table.NestedJoin(ExpandClientesDim, {"CanalId"}, Canales, {"CanalId"}, "Canal", JoinKind.LeftOuter),
|
|
121
|
+
ExpandCanales = Table.ExpandTableColumn(JoinCanales, "Canal", {"Canal", "Tipo de canal"}, {"Canal", "Tipo de canal"}),
|
|
122
|
+
#"Con Risk Score" = Table.AddColumn(ExpandCanales, "RiskScore", each
|
|
123
|
+
let
|
|
124
|
+
CountryRisk = if [País] = "Haiti" then 15 else if [País] = "Cuba" then 13 else if [País] = "Nicaragua" then 11 else if [País] = "Bolivia" then 9 else if [País] = "Paraguay" then 8 else if [País] = "El Salvador" then 8 else if [País] = "Brasil" then -7 else if [País] = "España" then -6 else if [País] = "Mexico" then -5 else if [País] = "Chile" then -4 else 0,
|
|
125
|
+
SegmentRisk = if [Segmento] = "Enterprise" then -6 else if [Segmento] = "Mid Market" then 1 else 7,
|
|
126
|
+
ChannelRisk = if [Canal] = "Directo" then -5 else if [Canal] = "Partner" then 1 else if [Canal] = "Marketplace" then 4 else 8,
|
|
127
|
+
AgingRisk = if [SemanaIndex] >= 78 then -3 else if [SemanaIndex] >= 52 then 1 else 4
|
|
128
|
+
in
|
|
129
|
+
CountryRisk + SegmentRisk + ChannelRisk + AgingRisk,
|
|
130
|
+
type number),
|
|
131
|
+
#"Con Clientes Inicio" = Table.AddColumn(#"Con Risk Score", "Clientes Inicio", each 145 + Number.Mod([Value] * 3, 70) + (if [Segmento] = "Enterprise" then 55 else if [Segmento] = "Mid Market" then 25 else 0), Int64.Type),
|
|
132
|
+
#"Con Clientes Perdidos" = Table.AddColumn(#"Con Clientes Inicio", "Clientes Perdidos", each
|
|
133
|
+
let
|
|
134
|
+
RawLost = 3 + Number.Mod([Value] + Number.Round([RiskScore] * 2, 0), 20),
|
|
135
|
+
AdjustedLost = RawLost + (if [RiskScore] > 10 then 8 else if [RiskScore] > 4 then 4 else if [RiskScore] < -8 then -3 else 0)
|
|
136
|
+
in
|
|
137
|
+
Number.RoundDown(List.Min({[Clientes Inicio] - 1, List.Max({0, AdjustedLost})})),
|
|
138
|
+
Int64.Type),
|
|
139
|
+
#"Con NPS" = Table.AddColumn(#"Con Clientes Perdidos", "NPS", each Number.Round(List.Min({88, List.Max({18, 68 - [RiskScore] * 1.9 + Number.Mod([Value] * 5 + [SemanaIndex], 21) - 10})}), 0), Int64.Type),
|
|
140
|
+
#"Con Reclamos" = Table.AddColumn(#"Con NPS", "Reclamos", each Number.RoundDown(List.Max({1, 4 + Number.Mod([Value] * 2, 18) + [RiskScore] / 2})), Int64.Type),
|
|
141
|
+
#"Con Tiempo Respuesta Horas" = Table.AddColumn(#"Con Reclamos", "Tiempo Respuesta Horas", each Number.Round(List.Min({24, List.Max({1.5, 5.2 + [RiskScore] * 0.28 + Number.Mod([Value] * 3, 18) / 2})}), 2), type number),
|
|
142
|
+
#"Con Data" = Table.AddColumn(#"Con Tiempo Respuesta Horas", "Data", each "Demo", type text),
|
|
143
|
+
Result = Table.SelectColumns(#"Con Data", {"InteraccionId", "Fecha", "ClienteId", "CanalId", "ProductoId", "ServicioId", "Clientes Inicio", "Clientes Perdidos", "NPS", "Reclamos", "Tiempo Respuesta Horas", "Data"})
|
|
144
|
+
in
|
|
145
|
+
Result
|
|
146
|
+
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/// Hecho demo de marketing con leads, MQLs, inversión y ventas atribuidas.
|
|
2
|
+
table Leads
|
|
3
|
+
isHidden
|
|
4
|
+
lineageTag: e3376acf-2ee9-496e-91c7-e98fd0781fc8
|
|
5
|
+
|
|
6
|
+
column LeadBatchId
|
|
7
|
+
dataType: string
|
|
8
|
+
isHidden
|
|
9
|
+
lineageTag: 61d36478-3647-4253-a521-ed3aa08e8be5
|
|
10
|
+
sourceColumn: LeadBatchId
|
|
11
|
+
|
|
12
|
+
column Fecha
|
|
13
|
+
dataType: dateTime
|
|
14
|
+
formatString: Long Date
|
|
15
|
+
lineageTag: 4a286859-3e21-4c1a-ad96-c809cc79b657
|
|
16
|
+
summarizeBy: none
|
|
17
|
+
sourceColumn: Fecha
|
|
18
|
+
|
|
19
|
+
annotation UnderlyingDateTimeDataType = Date
|
|
20
|
+
|
|
21
|
+
annotation SummarizationSetBy = Automatic
|
|
22
|
+
|
|
23
|
+
column CampañaId
|
|
24
|
+
dataType: string
|
|
25
|
+
isHidden
|
|
26
|
+
lineageTag: 1b85b592-86a0-46e7-9882-5d49427418ed
|
|
27
|
+
sourceColumn: CampañaId
|
|
28
|
+
|
|
29
|
+
column CanalId
|
|
30
|
+
dataType: string
|
|
31
|
+
isHidden
|
|
32
|
+
lineageTag: 6c425811-0356-4864-8974-89f432598155
|
|
33
|
+
sourceColumn: CanalId
|
|
34
|
+
|
|
35
|
+
column ClienteId
|
|
36
|
+
dataType: string
|
|
37
|
+
isHidden
|
|
38
|
+
lineageTag: 21b56e6f-995a-4dbc-9918-7c92156750af
|
|
39
|
+
sourceColumn: ClienteId
|
|
40
|
+
|
|
41
|
+
column Leads
|
|
42
|
+
dataType: int64
|
|
43
|
+
lineageTag: 96d2344b-0ec8-491d-9298-a17c1a8aa2fc
|
|
44
|
+
sourceColumn: Leads
|
|
45
|
+
|
|
46
|
+
column MQLs
|
|
47
|
+
dataType: int64
|
|
48
|
+
lineageTag: d028f013-bb38-48ff-8936-59cd577f611c
|
|
49
|
+
sourceColumn: MQLs
|
|
50
|
+
|
|
51
|
+
column 'Clientes ganados'
|
|
52
|
+
dataType: int64
|
|
53
|
+
lineageTag: 8ccc22fc-7f9b-4f8f-962a-f6378ab52733
|
|
54
|
+
sourceColumn: Clientes ganados
|
|
55
|
+
|
|
56
|
+
column 'Costo Base'
|
|
57
|
+
dataType: double
|
|
58
|
+
lineageTag: 0f61bd65-1130-42f3-be2e-861b4a64c100
|
|
59
|
+
sourceColumn: Costo Base
|
|
60
|
+
|
|
61
|
+
column 'Ventas Atribuidas Base'
|
|
62
|
+
dataType: double
|
|
63
|
+
lineageTag: 84716c33-954c-4a79-a5f3-307fa5db925e
|
|
64
|
+
sourceColumn: Ventas Atribuidas Base
|
|
65
|
+
|
|
66
|
+
column Data
|
|
67
|
+
dataType: string
|
|
68
|
+
lineageTag: 91afdb61-2fd5-4417-a29f-533af3211edc
|
|
69
|
+
sourceColumn: Data
|
|
70
|
+
|
|
71
|
+
partition Leads = m
|
|
72
|
+
mode: import
|
|
73
|
+
queryGroup: 'Sample Dataset\Hechos'
|
|
74
|
+
source =
|
|
75
|
+
let
|
|
76
|
+
EntityCode = (entity as text, n as number) as text =>
|
|
77
|
+
let
|
|
78
|
+
CleanNumber = Number.From(n),
|
|
79
|
+
ToLetters = (value as number) as text =>
|
|
80
|
+
let
|
|
81
|
+
Current = Number.IntegerDivide(value, 1),
|
|
82
|
+
Prefix = if Current < 26 then "" else @ToLetters(Number.IntegerDivide(Current, 26) - 1),
|
|
83
|
+
Suffix = Character.FromNumber(65 + Number.Mod(Current, 26))
|
|
84
|
+
in
|
|
85
|
+
Prefix & Suffix,
|
|
86
|
+
BlockCode = ToLetters(Number.IntegerDivide(CleanNumber - 1, 100)),
|
|
87
|
+
NumberPart = Text.PadStart(Text.From(Number.Mod(CleanNumber - 1, 100) + 1, "en-US"), 2, "0"),
|
|
88
|
+
CheckLetter = Character.FromNumber(65 + Number.Mod(CleanNumber * 7 + Text.Length(entity) + 3, 26))
|
|
89
|
+
in
|
|
90
|
+
entity & BlockCode & NumberPart & CheckLetter,
|
|
91
|
+
CalendarDates = Table.TransformColumnTypes(Table.SelectColumns(Calendario, {"Fecha"}), {{"Fecha", type date}}),
|
|
92
|
+
EndDate = List.Max(CalendarDates[Fecha]),
|
|
93
|
+
StartDate = List.Min(CalendarDates[Fecha]),
|
|
94
|
+
DateWindow = Table.SelectRows(CalendarDates, each [Fecha] >= StartDate and [Fecha] <= EndDate),
|
|
95
|
+
WeekTable = Table.Distinct(Table.AddColumn(DateWindow, "WeekStart", each Date.StartOfWeek([Fecha], Day.Monday), type date)[[WeekStart]]),
|
|
96
|
+
SortedWeeks = Table.Sort(WeekTable, {{"WeekStart", Order.Ascending}}),
|
|
97
|
+
AddSemanaIndex = Table.AddIndexColumn(SortedWeeks, "SemanaIndex", 0, 1, Int64.Type),
|
|
98
|
+
ClienteCount = Table.RowCount(Clientes),
|
|
99
|
+
CampaignCount = Table.RowCount(Campañas),
|
|
100
|
+
ChannelCount = Table.RowCount(Canales),
|
|
101
|
+
ClientesBase = Table.FromList(List.Numbers(1, ClienteCount), Splitter.SplitByNothing(), {"ClienteNr"}),
|
|
102
|
+
AddClientes = Table.AddColumn(AddSemanaIndex, "Clientes", each ClientesBase),
|
|
103
|
+
ExpandClientes = Table.ExpandTableColumn(AddClientes, "Clientes", {"ClienteNr"}, {"ClienteNr"}),
|
|
104
|
+
AddValue = Table.AddColumn(ExpandClientes, "Value", each [SemanaIndex] * ClienteCount + [ClienteNr], Int64.Type),
|
|
105
|
+
AddFecha = Table.AddColumn(AddValue, "Fecha", each List.Min({EndDate, List.Max({StartDate, Date.AddDays([WeekStart], Number.Mod([ClienteNr] + [SemanaIndex], 7))})}), type date),
|
|
106
|
+
#"Con LeadBatchId" = Table.AddColumn(AddFecha, "LeadBatchId", each EntityCode("LeadBatch", [Value]), type text),
|
|
107
|
+
#"Con CampañaId" = Table.AddColumn(#"Con LeadBatchId", "CampañaId", each EntityCode("Campana", Number.Mod([ClienteNr] + [SemanaIndex] - 1, CampaignCount) + 1), type text),
|
|
108
|
+
#"Con CanalId" = Table.AddColumn(#"Con CampañaId", "CanalId", each EntityCode("Canal", Number.Mod([ClienteNr] + [SemanaIndex] - 1, ChannelCount) + 1), type text),
|
|
109
|
+
#"Con ClienteId" = Table.AddColumn(#"Con CanalId", "ClienteId", each EntityCode("Cliente", [ClienteNr]), type text),
|
|
110
|
+
#"Con Leads" = Table.AddColumn(#"Con ClienteId", "Leads", each 35 + Number.Mod([Value] * 11 + [SemanaIndex] * 3, 90), Int64.Type),
|
|
111
|
+
#"Con MQLs" = Table.AddColumn(#"Con Leads", "MQLs", each 12 + Number.Mod([Value] * 7 + [SemanaIndex], 45), Int64.Type),
|
|
112
|
+
#"Con Clientes ganados" = Table.AddColumn(#"Con MQLs", "Clientes ganados", each 2 + Number.Mod([Value], 9), Int64.Type),
|
|
113
|
+
#"Con Costo Base" = Table.AddColumn(#"Con Clientes ganados", "Costo Base", each 2400 + Number.Mod([Value] * 421 + [SemanaIndex] * 17, 8500), type number),
|
|
114
|
+
#"Con Ventas Atribuidas Base" = Table.AddColumn(#"Con Costo Base", "Ventas Atribuidas Base", each 9000 + Number.Mod([Value] * 1733 + [SemanaIndex] * 101, 48000), type number),
|
|
115
|
+
#"Con Data" = Table.AddColumn(#"Con Ventas Atribuidas Base", "Data", each "Demo", type text),
|
|
116
|
+
Result = Table.SelectColumns(#"Con Data", {"LeadBatchId", "Fecha", "CampañaId", "CanalId", "ClienteId", "Leads", "MQLs", "Clientes ganados", "Costo Base", "Ventas Atribuidas Base", "Data"})
|
|
117
|
+
in
|
|
118
|
+
Result
|
|
119
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/// Selector desconectado de moneda de reporte, cargado desde Power Query para mantener el dataset de ejemplo fuera de DAX.
|
|
2
|
+
table Monedas
|
|
3
|
+
lineageTag: b7ee2bd9-23b2-416d-8794-e70029e343e8
|
|
4
|
+
|
|
5
|
+
column Moneda
|
|
6
|
+
dataType: string
|
|
7
|
+
lineageTag: 32e5f3f6-0e89-4a45-99af-d22fed0b43ef
|
|
8
|
+
summarizeBy: none
|
|
9
|
+
sourceColumn: Moneda
|
|
10
|
+
|
|
11
|
+
column Símbolo
|
|
12
|
+
dataType: string
|
|
13
|
+
isHidden
|
|
14
|
+
lineageTag: 94423e83-79d8-496b-8503-771be16c228c
|
|
15
|
+
summarizeBy: none
|
|
16
|
+
sourceColumn: Simbolo
|
|
17
|
+
|
|
18
|
+
column Orden
|
|
19
|
+
dataType: int64
|
|
20
|
+
isHidden
|
|
21
|
+
lineageTag: ba2a6509-9118-492d-a6e6-cb80f60f44be
|
|
22
|
+
summarizeBy: none
|
|
23
|
+
sourceColumn: Orden
|
|
24
|
+
|
|
25
|
+
partition Monedas = m
|
|
26
|
+
mode: import
|
|
27
|
+
queryGroup: 'Sample Dataset\Dimensiones'
|
|
28
|
+
source =
|
|
29
|
+
let
|
|
30
|
+
Source = #table(
|
|
31
|
+
type table [Moneda = text, Simbolo = text, Orden = Int64.Type],
|
|
32
|
+
{
|
|
33
|
+
{ "USD", "$", 1 },
|
|
34
|
+
{ "ARS", "$AR", 2 },
|
|
35
|
+
{ "EUR", "€", 3 }
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
in
|
|
39
|
+
Source
|
|
40
|
+
|
|
41
|
+
annotation PBI_NavigationStepName = Navegación
|
|
42
|
+
|
|
43
|
+
annotation PBI_ResultType = Table
|
|
44
|
+
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/// Hecho demo financiero con importes base para ingresos, gastos, cobros y cuentas por cobrar.
|
|
2
|
+
table 'Movimientos financieros'
|
|
3
|
+
isHidden
|
|
4
|
+
lineageTag: 5bacdbad-24ef-4b9f-b23d-8cb0a0680965
|
|
5
|
+
|
|
6
|
+
column MovimientoId
|
|
7
|
+
dataType: string
|
|
8
|
+
isHidden
|
|
9
|
+
lineageTag: 7d30513c-1531-4de6-9e68-b95934b11623
|
|
10
|
+
sourceColumn: MovimientoId
|
|
11
|
+
|
|
12
|
+
column Fecha
|
|
13
|
+
dataType: dateTime
|
|
14
|
+
formatString: Long Date
|
|
15
|
+
lineageTag: 989253e1-dcac-4b91-8d48-b6de0decb59d
|
|
16
|
+
summarizeBy: none
|
|
17
|
+
sourceColumn: Fecha
|
|
18
|
+
|
|
19
|
+
annotation UnderlyingDateTimeDataType = Date
|
|
20
|
+
|
|
21
|
+
annotation SummarizationSetBy = Automatic
|
|
22
|
+
|
|
23
|
+
column ClienteId
|
|
24
|
+
dataType: string
|
|
25
|
+
isHidden
|
|
26
|
+
lineageTag: c37f98c3-cd73-42bd-974e-5480dc7e27da
|
|
27
|
+
sourceColumn: ClienteId
|
|
28
|
+
|
|
29
|
+
column CanalId
|
|
30
|
+
dataType: string
|
|
31
|
+
isHidden
|
|
32
|
+
lineageTag: 92c30c92-4948-41be-9aa0-c5564f1883b7
|
|
33
|
+
sourceColumn: CanalId
|
|
34
|
+
|
|
35
|
+
column ProductoId
|
|
36
|
+
dataType: string
|
|
37
|
+
isHidden
|
|
38
|
+
lineageTag: 3176aa4e-889e-4f57-a1e3-0c804e8aacbc
|
|
39
|
+
sourceColumn: ProductoId
|
|
40
|
+
|
|
41
|
+
column ServicioId
|
|
42
|
+
dataType: string
|
|
43
|
+
isHidden
|
|
44
|
+
lineageTag: 158ae241-cc2f-4c1b-aba6-73890cd3df0e
|
|
45
|
+
sourceColumn: ServicioId
|
|
46
|
+
|
|
47
|
+
column ProyectoId
|
|
48
|
+
dataType: string
|
|
49
|
+
isHidden
|
|
50
|
+
lineageTag: 3e8c05ed-f043-433b-905d-b069d13952e5
|
|
51
|
+
sourceColumn: ProyectoId
|
|
52
|
+
|
|
53
|
+
column EquipoId
|
|
54
|
+
dataType: string
|
|
55
|
+
isHidden
|
|
56
|
+
lineageTag: 734b0053-4822-4ce5-a289-4be98f6ab022
|
|
57
|
+
sourceColumn: EquipoId
|
|
58
|
+
|
|
59
|
+
column 'Tipo movimiento'
|
|
60
|
+
dataType: string
|
|
61
|
+
lineageTag: 51bb8c45-bb6b-4f40-87e5-cc29e3a1a58e
|
|
62
|
+
sourceColumn: Tipo movimiento
|
|
63
|
+
|
|
64
|
+
column 'Importe Base'
|
|
65
|
+
dataType: double
|
|
66
|
+
lineageTag: 0494ead5-abce-4e88-be59-8a97c5848e09
|
|
67
|
+
sourceColumn: Importe Base
|
|
68
|
+
|
|
69
|
+
column Data
|
|
70
|
+
dataType: string
|
|
71
|
+
lineageTag: 1864bd5b-37d4-4c91-a87c-d7e088a8d72d
|
|
72
|
+
sourceColumn: Data
|
|
73
|
+
|
|
74
|
+
partition 'Movimientos financieros' = m
|
|
75
|
+
mode: import
|
|
76
|
+
queryGroup: 'Sample Dataset\Hechos'
|
|
77
|
+
source =
|
|
78
|
+
let
|
|
79
|
+
EntityCode = (entity as text, n as number) as text =>
|
|
80
|
+
let
|
|
81
|
+
CleanNumber = Number.From(n),
|
|
82
|
+
ToLetters = (value as number) as text =>
|
|
83
|
+
let
|
|
84
|
+
Current = Number.IntegerDivide(value, 1),
|
|
85
|
+
Prefix = if Current < 26 then "" else @ToLetters(Number.IntegerDivide(Current, 26) - 1),
|
|
86
|
+
Suffix = Character.FromNumber(65 + Number.Mod(Current, 26))
|
|
87
|
+
in
|
|
88
|
+
Prefix & Suffix,
|
|
89
|
+
BlockCode = ToLetters(Number.IntegerDivide(CleanNumber - 1, 100)),
|
|
90
|
+
NumberPart = Text.PadStart(Text.From(Number.Mod(CleanNumber - 1, 100) + 1, "en-US"), 2, "0"),
|
|
91
|
+
CheckLetter = Character.FromNumber(65 + Number.Mod(CleanNumber * 7 + Text.Length(entity) + 3, 26))
|
|
92
|
+
in
|
|
93
|
+
entity & BlockCode & NumberPart & CheckLetter,
|
|
94
|
+
CalendarDates = Table.TransformColumnTypes(Table.SelectColumns(Calendario, {"Fecha"}), {{"Fecha", type date}}),
|
|
95
|
+
EndDate = List.Max(CalendarDates[Fecha]),
|
|
96
|
+
StartDate = List.Min(CalendarDates[Fecha]),
|
|
97
|
+
DateWindow = Table.SelectRows(CalendarDates, each [Fecha] >= StartDate and [Fecha] <= EndDate),
|
|
98
|
+
WeekTable = Table.Distinct(Table.AddColumn(DateWindow, "WeekStart", each Date.StartOfWeek([Fecha], Day.Monday), type date)[[WeekStart]]),
|
|
99
|
+
SortedWeeks = Table.Sort(WeekTable, {{"WeekStart", Order.Ascending}}),
|
|
100
|
+
AddSemanaIndex = Table.AddIndexColumn(SortedWeeks, "SemanaIndex", 0, 1, Int64.Type),
|
|
101
|
+
ClienteCount = Table.RowCount(Clientes),
|
|
102
|
+
ProductCount = Table.RowCount(Productos),
|
|
103
|
+
ServiceCount = Table.RowCount(Servicios),
|
|
104
|
+
ProjectCount = Table.RowCount(Proyectos),
|
|
105
|
+
EquipoCount = Table.RowCount(Equipos),
|
|
106
|
+
ChannelCount = Table.RowCount(Canales),
|
|
107
|
+
ClientesBase = Table.FromList(List.Numbers(1, ClienteCount), Splitter.SplitByNothing(), {"ClienteNr"}),
|
|
108
|
+
AddClientes = Table.AddColumn(AddSemanaIndex, "Clientes", each ClientesBase),
|
|
109
|
+
ExpandClientes = Table.ExpandTableColumn(AddClientes, "Clientes", {"ClienteNr"}, {"ClienteNr"}),
|
|
110
|
+
AddValue = Table.AddColumn(ExpandClientes, "Value", each [SemanaIndex] * ClienteCount + [ClienteNr], Int64.Type),
|
|
111
|
+
AddFecha = Table.AddColumn(AddValue, "Fecha", each List.Min({EndDate, List.Max({StartDate, Date.AddDays([WeekStart], Number.Mod([ClienteNr] + [SemanaIndex], 7))})}), type date),
|
|
112
|
+
#"Con MovimientoId" = Table.AddColumn(AddFecha, "MovimientoId", each EntityCode("Movimiento", [Value]), type text),
|
|
113
|
+
#"Con ClienteId" = Table.AddColumn(#"Con MovimientoId", "ClienteId", each EntityCode("Cliente", [ClienteNr]), type text),
|
|
114
|
+
JoinClientes = Table.NestedJoin(#"Con ClienteId", {"ClienteId"}, Clientes, {"ClienteId"}, "Cliente", JoinKind.LeftOuter),
|
|
115
|
+
ExpandClientesDim = Table.ExpandTableColumn(JoinClientes, "Cliente", {"Pais", "Segmento"}, {"Pais", "Segmento"}),
|
|
116
|
+
AddChannelNr = Table.AddColumn(ExpandClientesDim, "ChannelNr", each Number.Mod([ClienteNr] + [SemanaIndex] - 1, ChannelCount) + 1, Int64.Type),
|
|
117
|
+
AddProductNr = Table.AddColumn(AddChannelNr, "ProductNr", each Number.Mod([ClienteNr] + [SemanaIndex] * 3 - 1, ProductCount) + 1, Int64.Type),
|
|
118
|
+
AddServiceNr = Table.AddColumn(AddProductNr, "ServiceNr", each Number.Mod([ClienteNr] + [SemanaIndex] * 5 - 1, ServiceCount) + 1, Int64.Type),
|
|
119
|
+
AddProjectNr = Table.AddColumn(AddServiceNr, "ProjectNr", each Number.Mod([ClienteNr] + [SemanaIndex] * 7 - 1, ProjectCount) + 1, Int64.Type),
|
|
120
|
+
AddEquipoNr = Table.AddColumn(AddProjectNr, "EquipoNr", each Number.Mod([ClienteNr] + [SemanaIndex] - 1, EquipoCount) + 1, Int64.Type),
|
|
121
|
+
#"Con CanalId" = Table.AddColumn(AddEquipoNr, "CanalId", each EntityCode("Canal", [ChannelNr]), type text),
|
|
122
|
+
#"Con ProductoId" = Table.AddColumn(#"Con CanalId", "ProductoId", each EntityCode("Producto", [ProductNr]), type text),
|
|
123
|
+
#"Con ServicioId" = Table.AddColumn(#"Con ProductoId", "ServicioId", each EntityCode("Servicio", [ServiceNr]), type text),
|
|
124
|
+
#"Con ProyectoId" = Table.AddColumn(#"Con ServicioId", "ProyectoId", each EntityCode("Proyecto", [ProjectNr]), type text),
|
|
125
|
+
#"Con EquipoId" = Table.AddColumn(#"Con ProyectoId", "EquipoId", each EntityCode("Equipo", [EquipoNr]), type text),
|
|
126
|
+
#"Con Tipo movimiento" = Table.AddColumn(#"Con EquipoId", "Tipo movimiento", each let r = Number.Mod([Value], 4) in if r = 0 then "Ingreso" else if r = 1 then "Gasto operativo" else if r = 2 then "Cobro" else "Cuenta por cobrar", type text),
|
|
127
|
+
AddYearNr = Table.AddColumn(#"Con Tipo movimiento", "YearNr", each Date.Year([Fecha]), Int64.Type),
|
|
128
|
+
AddMonthNr = Table.AddColumn(AddYearNr, "MonthNr", each Date.Month([Fecha]), Int64.Type),
|
|
129
|
+
AddYearFactor = Table.AddColumn(AddMonthNr, "YearFactor", each if [YearNr] = 2024 then 0.92 else if [YearNr] = 2025 then 1.08 else if [YearNr] = 2026 then 1.18 else 1.0, type number),
|
|
130
|
+
AddCountryFactor = Table.AddColumn(AddYearFactor, "CountryFactor", each if [Pais] = "Brasil" then 2.25 else if [Pais] = "Mexico" then 2.05 else if [Pais] = "España" then 1.90 else if [Pais] = "Colombia" then 1.68 else if [Pais] = "Argentina" then 1.55 else if [Pais] = "Chile" then 1.42 else if [Pais] = "Peru" then 1.28 else if [Pais] = "Venezuela" then 1.12 else if [Pais] = "Ecuador" then 1.02 else if [Pais] = "Republica Dominicana" then 0.96 else if [Pais] = "Uruguay" then 0.88 else if [Pais] = "Panama" then 0.82 else if [Pais] = "Costa Rica" then 0.74 else if [Pais] = "Guatemala" then 0.68 else if [Pais] = "Paraguay" then 0.58 else if [Pais] = "Bolivia" then 0.52 else if [Pais] = "Honduras" then 0.46 else if [Pais] = "El Salvador" then 0.40 else if [Pais] = "Nicaragua" then 0.35 else if [Pais] = "Cuba" then 0.30 else if [Pais] = "Haiti" then 0.22 else 1.0, type number),
|
|
131
|
+
AddSegmentFactor = Table.AddColumn(AddCountryFactor, "SegmentFactor", each if [Segmento] = "Enterprise" then 2.35 else if [Segmento] = "Mid Market" then 1.10 else if [Segmento] = "SMB" then 0.56 else 1.0, type number),
|
|
132
|
+
AddChannelFactor = Table.AddColumn(AddSegmentFactor, "ChannelFactor", each if [ChannelNr] = 1 then 1.72 else if [ChannelNr] = 2 then 1.18 else if [ChannelNr] = 3 then 0.82 else if [ChannelNr] = 4 then 0.54 else 1.0, type number),
|
|
133
|
+
AddProductFactor = Table.AddColumn(AddChannelFactor, "ProductFactor", each 0.62 + Number.Mod([ProductNr] * 29, 150) / 100, type number),
|
|
134
|
+
AddServiceFactor = Table.AddColumn(AddProductFactor, "ServiceFactor", each 0.68 + Number.Mod([ServiceNr] * 31, 140) / 100, type number),
|
|
135
|
+
AddProjectFactor = Table.AddColumn(AddServiceFactor, "ProjectFactor", each 0.70 + Number.Mod([ProjectNr] * 23, 160) / 100, type number),
|
|
136
|
+
AddEquipoFactor = Table.AddColumn(AddProjectFactor, "EquipoFactor", each 0.75 + Number.Mod([EquipoNr] * 19, 120) / 100, type number),
|
|
137
|
+
AddMovementFactor = Table.AddColumn(AddEquipoFactor, "MovementFactor", each if [Tipo movimiento] = "Ingreso" then 1.18 else if [Tipo movimiento] = "Gasto operativo" then 0.82 else if [Tipo movimiento] = "Cobro" then 1.04 else if [Tipo movimiento] = "Cuenta por cobrar" then 1.34 else 1.0, type number),
|
|
138
|
+
AddSeasonFactor = Table.AddColumn(AddMovementFactor, "SeasonFactor", each if [MonthNr] = 1 then 0.78 else if [MonthNr] = 2 then 0.86 else if [MonthNr] = 3 then 0.96 else if [MonthNr] = 4 then 1.04 else if [MonthNr] = 5 then 1.10 else if [MonthNr] = 6 then 1.18 else if [MonthNr] = 7 then 1.26 else if [MonthNr] = 8 then 1.20 else if [MonthNr] = 9 then 1.06 else if [MonthNr] = 10 then 1.16 else if [MonthNr] = 11 then 1.34 else if [MonthNr] = 12 then 1.52 else 1.0, type number),
|
|
139
|
+
AddNoiseFactor = Table.AddColumn(AddSeasonFactor, "NoiseFactor", each 0.82 + Number.Mod([Value] * 37 + [ClienteNr] * 17 + [ProductNr] * 13 + [ProjectNr] * 11, 95) / 100, type number),
|
|
140
|
+
#"Con Importe Base" = Table.AddColumn(AddNoiseFactor, "Importe Base", each Number.Round((6500 + Number.Mod([Value] * 1231 + [SemanaIndex] * 313, 68000)) * [YearFactor] * [CountryFactor] * [SegmentFactor] * [ChannelFactor] * [ProductFactor] * [ServiceFactor] * [ProjectFactor] * [EquipoFactor] * [MovementFactor] * [SeasonFactor] * [NoiseFactor], 0), type number),
|
|
141
|
+
#"Con Data" = Table.AddColumn(#"Con Importe Base", "Data", each "Demo", type text),
|
|
142
|
+
Result = Table.SelectColumns(#"Con Data", {"MovimientoId", "Fecha", "ClienteId", "CanalId", "ProductoId", "ServicioId", "ProyectoId", "EquipoId", "Tipo movimiento", "Importe Base", "Data"})
|
|
143
|
+
in
|
|
144
|
+
Result
|
|
145
|
+
|