Skip to content
3 changes: 2 additions & 1 deletion docs-mslearn/toolkit/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: FinOps toolkit changelog
description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more.
author: MSBrett
ms.author: brettwil
ms.date: 02/24/2026
ms.date: 02/25/2026
ms.topic: reference
ms.service: finops
ms.subservice: finops-toolkit
Expand Down Expand Up @@ -127,6 +127,7 @@ _Released January 2026_
- **Added**
- Added export requirements sections to all Power BI report documentation pages to clarify which Cost Management exports are needed for each report.
- Added Azure Resource Graph as an explicit requirement for governance and workload optimization reports.
- Added `CapacityReservationId` and `CapacityReservationStatus` columns in storage-based Power BI reports ([#1836](https://github.com/microsoft/finops-toolkit/issues/1836)).
- **Fixed**
- Fixed tag expansion when tag names contain special characters like colons.
- Fixed unattached disks count in the workload optimization report to show only truly unattached disks ([#1896](https://github.com/microsoft/finops-toolkit/issues/1896)).
Expand Down
4 changes: 3 additions & 1 deletion src/power-bi/queries/ftk_NormalizeSchema.pq
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,9 @@ let
BillingAccountType = Table.AddColumn(BillingAccountName, "BillingAccountType", each if [x_AccountType] = "MCA" then "Billing Profile" else if [x_AccountType] = "EA" then "Billing Account" else "Subscription"),
BillingPeriodEnd = _swapCol(BillingAccountType, "tmp_BillingPeriodEnd", "BillingPeriodEnd", each if _isMissing("tmp_BillingPeriodEnd") then Date.StartOfMonth(Date.AddDays([ChargePeriodStart], 31)) else Date.AddDays([tmp_BillingPeriodEnd], 1), type date),
BillingPeriodStart = _swapCol(BillingPeriodEnd, "tmp_BillingPeriodStart", "BillingPeriodStart", each if _isBlank([tmp_BillingPeriodStart]) then Date.StartOfMonth([ChargePeriodStart]) else [tmp_BillingPeriodStart], type date),
ChargeCategory = Table.AddColumn(BillingPeriodStart, "ChargeCategory", each if _isBlank([tmp_ChargeType]) then "Usage" else if [tmp_ChargeType] = "Usage" or [tmp_ChargeType] = "Purchase" or [tmp_ChargeType] = "Tax" then [tmp_ChargeType] else if Text.StartsWith([tmp_ChargeType], "Unused") then "Usage" else if [tmp_ChargeType] = "Refund" then "Purchase" else "Adjustment"),
CapacityReservationId = Table.AddColumn(BillingPeriodStart, "CapacityReservationId", each if _isNotBlank([x_CapacityCommitmentId]) then [x_CapacityCommitmentId] else null),
CapacityReservationStatus = Table.AddColumn(CapacityReservationId, "CapacityReservationStatus", each if _isBlank([CapacityReservationId]) then null else if _isNotBlank([x_ResourceType]) and Text.Lower([x_ResourceType]) = "microsoft.compute/capacityreservationgroups/capacityreservations" then "Unused" else "Used"),
ChargeCategory = Table.AddColumn(CapacityReservationStatus, "ChargeCategory", each if _isBlank([tmp_ChargeType]) then "Usage" else if [tmp_ChargeType] = "Usage" or [tmp_ChargeType] = "Purchase" or [tmp_ChargeType] = "Tax" then [tmp_ChargeType] else if Text.StartsWith([tmp_ChargeType], "Unused") then "Usage" else if [tmp_ChargeType] = "Refund" then "Purchase" else "Adjustment"),
ChargeClass = Table.AddColumn(ChargeCategory, "ChargeClass", each if [tmp_ChargeType] = "Refund" then "Correction" else null),
ChargeDescription = Table.AddColumn(ChargeClass, "ChargeDescription", each [x_SkuDescription]),
// TODO: PricingQuantity,SkuId,SkuPriceId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,22 @@ table Costs

annotation PBI_FormatHint = {"isCustom":true}

column CapacityReservationId
dataType: string
lineageTag: 7a3e4b1c-6f8e-4d9a-b5c1-3e2f4a7b8c9d
summarizeBy: none
sourceColumn: CapacityReservationId

annotation SummarizationSetBy = Automatic

column CapacityReservationStatus
dataType: string
lineageTag: 8b4f5c2d-7a9f-5e0b-c6d2-4f3e5b8a9c0e
summarizeBy: none
sourceColumn: CapacityReservationStatus

annotation SummarizationSetBy = Automatic

column ChargeCategory
dataType: string
lineageTag: 669cea79-1e27-46c1-a88f-0ad859cee094
Expand Down