Skip to content

Commit

Permalink
OV-2060 Added max_calls_per_agent field to Campaign resource (MyPureC…
Browse files Browse the repository at this point in the history
…loud#1077)

* OV-2060 Added max_calls_per_agent field

* OV-2060 Updated docs
  • Loading branch information
danilkulakov authored Jun 11, 2024
1 parent 05703a4 commit a6b497b
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 1 deletion.
1 change: 1 addition & 0 deletions docs/resources/outbound_campaign.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ resource "genesyscloud_outbound_campaign" "campaign" {
- `dnc_list_ids` (List of String) DncLists for this Campaign to check before placing a call.
- `dynamic_contact_queueing_settings` (Block List, Max: 1) Settings for dynamic queueing of contacts. (see [below for nested schema](#nestedblock--dynamic_contact_queueing_settings))
- `edge_group_id` (String) The EdgeGroup that will place the calls. Required for all dialing modes except preview.
- `max_calls_per_agent` (Number) The maximum number of calls that can be placed per agent on this campaign.
- `no_answer_timeout` (Number) How long to wait before dispositioning a call as 'no-answer'. Default 30 seconds. Only applicable to non-preview campaigns.
- `outbound_line_count` (Number) The number of outbound lines to be concurrently dialed. Only applicable to non-preview campaigns; only required for agentless.
- `preview_time_out_seconds` (Number) The number of seconds before a call will be automatically placed on a preview. A value of 0 indicates no automatic placement of calls. Only applicable to preview campaigns.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ func readOutboundCampaign(ctx context.Context, d *schema.ResourceData, meta inte
resourcedata.SetNillableValue(d, "campaign_status", campaign.CampaignStatus)
resourcedata.SetNillableValueWithInterfaceArrayWithFunc(d, "phone_columns", campaign.PhoneColumns, flattenPhoneColumn)
resourcedata.SetNillableValue(d, "abandon_rate", campaign.AbandonRate)
resourcedata.SetNillableValue(d, "max_calls_per_agent", campaign.MaxCallsPerAgent)
if campaign.DncLists != nil {
_ = d.Set("dnc_list_ids", util.SdkDomainEntityRefArrToList(*campaign.DncLists))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,12 @@ func ResourceOutboundCampaign() *schema.Resource {
Optional: true,
Type: schema.TypeFloat,
},
`max_calls_per_agent`: {
Description: `The maximum number of calls that can be placed per agent on this campaign.`,
Optional: true,
Type: schema.TypeInt,
ValidateFunc: validation.IntAtLeast(1),
},
`dnc_list_ids`: {
Description: `DncLists for this Campaign to check before placing a call.`,
Optional: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ func TestAccResourceOutboundCampaignBasic(t *testing.T) {
util.NullValue, // queue id
"genesyscloud_telephony_providers_edges_site."+siteId+".id",
"1",
util.NullValue,
"genesyscloud_outbound_callabletimeset."+callableTimeSetId+".id",
"genesyscloud_outbound_callanalysisresponseset."+carResourceId+".id",
"1",
Expand Down Expand Up @@ -271,6 +272,7 @@ func TestAccResourceOutboundCampaignBasic(t *testing.T) {
util.NullValue, // queue id
"genesyscloud_telephony_providers_edges_site."+siteId+".id",
"1",
util.NullValue,
"genesyscloud_outbound_callabletimeset."+callableTimeSetId+".id",
"genesyscloud_outbound_callanalysisresponseset."+carResourceId+".id",
"1",
Expand Down Expand Up @@ -339,6 +341,7 @@ func TestAccResourceOutboundCampaignBasic(t *testing.T) {
util.NullValue, // queue id
"genesyscloud_telephony_providers_edges_site."+siteId+".id",
"2",
util.NullValue,
"genesyscloud_outbound_callabletimeset."+callableTimeSetId+".id",
"genesyscloud_outbound_callanalysisresponseset."+carResourceId+".id",
"2",
Expand Down Expand Up @@ -780,6 +783,7 @@ func TestAccResourceOutboundCampaignWithScriptId(t *testing.T) {
util.NullValue,
util.NullValue,
util.NullValue,
util.NullValue,
[]string{},
[]string{},
[]string{},
Expand Down Expand Up @@ -814,6 +818,7 @@ func TestAccResourceOutboundCampaignWithScriptId(t *testing.T) {
"genesyscloud_routing_queue."+queueResourceId+".id",
util.NullValue,
"1",
util.NullValue,
"genesyscloud_outbound_callabletimeset."+callableTimeSetResourceId+".id",
"genesyscloud_outbound_callanalysisresponseset."+carResourceId+".id",
"1",
Expand Down Expand Up @@ -877,6 +882,149 @@ func TestAccResourceOutboundCampaignWithScriptId(t *testing.T) {
})
}

func TestAccResourceOutboundCampaignPower(t *testing.T) {
t.Parallel()
var (
resourceId = "campaign5"
name = "Test Campaign " + uuid.NewString()
dialingMode = "power"
callerName = "Test Name 123"
callerAddress = "+353371111111"
contactListResourceId = "contact_list"
queueResourceId = "queue"
locationResourceId = "location"
siteId = "site"
carResourceId = "car"
)

emergencyNumber := "+13178793431"
if err := edgeSite.DeleteLocationWithNumber(emergencyNumber, sdkConfig); err != nil {
t.Skipf("failed to delete location with number %s: %v", emergencyNumber, err)
}

scriptId, err := getPublishedScriptId()
if err != nil || scriptId == "" {
t.Skip("Skipping as a published script ID is needed to run this test")
}

referencedResources := GenerateReferencedResourcesForOutboundCampaignTests(
contactListResourceId,
"",
queueResourceId,
carResourceId,
"",
"",
"",
"",
siteId,
emergencyNumber,
"",
"",
"",
locationResourceId,
"",
)

resource.Test(t, resource.TestCase{
PreCheck: func() { util.TestAccPreCheck(t) },
ProviderFactories: provider.GetProviderFactories(providerResources, providerDataSources),
Steps: []resource.TestStep{
{
Config: referencedResources +
generateOutboundCampaign(
resourceId,
name,
dialingMode,
callerName,
callerAddress,
"genesyscloud_outbound_contact_list."+contactListResourceId+".id",
util.NullValue,
util.NullValue,
strconv.Quote(scriptId),
"genesyscloud_routing_queue."+queueResourceId+".id",
"genesyscloud_telephony_providers_edges_site."+siteId+".id",
"1",
"1",
util.NullValue,
"genesyscloud_outbound_callanalysisresponseset."+carResourceId+".id",
"1",
util.NullValue,
util.NullValue,
util.NullValue,
util.NullValue,
util.NullValue,
[]string{},
[]string{},
[]string{},
generatePhoneColumnNoTypeBlock("Cell"),
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "name", name),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "dialing_mode", dialingMode),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "caller_name", callerName),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "caller_address", callerAddress),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "max_calls_per_agent", "1"),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "phone_columns.0.column_name", "Cell"),
resource.TestCheckResourceAttrPair("genesyscloud_outbound_campaign."+resourceId, "contact_list_id",
"genesyscloud_outbound_contact_list."+contactListResourceId, "id"),
resource.TestCheckResourceAttrPair("genesyscloud_outbound_campaign."+resourceId, "queue_id",
"genesyscloud_routing_queue."+queueResourceId, "id"),
),
},
{
// update
Config: referencedResources +
generateOutboundCampaign(
resourceId,
name,
dialingMode,
callerName,
callerAddress,
"genesyscloud_outbound_contact_list."+contactListResourceId+".id",
util.NullValue,
util.NullValue,
strconv.Quote(scriptId),
"genesyscloud_routing_queue."+queueResourceId+".id",
"genesyscloud_telephony_providers_edges_site."+siteId+".id",
"1",
"2",
util.NullValue,
"genesyscloud_outbound_callanalysisresponseset."+carResourceId+".id",
"1",
util.NullValue,
util.NullValue,
util.NullValue,
util.NullValue,
util.NullValue,
[]string{},
[]string{},
[]string{},
generatePhoneColumnNoTypeBlock("Cell"),
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "name", name),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "dialing_mode", dialingMode),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "caller_name", callerName),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "caller_address", callerAddress),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "max_calls_per_agent", "2"),
resource.TestCheckResourceAttr("genesyscloud_outbound_campaign."+resourceId, "phone_columns.0.column_name", "Cell"),
resource.TestCheckResourceAttrPair("genesyscloud_outbound_campaign."+resourceId, "contact_list_id",
"genesyscloud_outbound_contact_list."+contactListResourceId, "id"),
resource.TestCheckResourceAttrPair("genesyscloud_outbound_campaign."+resourceId, "queue_id",
"genesyscloud_routing_queue."+queueResourceId, "id"),
),
},
{
// Import/Read
ResourceName: "genesyscloud_outbound_campaign." + resourceId,
ImportState: true,
ImportStateVerify: true,
},
},
CheckDestroy: testVerifyOutboundCampaignDestroyed,
})
}

