Modules/Private/1.ExtractionFunctions/Get-ARICostInventory.ps1

function Get-ARICostInventory {
    Param($Subscriptions, $Days, $Debug, $Granularity)

    if ($Debug.IsPresent) 
        {
            $DebugPreference = 'Continue'
            $ErrorActionPreference = 'Continue'
        } 
    else 
        {
            $ErrorActionPreference = "silentlycontinue"
        }

    $Today = Get-Date
    $EndDate = Get-Date -Year $Today.Year -Month $Today.Month -Day $Today.Day -Hour 23 -Minute 59 -Second 59 -Millisecond 0

    Write-Debug ((get-date -Format 'yyyy-MM-dd_HH_mm_ss') + ' - ' + 'Creating Cost Inventory Job')

    Start-Job -Name 'Cost Inventory' -ScriptBlock {

        $Grouping = @()
        $GTemp = @{Name='ResourceType';Type='Dimension'}
        $Grouping += $GTemp
        $GTemp = @{Name='ResourceGroup';Type='Dimension'}
        $Grouping += $GTemp

        $Hash = @{name="PreTaxCost";function="Sum"}
        $MHash = @{totalCost=$Hash}

        $EndDate = $($args[1])
        $Days = $($args[2])
        if ($Days -ge 365)
            {
                $StartDate = Get-date -Year $EndDate.AddYears(-1).Year -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0 -Millisecond 1
                $EndDate = Get-Date -Year $StartDate.Year -Month 12 -Day 31 -Hour 23 -Minute 59 -Second 59 -Millisecond 0
            }
        else
            {
                $StartDate = ($EndDate).AddDays(-$Days)
            }  

        $job = @()
        Foreach ($Subscription in $($args[0]))
            {

                $Sub = $Subscription.id
                $Scope = ('/subscriptions/'+$Sub+'/')

                New-Variable -Name ('SubRun'+$Sub)
                New-Variable -Name ('SubJob'+$Sub)

                Set-Variable -Name ('SubRun'+$Sub) -Value ([PowerShell]::Create()).AddScript({param($Scope,$StartDate,$EndDate,$Grouping,$MHash,$Granularity)
                    Invoke-AzCostManagementQuery -Type ActualCost -Scope $Scope -Timeframe Custom -DatasetGranularity $Granularity -DatasetGrouping $Grouping -DatasetAggregation $MHash -TimePeriodFrom $StartDate -TimePeriodTo $EndDate
                }).AddArgument($Scope).AddArgument($StartDate).AddArgument($EndDate).AddArgument($Grouping).AddArgument($MHash).AddArgument($($args[3]))
                
                Set-Variable -Name ('SubJob'+$Sub) -Value ((get-variable -name ('SubRun'+$Sub)).Value).BeginInvoke()
                $job += (get-variable -name ('SubJob'+$Sub)).Value

                Start-Sleep -Milliseconds 250
            }

        while ($job.IsCompleted -contains $false) {Start-Sleep -Milliseconds 100}

        Foreach ($Subscription in $($args[0]))
            {
                $Sub = $Subscription.id
                New-Variable -Name ('SubValue'+$Sub)
                Set-Variable -Name ('SubValue'+$Sub) -Value (((get-variable -name ('SubRun'+$Sub)).Value).EndInvoke((get-variable -name ('SubJob'+$Sub)).Value))
            }        

        Foreach ($Subscription in $($args[0]))
            {
                $Sub = $Subscription.id
                Remove-Variable -name ('SubRun'+$Sub)
            }     

        $Result = @()
        Foreach ($Subscription in $($args[0]))
            {
                $Sub = $Subscription.id 
                $Results = (get-variable -name ('SubValue'+$Sub)).Value
                $obj = @{
                        'Subscription'  = $Subscription.name;
                        'SubscriptionId'  = $Subscription.id;
                        'ActualCost'    = $Results
                        }
                $Result += $obj
            }

        $Result

        } -ArgumentList $Subscriptions, $EndDate, $Days, $Granularity | Out-Null

}