Public/Devices/Set-RMMDeviceWarranty.ps1

<#
    Copyright (c) 2025-2026 Robert Faddes
    SPDX-License-Identifier: MPL-2.0
#>

function Set-RMMDeviceWarranty {
    <#
    .SYNOPSIS
        Sets the warranty expiration date on a device in Datto RMM.
 
    .DESCRIPTION
        The Set-RMMDeviceWarranty function updates the warranty expiration date for a device
        in the Datto RMM system. The warranty date is used for asset management, tracking
        hardware support coverage, and planning device refresh cycles.
 
        The warranty date can be set to a specific date or cleared by passing $null.
 
    .PARAMETER Device
        A DRMMDevice object to update. Accepts pipeline input from Get-RMMDevice.
 
    .PARAMETER DeviceUid
        The unique identifier (GUID) of the device to update.
 
    .PARAMETER WarrantyDate
        The warranty expiration date as a DateTime object. Set to $null to clear the warranty date.
        The date will be formatted as ISO 8601 (yyyy-MM-dd) when sent to the API.
 
    .PARAMETER Force
        Bypasses the confirmation prompt.
 
    .EXAMPLE
        Set-RMMDeviceWarranty -DeviceUid $DeviceUid -WarrantyDate (Get-Date "2027-12-31")
 
        Sets the warranty expiration date to December 31, 2027.
 
    .EXAMPLE
        Get-RMMDevice -Hostname "SERVER01" | Set-RMMDeviceWarranty -WarrantyDate (Get-Date).AddYears(3)
 
        Sets the warranty date to 3 years from today via pipeline.
 
    .EXAMPLE
        Set-RMMDeviceWarranty -DeviceUid $DeviceUid -WarrantyDate $null -Force
 
        Clears the warranty date without confirmation.
 
    .EXAMPLE
        $Site = Get-RMMSite -SiteName "Chicago Office"
        PS > $Filter = $Site | Get-RMMFilter | Where-Object {$_.Name -eq "Dell Latitude 7490"}
        PS > Get-RMMDevice -FilterId $Filter.FilterId | Set-RMMDeviceWarranty -WarrantyDate (Get-Date "2026-06-30")
 
        Sets the warranty date for all Dell Latitude 7490 laptops at the Chicago Office site.
 
    .EXAMPLE
        # Bulk update warranties from a CSV file
        $Warranties = Import-Csv -Path "device_warranties.csv"
        # CSV format: DeviceUid,WarrantyDate
        # Example row: a1b2c3d4-e5f6-7890-abcd-ef1234567890,2027-12-31
 
        foreach ($Item in $Warranties) {
            Set-RMMDeviceWarranty -DeviceUid $Item.DeviceUid -WarrantyDate ([datetime]$Item.WarrantyDate) -Force
        }
 
        Imports warranty dates from a CSV and updates devices in bulk.
 
    .EXAMPLE
        # Set warranty dates from CSV using serial number matching
        $Warranties = Import-Csv -Path "warranty_imports.csv"
        # CSV format: SerialNumber,WarrantyDate
        # Example row: ABC123456,2028-03-15
 
        $Site = Get-RMMSite -SiteName "Boston Office"
        $Devices = Get-RMMDevice -SiteUid $Site.Uid
 
        foreach ($Item in $Warranties) {
            $Device = $Devices | Where-Object {$_.SerialNumber -eq $Item.SerialNumber}
            if ($Device) {
                $Device | Set-RMMDeviceWarranty -WarrantyDate ([datetime]$Item.WarrantyDate) -Force
                Write-Host "Updated warranty for $($Device.Hostname) (SN: $($Item.SerialNumber))"
            }
        }
 
        Imports warranties from a CSV and matches devices by serial number at a specific site.
 
    .INPUTS
        DRMMDevice. You can pipe device objects from Get-RMMDevice.
        You can also pipe objects with DeviceUid or Uid properties.
 
    .OUTPUTS
        None. This function does not return any output.
 
    .NOTES
        This function requires an active connection to the Datto RMM API.
        Use Connect-DattoRMM to authenticate before calling this function.
 
        Best practices for warranty management:
        - Update warranty dates when purchasing new devices
        - Use filters to identify devices with expired warranties
        - Track warranty dates to plan device refresh cycles
        - Set reminders to review warranties quarterly
        - Clear warranty dates for devices that are no longer under warranty
 
    .LINK
        https://github.com/TheShadowTek/DattoRMM.Core/blob/main/docs/commands/Devices/Set-RMMDeviceWarranty.md
 
    .LINK
        about_DRMMDevice
 
    .LINK
        Get-RMMDevice
    #>

    [CmdletBinding(DefaultParameterSetName = 'ByDeviceUid', SupportsShouldProcess, ConfirmImpact = 'Medium')]
    param (
        [Parameter(
            ParameterSetName = 'ByDeviceObject',
            Mandatory = $true,
            ValueFromPipeline = $true
        )]
        [DRMMDevice]
        $Device,

        [Parameter(
            ParameterSetName = 'ByDeviceUid',
            Mandatory = $true
        )]
        [guid]
        $DeviceUid,

        [Parameter(Mandatory = $true)]
        [AllowNull()]
        [Nullable[datetime]]
        $WarrantyDate,

        [Parameter()]
        [switch]
        $Force
    )

    process {

        if ($Device) {

            $DeviceUid = $Device.Uid
            $DeviceName = $Device.Hostname

        } else {

            $DeviceName = "device $DeviceUid"
        }

        $Target = "device '$DeviceName' (UID: $DeviceUid)"
        
        if ($null -eq $WarrantyDate) {

            $Action = "Clear warranty date"

        } else {

            $Action = "Set warranty date to $($WarrantyDate.ToString('yyyy-MM-dd'))"
        }

        if (-not $PSCmdlet.ShouldProcess($Target, $Action)) {

            return

        }

        Write-Debug "Setting warranty date for device $DeviceUid"

        # Build request body
        $Body = @{}

        if ($null -eq $WarrantyDate) {

            $Body.warrantyDate = $null

        } else {

            # Format as ISO 8601 date (yyyy-MM-dd)
            $Body.warrantyDate = $WarrantyDate.ToString('yyyy-MM-dd')

        }

        $APIMethod = @{
            Path = "device/$DeviceUid/warranty"
            Method = 'Post'
            Body = $Body
        }

        Invoke-ApiMethod @APIMethod | Out-Null
        
    }
}


