Public/Campaigns/New-Five9InboundCampaign.ps1

function New-Five9InboundCampaign
{
    <#
    .SYNOPSIS
     
        Function used to create a new inbound campaign in Five9
 
    .NOTES
        Only FTP can be enabled using API. SFTP must be enabled using GUI
 
    .EXAMPLE
     
        New-Five9InboundCampaign -Name "Cold-Calls" -IvrScriptName "Cold-Calls-IVR" -MaxNumOfLines 10
     
        # Creates new inbound campaign with minimum number of required parameters
 
    .EXAMPLE
     
        New-Five9InboundCampaign -Name "Cold-Calls" -Mode: ADVANCED -ProfileName "Cold-Calls-Profile" -IvrScriptName "Cold-Calls-IVR" -MaxNumOfLines 50 `
                                 -CallWrapupEnabled $true -WrapupAgentNotReady $true -WrapupTimerMinutes 2 -WrapupTimerSeconds 30
     
        # Creates new inbound campaign in advanced mode, and enables call wrap up timer
 
    #>


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

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

        <#
        Mode of new campaign. 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 to be used on new campaign
        [Parameter(Mandatory=$true)][string]$IvrScriptName,

        # Hashtable containing key value pairs mapping to IVR script parameters. Must be valid Input parameters in IVR script
        [Parameter(Mandatory=$false)][hashtable]$IvrScriptParameters = @{},

        # Maximum number of simultaneous calls. Cannot exceed the number of provisioned inbound lines for the domain.
        [Parameter(Mandatory=$true)][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
        [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
        [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

        $inboundCampaign = New-Object PSFive9Admin.inboundCampaign

        $inboundCampaign.type = "INBOUND"
        $inboundCampaign.typeSpecified = $true

        $inboundCampaign.name = $Name

        $inboundCampaign.mode = $Mode
        $inboundCampaign.modeSpecified = $true


        $inboundCampaign.defaultIvrSchedule = New-Object PSFive9Admin.inboundIvrScriptSchedule
        $inboundCampaign.defaultIvrSchedule.ivrSchedule = New-Object PSFive9Admin.ivrScriptSchedule
        $inboundCampaign.defaultIvrSchedule.ivrSchedule.scriptName = $IvrScriptName

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

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

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


        if ($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
            }

            $inboundCampaign.profileName = $ProfileName

        }

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


        if ($PSBoundParameters.Keys -contains 'MaxNumOfLines')
        {
            $inboundCampaign.MaxNumOfLines = $MaxNumOfLines
            $inboundCampaign.maxNumOfLinesSpecified = $true
        }

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

        if ($CallWrapupEnabled -eq $true)
        {
            $inboundCampaign.callWrapup = New-Object PSFive9Admin.campaignCallWrapup
            $inboundCampaign.callWrapup.enabled = $true
            $inboundCampaign.callWrapup.enabledSpecified = $true

            if ($WrapupAgentNotReady -eq $true)
            {
                $inboundCampaign.callWrapup.agentNotReady = $true
                $inboundCampaign.callWrapup.agentNotReadySpecified = $true
            }

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

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

            $inboundCampaign.callWrapup.timeout = New-Object PSFive9Admin.timer
            $inboundCampaign.callWrapup.timeout.days = $WrapupTimerDays
            $inboundCampaign.callWrapup.timeout.hours = $WrapupTimerHours
            $inboundCampaign.callWrapup.timeout.minutes = $WrapupTimerMinutes
            $inboundCampaign.callWrapup.timeout.seconds = $WrapupTimerSeconds

        }

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

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

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

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

        if ($PSBoundParameters.Keys -contains 'FtpHost')
        {
            $inboundCampaign.ftpHost = $FtpHost
        }
    
        if ($PSBoundParameters.Keys -contains 'FtpUser')
        {
            $inboundCampaign.ftpUser = $FtpUser
        }

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


        Write-Verbose "$($MyInvocation.MyCommand.Name): Creating new inbound campaign '$Name'." 
        $response = $global:DefaultFive9AdminClient.createInboundCampaign($inboundCampaign)


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