diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index 1cb31cd494..b0062fb02e 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -395,6 +395,7 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) { { name => "provisioning_voip_subscriber.pbx_extension", search => 1, title => $c->loc("Extension") }, { name => "provisioning_voip_subscriber.pbx_hunt_policy", search => 1, title => $c->loc("Hunt Policy") }, { name => "provisioning_voip_subscriber.pbx_hunt_timeout", search => 1, title => $c->loc("Hunt Timeout") }, + { name => "provisioning_voip_subscriber.pbx_hunt_cancel_mode", search => 1, title => $c->loc("Cancel Mode") }, ]); my $subscribers_rs = $c->model('DB')->resultset('voip_subscribers')->search({ contract_id => $contract_id, @@ -1465,6 +1466,7 @@ sub pbx_group_create :Chained('base') :PathPart('pbx/group/create') :Args(0) { $preferences->{cloud_pbx} = 1; $preferences->{cloud_pbx_hunt_policy} = $form->values->{pbx_hunt_policy}; $preferences->{cloud_pbx_hunt_timeout} = $form->values->{pbx_hunt_timeout}; + $preferences->{cloud_pbx_hunt_cancel_mode} = $form->values->{pbx_hunt_cancel_mode}; $preferences->{cloud_pbx_ext} = $form->values->{pbx_extension}; $preferences->{display_name} = ucfirst($form->values->{username}); my @events_to_create = (); @@ -1569,6 +1571,7 @@ sub pbx_group_edit :Chained('pbx_group_base') :PathPart('edit') :Args(0) { pbx_extension => $form->values->{pbx_extension}, pbx_hunt_policy => $form->values->{pbx_hunt_policy}, pbx_hunt_timeout => $form->values->{pbx_hunt_timeout}, + pbx_hunt_cancel_mode => $form->values->{pbx_hunt_cancel_mode}, }); NGCP::Panel::Utils::Subscriber::update_preferences( c => $c, @@ -1576,6 +1579,7 @@ sub pbx_group_edit :Chained('pbx_group_base') :PathPart('edit') :Args(0) { 'preferences' => { cloud_pbx_hunt_policy => $form->values->{pbx_hunt_policy}, cloud_pbx_hunt_timeout => $form->values->{pbx_hunt_timeout}, + cloud_pbx_hunt_cancel_mode => $form->values->{pbx_hunt_cancel_mode}, } ); my $e164; diff --git a/lib/NGCP/Panel/Form/Customer/PbxGroup.pm b/lib/NGCP/Panel/Form/Customer/PbxGroup.pm index 97236259ee..860ca00619 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxGroup.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxGroup.pm @@ -12,7 +12,7 @@ has_field 'username' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/username pbx_extension pbx_hunt_policy pbx_hunt_timeout/], + render_list => [qw/username pbx_extension pbx_hunt_policy pbx_hunt_timeout pbx_hunt_cancel_mode/], ); sub validate_username { diff --git a/lib/NGCP/Panel/Form/Customer/PbxGroupBase.pm b/lib/NGCP/Panel/Form/Customer/PbxGroupBase.pm index 5befa2b10f..c0a190d2d0 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxGroupBase.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxGroupBase.pm @@ -38,6 +38,17 @@ has_field 'pbx_hunt_timeout' => ( default => 10, ); +has_field 'pbx_hunt_cancel_mode' => ( + type => 'Select', + required => 1, + label => 'Cancel Mode', + options => [ + { label => 'Using Bye', value => 'bye' }, + { label => 'Using Cancel', value => 'cancel' }, + ], + default => 'cancel', +); + has_field 'save' => ( type => 'Submit', value => 'Save', @@ -48,7 +59,7 @@ has_field 'save' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/pbx_extension pbx_hunt_policy pbx_hunt_timeout/], + render_list => [qw/pbx_extension pbx_hunt_policy pbx_hunt_timeout pbx_hunt_cancel_mode/], ); has_block 'actions' => ( diff --git a/lib/NGCP/Panel/Form/Customer/PbxGroupEdit.pm b/lib/NGCP/Panel/Form/Customer/PbxGroupEdit.pm index cf7f012839..9ea9814ea6 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxGroupEdit.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxGroupEdit.pm @@ -24,7 +24,7 @@ has_field 'alias_number_add' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/pbx_extension pbx_hunt_policy pbx_hunt_timeout alias_number alias_number_add/], + render_list => [qw/pbx_extension pbx_hunt_policy pbx_hunt_timeout pbx_hunt_cancel_mode alias_number alias_number_add/], ); 1; diff --git a/lib/NGCP/Panel/Form/Customer/PbxGroupEditSubadmin.pm b/lib/NGCP/Panel/Form/Customer/PbxGroupEditSubadmin.pm index a05ad6b4af..cc5bd819dd 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxGroupEditSubadmin.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxGroupEditSubadmin.pm @@ -18,7 +18,7 @@ has_field 'alias_select' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/pbx_extension pbx_hunt_policy pbx_hunt_timeout alias_select/], + render_list => [qw/pbx_extension pbx_hunt_policy pbx_hunt_timeout pbx_hunt_cancel_mode alias_select/], ); sub update_fields { diff --git a/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm b/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm index 71ebaeb603..9574eca1ae 100644 --- a/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm +++ b/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm @@ -123,7 +123,6 @@ has_field 'pbx_hunt_policy' => ( title => ["Hunting policy, one of serial, parallel, random, circular."], }, ); - has_field 'pbx_hunt_timeout' => ( type => '+NGCP::Panel::Field::PosInteger', element_attr => { @@ -131,6 +130,18 @@ has_field 'pbx_hunt_timeout' => ( title => ['Hunting Timeout'], }, ); +has_field 'pbx_hunt_cancel_mode' => ( + type => 'Select', + options => [ + { value => 'bye', label => 'bye'}, + { value => 'cancel', label => 'cancel'}, + ], + element_attr => { + rel => ['tooltip'], + title => ["Termination mode for call legs in the early dialog stage. Can be: bye or cancel."], + }, +); + has_field 'cloud_pbx_hunt_policy' => ( type => 'Select', options => [ @@ -144,7 +155,6 @@ has_field 'cloud_pbx_hunt_policy' => ( title => ["Hunting policy, one of serial, parallel, random, circular."], }, ); - has_field 'cloud_pbx_hunt_timeout' => ( type => '+NGCP::Panel::Field::PosInteger', element_attr => { @@ -152,6 +162,17 @@ has_field 'cloud_pbx_hunt_timeout' => ( title => ['Hunting Timeout'], }, ); +has_field 'cloud_pbx_hunt_cancel_mode' => ( + type => 'Select', + options => [ + { value => 'bye', label => 'bye'}, + { value => 'cancel', label => 'cancel'}, + ], + element_attr => { + rel => ['tooltip'], + title => ["Termination mode for call legs in the early dialog stage. Can be: bye or cancel."], + }, +); has_field 'profile' => ( type => '+NGCP::Panel::Field::SubscriberProfile', diff --git a/lib/NGCP/Panel/Form/Subscriber/SubscriberSubAdminAPI.pm b/lib/NGCP/Panel/Form/Subscriber/SubscriberSubAdminAPI.pm index b9796b49e9..eb9524ce59 100644 --- a/lib/NGCP/Panel/Form/Subscriber/SubscriberSubAdminAPI.pm +++ b/lib/NGCP/Panel/Form/Subscriber/SubscriberSubAdminAPI.pm @@ -252,6 +252,18 @@ has_field 'pbx_hunt_policy' => ( }, ); +has_field 'pbx_hunt_cancel_mode' => ( + type => 'Select', + options => [ + { value => 'bye', label => 'bye'}, + { value => 'cancel', label => 'cancel'}, + ], + element_attr => { + rel => ['tooltip'], + title => ["Termination mode for call legs in the early dialog stage. Can be: bye or cancel."], + }, +); + has_field 'pbx_hunt_timeout' => ( type => '+NGCP::Panel::Field::PosInteger', element_attr => { @@ -274,6 +286,18 @@ has_field 'cloud_pbx_hunt_policy' => ( }, ); +has_field 'cloud_pbx_hunt_cancel_mode' => ( + type => 'Select', + options => [ + { value => 'bye', label => 'bye'}, + { value => 'cancel', label => 'cancel'}, + ], + element_attr => { + rel => ['tooltip'], + title => ["Termination mode for call legs in the early dialog stage. Can be: bye or cancel."], + }, +); + has_field 'cloud_pbx_hunt_timeout' => ( type => '+NGCP::Panel::Field::PosInteger', element_attr => { diff --git a/lib/NGCP/Panel/Role/API/Subscribers.pm b/lib/NGCP/Panel/Role/API/Subscribers.pm index f0c4e871ac..1405af0649 100644 --- a/lib/NGCP/Panel/Role/API/Subscribers.pm +++ b/lib/NGCP/Panel/Role/API/Subscribers.pm @@ -67,6 +67,8 @@ sub resource_from_item { delete $resource{cloud_pbx_hunt_policy}; delete $resource{pbx_hunt_timeout}; delete $resource{cloud_pbx_hunt_timeout}; + delete $resource{pbx_hunt_cancel_mode}; + delete $resource{cloud_pbx_hunt_cancel_mode}; } delete $resource{contact_id}; if($item->contact) { @@ -540,12 +542,14 @@ sub update_item { if(is_true($resource->{is_pbx_group})) { $provisioning_res->{pbx_hunt_policy} = $resource->{pbx_hunt_policy}; $provisioning_res->{pbx_hunt_timeout} = $resource->{pbx_hunt_timeout}; + $provisioning_res->{pbx_hunt_cancel_mode} = $resource->{pbx_hunt_cancel_mode}; NGCP::Panel::Utils::Subscriber::update_preferences( c => $c, prov_subscriber => $prov_subscriber, 'preferences' => { cloud_pbx_hunt_policy => $resource->{cloud_pbx_hunt_policy} // $resource->{pbx_hunt_policy}, - cloud_pbx_hunt_timeout => $resource->{cloud_pbx_hunt_policy} // $resource->{pbx_hunt_timeout}, + cloud_pbx_hunt_timeout => $resource->{cloud_pbx_hunt_timeout} // $resource->{pbx_hunt_timeout}, + cloud_pbx_hunt_cancel_mode => $resource->{cloud_pbx_hunt_cancel_mode} // $resource->{pbx_hunt_cancel_mode}, } ); } diff --git a/lib/NGCP/Panel/Utils/DbStrings.pm b/lib/NGCP/Panel/Utils/DbStrings.pm index 32b7bfd83b..c72c7aadc7 100644 --- a/lib/NGCP/Panel/Utils/DbStrings.pm +++ b/lib/NGCP/Panel/Utils/DbStrings.pm @@ -170,6 +170,8 @@ sub localize { $c->loc('The hunting policy for PBX hunt groups.'); $c->loc('CloudPBX Hunt Timeout'); $c->loc('The timeout for hunting in PBX hunt groups.'); + $c->loc('CloudPBX Cancel Mode'); + $c->loc('This is a termination mode for call legs in the early dialog stage. Can be: bye or cancel.'); $c->loc('CloudPBX Hunt Group List'); $c->loc('The members (as SIP URIs) of the PBX hunt group.'); $c->loc('CLI of CloudPBX Pilot Subscriber'); diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 96cdc6216f..184e9604b6 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -418,7 +418,7 @@ sub prepare_resource { my $preferences = {}; my $admin = 0; unless($customer->product->class eq 'pbxaccount') { - for my $pref(qw/is_pbx_group pbx_extension pbx_hunt_policy pbx_hunt_timeout is_pbx_pilot/) { + for my $pref(qw/is_pbx_group pbx_extension pbx_hunt_policy pbx_hunt_timeout pbx_hunt_cancel_mode is_pbx_pilot/) { delete $resource->{$pref}; } $admin = $resource->{admin} // 0; @@ -510,8 +510,10 @@ sub prepare_resource { if(is_true($resource->{is_pbx_group})) { $preferences->{cloud_pbx_hunt_policy} = $resource->{cloud_pbx_hunt_policy}; $preferences->{cloud_pbx_hunt_timeout} = $resource->{cloud_pbx_hunt_timeout}; + $preferences->{cloud_pbx_hunt_cancel_mode} = $resource->{pbx_hunt_cancel_mode}; $preferences->{cloud_pbx_hunt_policy} //= $resource->{pbx_hunt_policy}; $preferences->{cloud_pbx_hunt_timeout} //= $resource->{pbx_hunt_timeout}; + $preferences->{cloud_pbx_hunt_cancel_mode} //= $resource->{pbx_hunt_cancel_mode}; } $preferences->{cloud_pbx_ext} = $resource->{pbx_extension}; $preferences->{shared_buddylist_visibility} = 1; @@ -709,6 +711,7 @@ sub create_subscriber { pbx_extension => $params->{pbx_extension}, pbx_hunt_policy => $params->{pbx_hunt_policy}, pbx_hunt_timeout => $params->{pbx_hunt_timeout}, + pbx_hunt_cancel_mode => $params->{pbx_hunt_cancel_mode}, profile_set_id => $profile_set ? $profile_set->id : undef, profile_id => $profile ? $profile->id : undef, create_timestamp => NGCP::Panel::Utils::DateTime::current_local, diff --git a/share/templates/subscriber/master.tt b/share/templates/subscriber/master.tt index 3b673b7ca9..ad1c691249 100644 --- a/share/templates/subscriber/master.tt +++ b/share/templates/subscriber/master.tt @@ -160,6 +160,12 @@ [% subscriber.provisioning_voip_subscriber.pbx_hunt_timeout %] + + [% c.loc('Cancel Mode') %] + + [% subscriber.provisioning_voip_subscriber.pbx_hunt_cancel_mode %] + + [% END -%] diff --git a/t/api-rest/api-subscribers.t b/t/api-rest/api-subscribers.t index 52c9c8c1a7..2271f9395a 100644 --- a/t/api-rest/api-subscribers.t +++ b/t/api-rest/api-subscribers.t @@ -52,6 +52,7 @@ $fake_data->set_data_from_script({ status => 'active', pbx_hunt_policy => 'parallel', pbx_hunt_timeout => '15', + pbx_hunt_cancel_mode => 'cancel', }, 'query' => [['username',{'query_type'=> 'string_like'}]], 'create_special'=> sub { diff --git a/t/api-rest2/Subscribers.yaml b/t/api-rest2/Subscribers.yaml index 6c68eb950f..880b3c3d32 100644 --- a/t/api-rest2/Subscribers.yaml +++ b/t/api-rest2/Subscribers.yaml @@ -183,6 +183,7 @@ status: 'active' pbx_hunt_policy: 'parallel' pbx_hunt_timeout: '15' + pbx_hunt_cancel_mode: 'cancel' retain: subscriber_path1: header.location conditions: @@ -232,6 +233,7 @@ status: 'active' pbx_hunt_policy: 'parallel' pbx_hunt_timeout: '15' + pbx_hunt_cancel_mode: 'cancel' retain: subscriber_path2: header.location conditions: @@ -277,6 +279,7 @@ status: 'active' pbx_hunt_policy: 'parallel' pbx_hunt_timeout: '15' + pbx_hunt_cancel_mode: 'cancel' conditions: is: code: 422