private/Get-WarrantyCWM.ps1

function  Get-WarrantyCWM {
    [CmdletBinding()]
    Param(
        [string]$CwCompanyID,
        [String]$CWMpiKeyPublic,
        [String]$CWMpiKeyprivate,
        [string]$CWMAPIURL,
        [boolean]$SyncWithSource,
        [boolean]$Missingonly,
        [boolean]$OverwriteWarranty
    )
 
    Write-Host "Source is Connectwise Manage. Grabbing all devices." -ForegroundColor Green
    $Base64Key = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("$($CWcompanyid)+$($CWMpiKeyPublic):$($CWMpiKeyPrivate)"))
 
    $Header = @{
        'clientId'      = '3613dda6-fa25-49b9-85fb-7aa2b628befa' #This is the warranty script client id. Do not change.
        'Authorization' = "Basic $Base64Key"
        'Content-Type'  = 'application/json'
    }

    If (!($CWMAPIURL -match 'api')) {
        #https://developer.connectwise.com/Best_Practices/Manage_Cloud_URL_Formatting?mt-learningpath=manage
        $companyinfo = Invoke-RestMethod -Headers $header -Method GET -Uri "$CWMAPIURL/login/companyinfo/$cwcompanyid"
        If ($companyinfo.IsCloud) {
            $CWMAPIURL = "https://$($companyinfo.siteurl)/$($companyinfo.Codebase)apis/3.0"
        }
    }

    $ResumeLast = Test-Path 'Devices.json'
    If ($ResumeLast) {
        Write-Host "Found previous run results. Starting from last object." -ForegroundColor green
        $Devices = Get-Content 'Devices.json' | ConvertFrom-Json
    } else {
        $i = 0
        $Devices = do {
            $DeviceList = Invoke-RestMethod -Headers $header -Method GET -Uri "$($CWMAPIURL)/company/configurations?pageSize=250&page=$i"
            $i++
            $DeviceList
            Write-Host "Retrieved $(250 * $i) configurations" -ForegroundColor Yellow
        }while ($devicelist.count % 250 -eq 0 -and $devicelist.count -ne 0) 
    }
    
    $i = 0
    $warrantyObject = foreach ($device in $Devices) {
        #Write-Host $device.serialnumber
        $i++
        Write-Progress -Activity "Grabbing Warranty information" -Status "Processing $($device.serialnumber). Device $i of $($devices.Count)" -PercentComplete ($i / $Devices.Count * 100)
        $WarState = Get-Warrantyinfo -DeviceSerial $device.serialnumber -client $device.company.name
        $RemainingList = Set-Content 'Devices.json' -Force -Value ($Devices | Select-Object -Skip $i | ConvertTo-Json -Depth 5)

        if ($SyncWithSource -eq $true) {
            
            if (!$device.warrantyExpirationDate) {
                if ($warstate.EndDate) {
                    $EndDate = ($warstate.EndDate).ToString('yyyy-MM-ddT00:00:00Z')
                    $device | Add-Member -NotePropertyName "warrantyExpirationDate" -NotePropertyValue $EndDate
                }
            } else { 
                if ($warstate.EndDate) {
                    $EndDate = ($warstate.EndDate).ToString('yyyy-MM-ddT00:00:00Z')
                    $device.warrantyExpirationDate = $EndDate
                }
            }
            # Clear _info metadata that the CWM API doesn't like to receive in PUT commands.
            $device.type._info = "" 
            $device.status._info = "" 
            $device.company._info = ""

            $CWBody = $device | ConvertTo-Json

            switch ($OverwriteWarranty) {
                $true {
                    if ($null -ne $warstate.EndDate) {
                        Invoke-RestMethod -Headers $header -Method put -Uri "$($CWMAPIURL)/company/configurations/$($device.id)" -Body $CWBody
                    }
                }
                $false { 
                    if ($null -eq $device.WarrantyExpirationDate -and $null -ne $warstate.EndDate) { 
                        Invoke-RestMethod -Headers $header -Method put -Uri "$($CWMAPIURL)/company/configurations/$($device.id)" -Body $CWBody
                    } 
                }
            }
        }
        $WarState
    }
    Remove-Item 'devices.json' -Force -ErrorAction SilentlyContinue
    return $warrantyObject
}