public/New-SwSdTask.ps1

function New-SwSdTask {
    <#
    .SYNOPSIS
        Creates a new task for the specified incident number.
    .DESCRIPTION
        Creates a new task for the specified incident number.
        The task is assigned to the specified user and has a due date offset by the specified number of days.
    .PARAMETER IncidentNumber
        The incident number.
    .PARAMETER Name
        The task name.
    .PARAMETER Assignee
        The task assignee email address.
    .PARAMETER IsComplete
        The task completion status. Default is False.
    .PARAMETER DueDateOffsetDays
        The number of days to offset the due date. Default is 14 days.
    .EXAMPLE
        New-SwSdTask -IncidentNumber "12345" -Name "Task Name" -Assignee "user123@contoso.com"
    .NOTES
        Refer to https://apidoc.samanage.com/#tag/Task/operation/createTask
    .LINK
        https://github.com/Skatterbrainz/SolarWinds.ServiceDesk/blob/main/docs/New-SwSdTask.md
    #>

    [CmdletBinding()]
    param(
        [parameter(Mandatory = $True)][string][ValidateNotNullOrWhiteSpace()]$IncidentNumber,
        [parameter(Mandatory = $True)][string][ValidateNotNullOrWhiteSpace()]$Name,
        [parameter(Mandatory = $True)][string][ValidateNotNullOrWhiteSpace()]$Assignee,
        [parameter(Mandatory = $False)][boolean]$IsComplete = $False,
        [parameter(Mandatory = $False)][int]$DueDateOffsetDays = 7
    )
    try {
        $Session  = Connect-SwSD
        $incident = Get-SwSdIncident -Number $IncidentNumber
        if (!$incident) { throw "Incident $IncidentNumber not found." }
        $baseurl = Get-SwSdAPI -Name "Helpdesk Incidents List"
        $url  = "$($baseurl.replace('.json',''))/$($incident.id)/tasks"
        Write-Verbose "Tasks URL: $url"
        Write-Verbose "Verifying User $Assignee"
        $user = Get-SwSdUser -Email $Assignee
        if (!$user) {
            throw "User $Assignee not found."
        }
        $dueDate = (Get-Date).AddDays($DueDateOffsetDays).ToString("MMM dd, yyyy")
        $body = @{
            "task" = @{
                "name" = $Name.Trim()
                "assignee" = @{
                    "email" = $Assignee.Trim()
                }
                "due_at" = $dueDate
                "is_complete" = $IsComplete
            }
        } | ConvertTo-Json
        Write-Verbose "Creating task: $json"
        #curl -H "X-Samanage-Authorization: Bearer $token" -H "Accept: application/vnd.samanage.v2.1+json" -H "Content-Type: application/json" -X POST $url -d $json
        $response = Invoke-RestMethod -Method POST -Uri $url -ContentType "application/json" -Headers $Session.headers -Body $body #-ErrorAction Stop
        $response
    } catch {
        if ($_.Exception.Message -notmatch '406') {
            Write-Error $_.Exception.Message
        }
    }
}