resources/task.ps1

function Add-QlikTrigger {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0)]
        [alias("id")]
        [string]$taskId,
        [string]$name,

        [parameter(ParameterSetName = "CompositeEvent")]
        [string[]]$OnSuccess,
        [parameter(ParameterSetName = "CompositeEvent")]
        [string[]]$OnFail,

        [parameter(ParameterSetName = "SchemaEvent")]
        [DateTime]$startDate,
        [parameter(ParameterSetName = "SchemaEvent")]
        [DateTime]$expirationDate,
        [parameter(ParameterSetName = "SchemaEvent")]
        [string]$timeZone,
        [parameter(ParameterSetName = "SchemaEvent")]
        [bool]$daylightSavingTime
    )

    PROCESS {
        # $task = Get-QlikReloadTask -id $taskId -raw

        If ($startDate) {
            # $date = Get-Date -Format yyyy-MM-ddTHH:mm:ss.000Z $date
            if (!$name) { $name = 'Scheduled' }
            $update = @{
                schemaEvents = @(@{
                        name = $name;
                        enabled = $true;
                        eventType = 0;
                        startDate = $startDate.ToString("yyyy-MM-ddTHH:mm:ss.000Z");
                        expirationDate = if ($expirationDate) { $expirationDate.ToString("yyyy-MM-ddTHH:mm:ss.000Z") } else { "9999-12-30T23:59:59.999Z" };
                        schemaFilterDescription = @("* * - * * * * *");
                        incrementDescription = "0 0 1 0";
                        incrementOption = "2";
                        reloadTask = @{
                            id = $taskId
                        }
                    })
            }
        }
        else {
            if (!$name) { $name = 'OnSuccess' }
            $update = @{
                compositeEvents = @(
                    @{
                        name = $name;
                        enabled = $true;
                        eventType = 1;
                        reloadTask = @{
                            id = $taskId
                        }
                        timeConstraint = @{
                            seconds = 0;
                            minutes = 360;
                            hours = 0;
                            days = 0;
                        };
                        compositeRules = @($OnSuccess | ForEach-Object {
                                @{
                                    ruleState = 1;

                                    reloadTask = @{
                                        id = $_
                                    }
                                }
                            });
                        privileges = @("read", "update", "create", "delete")
                    }
                )
            }
        }

        if ($expirationDate) { $update.expirationDate = $expirationDate }
        if ($timeZone) { $update.timeZone = $timeZone }
        if ($daylightSavingTime) { $update.daylightSavingTime = $daylightSavingTime }

        $json = $update | ConvertTo-Json -Compress -Depth 10

        return Invoke-QlikPost "/qrs/reloadtask/update" $json
    }
}

function Get-QlikReloadTask {
    [CmdletBinding()]
    param (
        [parameter(Position = 0)]
        [string]$Id,
        [string]$Filter,
        [switch]$Full,
        [switch]$raw
    )

    PROCESS {
        $path = "/qrs/reloadtask"
        If ( $id ) { $path += "/$id" }
        If ( $full ) { $path += "/full" }
        If ( $raw ) { $rawOutput = $true }
        return Invoke-QlikGet -Path $path -Filter $filter
    }
}

function Get-QlikTask {
    [CmdletBinding()]
    param (
        [parameter(Position = 0)]
        [string]$id,
        [string]$filter,
        [switch]$full,
        [switch]$raw
    )

    PROCESS {
        $path = "/qrs/task"
        If ( !$raw ) {
            If ( $id ) { $path += "/$id" }
            $path += "/full"
            $result = Invoke-QlikGet $path $filter
            If ( !$full ) {
                $result = $result | ForEach-Object {
                    $props = @{
                        name = $_.name
                        status = $_ | Select-Object -ExpandProperty operational | Select-Object -ExpandProperty lastExecutionResult | Select-Object -ExpandProperty status
                        lastExecution = $_ | Select-Object -ExpandProperty operational | Select-Object -ExpandProperty lastExecutionResult | Select-Object -ExpandProperty startTime
                        nextExecution = $_ | Select-Object -ExpandProperty operational | Select-Object -ExpandProperty nextExecution
                    }
                    New-Object -TypeName PSObject -Prop $props
                }
            }
            return $result
        }
        else {
            If ( $id ) { $path += "/$id" }
            If ( $full ) { $path += "/full" }
            If ( $raw ) { $rawOutput = $true }
            return Invoke-QlikGet $path $filter
        }
    }
}

