Public/Set-SDPChangeWorklog.ps1

function Set-SDPChangeWorklog {
    <#
    .SYNOPSIS
        Updates a worklog entry on a ServiceDesk Plus change.
    .PARAMETER ChangeId
        The ID of the parent change.
    .PARAMETER Id
        The ID of the worklog to update.
    .PARAMETER Description
        Updated description.
    .PARAMETER OwnerName
        Updated owner name.
    .PARAMETER StartTime
        Updated start date/time.
    .PARAMETER EndTime
        Updated end date/time.
    .PARAMETER IncludeNonOperationalHours
        Updated non-operational hours flag.
    .EXAMPLE
        Set-SDPChangeWorklog -ChangeId '12345' -Id '1' -Description 'Corrected time entry.'
    #>

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

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

        [Parameter()]
        [string]$Description,

        [Parameter()]
        [string]$OwnerName,

        [Parameter()]
        [datetime]$StartTime,

        [Parameter()]
        [datetime]$EndTime,

        [Parameter()]
        [bool]$IncludeNonOperationalHours
    )

    process {
        $body = @{}

        if ($PSBoundParameters.ContainsKey('Description'))               { $body['description'] = $Description }
        if ($PSBoundParameters.ContainsKey('OwnerName'))                 { $body['owner']       = @{ name = $OwnerName } }
        if ($PSBoundParameters.ContainsKey('StartTime'))                 { $body['start_time']  = @{ value = [DateTimeOffset]::new($StartTime).ToUnixTimeMilliseconds() } }
        if ($PSBoundParameters.ContainsKey('EndTime'))                   { $body['end_time']    = @{ value = [DateTimeOffset]::new($EndTime).ToUnixTimeMilliseconds() } }
        if ($PSBoundParameters.ContainsKey('IncludeNonOperationalHours')) { $body['include_nonoperational_hours'] = $IncludeNonOperationalHours }

        if ($PSCmdlet.ShouldProcess("Worklog $Id on Change $ChangeId", 'Update SDP Change worklog')) {
            $response = Invoke-SDPRestMethod -Endpoint "changes/$ChangeId/worklogs/$Id" -Method PUT -Body @{ worklog = $body }
            [SDPChangeWorklog]::new($ChangeId, $response.worklog)
        }
    }
}