Public/Reports/Get-ZoomTelephoneReports.ps1

<#
 
.SYNOPSIS
Retrieve a telephone report for a specified period of time.
 
.DESCRIPTION
Retrieve a telephone report for a specified period of time.
 
.PARAMETER From
Start date in 'yyyy-mm-dd' format.
 
.PARAMETER To
End date in 'yyyy-mm-dd' format.
 
.PARAMETER PageSize
The number of records returned within a single API call.
 
.PARAMETER PageNumber
The current page number of returned records.
 
.PARAMETER YearTiDate
Use this switch to automatically retrieve all entries for the calendar year.
 
.PARAMETER Type
Audio types: 1 - Toll-free Call-in & Call-out. The only option is 1. This defaults to 1.
Note that Zoom documents this as a request parameter so it is included here. However it has no practical use at the moment.
 
.PARAMETER ApiKey
The Api Key.
 
.PARAMETER ApiSecret
The Api Secret.
 
.EXAMPLE
Get-ZoomTelephoneReports -from '2019-07-01' -to '2019-07-31' -page 1 -pagesize 300
Get-ZoomTelephoneReports -ytd
 
.OUTPUTS
A hastable with the Zoom API response.
 
#>


function Get-ZoomTelephoneReports {
    [CmdletBinding(DefaultParameterSetName = 'Default')]
    param (
        [Parameter(
            Mandatory = $True, 
            ValueFromPipelineByPropertyName = $True,
            ParameterSetName = 'Default'
        )]
        [ValidatePattern('([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))')]
        [string]$From,

        [Parameter(
            Mandatory = $True, 
            ValueFromPipelineByPropertyName = $True,
            ParameterSetName = 'Default'
        )]
        [ValidatePattern('([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))')]
        [string]$To,

        [Parameter(
            ValueFromPipelineByPropertyName = $True,
            ParameterSetName = 'Default'
        )]
        [ValidateRange(1, 300)]
        [Alias('size', 'page_size')]
        [int]$PageSize = 30,

        [Parameter(
            ValueFromPipelineByPropertyName = $True,
            ParameterSetName = 'Default'
        )]
        [Alias('page', 'page_number')]
        [int]$PageNumber = 1,

        [Parameter(
            ValueFromPipelineByPropertyName = $True,
            ParameterSetName = 'Default'
        )]
        [ValidateSet(1)]
        [int]$Type = 1,

        [Parameter(ParameterSetName = 'YearToDate')]
        [Alias('ytd')]
        [switch]$YearToDate,

        [string]$ApiKey,

        [string]$ApiSecret
    )

    begin {
        #Generate Headers and JWT (JSON Web Token)
        $Headers = New-ZoomHeaders -ApiKey $ApiKey -ApiSecret $ApiSecret
    }

    process {
        if ($YearToDate) {
                [int]$Requests = 0
                $MonthRanges = (Get-YtdMonthlyDateRanges)
                $AllTelephoneReports = New-Object System.Collections.Generic.List[System.Object]

                foreach ($Key in $MonthRanges.Keys) {
                    $TotalPages = (Get-ZoomTelephoneReports -from "$($MonthRanges.$Key.begin)" -to "$($MonthRanges.$Key.end)" -pagesize 300 -pagenumber 1).page_count
                    
                    for ($i = 1; $i -le $TotalPages; $i++) {
                        if (($Requests % 10) -eq 0) {  #Zoom limits the number of requests to 10 per second
                            Start-Sleep -seconds 2
                        }
            
                        $CurrentPage = (Get-ZoomTelephoneReports -from "$($MonthRanges.$Key.begin)" -to "$($MonthRanges.$Key.end)" -pagesize 300 -pagenumber $i).telephony_usage
                        
                        foreach ($Entry in $CurrentPage) {
                            $AllTelephoneReports.Add($Entry)
                        }
            
                        $Requests++
                    }
                }
                write-output $AllTelephoneReports
        } else {
            $Request = [System.UriBuilder]"https://api.zoom.us/v2/report/telephone"
            $RequestBody = @{ }
            $query = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)  
            $query.Add('type', $Type)
            $query.Add('from', $From)
            $query.Add('to', $To)
            $query.Add('page_size', $PageSize)
            $query.Add('page_number', $PageNumber)
            $Request.Query = $query.ToString()

            try {
                $response = Invoke-RestMethod -Uri $request.Uri -Headers $headers -Body $RequestBody -Method GET
            } catch {
                Write-Error -Message "$($_.Exception.Message)" -ErrorId $_.Exception.Code -Category InvalidOperation
            }
            
            Write-Output $response
        }
    }
}