function New-QlikTask {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0)]
        [alias("id")]
        [string]$appId,
        [parameter(Mandatory = $true, Position = 1)]
        [string]$name,
        [string[]]$customProperties,
        [string[]]$tags
    )

    PROCESS {
        $task = @{
            task = @{
                name = $name;
                taskType = 0;
                enabled = $true;
                taskSessionTimeout = 1440;
                maxRetries = 0;
                app = @{
                    id = $appId
                };
                isManuallyTriggered = $false;
            };
        }

        if ($PSBoundParameters.ContainsKey("customProperties")) { $task.customProperties = @(GetCustomProperties $customProperties) }
        if ($PSBoundParameters.ContainsKey("tags")) { $task.tags = @(GetTags $tags) }

        $json = $task | ConvertTo-Json -Compress -Depth 10

        return Invoke-QlikPost '/qrs/reloadtask/create' $json
    }
}

function Remove-QlikTask {
    [CmdletBinding()]
    param (
        [parameter(Position = 0, ValueFromPipelinebyPropertyName = $true)]
        [string]$id
    )

    PROCESS {
        $taskType = "ReloadTask"
        $json = (@{
                items = @(
                    @{
                        type = $taskType;
                        objectID = $id
                    }
                )
            } | ConvertTo-Json -Compress -Depth 10)
        $selection = Invoke-QlikPost "/qrs/selection" $json
        $result = Invoke-QlikDelete "/qrs/selection/$($selection.Id)/$taskType"
        Invoke-QlikDelete "/qrs/selection/$($selection.Id)" | Out-Null

        return $result
    }
}

function Start-QlikTask {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0)]
        [string]$id,
        [switch]$wait
    )

    PROCESS {
        $path = "/qrs/task"
        If ( $wait ) { $sync = "/synchronous" }
        If ( $id -match ($script:guid) ) {
            return Invoke-QlikPost "/qrs/task/$id/start$sync"
        }
        else {
            return Invoke-QlikPost "/qrs/task/start$($sync)?name=$id"
        }
    }
}

function Update-QlikReloadTask {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0)]
        [string]$id,

        [Bool]$Enabled,

        [ValidateRange(1, 2147483647)]
        [Int]$TaskSessionTimeout,

        [ValidateRange(0, 20)]
        [Int]$MaxRetries,

        [string[]]$customProperties,
        [string[]]$tags
    )

    PROCESS {
        $task = Get-QlikReloadTask -Id $id -raw
        If ( $psBoundParameters.ContainsKey("Enabled") ) { $task.enabled = $Enabled }
        If ( $psBoundParameters.ContainsKey("TaskSessionTimeout") ) { $task.taskSessionTimeout = $TaskSessionTimeout }
        If ( $psBoundParameters.ContainsKey("MaxRetries") ) { $task.maxRetries = $MaxRetries }
        if ($PSBoundParameters.ContainsKey("customProperties")) { $task.customProperties = @(GetCustomProperties $customProperties) }
        if ($PSBoundParameters.ContainsKey("tags")) { $task.tags = @(GetTags $tags) }

        $json = $task | ConvertTo-Json -Compress -Depth 10
        return Invoke-QlikPut -Path "/qrs/reloadtask/$id" -Body $json
    }
}

function Wait-QlikExecution {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $True, ValueFromPipelinebyPropertyName = $True, Position = 0, ParameterSetName = "Execution")]
        [alias("value")]
        [string]$executionId,

        [parameter(Mandatory = $true, ValueFromPipelinebyPropertyName = $True, Position = 0, ParameterSetName = "Task")]
        [alias("id")]
        [string]$taskId
    )

    PROCESS {
        if ($executionId) {
            $execution = Invoke-QlikGet "/qrs/executionSession/$executionId"
            $resultId = $execution.executionResult.Id
            $taskName = $execution.reloadTask.name
        }
        else {
            $task = Invoke-QlikGet "/qrs/reloadTask/$taskId"
            $resultId = $task.operational.lastExecutionResult.id
            $taskName = $task.name
        }
        do {
            # Get task status
            $rawOutput = $true
            $result = Invoke-QlikGet "/qrs/executionResult/$resultId"

            # Get internal task status code
            $taskstatuscode = $result.status

            $result = FormatOutput($result)
            Write-Progress -Activity $taskName -Status $result.status -CurrentOperation ($result.details | Select-Object -Last 1).message

            # Wait for 1 second, in a Production setting this should be set much higher to avoid stressing the QRS API
            Start-Sleep -Seconds 1

        } until ($taskstatuscode -gt 3) #status code of more than 3 is a completion (both success and fail)
        return $result
    }
}