diff --git a/docs/resources/outbound_campaign.md b/docs/resources/outbound_campaign.md index b941c6c8d..4391ec542 100644 --- a/docs/resources/outbound_campaign.md +++ b/docs/resources/outbound_campaign.md @@ -96,7 +96,7 @@ resource "genesyscloud_outbound_campaign" "campaign2" { - `dynamic_contact_queueing_settings` (Block List, Max: 1) Settings for dynamic queueing of contacts. If not set, default dynamic contact queue settings will be applied (see [below for nested schema](#nestedblock--dynamic_contact_queueing_settings)) - `dynamic_line_balancing_settings` (Block List, Max: 1) Dynamic line balancing settings. (see [below for nested schema](#nestedblock--dynamic_line_balancing_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. +- `max_calls_per_agent` (Number) The maximum number of calls that can be placed per agent on this campaign. Must be >= 1. Supports decimal values (e.g., 1.5, 2.3). - `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. diff --git a/genesyscloud/outbound_campaign/genesyscloud_outbound_campaign_proxy.go b/genesyscloud/outbound_campaign/genesyscloud_outbound_campaign_proxy.go index ca50d827d..ec335fb58 100644 --- a/genesyscloud/outbound_campaign/genesyscloud_outbound_campaign_proxy.go +++ b/genesyscloud/outbound_campaign/genesyscloud_outbound_campaign_proxy.go @@ -140,7 +140,8 @@ func createOutboundCampaignFn(ctx context.Context, p *outboundCampaignProxy, out // Set resource context for SDK debug logging ctx = provider.EnsureResourceContext(ctx, ResourceType) - campaign, resp, err := p.outboundApi.PostOutboundCampaigns(*outboundCampaign, false) + // Use useMaxCallsPerAgentDecimal=true to support decimal values for max_calls_per_agent + campaign, resp, err := p.outboundApi.PostOutboundCampaigns(*outboundCampaign, true) if err != nil { return nil, resp, fmt.Errorf("failed to create campaign %s", err) } @@ -234,7 +235,8 @@ func updateOutboundCampaignFn(ctx context.Context, p *outboundCampaignProxy, id outboundCampaign.CampaignStatus = campaign.CampaignStatus } outboundCampaign.Version = campaign.Version - outboundCampaign, resp, err = p.outboundApi.PutOutboundCampaign(id, *outboundCampaign, false) + // Use useMaxCallsPerAgentDecimal=true to support decimal values for max_calls_per_agent + outboundCampaign, resp, err = p.outboundApi.PutOutboundCampaign(id, *outboundCampaign, true) if err != nil { return nil, resp, fmt.Errorf("failed to update campaign: %s", err) } diff --git a/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign.go b/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign.go index a7dd35b83..db11b225e 100644 --- a/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign.go +++ b/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign.go @@ -125,7 +125,14 @@ 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) + // Use MaxCallsPerAgentDecimal if available, fall back to MaxCallsPerAgent for backward compatibility + if campaign.MaxCallsPerAgentDecimal != nil { + resourcedata.SetNillableValue(d, "max_calls_per_agent", campaign.MaxCallsPerAgentDecimal) + } else if campaign.MaxCallsPerAgent != nil { + // Convert int to float64 for backward compatibility with existing campaigns + maxCallsFloat := float64(*campaign.MaxCallsPerAgent) + _ = d.Set("max_calls_per_agent", maxCallsFloat) + } if campaign.DncLists != nil { _ = d.Set("dnc_list_ids", util.SdkDomainEntityRefArrToSet(*campaign.DncLists)) } diff --git a/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_schema.go b/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_schema.go index d73f21d20..3f072e344 100644 --- a/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_schema.go +++ b/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_schema.go @@ -112,10 +112,10 @@ func ResourceOutboundCampaign() *schema.Resource { Type: schema.TypeFloat, }, `max_calls_per_agent`: { - Description: `The maximum number of calls that can be placed per agent on this campaign.`, + Description: `The maximum number of calls that can be placed per agent on this campaign. Must be >= 1. Supports decimal values (e.g., 1.5, 2.3).`, Optional: true, - Type: schema.TypeInt, - ValidateFunc: validation.IntAtLeast(1), + Type: schema.TypeFloat, + ValidateFunc: validation.FloatAtLeast(1), }, `dnc_list_ids`: { Description: `DncLists for this Campaign to check before placing a call.`, diff --git a/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_test.go b/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_test.go index e5a8223ad..1d86f0014 100644 --- a/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_test.go +++ b/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_test.go @@ -1200,6 +1200,44 @@ func TestAccResourceOutboundCampaignPower(t *testing.T) { "dynamic_line_balancing_settings.0.relative_weight", "15"), ), }, + { + // Update with decimal max_calls_per_agent value + Config: referencedResources + + generateOutboundCampaign( + resourceLabel, + name, + dialingMode, + strconv.Quote(callerName), + strconv.Quote(callerAddress), + "genesyscloud_outbound_contact_list."+contactListResourceLabel+".id", + util.NullValue, + util.NullValue, + strconv.Quote(scriptId), + "genesyscloud_routing_queue."+queueResourceLabel+".id", + "genesyscloud_telephony_providers_edges_site."+siteId+".id", + "1", + "1.5", + util.NullValue, + "genesyscloud_outbound_callanalysisresponseset."+carResourceLabel+".id", + util.NullValue, + util.NullValue, + util.NullValue, + util.NullValue, + util.NullValue, + util.NullValue, + []string{}, + []string{}, + []string{}, + []string{}, + strconv.Quote("true"), + generatePhoneColumnNoTypeBlock("Cell"), + generateDynamicLineBalancingSettingsBlock(util.TrueValue, "15"), + ), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourcePath, "name", name), + resource.TestCheckResourceAttr(resourcePath, "max_calls_per_agent", "1.5"), + ), + }, { // Import/Read ResourceName: resourcePath, diff --git a/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_utils.go b/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_utils.go index c76560e01..272f612b3 100644 --- a/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_utils.go +++ b/genesyscloud/outbound_campaign/resource_genesyscloud_outbound_campaign_utils.go @@ -37,7 +37,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) + maxCallsPerAgent := d.Get("max_calls_per_agent").(float64) skillColumns := lists.InterfaceListToStrings(d.Get("skill_columns").([]interface{})) autoAnswer := d.Get("auto_answer").(bool) @@ -99,8 +99,8 @@ func getOutboundCampaignFromResourceData(d *schema.ResourceData) platformclientv if priority != 0 { campaign.Priority = &priority } - if maxCallsPerAgent != 0 { - campaign.MaxCallsPerAgent = &maxCallsPerAgent + if maxCallsPerAgent >= 1 { + campaign.MaxCallsPerAgentDecimal = &maxCallsPerAgent } return campaign }