Public/Set-SDPChangeDeploymentSchedule.ps1

function Set-SDPChangeDeploymentSchedule {
    <#
    .SYNOPSIS
        Updates a deployment (downtime) schedule on a ServiceDesk Plus change.
    .PARAMETER ChangeId
        The ID of the parent change.
    .PARAMETER Id
        The ID of the deployment schedule to update.
    .PARAMETER Description
        Updated description.
    .PARAMETER ScheduledStartTime
        Updated planned start date/time.
    .PARAMETER ScheduledEndTime
        Updated planned end date/time.
    .PARAMETER ActualStartTime
        Actual start date/time.
    .PARAMETER ActualEndTime
        Actual end date/time.
    .EXAMPLE
        Set-SDPChangeDeploymentSchedule -ChangeId '12345' -Id '1' -ActualStartTime (Get-Date)
    #>

    [CmdletBinding(SupportsShouldProcess)]
    [OutputType('SDPChangeDeploymentSchedule')]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string]$ChangeId,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string]$Id,

        [Parameter()]
        [string]$Description,

        [Parameter()]
        [datetime]$ScheduledStartTime,

        [Parameter()]
        [datetime]$ScheduledEndTime,

        [Parameter()]
        [datetime]$ActualStartTime,

        [Parameter()]
        [datetime]$ActualEndTime
    )

    process {
        $body = @{}

        if ($PSBoundParameters.ContainsKey('Description'))        { $body['description'] = $Description }
        if ($PSBoundParameters.ContainsKey('ScheduledStartTime')) {
            $body['scheduled_start_time'] = @{ value = [DateTimeOffset]::new($ScheduledStartTime).ToUnixTimeMilliseconds() }
        }
        if ($PSBoundParameters.ContainsKey('ScheduledEndTime')) {
            $body['scheduled_end_time'] = @{ value = [DateTimeOffset]::new($ScheduledEndTime).ToUnixTimeMilliseconds() }
        }
        if ($PSBoundParameters.ContainsKey('ActualStartTime')) {
            $body['actual_start_time'] = @{ value = [DateTimeOffset]::new($ActualStartTime).ToUnixTimeMilliseconds() }
        }
        if ($PSBoundParameters.ContainsKey('ActualEndTime')) {
            $body['actual_end_time'] = @{ value = [DateTimeOffset]::new($ActualEndTime).ToUnixTimeMilliseconds() }
        }

        if ($PSCmdlet.ShouldProcess("Deployment schedule $Id on Change $ChangeId", 'Update SDP Change deployment schedule')) {
            $response = Invoke-SDPRestMethod -Endpoint "changes/$ChangeId/downtimes/$Id" -Method PUT -Body @{ downtime = $body }
            [SDPChangeDeploymentSchedule]::new($ChangeId, $response.downtime)
        }
    }
}