func addContactsToContactList(state *terraform.State) error {
outboundAPI := platformclientv2.NewOutboundApi()
contactListResource := state.RootModule().Resources["genesyscloud_outbound_contact_list.contact_list"]
Expand Down Expand Up @@ -946,6 +1094,7 @@ func generateOutboundCampaign(
queueId string,
siteId string,
abandonRate string,
maxCallsPerAgent string,
callableTimeSetId string,
callAnalysisResponseSetId string,
outboundLineCount string,
Expand All @@ -972,6 +1121,7 @@ resource "genesyscloud_outbound_campaign" "%s" {
queue_id = %s
site_id = %s
abandon_rate = %s
max_calls_per_agent = %s
callable_time_set_id = %s
call_analysis_response_set_id = %s
outbound_line_count = %s
Expand All @@ -985,7 +1135,7 @@ resource "genesyscloud_outbound_campaign" "%s" {
contact_list_filter_ids = [%s]
%s
}
`, resourceId, name, dialingMode, callerName, callerAddress, contactListId, campaignStatus, divisionId, scriptId, queueId, siteId, abandonRate, callableTimeSetId,
`, resourceId, name, dialingMode, callerName, callerAddress, contactListId, campaignStatus, divisionId, scriptId, queueId, siteId, abandonRate, maxCallsPerAgent, callableTimeSetId,
callAnalysisResponseSetId, outboundLineCount, skipPreviewDisabled, previewTimeOutSeconds, alwaysRunning, noAnswerTimeout,
priority, strings.Join(dncListIds, ", "), strings.Join(ruleSetIds, ", "), strings.Join(contactListFilterIds, ", "),
strings.Join(nestedBlocks, "\n"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ func getOutboundCampaignFromResourceData(d *schema.ResourceData) platformclientv
noAnswerTimeout := d.Get("no_answer_timeout").(int)
callAnalysisLanguage := d.Get("call_analysis_language").(string)
priority := d.Get("priority").(int)
maxCallsPerAgent := d.Get("max_calls_per_agent").(int)

campaign := platformclientv2.Campaign{
Name: platformclientv2.String(d.Get("name").(string)),
Expand Down Expand Up @@ -78,6 +79,9 @@ func getOutboundCampaignFromResourceData(d *schema.ResourceData) platformclientv
if priority != 0 {
campaign.Priority = &priority
}
if maxCallsPerAgent != 0 {
campaign.MaxCallsPerAgent = &maxCallsPerAgent
}
return campaign
}

Expand Down

0 comments on commit a6b497b

Please sign in to comment.