Public/Get-O365CalEntry.ps1

Function Get-O365CalEntry{
    param (
        
        # Parameter help description
        [Parameter()]
        [DateTime]
        $StartTime =  (Get-Date -Day 1),
        # Parameter help description
        [Parameter()]
        [DateTime]
        $EndTime = (Get-Date -Day 1).AddMonths(1).AddDays(-1),
        # Parameter help description
        [Parameter()]
        [String]
        $SubjectSearchString = "DTX:"
    )
    $StartTimeStr = $StartTime | Get-Date -f "yyyy-MM-ddT00:00:00"
    $EndTimeStr = $EndTime | Get-Date -f "yyyy-MM-ddT23:59:59"
    $Token = (Get-O365Jwt).Trim()
    $Splat = @{
        Headers = @{
            Authorization = "Bearer $Token"
        }
        Uri = "https://graph.microsoft.com/v1.0/me/events?`$filter=startswith(subject,'$SubjectSearchString') and start/dateTime ge '$StartTimeStr' and end/dateTime le '$EndTimeStr'"
    }
    Write-Verbose "DateRange From: $StartTimeStr"
    Write-Verbose "DateRange To: $EndTimeStr "
    Write-Debug "URI:$($Splat.Uri)"
    Write-Verbose "Token: $($Token.Substring(0,64))"
    Write-Verbose "Account: $((Get-O365JwtPayload -JwtToken $Token).unique_name)"
    $Results = Invoke-RestMethod @Splat | Select-Object -ExpandProperty value
    $DateTimeUKParse = "MM/dd/yyyy HH:mm:ss"
    $Entries = @()
    $Results | ForEach-Object {
        $x = @{}
        $x.ProjectCode = $PSItem.subject.split("DTX:")[1].Trim()

        
        if($PSItem.isAllDay -eq $true){
            $Time = New-TimeSpan -Hours 7 -Minutes 30
        }else{ 
            $Time = $PSItem.start.datetime
            $start = [DateTime]::new($Time.Year,$Time.Month,$Time.Day,$Time.Hour,$Time.Minutes,0)
            $Time = $PSItem.end.datetime
            $end = [DateTime]::new($Time.Year,$Time.Month,$Time.Day,$Time.Hour,$Time.Minutes,0)
            
            $Time = New-TimeSpan -Start $start -End $end

                # $Time = New-TimeSpan -Start ([datetime]::ParseExact($PSItem.start.datetime,$DateTimeUKParse,[Globalization.CultureInfo]::CreateSpecificCulture('en-GB'))) -End ([datetime]::ParseExact($PSItem.end.datetime,$DateTimeUKParse,[Globalization.CultureInfo]::CreateSpecificCulture('en-GB')))
        }

        $x.AllocatedTime = "$($Time.Hours).$([math]::Round($Time.Minutes/60 * 10))" #TODO: Needs fine tuning.
    
        $x.Month = ($PSItem.start.datetime | Get-Date -f "MMMM").toLower()
        $x.Day = ($PSItem.start.datetime).Day

        $Entries += [PSCustomObject]$x
    }
    $Entries
}