# SIG # Begin signature block
# MIIF+wYJKoZIhvcNAQcCoIIF7DCCBegCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDZJDl/RIvgbTLh
# hutTdUT6rjdKV8xDf0mRdjZ67bFw2aCCA04wggNKMIICMqADAgECAhB464iXHfI6
# gksEkDDTyrNsMA0GCSqGSIb3DQEBCwUAMD0xFjAUBgNVBAoMDVJvYmVydCBGYWRk
# ZXMxIzAhBgNVBAMMGkRhdHRvUk1NLkNvcmUgQ29kZSBTaWduaW5nMB4XDTI2MDMz
# MTAwMTMzMFoXDTI4MDMzMTAwMjMzMFowPTEWMBQGA1UECgwNUm9iZXJ0IEZhZGRl
# czEjMCEGA1UEAwwaRGF0dG9STU0uQ29yZSBDb2RlIFNpZ25pbmcwggEiMA0GCSqG
# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQChn1EpMYQgl1RgWzQj2+wp2mvdfb3UsaBS
# nxEVGoQ0gj96tJ2MHAF7zsITdUjwaflKS1vE6wAlOg5EI1V79tJCMxzM0bFpOdR1
# L5F2HE/ovIAKNkHxFUF5qWU8vVeAsOViFQ4yhHpzLen0WLF6vhmc9eH23dLQy5fy
# tELZQEc2WbQFa4HMAitP/P9kHAu6CUx5s4woLIOyyR06jkr3l9vk0sxcbCxx7+dF
# RrsSLyPYPH+bUAB8+a0hs+6qCeteBuUfLvGzpMhpzKAsY82WZ3Rd9X38i32dYj+y
# dYx+nx+UEMDLjDJrZgnVa8as4RojqVLcEns5yb/XTjLxDc58VatdAgMBAAGjRjBE
# MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU
# H+B0vf97dYXqdUX1YMcWhFsY6fcwDQYJKoZIhvcNAQELBQADggEBAJmD4EEGNmcD
# 1JtFoRGxuLJaTHxDwBsjqcRQRE1VPZNGaiwIm8oSQdHVjQg0oIyK7SEb02cs6n6Y
# NZbwf7B7WZJ4aKYbcoLug1k1x9SoqwBmfElECeJTKXf6dkRRNmrAodpGCixR4wMH
# KXqwqP5F+5j7bdnQPiIVXuMesxc4tktz362ysph1bqKjDQSCBpwi0glEIH7bv5Ms
# Ey9Gl3fe+vYC5W06d2LYVebEfm9+7766hsOgpdDVgdtnN+e6uwIJjG/6PTG6TMDP
# y+pr5K6LyUVYJYcWWUTZRBqqwBHiLGekPbxrjEVfxUY32Pq4QfLzUH5hhUCAk4HN
# XpF9pOzFLMUxggIDMIIB/wIBATBRMD0xFjAUBgNVBAoMDVJvYmVydCBGYWRkZXMx
# IzAhBgNVBAMMGkRhdHRvUk1NLkNvcmUgQ29kZSBTaWduaW5nAhB464iXHfI6gksE
# kDDTyrNsMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKEC
# gAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwG
# CisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIKufhkrsPSRndEPkXsGjYQXeNde7
# e8W2Cr/aJZA/PbPMMA0GCSqGSIb3DQEBAQUABIIBAEd1THYeFc0YaMfdDYmh2YVB
# pz9iEHnwkAg8YUBeQ9LAWUCX+OBBtoYc6uPsMkYGTrfHjYlA5inLhTjNVG7Ca5gY
# nrAhgjlHk8bf+zzWkpJAJARA3N/71MSEHvUOfQ0CCsf7Gd8kKrhACVTDkY3bbpfI
# ieAO7Vl+pIT0w6j26ACRpjfk6VUjFmbL5p6BY9pd1GTfD5D80DG2OTHV4P+ULRjy
# MDk9S8zr5GIhM2OInklykAVG0AuC/a3V3Q3hwhRVGIghaAbahqIUmKJKURY0a3PV
# aWvZZkhq/xJX54z8m6qH4rb+ct1RpLL7AhsZwQSWvOyl+ZRKAKWJD7vcwWHYB6A=
# SIG # End signature block