@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.
Files changed (193) hide show
  1. package/.claude-plugin/plugin.json +8 -0
  2. package/.mcp.json +25 -0
  3. package/AGENTS.md +244 -0
  4. package/CHANGELOG.md +265 -0
  5. package/LICENSE +21 -0
  6. package/README.md +211 -0
  7. package/bin/build-plugin.js +30 -0
  8. package/bin/cli.js +1064 -0
  9. package/bin/commands/add.js +533 -0
  10. package/bin/commands/add.test.js +77 -0
  11. package/bin/commands/build-desktop.js +166 -0
  12. package/bin/commands/changelog.js +443 -0
  13. package/bin/commands/diff.js +325 -0
  14. package/bin/commands/lint.js +419 -0
  15. package/bin/commands/lint.test.js +103 -0
  16. package/bin/commands/mcp-setup.js +246 -0
  17. package/bin/commands/pull.js +287 -0
  18. package/bin/commands/pull.test.js +36 -0
  19. package/bin/commands/push.js +231 -0
  20. package/bin/commands/push.test.js +14 -0
  21. package/bin/commands/search.js +344 -0
  22. package/bin/commands/search.test.js +115 -0
  23. package/bin/commands/setup.js +545 -0
  24. package/bin/commands/setup.test.js +46 -0
  25. package/bin/commands/sync-profile.js +405 -0
  26. package/bin/commands/sync-profile.test.js +14 -0
  27. package/bin/commands/sync-source.js +418 -0
  28. package/bin/commands/sync-source.test.js +14 -0
  29. package/bin/commands/watch.js +206 -0
  30. package/bin/lib/generators/claude-plugin.js +266 -0
  31. package/bin/lib/generators/claude-plugin.test.js +110 -0
  32. package/bin/lib/generators/index.js +116 -0
  33. package/bin/lib/generators/shared.js +282 -0
  34. package/bin/lib/licensing/index.js +35 -0
  35. package/bin/lib/licensing/storage.js +364 -0
  36. package/bin/lib/licensing/storage.test.js +55 -0
  37. package/bin/lib/licensing/validator.js +213 -0
  38. package/bin/lib/licensing/validator.test.js +137 -0
  39. package/bin/lib/microsoft-mcp.js +176 -0
  40. package/bin/lib/microsoft-mcp.test.js +106 -0
  41. package/bin/lib/skills.js +84 -0
  42. package/bin/mcp/powerbi-modeling-launcher.js +38 -0
  43. package/bin/postinstall.js +44 -0
  44. package/bin/utils/errors.js +159 -0
  45. package/bin/utils/git.js +298 -0
  46. package/bin/utils/logger.js +142 -0
  47. package/bin/utils/mcp-detect.js +274 -0
  48. package/bin/utils/mcp-detect.test.js +105 -0
  49. package/bin/utils/pbix.js +305 -0
  50. package/bin/utils/pbix.test.js +37 -0
  51. package/bin/utils/profiles.js +312 -0
  52. package/bin/utils/projects.js +168 -0
  53. package/bin/utils/readline.js +206 -0
  54. package/bin/utils/readline.test.js +47 -0
  55. package/bin/utils/tui.js +314 -0
  56. package/bin/utils/tui.test.js +127 -0
  57. package/commands/contributions.md +265 -0
  58. package/commands/data-model-design.md +468 -0
  59. package/commands/dax-doctor.md +248 -0
  60. package/commands/fabric-scripts.md +452 -0
  61. package/commands/migration-assistant.md +290 -0
  62. package/commands/model-documenter.md +242 -0
  63. package/commands/pbi-connect.md +239 -0
  64. package/commands/project-kickoff.md +905 -0
  65. package/commands/report-layout.md +296 -0
  66. package/commands/rls-design.md +533 -0
  67. package/commands/theme-tweaker.md +624 -0
  68. package/config.example.json +23 -0
  69. package/config.json +23 -0
  70. package/desktop-extension/manifest.json +37 -0
  71. package/desktop-extension/package.json +10 -0
  72. package/desktop-extension/server.js +95 -0
  73. package/docs/openrouter-free-models.md +92 -0
  74. package/library/examples/README.md +151 -0
  75. package/library/examples/finance-reporting/README.md +351 -0
  76. package/library/examples/finance-reporting/data-model.md +267 -0
  77. package/library/examples/finance-reporting/measures.dax +557 -0
  78. package/library/examples/hr-analytics/README.md +371 -0
  79. package/library/examples/hr-analytics/data-model.md +315 -0
  80. package/library/examples/hr-analytics/measures.dax +460 -0
  81. package/library/examples/marketing-analytics/README.md +37 -0
  82. package/library/examples/marketing-analytics/data-model.md +62 -0
  83. package/library/examples/marketing-analytics/measures.dax +110 -0
  84. package/library/examples/retail-analytics/README.md +439 -0
  85. package/library/examples/retail-analytics/data-model.md +288 -0
  86. package/library/examples/retail-analytics/measures.dax +481 -0
  87. package/library/examples/supply-chain/README.md +37 -0
  88. package/library/examples/supply-chain/data-model.md +69 -0
  89. package/library/examples/supply-chain/measures.dax +77 -0
  90. package/library/examples/udf-library/README.md +228 -0
  91. package/library/examples/udf-library/functions.dax +571 -0
  92. package/library/snippets/dax/README.md +292 -0
  93. package/library/snippets/dax/business-domains.md +576 -0
  94. package/library/snippets/dax/calculate-patterns.md +276 -0
  95. package/library/snippets/dax/calculation-groups.md +489 -0
  96. package/library/snippets/dax/error-handling.md +495 -0
  97. package/library/snippets/dax/iterators-and-aggregations.md +474 -0
  98. package/library/snippets/dax/kpis-and-metrics.md +293 -0
  99. package/library/snippets/dax/rankings-and-topn.md +235 -0
  100. package/library/snippets/dax/security-patterns.md +413 -0
  101. package/library/snippets/dax/text-and-formatting.md +316 -0
  102. package/library/snippets/dax/time-intelligence.md +196 -0
  103. package/library/snippets/dax/user-defined-functions.md +477 -0
  104. package/library/snippets/dax/virtual-tables.md +546 -0
  105. package/library/snippets/excel-formulas/README.md +84 -0
  106. package/library/snippets/excel-formulas/aggregations.md +330 -0
  107. package/library/snippets/excel-formulas/dates-and-times.md +361 -0
  108. package/library/snippets/excel-formulas/dynamic-arrays.md +314 -0
  109. package/library/snippets/excel-formulas/lookups.md +169 -0
  110. package/library/snippets/excel-formulas/text-functions.md +363 -0
  111. package/library/snippets/governance/naming-conventions.md +97 -0
  112. package/library/snippets/governance/review-checklists.md +107 -0
  113. package/library/snippets/power-query/README.md +389 -0
  114. package/library/snippets/power-query/api-integration.md +707 -0
  115. package/library/snippets/power-query/connections.md +434 -0
  116. package/library/snippets/power-query/data-cleaning.md +298 -0
  117. package/library/snippets/power-query/error-handling.md +526 -0
  118. package/library/snippets/power-query/parameters.md +350 -0
  119. package/library/snippets/power-query/performance.md +506 -0
  120. package/library/snippets/power-query/transformations.md +330 -0
  121. package/library/snippets/report-design/accessibility.md +78 -0
  122. package/library/snippets/report-design/chart-selection.md +54 -0
  123. package/library/snippets/report-design/layout-patterns.md +87 -0
  124. package/library/templates/data-models/README.md +93 -0
  125. package/library/templates/data-models/finance-model.md +627 -0
  126. package/library/templates/data-models/retail-star-schema.md +473 -0
  127. package/library/templates/excel/README.md +83 -0
  128. package/library/templates/excel/budget-tracker.md +432 -0
  129. package/library/templates/excel/data-entry-form.md +533 -0
  130. package/library/templates/power-bi/README.md +72 -0
  131. package/library/templates/power-bi/finance-report.md +449 -0
  132. package/library/templates/power-bi/kpi-scorecard.md +461 -0
  133. package/library/templates/power-bi/sales-dashboard.md +281 -0
  134. package/library/themes/excel/README.md +436 -0
  135. package/library/themes/power-bi/README.md +271 -0
  136. package/library/themes/power-bi/accessible.json +307 -0
  137. package/library/themes/power-bi/bi-superpowers-default.json +858 -0
  138. package/library/themes/power-bi/corporate-blue.json +291 -0
  139. package/library/themes/power-bi/dark-mode.json +291 -0
  140. package/library/themes/power-bi/minimal.json +292 -0
  141. package/library/themes/power-bi/print-friendly.json +309 -0
  142. package/package.json +93 -0
  143. package/skills/contributions/SKILL.md +267 -0
  144. package/skills/data-model-design/SKILL.md +470 -0
  145. package/skills/data-modeling/SKILL.md +254 -0
  146. package/skills/data-quality/SKILL.md +664 -0
  147. package/skills/dax/SKILL.md +708 -0
  148. package/skills/dax-doctor/SKILL.md +250 -0
  149. package/skills/dax-udf/SKILL.md +489 -0
  150. package/skills/deployment/SKILL.md +320 -0
  151. package/skills/excel-formulas/SKILL.md +463 -0
  152. package/skills/fabric-scripts/SKILL.md +454 -0
  153. package/skills/fast-standard/SKILL.md +509 -0
  154. package/skills/governance/SKILL.md +205 -0
  155. package/skills/migration-assistant/SKILL.md +292 -0
  156. package/skills/model-documenter/SKILL.md +244 -0
  157. package/skills/pbi-connect/SKILL.md +241 -0
  158. package/skills/power-query/SKILL.md +406 -0
  159. package/skills/project-kickoff/SKILL.md +907 -0
  160. package/skills/query-performance/SKILL.md +480 -0
  161. package/skills/report-design/SKILL.md +207 -0
  162. package/skills/report-layout/SKILL.md +298 -0
  163. package/skills/rls-design/SKILL.md +535 -0
  164. package/skills/semantic-model/SKILL.md +237 -0
  165. package/skills/testing-validation/SKILL.md +643 -0
  166. package/skills/theme-tweaker/SKILL.md +626 -0
  167. package/src/content/base.md +237 -0
  168. package/src/content/mcp-requirements.json +69 -0
  169. package/src/content/routing.md +203 -0
  170. package/src/content/skills/contributions.md +259 -0
  171. package/src/content/skills/data-model-design.md +462 -0
  172. package/src/content/skills/data-modeling.md +246 -0
  173. package/src/content/skills/data-quality.md +656 -0
  174. package/src/content/skills/dax-doctor.md +242 -0
  175. package/src/content/skills/dax-udf.md +481 -0
  176. package/src/content/skills/dax.md +700 -0
  177. package/src/content/skills/deployment.md +312 -0
  178. package/src/content/skills/excel-formulas.md +455 -0
  179. package/src/content/skills/fabric-scripts.md +446 -0
  180. package/src/content/skills/fast-standard.md +501 -0
  181. package/src/content/skills/governance.md +197 -0
  182. package/src/content/skills/migration-assistant.md +284 -0
  183. package/src/content/skills/model-documenter.md +236 -0
  184. package/src/content/skills/pbi-connect.md +233 -0
  185. package/src/content/skills/power-query.md +398 -0
  186. package/src/content/skills/project-kickoff.md +899 -0
  187. package/src/content/skills/query-performance.md +472 -0
  188. package/src/content/skills/report-design.md +199 -0
  189. package/src/content/skills/report-layout.md +290 -0
  190. package/src/content/skills/rls-design.md +527 -0
  191. package/src/content/skills/semantic-model.md +229 -0
  192. package/src/content/skills/testing-validation.md +635 -0
  193. 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
+ // ============================================================================