@luquimbo/bi-superpowers 5.0.0 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +5 -3
- package/.claude-plugin/plugin.json +1 -1
- package/.claude-plugin/skill-manifest.json +23 -7
- package/.plugin/plugin.json +1 -1
- package/AGENTS.md +124 -26
- package/CHANGELOG.md +494 -16
- package/README.md +33 -117
- package/bin/cli.js +1 -1
- package/bin/commands/diff.js +2 -2
- package/bin/commands/install.js +58 -45
- package/bin/commands/lint.js +2 -2
- package/bin/commands/validate-projects.js +1 -1
- package/bin/lib/generators/claude-plugin.js +14 -5
- package/bin/lib/generators/shared.js +9 -5
- package/bin/lib/mcp-config.js +22 -2
- package/bin/lib/skills.js +8 -8
- package/bin/mcp/powerbi-modeling-launcher.js +8 -4
- package/bin/postinstall.js +14 -12
- package/bin/utils/mcp-detect.js +11 -11
- package/commands/bi-connect.md +34 -17
- package/commands/bi-dax.md +385 -0
- package/commands/bi-kickoff.md +75 -44
- package/commands/bi-modeling.md +395 -0
- package/commands/bi-performance.md +455 -0
- package/commands/bi-start.md +30 -18
- package/desktop-extension/manifest.json +2 -2
- package/package.json +6 -3
- package/skills/bi-connect/SKILL.md +34 -17
- package/skills/bi-connect/scripts/update-check.js +1 -1
- package/skills/bi-dax/SKILL.md +387 -0
- package/skills/{bi-report → bi-dax}/scripts/update-check.js +1 -1
- package/skills/bi-kickoff/SKILL.md +75 -44
- package/skills/bi-kickoff/scripts/update-check.js +1 -1
- package/skills/bi-modeling/SKILL.md +397 -0
- package/skills/bi-modeling/scripts/update-check.js +403 -0
- package/skills/bi-performance/SKILL.md +457 -0
- package/skills/bi-performance/scripts/install-tabular-editor.ps1 +90 -0
- package/skills/bi-performance/scripts/run-bpa.ps1 +161 -0
- package/skills/bi-performance/scripts/update-check.js +403 -0
- package/skills/bi-start/SKILL.md +31 -19
- package/skills/bi-start/scripts/update-check.js +1 -1
- package/src/content/base.md +13 -8
- package/src/content/routing.md +1 -5
- package/src/content/skills/bi-connect.md +32 -15
- package/src/content/skills/bi-dax.md +358 -0
- package/src/content/skills/bi-kickoff.md +73 -42
- package/src/content/skills/bi-modeling.md +368 -0
- package/src/content/skills/bi-performance/SKILL.md +428 -0
- package/src/content/skills/bi-performance/scripts/install-tabular-editor.ps1 +90 -0
- package/src/content/skills/bi-performance/scripts/run-bpa.ps1 +161 -0
- package/src/content/skills/bi-start.md +30 -18
- package/templates/sales/AGENTS.md +33 -0
- package/templates/sales/sales-template.Report/.platform +11 -0
- package/templates/sales/sales-template.Report/StaticResources/RegisteredResources/BISuperpowers.json +3888 -0
- package/templates/sales/sales-template.Report/StaticResources/SharedResources/BaseThemes/Fluent2-CY26SU03.json +4104 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/page.json +123 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/10420560e5b8c5235857/visual.json +16 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2181c54a94f0c67abb2d/visual.json +283 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/24eba6a7af0b59974ef5/visual.json +703 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/26db24c91e5b615a5c29/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/26db24c91e5b615a5c29/visual.json +528 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2ec652d0956901dd2afd/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/2ec652d0956901dd2afd/visual.json +324 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/45dda4e0b159becf2dcd/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/45dda4e0b159becf2dcd/visual.json +359 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4ca8800cf1539ad423f2/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4f5704218eb88f7cdff6/mobile.json +29 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/4f5704218eb88f7cdff6/visual.json +241 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/54d3fdbedbbb863a9d7a/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/68043403e96ca8ed23e8/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/80b54a678ef36a250994/visual.json +351 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/814f624b6056dc4c8de5/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/814f624b6056dc4c8de5/visual.json +421 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/85e1cc13559f4e107ede/visual.json +681 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8686961b837e855963fe/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8686961b837e855963fe/visual.json +720 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/8d302c5b7e87e8cb57bb/visual.json +590 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a02c5b30f2e757637d78/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a02c5b30f2e757637d78/visual.json +102 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/a405d29e7744c770d445/visual.json +575 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/b0dc2036d3cf2baafb35/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/b0dc2036d3cf2baafb35/visual.json +333 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/cdd696baaf3b80b326f8/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/cdd696baaf3b80b326f8/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/ff77ca1bafff5bfe5044/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/017e2c84c7dc89f26e57/visuals/ff77ca1bafff5bfe5044/visual.json +523 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/page.json +130 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/0352fd80d074693a65db/visual.json +681 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/1c5a14bf493697344b68/visual.json +351 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/3486cf7624c5b109b4e5/visual.json +333 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/4d8b989008edc0db28d1/visual.json +102 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/5f4d76bbc870118e9840/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/73629e1abebb7a444b59/visual.json +359 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/749cb1388c7e0a88161c/visual.json +685 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/85090dcdf75ac2487d1e/visual.json +283 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/92cf92e3da10493adb78/visual.json +468 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a30bd0950630ed94e8a3/visual.json +590 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a56e91d9400a835e4814/visual.json +528 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a90aaa3e3117494f18f8/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/a90aaa3e3117494f18f8/visual.json +523 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/aded24cd205c0b528642/visual.json +720 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/mobile.json +37 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/af34b26f14a8a724c9a9/visual.json +1230 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b06ef80aa78cabcef8a6/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/b06ef80aa78cabcef8a6/visual.json +324 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/d97979633a91e041107e/mobile.json +11 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/d97979633a91e041107e/visual.json +421 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/mobile.json +29 -0
- package/templates/sales/sales-template.Report/definition/pages/6a4808bb8bb9166f49ff/visuals/fa81f184e2cb0e8b087c/visual.json +241 -0
- package/templates/sales/sales-template.Report/definition/pages/pages.json +8 -0
- package/templates/sales/sales-template.Report/definition/report.json +89 -0
- package/templates/sales/sales-template.Report/definition/version.json +4 -0
- package/templates/sales/sales-template.Report/definition.pbir +9 -0
- package/templates/sales/sales-template.SemanticModel/.pbi/editorSettings.json +8 -0
- package/templates/sales/sales-template.SemanticModel/.platform +11 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/.pbi/daxQueries.json +9 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Calendar445MonthNr.dax +0 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Consulta 1.dax +6 -0
- package/templates/sales/sales-template.SemanticModel/DAXQueries/Consulta 2.dax +32 -0
- package/templates/sales/sales-template.SemanticModel/definition/cultures/es-AR.tmdl +7324 -0
- package/templates/sales/sales-template.SemanticModel/definition/database.tmdl +3 -0
- package/templates/sales/sales-template.SemanticModel/definition/expressions.tmdl +233 -0
- package/templates/sales/sales-template.SemanticModel/definition/functions.tmdl +247 -0
- package/templates/sales/sales-template.SemanticModel/definition/model.tmdl +46 -0
- package/templates/sales/sales-template.SemanticModel/definition/relationships.tmdl +16 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Comparaciones.tmdl +194 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Dimensiones ventas.tmdl +71 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Ejes temporales.tmdl +67 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Per/303/255odos.tmdl" +318 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista de calendario.tmdl +36 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista del valor.tmdl +87 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Aux Vista temporal.tmdl +62 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Calendario.tmdl +198 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Canales.tmdl +59 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Clientes.tmdl +120 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Modelo Configuraci/303/263n.tmdl" +48 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Monedas.tmdl +43 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/M/303/251tricas.tmdl +553 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Productos.tmdl +73 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Tipo de cambio.tmdl +66 -0
- package/templates/sales/sales-template.SemanticModel/definition/tables/Ventas.tmdl +133 -0
- package/templates/sales/sales-template.SemanticModel/definition.pbism +5 -0
- package/templates/sales/sales-template.SemanticModel/diagramLayout.json +239 -0
- package/templates/sales/sales-template.pbip +14 -0
- package/theme/BISuperpowers.json +3888 -0
- package/commands/bi-report.md +0 -403
- package/skills/bi-report/SKILL.md +0 -405
- package/skills/bi-report/references/cli-commands.md +0 -184
- package/skills/bi-report/references/cli-setup.md +0 -101
- package/skills/bi-report/references/close-write-open-pattern.md +0 -80
- package/skills/bi-report/references/layouts/finance.md +0 -65
- package/skills/bi-report/references/layouts/generic.md +0 -46
- package/skills/bi-report/references/layouts/hr.md +0 -48
- package/skills/bi-report/references/layouts/marketing.md +0 -45
- package/skills/bi-report/references/layouts/operations.md +0 -44
- package/skills/bi-report/references/layouts/sales.md +0 -50
- package/skills/bi-report/references/native-visuals.md +0 -341
- package/skills/bi-report/references/pbi-desktop-installation.md +0 -87
- package/skills/bi-report/references/pbir-preview-activation.md +0 -40
- package/skills/bi-report/references/slicer.md +0 -89
- package/skills/bi-report/references/textbox.md +0 -101
- package/skills/bi-report/references/themes/BISuperpowers.json +0 -915
- package/skills/bi-report/references/troubleshooting.md +0 -135
- package/skills/bi-report/references/visual-types.md +0 -78
- package/skills/bi-report/scripts/apply-theme.js +0 -243
- package/skills/bi-report/scripts/create-visual.js +0 -942
- package/skills/bi-report/scripts/ensure-pbi-cli.sh +0 -41
- package/skills/bi-report/scripts/validate-pbir.js +0 -351
- package/src/content/skills/bi-report/SKILL.md +0 -376
- package/src/content/skills/bi-report/references/cli-commands.md +0 -184
- package/src/content/skills/bi-report/references/cli-setup.md +0 -101
- package/src/content/skills/bi-report/references/close-write-open-pattern.md +0 -80
- package/src/content/skills/bi-report/references/layouts/finance.md +0 -65
- package/src/content/skills/bi-report/references/layouts/generic.md +0 -46
- package/src/content/skills/bi-report/references/layouts/hr.md +0 -48
- package/src/content/skills/bi-report/references/layouts/marketing.md +0 -45
- package/src/content/skills/bi-report/references/layouts/operations.md +0 -44
- package/src/content/skills/bi-report/references/layouts/sales.md +0 -50
- package/src/content/skills/bi-report/references/native-visuals.md +0 -341
- package/src/content/skills/bi-report/references/pbi-desktop-installation.md +0 -87
- package/src/content/skills/bi-report/references/pbir-preview-activation.md +0 -40
- package/src/content/skills/bi-report/references/slicer.md +0 -89
- package/src/content/skills/bi-report/references/textbox.md +0 -101
- package/src/content/skills/bi-report/references/themes/BISuperpowers.json +0 -915
- package/src/content/skills/bi-report/references/troubleshooting.md +0 -135
- package/src/content/skills/bi-report/references/visual-types.md +0 -78
- package/src/content/skills/bi-report/scripts/apply-theme.js +0 -243
- package/src/content/skills/bi-report/scripts/create-visual.js +0 -942
- package/src/content/skills/bi-report/scripts/ensure-pbi-cli.sh +0 -41
- package/src/content/skills/bi-report/scripts/validate-pbir.js +0 -351
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/// Power Query helper that returns the ISO week number for a date. Used by the parallel M period-comparison prototype.
|
|
2
|
+
expression fxTemplateIsoWeek =
|
|
3
|
+
(dateValue as date) as number =>
|
|
4
|
+
let
|
|
5
|
+
// ISO 8601 usa lunes como inicio de semana.
|
|
6
|
+
dayIndex = Date.DayOfWeek(dateValue, Day.Monday),
|
|
7
|
+
// El jueves define a que año ISO pertenece la semana.
|
|
8
|
+
thursday = Date.AddDays(dateValue, 3 - dayIndex),
|
|
9
|
+
isoYear = Date.Year(thursday),
|
|
10
|
+
// El 4 de enero siempre cae dentro de la semana ISO 1.
|
|
11
|
+
firstThursday = #date(isoYear, 1, 4),
|
|
12
|
+
firstWeekStart = Date.StartOfWeek(firstThursday, Day.Monday),
|
|
13
|
+
weekStart = Date.StartOfWeek(dateValue, Day.Monday),
|
|
14
|
+
// Divide los dias transcurridos en bloques de 7 dias.
|
|
15
|
+
week = Number.IntegerDivide(Duration.Days(weekStart - firstWeekStart), 7) + 1
|
|
16
|
+
in
|
|
17
|
+
week
|
|
18
|
+
lineageTag: 8177d19e-7f3b-4eb2-a9b4-13ed978a2925
|
|
19
|
+
queryGroup: Calendario
|
|
20
|
+
|
|
21
|
+
annotation PBI_NavigationStepName = Navegación
|
|
22
|
+
|
|
23
|
+
annotation PBI_ResultType = Function
|
|
24
|
+
|
|
25
|
+
/// Power Query helper matching the template DAX Calendar445Year approximation.
|
|
26
|
+
expression fxTemplateCalendar445Year =
|
|
27
|
+
(dateValue as date) as number =>
|
|
28
|
+
let
|
|
29
|
+
// Reutiliza la misma ancla semanal que el calendario ISO.
|
|
30
|
+
dayIndex = Date.DayOfWeek(dateValue, Day.Monday),
|
|
31
|
+
// Mover al jueves estabiliza semanas que cruzan de año.
|
|
32
|
+
fiscalAnchorDate = Date.AddDays(dateValue, 3 - dayIndex)
|
|
33
|
+
in
|
|
34
|
+
Date.Year(fiscalAnchorDate)
|
|
35
|
+
lineageTag: bc114851-859b-4070-8a1f-94277a765443
|
|
36
|
+
queryGroup: Calendario
|
|
37
|
+
|
|
38
|
+
annotation PBI_NavigationStepName = Navegación
|
|
39
|
+
|
|
40
|
+
annotation PBI_ResultType = Function
|
|
41
|
+
|
|
42
|
+
/// Power Query helper matching the template DAX Calendar445MonthNr 4-4-5 approximation.
|
|
43
|
+
expression fxTemplateCalendar445MonthNr =
|
|
44
|
+
(dateValue as date) as number =>
|
|
45
|
+
let
|
|
46
|
+
// Primero calcula la semana ISO de la fecha.
|
|
47
|
+
weekNr = fxTemplateIsoWeek(dateValue),
|
|
48
|
+
// El patron 4-4-5 agrupa semanas en meses fiscales.
|
|
49
|
+
fiscalMonth =
|
|
50
|
+
if weekNr <= 4 then 1
|
|
51
|
+
else if weekNr <= 8 then 2
|
|
52
|
+
else if weekNr <= 13 then 3
|
|
53
|
+
else if weekNr <= 17 then 4
|
|
54
|
+
else if weekNr <= 21 then 5
|
|
55
|
+
else if weekNr <= 26 then 6
|
|
56
|
+
else if weekNr <= 30 then 7
|
|
57
|
+
else if weekNr <= 34 then 8
|
|
58
|
+
else if weekNr <= 39 then 9
|
|
59
|
+
else if weekNr <= 43 then 10
|
|
60
|
+
else if weekNr <= 47 then 11
|
|
61
|
+
else 12
|
|
62
|
+
in
|
|
63
|
+
fiscalMonth
|
|
64
|
+
lineageTag: 92f3a8a4-5c4d-4efc-a8f9-3a4d0a9d4b9b
|
|
65
|
+
queryGroup: Calendario
|
|
66
|
+
|
|
67
|
+
annotation PBI_NavigationStepName = Navegación
|
|
68
|
+
|
|
69
|
+
annotation PBI_ResultType = Function
|
|
70
|
+
|
|
71
|
+
/// Query helper para listar las vistas de calendario disponibles que alimentan los periodos y comparaciones M.
|
|
72
|
+
expression 'Calendar Types' =
|
|
73
|
+
let
|
|
74
|
+
// Lista las vistas de calendario que el usuario puede elegir.
|
|
75
|
+
Source = #table(
|
|
76
|
+
type table [#"Calendar Type" = text, #"Calendar Type Fields" = text, #"Calendar Type Order" = Int64.Type],
|
|
77
|
+
{
|
|
78
|
+
// Orden 1: calendario fiscal semanal 4-4-5.
|
|
79
|
+
{"Semanal 4-4-5", "Semanal 4-4-5", 1},
|
|
80
|
+
// Orden 2: calendario gregoriano tradicional.
|
|
81
|
+
{"Gregoriano", "Gregoriano", 2}
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
in
|
|
85
|
+
Source
|
|
86
|
+
lineageTag: c0c58cf0-e2ee-41ad-b48d-41a4177e34ee
|
|
87
|
+
queryGroup: Calendario
|
|
88
|
+
|
|
89
|
+
annotation PBI_NavigationStepName = Navegación
|
|
90
|
+
|
|
91
|
+
annotation PBI_ResultType = Table
|
|
92
|
+
|
|
93
|
+
/// Query editable por el usuario para elegir que periodos quedan disponibles. Quitar filas aca quita opciones de Aux Periodos al refrescar.
|
|
94
|
+
expression 'Calendar Period Presets' =
|
|
95
|
+
let
|
|
96
|
+
// Catalogo editable de periodos disponibles para el slicer.
|
|
97
|
+
// Si borras una fila, desaparece del modelo al refrescar.
|
|
98
|
+
Source = #table(
|
|
99
|
+
type table [#"Período" = text, Period = text, Sort = Int64.Type],
|
|
100
|
+
{
|
|
101
|
+
{"Hoy", "Today", 1},
|
|
102
|
+
{"Ayer", "Yesterday", 2},
|
|
103
|
+
{"Anteayer", "Before yesterday", 3},
|
|
104
|
+
{"Últimos 7 días", "Last 7 days", 4},
|
|
105
|
+
{"7 días previos", "Previous 7 days", 5},
|
|
106
|
+
{"Últimos 30 días", "Last 30 days", 6},
|
|
107
|
+
{"30 días previos", "Previous 30 days", 7},
|
|
108
|
+
{"Últimos 90 días", "Last 90 days", 8},
|
|
109
|
+
{"90 días previos", "Previous 90 days", 9},
|
|
110
|
+
{"Últimos 180 días", "Last 180 days", 10},
|
|
111
|
+
{"180 días previos", "Previous 180 days", 11},
|
|
112
|
+
{"Últimos 365 días", "Last 365 days", 12},
|
|
113
|
+
{"365 días previos", "Previous 365 days", 13},
|
|
114
|
+
{"Esta semana", "This week", 14},
|
|
115
|
+
{"Semana pasada hasta la fecha", "Last week to date", 15},
|
|
116
|
+
{"Semana pasada completa", "Last week complete", 16},
|
|
117
|
+
{"2 semanas atrás", "2 weeks ago", 17},
|
|
118
|
+
{"Esta semana del año previo", "This week last year", 18},
|
|
119
|
+
{"Semana pasada del año previo", "Last week last year", 19},
|
|
120
|
+
{"Este mes", "This month", 20},
|
|
121
|
+
{"Mes pasado hasta la fecha", "Last month to date", 21},
|
|
122
|
+
{"Mes pasado completo", "Last month complete", 22},
|
|
123
|
+
{"2 meses atrás", "2 months ago", 23},
|
|
124
|
+
{"Este mes del año previo", "This month last year", 24},
|
|
125
|
+
{"Mes pasado del año previo", "Last month last year", 25},
|
|
126
|
+
{"Este trimestre", "This quarter", 26},
|
|
127
|
+
{"Trimestre pasado hasta la fecha", "Last quarter to date", 27},
|
|
128
|
+
{"Trimestre pasado completo", "Last quarter complete", 28},
|
|
129
|
+
{"2 trimestres atrás", "2 quarters ago", 29},
|
|
130
|
+
{"Este trimestre del año previo", "This quarter last year", 30},
|
|
131
|
+
{"Trimestre pasado del año previo", "Last quarter last year", 31},
|
|
132
|
+
{"Este semestre", "This semester", 32},
|
|
133
|
+
{"Semestre pasado", "Last semester", 33},
|
|
134
|
+
{"Semestre pasado hasta la fecha", "Last semester to date", 34},
|
|
135
|
+
{"Semestre pasado completo", "Last semester complete", 35},
|
|
136
|
+
{"2 semestres atrás", "2 semesters ago", 36},
|
|
137
|
+
{"Este semestre del año previo", "This semester last year", 37},
|
|
138
|
+
{"Semestre pasado del año previo", "Last semester last year", 38},
|
|
139
|
+
{"Este año", "This year", 39},
|
|
140
|
+
{"Año pasado completo", "Last year complete", 40},
|
|
141
|
+
{"Año pasado hasta la fecha", "Last year to date", 41},
|
|
142
|
+
{"2 años atrás", "2 years ago", 42},
|
|
143
|
+
{"Histórico", "All time", 43}
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
in
|
|
147
|
+
Source
|
|
148
|
+
lineageTag: 9c95f308-8206-4056-86d4-8a2f2b419ee5
|
|
149
|
+
queryGroup: Calendario
|
|
150
|
+
|
|
151
|
+
annotation PBI_NavigationStepName = Navegación
|
|
152
|
+
|
|
153
|
+
annotation PBI_ResultType = Table
|
|
154
|
+
|
|
155
|
+
/// Query editable por el usuario para elegir que comparaciones quedan disponibles. Quitar filas aca quita opciones de Aux Comparaciones al refrescar.
|
|
156
|
+
expression 'Calendar Comparison Presets' =
|
|
157
|
+
let
|
|
158
|
+
// Catalogo editable de comparaciones entre periodo actual y previo.
|
|
159
|
+
// Sort conecta cada comparacion con el mapa de rangos.
|
|
160
|
+
Source = #table(
|
|
161
|
+
type table [Sort = Int64.Type, #"Current period (vs. previous period)" = text, #"Período actual (vs. período previo)" = text],
|
|
162
|
+
{
|
|
163
|
+
{1, "Today (vs. Yesterday)", "Hoy (vs. Ayer)"},
|
|
164
|
+
{2, "Yesterday (vs. Before yesterday)", "Ayer (vs. Anteayer)"},
|
|
165
|
+
{9, "This week (vs. last week to date)", "Este semana (vs. semana pasada hasta la fecha)"},
|
|
166
|
+
{10, "This week (vs. last week complete)", "Este semana (vs. semana pasada completo)"},
|
|
167
|
+
{11, "This week (vs. same week last year to date)", "Este semana (vs. mismo semana del año pasado hasta la fecha)"},
|
|
168
|
+
{12, "Last week (vs. 2 weeks ago)", "Semana pasada (vs. 2 semanas atrás)"},
|
|
169
|
+
{13, "Last week (vs. same week last year)", "Semana pasada (vs. mismo semana del año pasado)"},
|
|
170
|
+
{14, "This month (vs. last month to date)", "Este mes (vs. mes pasado hasta la fecha)"},
|
|
171
|
+
{15, "This month (vs. last month complete)", "Este mes (vs. mes pasado completo)"},
|
|
172
|
+
{16, "This month (vs. same month last year to date)", "Este mes (vs. mismo mes del año pasado hasta la fecha)"},
|
|
173
|
+
{17, "Last month (vs. 2 months ago)", "Mes pasado (vs. 2 meses atrás)"},
|
|
174
|
+
{18, "Last month (vs. same month last year)", "Mes pasado (vs. mismo mes del año pasado)"},
|
|
175
|
+
{19, "This quarter (vs. last quarter to date)", "Este trimestre (vs. trimestre pasado hasta la fecha)"},
|
|
176
|
+
{20, "This quarter (vs. last quarter complete)", "Este trimestre (vs. trimestre pasado completo)"},
|
|
177
|
+
{21, "This quarter (vs. same quarter last year to date)", "Este trimestre (vs. mismo trimestre del año pasado hasta la fecha)"},
|
|
178
|
+
{22, "Last quarter (vs. 2 quarters ago)", "Trimestre pasado (vs. 2 trimestres atrás)"},
|
|
179
|
+
{23, "Last quarter (vs. same quarter last year)", "Trimestre pasado (vs. mismo trimestre del año pasado)"},
|
|
180
|
+
{24, "This semester (vs. last semester to date)", "Este semestre (vs. semestre pasado hasta la fecha)"},
|
|
181
|
+
{25, "This semester (vs. last semester complete)", "Este semestre (vs. semestre pasado completo)"},
|
|
182
|
+
{26, "This semester (vs. same semester last year to date)", "Este semestre (vs. mismo semestre del año pasado hasta la fecha)"},
|
|
183
|
+
{27, "Last semester (vs. 2 semesters ago)", "Semestre pasado (vs. 2 semestres atrás)"},
|
|
184
|
+
{28, "Last semester (vs. same semester last year)", "Semestre pasado (vs. mismo semestre del año pasado)"},
|
|
185
|
+
{29, "This year (vs. last year to date)", "Este año (vs. año pasado hasta la fecha)"},
|
|
186
|
+
{30, "This year (vs. last year complete)", "Este año (vs. año pasado completo)"},
|
|
187
|
+
{31, "This year (vs. All Time)", "Este año (vs. histórico)"},
|
|
188
|
+
{32, "Last year (vs. previous year)", "Año pasado (vs. año anterior)"},
|
|
189
|
+
{33, "All Time (vs. All Time)", "Histórico (vs. Histórico)"}
|
|
190
|
+
}
|
|
191
|
+
)
|
|
192
|
+
in
|
|
193
|
+
Source
|
|
194
|
+
lineageTag: a126c29e-71e5-484a-94f7-ceb252f5c965
|
|
195
|
+
queryGroup: Calendario
|
|
196
|
+
|
|
197
|
+
annotation PBI_NavigationStepName = Navegación
|
|
198
|
+
|
|
199
|
+
annotation PBI_ResultType = Table
|
|
200
|
+
|
|
201
|
+
/// Parametro de Power Query que define la fecha inicial del calendario del template.
|
|
202
|
+
expression FechaInicio =
|
|
203
|
+
// Fecha inicial del calendario del template.
|
|
204
|
+
// Cambiar este parametro agranda o achica la tabla de fechas.
|
|
205
|
+
#date(2023, 1, 1) meta [IsParameterQuery=true, Type="Date", IsParameterQueryRequired=true]
|
|
206
|
+
lineageTag: c49bce2a-539e-46c9-9554-9bba49ca7580
|
|
207
|
+
queryGroup: Params
|
|
208
|
+
|
|
209
|
+
annotation PBI_ResultType = Date
|
|
210
|
+
|
|
211
|
+
annotation PBI_NavigationStepName = Navegación
|
|
212
|
+
|
|
213
|
+
/// Parametro de Power Query que define el offset horario UTC del template. Ejemplo: -3 para Buenos Aires.
|
|
214
|
+
expression ZonaHoraria =
|
|
215
|
+
// Offset UTC usado para calcular la fecha actual del modelo.
|
|
216
|
+
// Buenos Aires usa -3; España suele usar 1 o 2 segun horario.
|
|
217
|
+
-3 meta [IsParameterQuery=true, Type="Number", IsParameterQueryRequired=true]
|
|
218
|
+
lineageTag: f11ac853-0898-4e54-ac32-115848938226
|
|
219
|
+
queryGroup: Params
|
|
220
|
+
|
|
221
|
+
annotation PBI_ResultType = Number
|
|
222
|
+
|
|
223
|
+
annotation PBI_NavigationStepName = Navegación
|
|
224
|
+
|
|
225
|
+
/// Parametro de Power Query que define la moneda base del modelo y la moneda default de visualizacion.
|
|
226
|
+
expression MonedaBase = "USD" meta [IsParameterQuery=true, Type="Text", IsParameterQueryRequired=true]
|
|
227
|
+
lineageTag: 49a97699-aa32-43e9-a7c6-8f42299f36a1
|
|
228
|
+
queryGroup: Params
|
|
229
|
+
|
|
230
|
+
annotation PBI_ResultType = Text
|
|
231
|
+
|
|
232
|
+
annotation PBI_NavigationStepName = Navegación
|
|
233
|
+
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/// Devuelve el tipo de cambio de una moneda hacia la moneda base definida por MonedaBase para una fecha; la moneda base devuelve 1 sin depender de la tabla de tasas.
|
|
2
|
+
function GetExchangeRate =
|
|
3
|
+
( currency : STRING, rateDate : DATETIME ) =>
|
|
4
|
+
VAR __BaseCurrency =
|
|
5
|
+
COALESCE (
|
|
6
|
+
MAXX (
|
|
7
|
+
FILTER (
|
|
8
|
+
'Modelo Configuración',
|
|
9
|
+
'Modelo Configuración'[Configuración] = "Moneda Base"
|
|
10
|
+
),
|
|
11
|
+
'Modelo Configuración'[ValorTexto]
|
|
12
|
+
),
|
|
13
|
+
"USD"
|
|
14
|
+
)
|
|
15
|
+
VAR __Currency = COALESCE ( currency, __BaseCurrency )
|
|
16
|
+
VAR __SafeDate =
|
|
17
|
+
IF (
|
|
18
|
+
ISBLANK ( rateDate ),
|
|
19
|
+
CALCULATE (
|
|
20
|
+
MAX ( 'Tipo de cambio'[Fecha] ),
|
|
21
|
+
REMOVEFILTERS ( 'Tipo de cambio' )
|
|
22
|
+
),
|
|
23
|
+
rateDate
|
|
24
|
+
)
|
|
25
|
+
RETURN
|
|
26
|
+
IF (
|
|
27
|
+
__Currency = __BaseCurrency,
|
|
28
|
+
1,
|
|
29
|
+
VAR __LastAvailableDate =
|
|
30
|
+
CALCULATE (
|
|
31
|
+
MAX ( 'Tipo de cambio'[Fecha] ),
|
|
32
|
+
REMOVEFILTERS ( 'Tipo de cambio' ),
|
|
33
|
+
'Tipo de cambio'[Moneda] = __Currency,
|
|
34
|
+
'Tipo de cambio'[Fecha] <= __SafeDate
|
|
35
|
+
)
|
|
36
|
+
VAR __Rate =
|
|
37
|
+
CALCULATE (
|
|
38
|
+
MAX ( 'Tipo de cambio'[TipoCambioBase] ),
|
|
39
|
+
REMOVEFILTERS ( 'Tipo de cambio' ),
|
|
40
|
+
'Tipo de cambio'[Moneda] = __Currency,
|
|
41
|
+
'Tipo de cambio'[Fecha] = __LastAvailableDate
|
|
42
|
+
)
|
|
43
|
+
RETURN
|
|
44
|
+
COALESCE ( __Rate, 1 )
|
|
45
|
+
)
|
|
46
|
+
lineageTag: eaeb396c-d336-4383-9809-420213485325
|
|
47
|
+
|
|
48
|
+
/// Convierte un importe desde una moneda origen hacia una moneda destino usando la moneda base definida por MonedaBase como pivote.
|
|
49
|
+
function ConvertCurrency =
|
|
50
|
+
( amount : NUMERIC, fromCurrency : STRING, toCurrency : STRING, rateDate : DATETIME ) =>
|
|
51
|
+
IF (
|
|
52
|
+
ISBLANK ( amount ),
|
|
53
|
+
BLANK (),
|
|
54
|
+
VAR __BaseCurrency =
|
|
55
|
+
COALESCE (
|
|
56
|
+
MAXX (
|
|
57
|
+
FILTER (
|
|
58
|
+
'Modelo Configuración',
|
|
59
|
+
'Modelo Configuración'[Configuración] = "Moneda Base"
|
|
60
|
+
),
|
|
61
|
+
'Modelo Configuración'[ValorTexto]
|
|
62
|
+
),
|
|
63
|
+
"USD"
|
|
64
|
+
)
|
|
65
|
+
VAR __FromCurrency = COALESCE ( fromCurrency, __BaseCurrency )
|
|
66
|
+
VAR __ToCurrency = COALESCE ( toCurrency, __BaseCurrency )
|
|
67
|
+
RETURN
|
|
68
|
+
IF (
|
|
69
|
+
__FromCurrency = __ToCurrency,
|
|
70
|
+
amount,
|
|
71
|
+
VAR __RateToBase = GetExchangeRate ( __FromCurrency, rateDate )
|
|
72
|
+
VAR __RateFromBase = GetExchangeRate ( __ToCurrency, rateDate )
|
|
73
|
+
RETURN
|
|
74
|
+
DIVIDE ( amount, __RateToBase ) * __RateFromBase
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
lineageTag: 6015e897-8732-43b5-ba6f-46d586d5ce00
|
|
78
|
+
|
|
79
|
+
/// Devuelve el año fiscal semanal aproximado 4-4-5 para una fecha. Sirve para comparar calendarios de retail contra calendario gregoriano.
|
|
80
|
+
function Calendar445Year =
|
|
81
|
+
( DateValue : DATETIME ) =>
|
|
82
|
+
// Guardamos la fecha de entrada con un nombre corto para leer mejor el cálculo.
|
|
83
|
+
VAR __Date = DateValue
|
|
84
|
+
// Movemos la fecha hacia el jueves de su semana para estimar el año fiscal semanal.
|
|
85
|
+
VAR __FiscalAnchorDate = __Date - WEEKDAY ( __Date, 2 ) + 4
|
|
86
|
+
// Si la fecha viene en blanco devolvemos BLANK; si no, devolvemos el año fiscal estimado.
|
|
87
|
+
RETURN
|
|
88
|
+
IF ( ISBLANK ( __Date ), BLANK (), YEAR ( __FiscalAnchorDate ) )
|
|
89
|
+
lineageTag: 66eb01d4-c444-474f-8d1b-b3da5cb58aa5
|
|
90
|
+
|
|
91
|
+
/// Devuelve el mes fiscal aproximado de un calendario semanal 4-4-5 para una fecha. Es una aproximación didáctica para el template.
|
|
92
|
+
function Calendar445MonthNr =
|
|
93
|
+
( DateValue : DATETIME ) =>
|
|
94
|
+
// Guardamos la fecha de entrada con un nombre corto para leer mejor el cálculo.
|
|
95
|
+
VAR __Date = DateValue
|
|
96
|
+
// Calculamos la semana ISO del año para ubicar la fecha dentro del calendario 4-4-5.
|
|
97
|
+
VAR __WeekNr = WEEKNUM ( __Date, 21 )
|
|
98
|
+
// Convertimos el número de semana a un mes fiscal aproximado siguiendo bloques 4-4-5.
|
|
99
|
+
VAR __FiscalMonth =
|
|
100
|
+
SWITCH (
|
|
101
|
+
TRUE (),
|
|
102
|
+
__WeekNr <= 4, 1,
|
|
103
|
+
__WeekNr <= 8, 2,
|
|
104
|
+
__WeekNr <= 13, 3,
|
|
105
|
+
__WeekNr <= 17, 4,
|
|
106
|
+
__WeekNr <= 21, 5,
|
|
107
|
+
__WeekNr <= 26, 6,
|
|
108
|
+
__WeekNr <= 30, 7,
|
|
109
|
+
__WeekNr <= 34, 8,
|
|
110
|
+
__WeekNr <= 39, 9,
|
|
111
|
+
__WeekNr <= 43, 10,
|
|
112
|
+
__WeekNr <= 47, 11,
|
|
113
|
+
12
|
|
114
|
+
)
|
|
115
|
+
// Si la fecha viene en blanco devolvemos BLANK; si no, devolvemos el mes fiscal calculado.
|
|
116
|
+
RETURN
|
|
117
|
+
IF ( ISBLANK ( __Date ), BLANK (), __FiscalMonth )
|
|
118
|
+
lineageTag: af2ea27b-986e-4cb6-ac7a-fa8721391ea6
|
|
119
|
+
|
|
120
|
+
/// Devuelve una tabla de una fila con el calendario elegido, el rango actual y el rango previo. Las medidas Current/Previous usan esta función para no repetir lógica.
|
|
121
|
+
function CalendarContext =
|
|
122
|
+
() =>
|
|
123
|
+
// Leemos qué vista de calendario eligió el usuario; si no eligió nada usamos Gregoriano.
|
|
124
|
+
VAR __CalendarType =
|
|
125
|
+
SELECTEDVALUE ( 'Aux Vista de calendario'[Vista de calendario], "Gregoriano" )
|
|
126
|
+
// Leemos qué comparación eligió el usuario en el slicer de comparaciones.
|
|
127
|
+
VAR __Comparison =
|
|
128
|
+
SELECTEDVALUE ( 'Aux Comparaciones'[Comparación] )
|
|
129
|
+
// Si el usuario no eligió comparación, buscamos la comparación default para esa vista de calendario.
|
|
130
|
+
VAR __DefaultComparison =
|
|
131
|
+
MAXX (
|
|
132
|
+
FILTER (
|
|
133
|
+
ALL ( 'Aux Comparaciones' ),
|
|
134
|
+
'Aux Comparaciones'[Vista de calendario] = __CalendarType
|
|
135
|
+
&& 'Aux Comparaciones'[Orden] = 14
|
|
136
|
+
),
|
|
137
|
+
'Aux Comparaciones'[Comparación]
|
|
138
|
+
)
|
|
139
|
+
// Elegimos la comparación final: la seleccionada por el usuario o la default.
|
|
140
|
+
VAR __SelectedComparison =
|
|
141
|
+
COALESCE ( __Comparison, __DefaultComparison )
|
|
142
|
+
// Filtramos la tabla de comparaciones para quedarnos con una sola definición de rangos.
|
|
143
|
+
VAR __SelectedRows =
|
|
144
|
+
FILTER (
|
|
145
|
+
ALL ( 'Aux Comparaciones' ),
|
|
146
|
+
'Aux Comparaciones'[Vista de calendario] = __CalendarType
|
|
147
|
+
&& 'Aux Comparaciones'[Comparación] = __SelectedComparison
|
|
148
|
+
)
|
|
149
|
+
// Devolvemos solo las columnas necesarias con nombres simples para que las medidas las consuman.
|
|
150
|
+
RETURN
|
|
151
|
+
SELECTCOLUMNS (
|
|
152
|
+
__SelectedRows,
|
|
153
|
+
"Calendar Type", 'Aux Comparaciones'[Vista de calendario],
|
|
154
|
+
"Current Start", 'Aux Comparaciones'[FechaCurrentStart],
|
|
155
|
+
"Current End", 'Aux Comparaciones'[FechaCurrentEnd],
|
|
156
|
+
"Previous Start", 'Aux Comparaciones'[FechaPrevioStart],
|
|
157
|
+
"Previous End", 'Aux Comparaciones'[FechaPrevioEnd]
|
|
158
|
+
)
|
|
159
|
+
lineageTag: 411b9c02-2219-4344-9f91-224e5e3f6185
|
|
160
|
+
|
|
161
|
+
/// Devuelve el formato de la métrica seleccionada usando el símbolo visible de Monedas[Símbolo] cuando la métrica es monetaria.
|
|
162
|
+
function FormatoMetricaSeleccionada =
|
|
163
|
+
() =>
|
|
164
|
+
VAR __MetricFormat =
|
|
165
|
+
SELECTEDVALUE ( 'Métricas'[Formato] )
|
|
166
|
+
VAR __CurrencySymbol =
|
|
167
|
+
SELECTEDVALUE ( Monedas[Símbolo] )
|
|
168
|
+
VAR __Monetary =
|
|
169
|
+
SELECTEDVALUE ( 'Métricas'[Monetaria] )
|
|
170
|
+
RETURN
|
|
171
|
+
SWITCH (
|
|
172
|
+
TRUE (),
|
|
173
|
+
ISBLANK ( __MetricFormat ), BLANK (),
|
|
174
|
+
__Monetary = TRUE () && ISBLANK ( __CurrencySymbol ), "$ " & __MetricFormat,
|
|
175
|
+
__Monetary = TRUE (), __CurrencySymbol & " " & __MetricFormat,
|
|
176
|
+
__MetricFormat
|
|
177
|
+
)
|
|
178
|
+
lineageTag: fa141865-229b-4309-9618-aadd1a4e038f
|
|
179
|
+
|
|
180
|
+
/// Devuelve TRUE si alguna columna de la tabla Calendario está en el eje del visual (Fecha / Año / Trimestre / Mes / Año mes / Semana). Las medidas router (Actual, Anterior) usan esto para decidir si respetar el eje del visual o aplicar el rango completo del período. Centralizar el chequeo evita el bug clásico de "agregué una columna nueva al eje y todas las celdas muestran el mismo total".
|
|
181
|
+
function EjeCalendarioEnContexto =
|
|
182
|
+
() =>
|
|
183
|
+
// Devuelve TRUE si el visual donde corre la medida tiene CUALQUIER columna
|
|
184
|
+
// de la tabla Calendario en su eje. Cada granularidad (Fecha, Año, Trimestre,
|
|
185
|
+
// Mes, Año mes, Semana) cuenta como "hay eje temporal" y la medida router
|
|
186
|
+
// debe respetar el filtro de fecha del visual en lugar de aplicar
|
|
187
|
+
// REMOVEFILTERS(Calendario) que recalcula el total del período en cada celda.
|
|
188
|
+
// Si en el futuro la tabla Calendario crece con más columnas-etiqueta
|
|
189
|
+
// (e.g. Bimestre, Cuatrimestre), agregalas acá — un solo punto de cambio.
|
|
190
|
+
ISINSCOPE ( 'Calendario'[Fecha] )
|
|
191
|
+
|| ISINSCOPE ( 'Calendario'[Año] )
|
|
192
|
+
|| ISINSCOPE ( 'Calendario'[Trimestre] )
|
|
193
|
+
|| ISINSCOPE ( 'Calendario'[Mes] )
|
|
194
|
+
|| ISINSCOPE ( 'Calendario'[Año mes] )
|
|
195
|
+
|| ISINSCOPE ( 'Calendario'[Semana] )
|
|
196
|
+
lineageTag: 6f9014bc-cbde-419a-a944-6770c550d6e1
|
|
197
|
+
|
|
198
|
+
/// Formatea etiquetas compactas usando el símbolo visible de Monedas[Símbolo] para métricas monetarias y abreviando miles/millones para KPI y bullet charts.
|
|
199
|
+
function FormatoValorEtiqueta =
|
|
200
|
+
( metricValue : NUMERIC ) =>
|
|
201
|
+
VAR __Value = metricValue
|
|
202
|
+
VAR __MetricFormat =
|
|
203
|
+
SELECTEDVALUE ( 'Métricas'[Formato] )
|
|
204
|
+
VAR __CurrencySymbol =
|
|
205
|
+
SELECTEDVALUE ( Monedas[Símbolo] )
|
|
206
|
+
VAR __Monetary =
|
|
207
|
+
SELECTEDVALUE ( 'Métricas'[Monetaria] )
|
|
208
|
+
VAR __IsPercent =
|
|
209
|
+
CONTAINSSTRING ( COALESCE ( __MetricFormat, "" ), "%" )
|
|
210
|
+
VAR __CurrencyPrefix =
|
|
211
|
+
SWITCH (
|
|
212
|
+
TRUE (),
|
|
213
|
+
__Monetary <> TRUE () || ISBLANK ( __Value ), "",
|
|
214
|
+
ISBLANK ( __CurrencySymbol ), "$ ",
|
|
215
|
+
__CurrencySymbol & " "
|
|
216
|
+
)
|
|
217
|
+
VAR __AbsValue =
|
|
218
|
+
ABS ( __Value )
|
|
219
|
+
VAR __Scale =
|
|
220
|
+
SWITCH (
|
|
221
|
+
TRUE (),
|
|
222
|
+
__IsPercent, 1,
|
|
223
|
+
__AbsValue >= 1000000, 1000000,
|
|
224
|
+
__AbsValue >= 1000, 1000,
|
|
225
|
+
1
|
|
226
|
+
)
|
|
227
|
+
VAR __Suffix =
|
|
228
|
+
SWITCH (
|
|
229
|
+
TRUE (),
|
|
230
|
+
__IsPercent, "",
|
|
231
|
+
__AbsValue >= 1000000, " mill.",
|
|
232
|
+
__AbsValue >= 1000, " mil",
|
|
233
|
+
""
|
|
234
|
+
)
|
|
235
|
+
VAR __NumberText =
|
|
236
|
+
SWITCH (
|
|
237
|
+
TRUE (),
|
|
238
|
+
ISBLANK ( __Value ), "-",
|
|
239
|
+
__IsPercent, FORMAT ( __Value, "0.0%" ),
|
|
240
|
+
__Scale = 1000000, FORMAT ( DIVIDE ( __Value, __Scale ), "0.#" ),
|
|
241
|
+
__Scale = 1000, FORMAT ( DIVIDE ( __Value, __Scale ), "#,0" ),
|
|
242
|
+
FORMAT ( __Value, "#,0" )
|
|
243
|
+
)
|
|
244
|
+
RETURN
|
|
245
|
+
IF ( ISBLANK ( __Value ), "-", __CurrencyPrefix & __NumberText & __Suffix )
|
|
246
|
+
lineageTag: 958d9e74-4b91-432d-b3b5-a1d5b0bf7792
|
|
247
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
model Model
|
|
2
|
+
culture: es-AR
|
|
3
|
+
defaultPowerBIDataSourceVersion: powerBI_V3
|
|
4
|
+
discourageImplicitMeasures
|
|
5
|
+
sourceQueryCulture: es-AR
|
|
6
|
+
dataAccessOptions
|
|
7
|
+
legacyRedirects
|
|
8
|
+
returnErrorValuesAsNull
|
|
9
|
+
|
|
10
|
+
queryGroup Params
|
|
11
|
+
|
|
12
|
+
annotation PBI_QueryGroupOrder = 0
|
|
13
|
+
|
|
14
|
+
queryGroup 'Sample Dataset'
|
|
15
|
+
|
|
16
|
+
annotation PBI_QueryGroupOrder = 1
|
|
17
|
+
|
|
18
|
+
queryGroup Calendario
|
|
19
|
+
|
|
20
|
+
annotation PBI_QueryGroupOrder = 2
|
|
21
|
+
|
|
22
|
+
annotation __PBI_TimeIntelligenceEnabled = 0
|
|
23
|
+
|
|
24
|
+
annotation PBI_ProTooling = ["MCP-PBIModeling","DevMode"]
|
|
25
|
+
|
|
26
|
+
annotation PBI_QueryOrder = ["Calendar Types","Calendar Period Presets","Calendar Comparison Presets","fxTemplateIsoWeek","fxTemplateCalendar445Year","fxTemplateCalendar445MonthNr","Aux Períodos","Aux Comparaciones","Calendario","FechaInicio","Modelo Configuración","ZonaHoraria","MonedaBase","Productos","Canales","Monedas","Clientes","Tipo de cambio","Ventas"]
|
|
27
|
+
|
|
28
|
+
ref table 'Aux Vista de calendario'
|
|
29
|
+
ref table Métricas
|
|
30
|
+
ref table 'Aux Ejes temporales'
|
|
31
|
+
ref table 'Aux Vista del valor'
|
|
32
|
+
ref table 'Aux Vista temporal'
|
|
33
|
+
ref table 'Aux Períodos'
|
|
34
|
+
ref table 'Aux Comparaciones'
|
|
35
|
+
ref table 'Aux Dimensiones ventas'
|
|
36
|
+
ref table Calendario
|
|
37
|
+
ref table 'Modelo Configuración'
|
|
38
|
+
ref table Productos
|
|
39
|
+
ref table Canales
|
|
40
|
+
ref table Monedas
|
|
41
|
+
ref table Clientes
|
|
42
|
+
ref table 'Tipo de cambio'
|
|
43
|
+
ref table Ventas
|
|
44
|
+
|
|
45
|
+
ref cultureInfo es-AR
|
|
46
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
relationship Ventas_ProductoId_Productos_ProductoId
|
|
2
|
+
fromColumn: Ventas.ProductoId
|
|
3
|
+
toColumn: Productos.ProductoId
|
|
4
|
+
|
|
5
|
+
relationship Ventas_ClienteId_Clientes_ClienteId
|
|
6
|
+
fromColumn: Ventas.ClienteId
|
|
7
|
+
toColumn: Clientes.ClienteId
|
|
8
|
+
|
|
9
|
+
relationship Ventas_CanalId_Canales_CanalId
|
|
10
|
+
fromColumn: Ventas.CanalId
|
|
11
|
+
toColumn: Canales.CanalId
|
|
12
|
+
|
|
13
|
+
relationship Ventas_Fecha_Calendario_Fecha
|
|
14
|
+
fromColumn: Ventas.Fecha
|
|
15
|
+
toColumn: Calendario.Fecha
|
|
16
|
+
|