@luquimbo/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/plugin.json +8 -0
- package/.mcp.json +25 -0
- package/AGENTS.md +244 -0
- package/CHANGELOG.md +265 -0
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/bin/build-plugin.js +30 -0
- package/bin/cli.js +1064 -0
- package/bin/commands/add.js +533 -0
- package/bin/commands/add.test.js +77 -0
- package/bin/commands/build-desktop.js +166 -0
- package/bin/commands/changelog.js +443 -0
- package/bin/commands/diff.js +325 -0
- package/bin/commands/lint.js +419 -0
- package/bin/commands/lint.test.js +103 -0
- package/bin/commands/mcp-setup.js +246 -0
- package/bin/commands/pull.js +287 -0
- package/bin/commands/pull.test.js +36 -0
- package/bin/commands/push.js +231 -0
- package/bin/commands/push.test.js +14 -0
- package/bin/commands/search.js +344 -0
- package/bin/commands/search.test.js +115 -0
- package/bin/commands/setup.js +545 -0
- package/bin/commands/setup.test.js +46 -0
- package/bin/commands/sync-profile.js +405 -0
- package/bin/commands/sync-profile.test.js +14 -0
- package/bin/commands/sync-source.js +418 -0
- package/bin/commands/sync-source.test.js +14 -0
- package/bin/commands/watch.js +206 -0
- package/bin/lib/generators/claude-plugin.js +266 -0
- package/bin/lib/generators/claude-plugin.test.js +110 -0
- package/bin/lib/generators/index.js +116 -0
- package/bin/lib/generators/shared.js +282 -0
- package/bin/lib/licensing/index.js +35 -0
- package/bin/lib/licensing/storage.js +364 -0
- package/bin/lib/licensing/storage.test.js +55 -0
- package/bin/lib/licensing/validator.js +213 -0
- package/bin/lib/licensing/validator.test.js +137 -0
- package/bin/lib/microsoft-mcp.js +176 -0
- package/bin/lib/microsoft-mcp.test.js +106 -0
- package/bin/lib/skills.js +84 -0
- package/bin/mcp/powerbi-modeling-launcher.js +38 -0
- package/bin/postinstall.js +44 -0
- package/bin/utils/errors.js +159 -0
- package/bin/utils/git.js +298 -0
- package/bin/utils/logger.js +142 -0
- package/bin/utils/mcp-detect.js +274 -0
- package/bin/utils/mcp-detect.test.js +105 -0
- package/bin/utils/pbix.js +305 -0
- package/bin/utils/pbix.test.js +37 -0
- package/bin/utils/profiles.js +312 -0
- package/bin/utils/projects.js +168 -0
- package/bin/utils/readline.js +206 -0
- package/bin/utils/readline.test.js +47 -0
- package/bin/utils/tui.js +314 -0
- package/bin/utils/tui.test.js +127 -0
- package/commands/contributions.md +265 -0
- package/commands/data-model-design.md +468 -0
- package/commands/dax-doctor.md +248 -0
- package/commands/fabric-scripts.md +452 -0
- package/commands/migration-assistant.md +290 -0
- package/commands/model-documenter.md +242 -0
- package/commands/pbi-connect.md +239 -0
- package/commands/project-kickoff.md +905 -0
- package/commands/report-layout.md +296 -0
- package/commands/rls-design.md +533 -0
- package/commands/theme-tweaker.md +624 -0
- package/config.example.json +23 -0
- package/config.json +23 -0
- package/desktop-extension/manifest.json +37 -0
- package/desktop-extension/package.json +10 -0
- package/desktop-extension/server.js +95 -0
- package/docs/openrouter-free-models.md +92 -0
- package/library/examples/README.md +151 -0
- package/library/examples/finance-reporting/README.md +351 -0
- package/library/examples/finance-reporting/data-model.md +267 -0
- package/library/examples/finance-reporting/measures.dax +557 -0
- package/library/examples/hr-analytics/README.md +371 -0
- package/library/examples/hr-analytics/data-model.md +315 -0
- package/library/examples/hr-analytics/measures.dax +460 -0
- package/library/examples/marketing-analytics/README.md +37 -0
- package/library/examples/marketing-analytics/data-model.md +62 -0
- package/library/examples/marketing-analytics/measures.dax +110 -0
- package/library/examples/retail-analytics/README.md +439 -0
- package/library/examples/retail-analytics/data-model.md +288 -0
- package/library/examples/retail-analytics/measures.dax +481 -0
- package/library/examples/supply-chain/README.md +37 -0
- package/library/examples/supply-chain/data-model.md +69 -0
- package/library/examples/supply-chain/measures.dax +77 -0
- package/library/examples/udf-library/README.md +228 -0
- package/library/examples/udf-library/functions.dax +571 -0
- package/library/snippets/dax/README.md +292 -0
- package/library/snippets/dax/business-domains.md +576 -0
- package/library/snippets/dax/calculate-patterns.md +276 -0
- package/library/snippets/dax/calculation-groups.md +489 -0
- package/library/snippets/dax/error-handling.md +495 -0
- package/library/snippets/dax/iterators-and-aggregations.md +474 -0
- package/library/snippets/dax/kpis-and-metrics.md +293 -0
- package/library/snippets/dax/rankings-and-topn.md +235 -0
- package/library/snippets/dax/security-patterns.md +413 -0
- package/library/snippets/dax/text-and-formatting.md +316 -0
- package/library/snippets/dax/time-intelligence.md +196 -0
- package/library/snippets/dax/user-defined-functions.md +477 -0
- package/library/snippets/dax/virtual-tables.md +546 -0
- package/library/snippets/excel-formulas/README.md +84 -0
- package/library/snippets/excel-formulas/aggregations.md +330 -0
- package/library/snippets/excel-formulas/dates-and-times.md +361 -0
- package/library/snippets/excel-formulas/dynamic-arrays.md +314 -0
- package/library/snippets/excel-formulas/lookups.md +169 -0
- package/library/snippets/excel-formulas/text-functions.md +363 -0
- package/library/snippets/governance/naming-conventions.md +97 -0
- package/library/snippets/governance/review-checklists.md +107 -0
- package/library/snippets/power-query/README.md +389 -0
- package/library/snippets/power-query/api-integration.md +707 -0
- package/library/snippets/power-query/connections.md +434 -0
- package/library/snippets/power-query/data-cleaning.md +298 -0
- package/library/snippets/power-query/error-handling.md +526 -0
- package/library/snippets/power-query/parameters.md +350 -0
- package/library/snippets/power-query/performance.md +506 -0
- package/library/snippets/power-query/transformations.md +330 -0
- package/library/snippets/report-design/accessibility.md +78 -0
- package/library/snippets/report-design/chart-selection.md +54 -0
- package/library/snippets/report-design/layout-patterns.md +87 -0
- package/library/templates/data-models/README.md +93 -0
- package/library/templates/data-models/finance-model.md +627 -0
- package/library/templates/data-models/retail-star-schema.md +473 -0
- package/library/templates/excel/README.md +83 -0
- package/library/templates/excel/budget-tracker.md +432 -0
- package/library/templates/excel/data-entry-form.md +533 -0
- package/library/templates/power-bi/README.md +72 -0
- package/library/templates/power-bi/finance-report.md +449 -0
- package/library/templates/power-bi/kpi-scorecard.md +461 -0
- package/library/templates/power-bi/sales-dashboard.md +281 -0
- package/library/themes/excel/README.md +436 -0
- package/library/themes/power-bi/README.md +271 -0
- package/library/themes/power-bi/accessible.json +307 -0
- package/library/themes/power-bi/bi-superpowers-default.json +858 -0
- package/library/themes/power-bi/corporate-blue.json +291 -0
- package/library/themes/power-bi/dark-mode.json +291 -0
- package/library/themes/power-bi/minimal.json +292 -0
- package/library/themes/power-bi/print-friendly.json +309 -0
- package/package.json +93 -0
- package/skills/contributions/SKILL.md +267 -0
- package/skills/data-model-design/SKILL.md +470 -0
- package/skills/data-modeling/SKILL.md +254 -0
- package/skills/data-quality/SKILL.md +664 -0
- package/skills/dax/SKILL.md +708 -0
- package/skills/dax-doctor/SKILL.md +250 -0
- package/skills/dax-udf/SKILL.md +489 -0
- package/skills/deployment/SKILL.md +320 -0
- package/skills/excel-formulas/SKILL.md +463 -0
- package/skills/fabric-scripts/SKILL.md +454 -0
- package/skills/fast-standard/SKILL.md +509 -0
- package/skills/governance/SKILL.md +205 -0
- package/skills/migration-assistant/SKILL.md +292 -0
- package/skills/model-documenter/SKILL.md +244 -0
- package/skills/pbi-connect/SKILL.md +241 -0
- package/skills/power-query/SKILL.md +406 -0
- package/skills/project-kickoff/SKILL.md +907 -0
- package/skills/query-performance/SKILL.md +480 -0
- package/skills/report-design/SKILL.md +207 -0
- package/skills/report-layout/SKILL.md +298 -0
- package/skills/rls-design/SKILL.md +535 -0
- package/skills/semantic-model/SKILL.md +237 -0
- package/skills/testing-validation/SKILL.md +643 -0
- package/skills/theme-tweaker/SKILL.md +626 -0
- package/src/content/base.md +237 -0
- package/src/content/mcp-requirements.json +69 -0
- package/src/content/routing.md +203 -0
- package/src/content/skills/contributions.md +259 -0
- package/src/content/skills/data-model-design.md +462 -0
- package/src/content/skills/data-modeling.md +246 -0
- package/src/content/skills/data-quality.md +656 -0
- package/src/content/skills/dax-doctor.md +242 -0
- package/src/content/skills/dax-udf.md +481 -0
- package/src/content/skills/dax.md +700 -0
- package/src/content/skills/deployment.md +312 -0
- package/src/content/skills/excel-formulas.md +455 -0
- package/src/content/skills/fabric-scripts.md +446 -0
- package/src/content/skills/fast-standard.md +501 -0
- package/src/content/skills/governance.md +197 -0
- package/src/content/skills/migration-assistant.md +284 -0
- package/src/content/skills/model-documenter.md +236 -0
- package/src/content/skills/pbi-connect.md +233 -0
- package/src/content/skills/power-query.md +398 -0
- package/src/content/skills/project-kickoff.md +899 -0
- package/src/content/skills/query-performance.md +472 -0
- package/src/content/skills/report-design.md +199 -0
- package/src/content/skills/report-layout.md +290 -0
- package/src/content/skills/rls-design.md +527 -0
- package/src/content/skills/semantic-model.md +229 -0
- package/src/content/skills/testing-validation.md +635 -0
- package/src/content/skills/theme-tweaker.md +618 -0
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// FINANCE REPORTING - DAX MEASURE LIBRARY
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Comprehensive measures for P&L, Balance Sheet, and Financial Analysis
|
|
5
|
+
// All measures follow BI Agent Superpowers naming conventions
|
|
6
|
+
// ============================================================================
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
// ----------------------------------------------------------------------------
|
|
10
|
+
// BASE SCENARIO MEASURES
|
|
11
|
+
// ----------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
// Generic amount (all scenarios)
|
|
14
|
+
Amount =
|
|
15
|
+
SUM(FactFinancials[Amount])
|
|
16
|
+
|
|
17
|
+
// Actual only (with sign correction)
|
|
18
|
+
Actual =
|
|
19
|
+
CALCULATE(
|
|
20
|
+
SUMX(
|
|
21
|
+
FactFinancials,
|
|
22
|
+
FactFinancials[Amount] * RELATED(DimAccount[NaturalSign])
|
|
23
|
+
),
|
|
24
|
+
DimScenario[IsActual] = TRUE()
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
// Budget only
|
|
28
|
+
Budget =
|
|
29
|
+
CALCULATE(
|
|
30
|
+
SUMX(
|
|
31
|
+
FactFinancials,
|
|
32
|
+
FactFinancials[Amount] * RELATED(DimAccount[NaturalSign])
|
|
33
|
+
),
|
|
34
|
+
DimScenario[ScenarioName] = "Budget"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
// Forecast only
|
|
38
|
+
Forecast =
|
|
39
|
+
CALCULATE(
|
|
40
|
+
SUMX(
|
|
41
|
+
FactFinancials,
|
|
42
|
+
FactFinancials[Amount] * RELATED(DimAccount[NaturalSign])
|
|
43
|
+
),
|
|
44
|
+
DimScenario[IsForecast] = TRUE()
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
// ----------------------------------------------------------------------------
|
|
49
|
+
// INCOME STATEMENT - LINE ITEMS
|
|
50
|
+
// ----------------------------------------------------------------------------
|
|
51
|
+
|
|
52
|
+
Revenue =
|
|
53
|
+
CALCULATE(
|
|
54
|
+
[Actual],
|
|
55
|
+
DimAccount[AccountType] = "Revenue"
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
COGS =
|
|
59
|
+
CALCULATE(
|
|
60
|
+
[Actual],
|
|
61
|
+
DimAccount[AccountType] = "COGS"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
Gross Profit =
|
|
65
|
+
[Revenue] - [COGS]
|
|
66
|
+
|
|
67
|
+
Operating Expenses =
|
|
68
|
+
CALCULATE(
|
|
69
|
+
[Actual],
|
|
70
|
+
DimAccount[AccountType] = "OpEx"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
// EBITDA = Gross Profit - OpEx (before D&A)
|
|
74
|
+
EBITDA =
|
|
75
|
+
[Gross Profit] - [Operating Expenses]
|
|
76
|
+
|
|
77
|
+
// Operating Income (after D&A)
|
|
78
|
+
Operating Income =
|
|
79
|
+
CALCULATE(
|
|
80
|
+
[Actual],
|
|
81
|
+
DimAccount[AccountGroup] IN {"Net Revenue", "COGS", "SG&A", "R&D", "D&A"}
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
Other Income =
|
|
85
|
+
CALCULATE(
|
|
86
|
+
[Actual],
|
|
87
|
+
DimAccount[AccountType] = "OtherIncome"
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
Other Expense =
|
|
91
|
+
CALCULATE(
|
|
92
|
+
[Actual],
|
|
93
|
+
DimAccount[AccountType] = "OtherExpense"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
Interest Expense =
|
|
97
|
+
CALCULATE(
|
|
98
|
+
[Actual],
|
|
99
|
+
DimAccount[AccountSubGroup] = "Interest Expense"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
// EBT = Earnings Before Tax
|
|
103
|
+
EBT =
|
|
104
|
+
[Operating Income] + [Other Income] - [Other Expense]
|
|
105
|
+
|
|
106
|
+
Income Tax =
|
|
107
|
+
CALCULATE(
|
|
108
|
+
[Actual],
|
|
109
|
+
DimAccount[AccountType] = "Tax"
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
Net Income =
|
|
113
|
+
[EBT] - [Income Tax]
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
// ----------------------------------------------------------------------------
|
|
117
|
+
// INCOME STATEMENT - MARGINS
|
|
118
|
+
// ----------------------------------------------------------------------------
|
|
119
|
+
|
|
120
|
+
Gross Margin % =
|
|
121
|
+
DIVIDE([Gross Profit], [Revenue])
|
|
122
|
+
|
|
123
|
+
Operating Margin % =
|
|
124
|
+
DIVIDE([Operating Income], [Revenue])
|
|
125
|
+
|
|
126
|
+
EBITDA Margin % =
|
|
127
|
+
DIVIDE([EBITDA], [Revenue])
|
|
128
|
+
|
|
129
|
+
Net Margin % =
|
|
130
|
+
DIVIDE([Net Income], [Revenue])
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
// ----------------------------------------------------------------------------
|
|
134
|
+
// BUDGET VARIANCE
|
|
135
|
+
// ----------------------------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
Budget Revenue =
|
|
138
|
+
CALCULATE(
|
|
139
|
+
[Budget],
|
|
140
|
+
DimAccount[AccountType] = "Revenue"
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
Budget COGS =
|
|
144
|
+
CALCULATE(
|
|
145
|
+
[Budget],
|
|
146
|
+
DimAccount[AccountType] = "COGS"
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
Budget OpEx =
|
|
150
|
+
CALCULATE(
|
|
151
|
+
[Budget],
|
|
152
|
+
DimAccount[AccountType] = "OpEx"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
// Variance = Actual - Budget
|
|
156
|
+
Variance =
|
|
157
|
+
[Actual] - [Budget]
|
|
158
|
+
|
|
159
|
+
Variance % =
|
|
160
|
+
DIVIDE([Variance], ABS([Budget]))
|
|
161
|
+
|
|
162
|
+
// Revenue variance
|
|
163
|
+
Revenue Variance =
|
|
164
|
+
[Revenue] - [Budget Revenue]
|
|
165
|
+
|
|
166
|
+
Revenue Variance % =
|
|
167
|
+
DIVIDE([Revenue Variance], ABS([Budget Revenue]))
|
|
168
|
+
|
|
169
|
+
// Expense variance (favorable when under budget)
|
|
170
|
+
OpEx Variance =
|
|
171
|
+
[Budget OpEx] - [Operating Expenses]
|
|
172
|
+
|
|
173
|
+
OpEx Variance % =
|
|
174
|
+
DIVIDE([OpEx Variance], ABS([Budget OpEx]))
|
|
175
|
+
|
|
176
|
+
// Variance status indicator
|
|
177
|
+
Variance Status =
|
|
178
|
+
VAR _Variance = [Variance]
|
|
179
|
+
VAR _AccountType = SELECTEDVALUE(DimAccount[AccountType])
|
|
180
|
+
VAR _IsExpense = _AccountType IN {"COGS", "OpEx", "OtherExpense", "Tax"}
|
|
181
|
+
RETURN
|
|
182
|
+
SWITCH(
|
|
183
|
+
TRUE(),
|
|
184
|
+
ISBLANK(_Variance), BLANK(),
|
|
185
|
+
ABS(_Variance) < 0.01, "On Plan",
|
|
186
|
+
_IsExpense && _Variance < 0, "Favorable",
|
|
187
|
+
_IsExpense && _Variance > 0, "Unfavorable",
|
|
188
|
+
NOT _IsExpense && _Variance > 0, "Favorable",
|
|
189
|
+
"Unfavorable"
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
// Variance color for conditional formatting
|
|
193
|
+
Variance Color =
|
|
194
|
+
VAR _Status = [Variance Status]
|
|
195
|
+
RETURN
|
|
196
|
+
SWITCH(
|
|
197
|
+
_Status,
|
|
198
|
+
"Favorable", "#166534",
|
|
199
|
+
"Unfavorable", "#991B1B",
|
|
200
|
+
"On Plan", "#525252",
|
|
201
|
+
"#A3A3A3"
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
// ----------------------------------------------------------------------------
|
|
206
|
+
// YEAR-TO-DATE (YTD)
|
|
207
|
+
// ----------------------------------------------------------------------------
|
|
208
|
+
|
|
209
|
+
Revenue YTD =
|
|
210
|
+
TOTALYTD(
|
|
211
|
+
[Revenue],
|
|
212
|
+
DimDate[Date],
|
|
213
|
+
"6-30" // Fiscal year end (adjust as needed)
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
Gross Profit YTD =
|
|
217
|
+
TOTALYTD([Gross Profit], DimDate[Date], "6-30")
|
|
218
|
+
|
|
219
|
+
EBITDA YTD =
|
|
220
|
+
TOTALYTD([EBITDA], DimDate[Date], "6-30")
|
|
221
|
+
|
|
222
|
+
Net Income YTD =
|
|
223
|
+
TOTALYTD([Net Income], DimDate[Date], "6-30")
|
|
224
|
+
|
|
225
|
+
Budget YTD =
|
|
226
|
+
TOTALYTD([Budget], DimDate[Date], "6-30")
|
|
227
|
+
|
|
228
|
+
Variance YTD =
|
|
229
|
+
[Actual] - [Budget YTD] // Note: Uses actual which is already YTD in context
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
// ----------------------------------------------------------------------------
|
|
233
|
+
// PRIOR YEAR COMPARISON
|
|
234
|
+
// ----------------------------------------------------------------------------
|
|
235
|
+
|
|
236
|
+
Revenue PY =
|
|
237
|
+
CALCULATE(
|
|
238
|
+
[Revenue],
|
|
239
|
+
SAMEPERIODLASTYEAR(DimDate[Date])
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
Gross Profit PY =
|
|
243
|
+
CALCULATE(
|
|
244
|
+
[Gross Profit],
|
|
245
|
+
SAMEPERIODLASTYEAR(DimDate[Date])
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
Net Income PY =
|
|
249
|
+
CALCULATE(
|
|
250
|
+
[Net Income],
|
|
251
|
+
SAMEPERIODLASTYEAR(DimDate[Date])
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
Revenue YTD PY =
|
|
255
|
+
CALCULATE(
|
|
256
|
+
[Revenue YTD],
|
|
257
|
+
SAMEPERIODLASTYEAR(DimDate[Date])
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
// Year-over-Year Growth
|
|
261
|
+
Revenue YoY % =
|
|
262
|
+
VAR _Current = [Revenue]
|
|
263
|
+
VAR _PY = [Revenue PY]
|
|
264
|
+
RETURN
|
|
265
|
+
DIVIDE(_Current - _PY, ABS(_PY))
|
|
266
|
+
|
|
267
|
+
Revenue YoY Var =
|
|
268
|
+
[Revenue] - [Revenue PY]
|
|
269
|
+
|
|
270
|
+
Net Income YoY % =
|
|
271
|
+
VAR _Current = [Net Income]
|
|
272
|
+
VAR _PY = [Net Income PY]
|
|
273
|
+
RETURN
|
|
274
|
+
DIVIDE(_Current - _PY, ABS(_PY))
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
// ----------------------------------------------------------------------------
|
|
278
|
+
// TRAILING TWELVE MONTHS (TTM)
|
|
279
|
+
// ----------------------------------------------------------------------------
|
|
280
|
+
|
|
281
|
+
Revenue TTM =
|
|
282
|
+
CALCULATE(
|
|
283
|
+
[Revenue],
|
|
284
|
+
DATESINPERIOD(DimDate[Date], MAX(DimDate[Date]), -12, MONTH)
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
Net Income TTM =
|
|
288
|
+
CALCULATE(
|
|
289
|
+
[Net Income],
|
|
290
|
+
DATESINPERIOD(DimDate[Date], MAX(DimDate[Date]), -12, MONTH)
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
EBITDA TTM =
|
|
294
|
+
CALCULATE(
|
|
295
|
+
[EBITDA],
|
|
296
|
+
DATESINPERIOD(DimDate[Date], MAX(DimDate[Date]), -12, MONTH)
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
// ----------------------------------------------------------------------------
|
|
301
|
+
// BALANCE SHEET ITEMS
|
|
302
|
+
// ----------------------------------------------------------------------------
|
|
303
|
+
|
|
304
|
+
Total Assets =
|
|
305
|
+
CALCULATE(
|
|
306
|
+
[Actual],
|
|
307
|
+
DimAccount[AccountType] = "Asset",
|
|
308
|
+
LASTDATE(DimDate[Date]) // Point-in-time
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
Current Assets =
|
|
312
|
+
CALCULATE(
|
|
313
|
+
[Actual],
|
|
314
|
+
DimAccount[AccountSubGroup] = "Current Assets",
|
|
315
|
+
LASTDATE(DimDate[Date])
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
Cash =
|
|
319
|
+
CALCULATE(
|
|
320
|
+
[Actual],
|
|
321
|
+
DimAccount[AccountName] = "Cash and Cash Equivalents",
|
|
322
|
+
LASTDATE(DimDate[Date])
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
Accounts Receivable =
|
|
326
|
+
CALCULATE(
|
|
327
|
+
[Actual],
|
|
328
|
+
DimAccount[AccountName] = "Accounts Receivable",
|
|
329
|
+
LASTDATE(DimDate[Date])
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
Inventory =
|
|
333
|
+
CALCULATE(
|
|
334
|
+
[Actual],
|
|
335
|
+
DimAccount[AccountName] = "Inventory",
|
|
336
|
+
LASTDATE(DimDate[Date])
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
Total Liabilities =
|
|
340
|
+
CALCULATE(
|
|
341
|
+
[Actual],
|
|
342
|
+
DimAccount[AccountType] = "Liability",
|
|
343
|
+
LASTDATE(DimDate[Date])
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
Current Liabilities =
|
|
347
|
+
CALCULATE(
|
|
348
|
+
[Actual],
|
|
349
|
+
DimAccount[AccountSubGroup] = "Current Liabilities",
|
|
350
|
+
LASTDATE(DimDate[Date])
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
Accounts Payable =
|
|
354
|
+
CALCULATE(
|
|
355
|
+
[Actual],
|
|
356
|
+
DimAccount[AccountName] = "Accounts Payable",
|
|
357
|
+
LASTDATE(DimDate[Date])
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
Total Debt =
|
|
361
|
+
CALCULATE(
|
|
362
|
+
[Actual],
|
|
363
|
+
DimAccount[AccountSubGroup] IN {"Short-term Debt", "Long-term Debt"},
|
|
364
|
+
LASTDATE(DimDate[Date])
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
Total Equity =
|
|
368
|
+
CALCULATE(
|
|
369
|
+
[Actual],
|
|
370
|
+
DimAccount[AccountType] = "Equity",
|
|
371
|
+
LASTDATE(DimDate[Date])
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
// ----------------------------------------------------------------------------
|
|
376
|
+
// FINANCIAL RATIOS - PROFITABILITY
|
|
377
|
+
// ----------------------------------------------------------------------------
|
|
378
|
+
|
|
379
|
+
// Return on Equity
|
|
380
|
+
ROE =
|
|
381
|
+
DIVIDE([Net Income TTM], [Total Equity])
|
|
382
|
+
|
|
383
|
+
// Return on Assets
|
|
384
|
+
ROA =
|
|
385
|
+
DIVIDE([Net Income TTM], [Total Assets])
|
|
386
|
+
|
|
387
|
+
// Return on Invested Capital
|
|
388
|
+
ROIC =
|
|
389
|
+
VAR _NOPAT = [Operating Income] * (1 - 0.25) // Assume 25% tax rate
|
|
390
|
+
VAR _InvestedCapital = [Total Assets] - [Current Liabilities] + [Total Debt]
|
|
391
|
+
RETURN
|
|
392
|
+
DIVIDE(_NOPAT, _InvestedCapital)
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
// ----------------------------------------------------------------------------
|
|
396
|
+
// FINANCIAL RATIOS - LIQUIDITY
|
|
397
|
+
// ----------------------------------------------------------------------------
|
|
398
|
+
|
|
399
|
+
// Current Ratio
|
|
400
|
+
Current Ratio =
|
|
401
|
+
DIVIDE([Current Assets], [Current Liabilities])
|
|
402
|
+
|
|
403
|
+
// Quick Ratio (Acid Test)
|
|
404
|
+
Quick Ratio =
|
|
405
|
+
DIVIDE([Current Assets] - [Inventory], [Current Liabilities])
|
|
406
|
+
|
|
407
|
+
// Cash Ratio
|
|
408
|
+
Cash Ratio =
|
|
409
|
+
DIVIDE([Cash], [Current Liabilities])
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
// ----------------------------------------------------------------------------
|
|
413
|
+
// FINANCIAL RATIOS - LEVERAGE
|
|
414
|
+
// ----------------------------------------------------------------------------
|
|
415
|
+
|
|
416
|
+
// Debt to Equity
|
|
417
|
+
Debt to Equity =
|
|
418
|
+
DIVIDE([Total Debt], [Total Equity])
|
|
419
|
+
|
|
420
|
+
// Debt to Assets
|
|
421
|
+
Debt to Assets =
|
|
422
|
+
DIVIDE([Total Debt], [Total Assets])
|
|
423
|
+
|
|
424
|
+
// Interest Coverage
|
|
425
|
+
Interest Coverage =
|
|
426
|
+
DIVIDE([EBITDA], ABS([Interest Expense]))
|
|
427
|
+
|
|
428
|
+
// Equity Multiplier
|
|
429
|
+
Equity Multiplier =
|
|
430
|
+
DIVIDE([Total Assets], [Total Equity])
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
// ----------------------------------------------------------------------------
|
|
434
|
+
// FINANCIAL RATIOS - EFFICIENCY
|
|
435
|
+
// ----------------------------------------------------------------------------
|
|
436
|
+
|
|
437
|
+
// Days Sales Outstanding
|
|
438
|
+
DSO =
|
|
439
|
+
DIVIDE([Accounts Receivable], [Revenue TTM]) * 365
|
|
440
|
+
|
|
441
|
+
// Days Payable Outstanding
|
|
442
|
+
DPO =
|
|
443
|
+
VAR _COGS_TTM = CALCULATE([COGS], DATESINPERIOD(DimDate[Date], MAX(DimDate[Date]), -12, MONTH))
|
|
444
|
+
RETURN
|
|
445
|
+
DIVIDE([Accounts Payable], ABS(_COGS_TTM)) * 365
|
|
446
|
+
|
|
447
|
+
// Days Inventory Outstanding
|
|
448
|
+
DIO =
|
|
449
|
+
VAR _COGS_TTM = CALCULATE([COGS], DATESINPERIOD(DimDate[Date], MAX(DimDate[Date]), -12, MONTH))
|
|
450
|
+
RETURN
|
|
451
|
+
DIVIDE([Inventory], ABS(_COGS_TTM)) * 365
|
|
452
|
+
|
|
453
|
+
// Cash Conversion Cycle
|
|
454
|
+
Cash Conversion Cycle =
|
|
455
|
+
[DSO] + [DIO] - [DPO]
|
|
456
|
+
|
|
457
|
+
// Asset Turnover
|
|
458
|
+
Asset Turnover =
|
|
459
|
+
DIVIDE([Revenue TTM], [Total Assets])
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
// ----------------------------------------------------------------------------
|
|
463
|
+
// DISPLAY / FORMATTING MEASURES
|
|
464
|
+
// ----------------------------------------------------------------------------
|
|
465
|
+
|
|
466
|
+
Revenue Display =
|
|
467
|
+
VAR _Value = [Revenue]
|
|
468
|
+
RETURN
|
|
469
|
+
IF(
|
|
470
|
+
ABS(_Value) >= 1000000,
|
|
471
|
+
FORMAT(_Value / 1000000, "$#,##0.0") & "M",
|
|
472
|
+
IF(
|
|
473
|
+
ABS(_Value) >= 1000,
|
|
474
|
+
FORMAT(_Value / 1000, "$#,##0.0") & "K",
|
|
475
|
+
FORMAT(_Value, "$#,##0")
|
|
476
|
+
)
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
Variance Display =
|
|
480
|
+
VAR _Var = [Variance]
|
|
481
|
+
RETURN
|
|
482
|
+
IF(
|
|
483
|
+
ISBLANK(_Var),
|
|
484
|
+
"--",
|
|
485
|
+
IF(_Var >= 0, "+", "") & FORMAT(_Var / 1000, "#,##0") & "K"
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
YoY Display =
|
|
489
|
+
VAR _YoY = [Revenue YoY %]
|
|
490
|
+
RETURN
|
|
491
|
+
IF(
|
|
492
|
+
ISBLANK(_YoY),
|
|
493
|
+
"--",
|
|
494
|
+
IF(_YoY >= 0, "+", "") & FORMAT(_YoY, "0.0%")
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
Margin Display =
|
|
498
|
+
FORMAT([Net Margin %], "0.0%")
|
|
499
|
+
|
|
500
|
+
Ratio Display =
|
|
501
|
+
FORMAT([Current Ratio], "0.00") & "x"
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
// ----------------------------------------------------------------------------
|
|
505
|
+
// PERIOD LABELS
|
|
506
|
+
// ----------------------------------------------------------------------------
|
|
507
|
+
|
|
508
|
+
Current Period Label =
|
|
509
|
+
VAR _MaxDate = MAX(DimDate[Date])
|
|
510
|
+
RETURN
|
|
511
|
+
FORMAT(_MaxDate, "MMM YYYY")
|
|
512
|
+
|
|
513
|
+
Selected Period Range =
|
|
514
|
+
VAR _Min = MIN(DimDate[Date])
|
|
515
|
+
VAR _Max = MAX(DimDate[Date])
|
|
516
|
+
RETURN
|
|
517
|
+
FORMAT(_Min, "MMM D, YYYY") & " - " & FORMAT(_Max, "MMM D, YYYY")
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
// ============================================================================
|
|
521
|
+
// MEASURE ORGANIZATION (Display Folders)
|
|
522
|
+
// ============================================================================
|
|
523
|
+
//
|
|
524
|
+
// 📊 Income Statement
|
|
525
|
+
// - Revenue, COGS, Gross Profit, Operating Expenses, EBITDA, Net Income
|
|
526
|
+
//
|
|
527
|
+
// 📈 Margins
|
|
528
|
+
// - Gross Margin %, Operating Margin %, EBITDA Margin %, Net Margin %
|
|
529
|
+
//
|
|
530
|
+
// 🎯 Budget Variance
|
|
531
|
+
// - Budget, Variance, Variance %, Revenue Variance, OpEx Variance
|
|
532
|
+
//
|
|
533
|
+
// 📅 Time Intelligence
|
|
534
|
+
// - YTD: Revenue YTD, Gross Profit YTD, Net Income YTD
|
|
535
|
+
// - Prior Year: Revenue PY, Net Income PY, Revenue YoY %
|
|
536
|
+
// - TTM: Revenue TTM, Net Income TTM, EBITDA TTM
|
|
537
|
+
//
|
|
538
|
+
// 📋 Balance Sheet
|
|
539
|
+
// - Total Assets, Current Assets, Cash, Inventory
|
|
540
|
+
// - Total Liabilities, Current Liabilities, Total Debt
|
|
541
|
+
// - Total Equity
|
|
542
|
+
//
|
|
543
|
+
// 📊 Ratios - Profitability
|
|
544
|
+
// - ROE, ROA, ROIC
|
|
545
|
+
//
|
|
546
|
+
// 💧 Ratios - Liquidity
|
|
547
|
+
// - Current Ratio, Quick Ratio, Cash Ratio
|
|
548
|
+
//
|
|
549
|
+
// ⚖️ Ratios - Leverage
|
|
550
|
+
// - Debt to Equity, Debt to Assets, Interest Coverage
|
|
551
|
+
//
|
|
552
|
+
// ⚡ Ratios - Efficiency
|
|
553
|
+
// - DSO, DPO, DIO, Cash Conversion Cycle, Asset Turnover
|
|
554
|
+
//
|
|
555
|
+
// 🎨 Display / Formatting
|
|
556
|
+
// - Revenue Display, Variance Display, Margin Display
|
|
557
|
+
// ============================================================================
|