Public/Campaigns/Set-Five9InboundCampaign.ps1

function Set-Five9InboundCampaign
{
    <#
    .SYNOPSIS
     
        Function used to modify an existing inbound campaign in Five9
 
    .EXAMPLE
     
        Set-Five9InboundCampaign -Name "Cold-Calls" -NewName "Warm-Calls" -IvrScriptName "Warm-Calls-IVR"
     
        # Changes name of existing campaign and changes IVR script
 
    .EXAMPLE
     
        Set-Five9InboundCampaign -Name "Warm-Calls" -AutoRecord $true -RecordingNameAsSid $true -UseFtp $true -FtpHost '192.168.1.50' -FtpUser 'admin' -FtpPassword 'P@ssword!'
     
        # Modified recording values on existing campaign
    #>


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

        # Optional. Will rename campaign to this new name
        [Parameter(Mandatory=$false)][string]$NewName,

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

        <#
        Mode that existing campaign will be set to. If not specified, default set to BASIC.
 
        Options are:
            • BASIC (Default) - Campaign with default settings, without a campaign profile
            • ADVANCED - Campaign with a campaign profile specified in the profileName parameter
        #>

        [Parameter(Mandatory=$false)][ValidateSet('BASIC', 'ADVANCED')][string]$Mode = 'BASIC',

        # Campaign profile name. Applies only to the advanced campaign mode
        [Parameter(Mandatory=$false)][string]$ProfileName,

        # Name of IVR script
        [Parameter(Mandatory=$false)][string]$IvrScriptName,

        # Hashtable containing key value pairs mapping to IVR script parameters. Must be valid Input parameters in IVR script
        # NOTE: Existing IVR Script parameters will be completely overwritten, not appended to
        [Parameter(Mandatory=$false)][hashtable]$IvrScriptParameters = @{},

        # Maximum number of simultaneous calls. Cannot exceed the number of provisioned inbound lines for the domain.
        [Parameter(Mandatory=$false)][int]$MaxNumOfLines,

        # Whether the campaign is in training mode
        [Parameter(Mandatory=$false)][bool]$TrainingMode,

        # Whether to record all calls of the campaign
        [Parameter(Mandatory=$false)][bool]$AutoRecord,

        # Whether to use FTP to transfer recordings.
        # NOTE: SFTP must be enabled in the Java Admin console
        [Parameter(Mandatory=$false)][bool]$UseFtp,

        # For FTP transfer, whether to use the session ID as the recording name
        [Parameter(Mandatory=$false)][bool]$RecordingNameAsSid,

        # Host name of the FTP server
        [Parameter(Mandatory=$false)][string]$FtpHost,

        # Username of the FTP server
        [Parameter(Mandatory=$false)][string]$FtpUser,

        # Password of the FTP server
        [Parameter(Mandatory=$false)][string]$FtpPassword,

        # Enables the "After Call Work Time Limit" setting on the campaign
        [Parameter(Mandatory=$false)][bool]$CallWrapupEnabled,

        <#
        Whether to automatically place agents who reach a call timeout in a Not Ready state
 
        Options are:
            • True: Set agents to Not Ready state
            • False: Do not set agents to Not Ready state
        #>

        [Parameter(Mandatory=$false)][bool]$WrapupAgentNotReady,

        # Name of disposition automatically set for the call if the timeout is reached
        # Note: Disposition must FIRST be added to campaign's list of dispositions using the GUI or "Add-Five9CampaignDisposition"
        [Parameter(Mandatory=$false)][Alias('WrapupDispostionName')][string]$WrapupDispositionName,

        # Not Ready reason code for agents who are automatically placed in Not Ready state after reaching the timeout
        # Note: Reason codes must first be enabled globally: Actions > Configure > Other > Enable Reason Codes
        [Parameter(Mandatory=$false)][string]$WrapupReasonCodeName,

        # Number of Days used on wrap up timer
        [Parameter(Mandatory=$false)][ValidateRange(0,59)][int]$WrapupTimerDays,

        # Number of Hours used on wrap up timer
        [Parameter(Mandatory=$false)][ValidateRange(0,23)][int]$WrapupTimerHours,

        # Number of Minutes used on wrap up timer
        [Parameter(Mandatory=$false)][ValidateRange(0,59)][int]$WrapupTimerMinutes,

        # Number of Seconds used on wrap up timer
        [Parameter(Mandatory=$false)][ValidateRange(0,59)][int]$WrapupTimerSeconds


    )

    try
    {
        Test-Five9Connection -ErrorAction: Stop

        $existingCampaign = $null
        try
        {
            $existingCampaign = $global:DefaultFive9AdminClient.getInboundCampaign($Name)
        }
        catch
        {

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

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

        $existingCampaign = $existingCampaign | select -First 1


        $campaignToModify = New-Object PSFive9Admin.inboundCampaign
        $campaignToModify.name = $existingCampaign.name


        if ($PSBoundParameters.Keys -contains 'Description')
        {
            $campaignToModify.description = $Description
        }

        
        if ($PSBoundParameters.Keys -contains 'IvrScriptName')
        {
            $campaignToModify.defaultIvrSchedule = New-Object PSFive9Admin.inboundIvrScriptSchedule
            $campaignToModify.defaultIvrSchedule.ivrSchedule = New-Object PSFive9Admin.ivrScriptSchedule
            
            $campaignToModify.defaultIvrSchedule.ivrSchedule.scriptName = $IvrScriptName
        }
            
        if ($existingCampaign.defaultIvrSchedule -eq $null -and $campaignToModify.defaultIvrSchedule -eq $null)
        {
            throw "The campaign being modified is not configured with an IVR Script. Please try again including the -IvrScriptName parameter."
            return
        }

        if ($PSBoundParameters.Keys -contains 'IvrScriptParameters' -and $IvrScriptParameters.Count -gt 0)
        {

            if ($campaignToModify.defaultIvrSchedule -eq $null)
            {
                $campaignToModify.defaultIvrSchedule = $existingCampaign.defaultIvrSchedule
            }

            foreach ($key in $IvrScriptParameters.Keys)
            {
                $scriptParameterValue = New-Object PSFive9Admin.scriptParameterValue
                $scriptParameterValue.name = $key
                $scriptParameterValue.value = $IvrScriptParameters.$key

                $campaignToModify.defaultIvrSchedule.ivrSchedule.scriptParameters += $scriptParameterValue
            }
        }


        if ($PSBoundParameters.Keys -contains 'Mode')
        {
            # if change is from basic to advanced, make sure that theres a profile being set as well
            if ($existingCampaign.mode -eq "BASIC" -and $Mode -eq 'ADVANCED')
            {
                # if type is advanced, must also provide a campaign profile name
                if ($PSBoundParameters.Keys -notcontains 'ProfileName')
                {
                    throw "Campaign Mode set as ""ADVANCED"", but no profile name was provided. Try again including the -ProfileName parameter."
                    return
                }

            }

            $campaignToModify.mode = $Mode
            $campaignToModify.modeSpecified = $true
        
        }


        if ($PSBoundParameters.Keys -contains 'ProfileName')
        {
            $campaignToModify.profileName = $ProfileName
        }

        if ($existingCampaign.maxNumOfLines -lt 1)
        {
            if ($PSBoundParameters.Keys -contains 'MaxNumOfLines')
            {
                $campaignToModify.MaxNumOfLines = $MaxNumOfLines
                $campaignToModify.maxNumOfLinesSpecified = $true
            }
            else
            {
                throw "The campaign being modified has zero voice lines. Please try again including the -MaxNumOfLines parameter."
                return
            }
        }
        else
        {
            if ($PSBoundParameters.Keys -contains 'MaxNumOfLines')
            {
                $campaignToModify.MaxNumOfLines = $MaxNumOfLines
                $campaignToModify.maxNumOfLinesSpecified = $true
            }
        }


        if ($PSBoundParameters.Keys -contains 'AutoRecord')
        {
            $campaignToModify.autoRecord = $AutoRecord
            $campaignToModify.autoRecordSpecified = $true
        }

        if ($PSBoundParameters.Keys -contains 'RecordingNameAsSid')
        {
            $campaignToModify.recordingNameAsSid = $RecordingNameAsSid
            $campaignToModify.recordingNameAsSidSpecified = $true
        }

        if ($PSBoundParameters.Keys -contains 'TrainingMode')
        {
            $campaignToModify.trainingMode = $TrainingMode
            $campaignToModify.trainingModeSpecified = $true
        }


        if ($PSBoundParameters.Keys -contains 'UseFtp')
        {
            $campaignToModify.useFtp = $UseFtp
            $campaignToModify.useFtpSpecified = $true
        }


        if ($PSBoundParameters.Keys -contains 'FtpHost')
        {
            $campaignToModify.ftpHost = $FtpHost
        }

        if ($PSBoundParameters.Keys -contains 'FtpUser')
        {
            $campaignToModify.ftpUser = $FtpUser
        }

        if ($PSBoundParameters.Keys -contains 'FtpPassword')
        {
            $campaignToModify.ftpPassword = $FtpPassword
        }


        $campaignToModify.callWrapup = $existingCampaign.callWrapup

        if ($PSBoundParameters.Keys -contains 'CallWrapupEnabled')
        {
            $campaignToModify.callWrapup.enabled = $CallWrapupEnabled
            $campaignToModify.callWrapup.enabledSpecified = $true
        }

        if ($PSBoundParameters.Keys -contains 'WrapupAgentNotReady')
        {
            $campaignToModify.callWrapup.agentNotReady = $WrapupAgentNotReady
            $campaignToModify.callWrapup.agentNotReadySpecified = $true
        }

        if ($PSBoundParameters.Keys -contains 'WrapupDispositionName')
        {
            $campaignToModify.callWrapup.dispostionName = $WrapupDispositionName
        }

        if ($PSBoundParameters.Keys -contains 'WrapupReasonCodeName')
        {
            $campaignToModify.callWrapup.reasonCodeName = $WrapupReasonCodeName
        }


        if ($CallWrapupEnabled -eq $true -and $existingCampaign.callWrapup.timeout -eq $null)
        {
            $campaignToModify.callWrapup.timeout = New-Object PSFive9Admin.timer
        }

        if ($PSBoundParameters.Keys -contains 'WrapupTimerDays')
        {
            $campaignToModify.callWrapup.timeout.days = $WrapupTimerDays
        }

        if ($PSBoundParameters.Keys -contains 'WrapupTimerHours')
        {
            $campaignToModify.callWrapup.timeout.hours = $WrapupTimerHours
        }

        if ($PSBoundParameters.Keys -contains 'WrapupTimerMinutes')
        {
            $campaignToModify.callWrapup.timeout.minutes = $WrapupTimerMinutes
        }

        if ($PSBoundParameters.Keys -contains 'WrapupTimerSeconds')
        {
            $campaignToModify.callWrapup.timeout.seconds = $WrapupTimerSeconds
        }



        Write-Verbose "$($MyInvocation.MyCommand.Name): Modifying inbound campaign '$Name'." 
        $response = $global:DefaultFive9AdminClient.modifyInboundCampaign($campaignToModify)

        if ($PSBoundParameters.Keys -contains 'NewName')
        {
            Write-Verbose "$($MyInvocation.MyCommand.Name): Renaming inbound campaign '$Name'." 
            $global:DefaultFive9AdminClient.renameCampaign($existingCampaign.name, $NewName)
        }



        return $response

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

}