Public/Dispositions/Set-Five9Disposition.ps1

function Set-Five9Disposition
{
    <#
    .SYNOPSIS
     
        Function used to modify a Five9 disposition
    
    .EXAMPLE
     
        Set-Five9Disposition -Name "Default-Disposition" -NewName "Old-Disposition" -Type: AddActiveNumber
 
        # Changes existing disposition from "Default-Disposition" to "Old-Disposition", and changes Type to "AddActiveNumber"
    #>


    [CmdletBinding(PositionalBinding=$false)]
    param
    ( 
        # Name of existing disposition
        [Parameter(Mandatory=$true, Position=0)][string]$Name,

        # Optional parameter. If provided, existing disposition's name will be changed
        [Parameter(Mandatory=$false)][string]$NewName,

        # Description of disposition
        [Parameter(Mandatory=$false)][string]$Description,

        # Whether the agent needs to complete a worksheet before selecting a disposition
        [Parameter(Mandatory=$false)][bool]$AgentMustCompleteWorksheet,

        # Whether the agent is prompted tconfirm the selection of the disposition
        [Parameter(Mandatory=$false)][bool]$AgentMustConfirm,

        # Whether the agent is prompted to confirm the selection of the disposition
        [Parameter(Mandatory=$false)][bool]$ResetAttemptsCounter,

        # Whether call details are sent as an email notification when the disposition is used by an agent
        [Parameter(Mandatory=$false)][bool]$SendEmailNotification,

        # Whether call details are sent as an instant message in the Five9 system when the disposition is used by an agent
        [Parameter(Mandatory=$false)][bool]$SendIMNotification,

        # Whether the call is included in the first call resolution statistics (customer’s needs addressed in the first call). Used primarily for inbound campaigns
        [Parameter(Mandatory=$false)][bool]$TrackAsFirstCallResolution,

        <#
        Type of disposition
 
        Options are:
            • FinalDisp - Any contact number of the contact is not dialed again by the current campaign
            • FinalApplyToCampaigns - Contact is not dialed again by any campaign that contains the disposition
            • AddActiveNumber - Adds the number dialed to the DNC list
            • AddAndFinalize - Adds the call results to the campaign history. This record is no longer dialing in this campaign.
                             Does not add the contact’s other phone numbers to the DNC list.
            • AddAllNumbers - Adds all the contact’s phone numbers to the DNC list
            • DoNotDial - Number is not dialed in the campaign, but other numbers from the CRM record can be dialed
            • RedialNumber - Number is dialed again when the list to dial is completed, and the dialer starts again from the beginning.
        #>

        [Parameter(Mandatory=$false)][ValidateSet("FinalDisp", "FinalApplyToCampaigns", "AddActiveNumber", "AddAndFinalize", "AddAllNumbers", "DoNotDial", "RedialNumber")][string]$Type,

        # Number of redial attempts.
        # Only used when -Type is set to "RedialNumber"
        [Parameter(Mandatory=$false)][bool]$UseRedialTimer,

        # Whether this disposition uses a redial timer
        # Only used when -Type is set to "RedialNumber"
        [Parameter(Mandatory=$false)][ValidateRange(1,99)][int]$RedialAttempts,

        # Number of Days
        # Only used when -Type is set to "RedialNumber" and -UseRedialTimer is set to "True"
        [Parameter(Mandatory=$false)][ValidateRange(0,59)][int]$RedialTimerDays,

        # Number of Hours
        # Only used when -Type is set to "RedialNumber" and -UseRedialTimer is set to "True"
        [Parameter(Mandatory=$false)][ValidateRange(0,23)][int]$RedialTimerHours,

        # Number of Minutes
        # Only used when -Type is set to "RedialNumber" and -UseRedialTimer is set to "True"
        [Parameter(Mandatory=$false)][ValidateRange(0,59)][int]$RedialTimerMinutes,

        # Number of Seconds
        # Only used when -Type is set to "RedialNumber" and -UseRedialTimer is set to "True"
        [Parameter(Mandatory=$false)][ValidateRange(0,59)][int]$RedialTimerSeconds,

        # Whether the agent can change the redial timer for this disposition
        # Only used when -Type is set to "RedialNumber"
        [Parameter(Mandatory=$false)][string]$AllowChangeTimer

    )

    try
    {
        Test-Five9Connection -ErrorAction: Stop

        $dispositionToModify = $null
        try
        {
            $dispositionToModify = $global:DefaultFive9AdminClient.getDispositions($Name)
        }
        catch
        {

        }
    
        if ($dispositionToModify.Count -gt 1)
        {
            throw "Multiple Dispositions were found using query: ""$Name"". Please try using the exact name of the disposition you're trying to modify."
            return
        }

        if ($dispositionToModify -eq $null)
        {
            throw "Cannot find a Disposition with name: ""$Name"". Remember that Name is case sensitive."
            return
        }

         $dispositionToModify = $dispositionToModify | select -First 1

        if ($PSBoundParameters.Keys -contains "Description")
        {
            $dispositionToModify.description = $Description
        }
    
        if ($PSBoundParameters.Keys -contains "AgentMustCompleteWorksheet")
        {
            $dispositionToModify.agentMustCompleteWorksheet = $AgentMustCompleteWorksheet
            $dispositionToModify.agentMustCompleteWorksheetSpecified = $true
        }

        if ($PSBoundParameters.Keys -contains "AgentMustConfirm")
        {
            $dispositionToModify.agentMustConfirm = $AgentMustConfirm
            $dispositionToModify.agentMustConfirmSpecified = $true
        }

        if ($PSBoundParameters.Keys -contains "ResetAttemptsCounter")
        {
            $dispositionToModify.resetAttemptsCounter = $ResetAttemptsCounter
            $dispositionToModify.resetAttemptsCounterSpecified = $true
        }

        if ($PSBoundParameters.Keys -contains "SendEmailNotification")
        {
            $dispositionToModify.sendEmailNotification = $SendEmailNotification
            $dispositionToModify.sendEmailNotificationSpecified = $true
        }

        if ($PSBoundParameters.Keys -contains "SendIMNotification")
        {
            $dispositionToModify.sendIMNotification = $SendIMNotification
            $dispositionToModify.sendIMNotificationSpecified = $true
        }

        if ($PSBoundParameters.Keys -contains "TrackAsFirstCallResolution")
        {
            $dispositionToModify.trackAsFirstCallResolution = $TrackAsFirstCallResolution
            $dispositionToModify.trackAsFirstCallResolutionSpecified = $true
        }
    
   
        if ($PSBoundParameters.Keys -contains "Type")
        {
            $dispositionToModify.type = $Type
            $dispositionToModify.typeSpecified = $true

             # only set timer values if type is set to RedialNumber
            if ($Type -eq "RedialNumber" -and $PSBoundParameters.Keys -contains "UseRedialTimer")
            {
                $dispositionToModify.typeParameters = New-Object PSFive9Admin.dispositionTypeParams

                $dispositionToModify.typeParameters.useTimer = $UseRedialTimer
                $dispositionToModify.typeParameters.useTimerSpecified = $true

                if ($UseRedialTimer -eq $true)
                {
                    if ($RedialAttempts -lt 1)
                    {
                        throw "When -UseRedialTimer is set to True, you must also set -RedialAttempts to a value between 1-99."
                        return
                    }

                    if ($RedialTimerDays -lt 1 -and $RedialTimerHours -lt 1 -and $RedialTimerMinutes -lt 1)
                    {
                        throw "When -UseRedialTimer is set to True, the total -RedailTimer<unit> values must be set to at least 1 minute. For example, to redial a record after 8.5 hours, use -RedialTimerHours 8 -RedialTimerMinutes 30"
                        return
                    }

                    $dispositionToModify.typeParameters.timer = New-Object PSFive9Admin.timer
                    $dispositionToModify.typeParameters.timer.days = $RedialTimerDays
                    $dispositionToModify.typeParameters.timer.hours = $RedialTimerHours
                    $dispositionToModify.typeParameters.timer.minutes = $RedialTimerMinutes
                    $dispositionToModify.typeParameters.timer.seconds = $RedialTimerSeconds

                    $dispositionToModify.typeParameters.attempts = $RedialAttempts
                    $dispositionToModify.typeParameters.attemptsSpecified = $true

                }

                if ($PSBoundParameters.Keys -contains "AllowChangeTimer")
                {
                    $dispositionToModify.typeParameters.allowChangeTimer = $AllowChangeTimer
                    $dispositionToModify.typeParameters.allowChangeTimerSpecified = $true
                }

            }

        }


        Write-Verbose "$($MyInvocation.MyCommand.Name): Modifying disposition '$Name'." 
        $response =  $global:DefaultFive9AdminClient.modifyDisposition($dispositionToModify)

        if ($PSBoundParameters.Keys -contains "NewName")
        {
            Write-Verbose "$($MyInvocation.MyCommand.Name): Modifying disposition name from: '$Name' to '$NewName'." 
            $response =  $global:DefaultFive9AdminClient.renameDisposition($Name, $NewName)
        }

        return $response
    
    }
    catch
    {
        $_ | Write-PSFive9AdminError
        $_ | Write-Error
    }
}