diff --git a/lib/NGCP/Panel/Controller/API/NcosLevels.pm b/lib/NGCP/Panel/Controller/API/NcosLevels.pm index 7e36fdc80f..4b50e48531 100644 --- a/lib/NGCP/Panel/Controller/API/NcosLevels.pm +++ b/lib/NGCP/Panel/Controller/API/NcosLevels.pm @@ -60,7 +60,11 @@ sub relation{ } __PACKAGE__->set_config({ - allowed_roles => [qw/admin reseller/], + allowed_roles => { + Default => [qw/admin reseller/], + Journal => [qw/admin reseller/], + GET => [qw/admin reseller subscriberadmin/], + }, }); sub GET :Allow { diff --git a/lib/NGCP/Panel/Controller/API/NcosLevelsItem.pm b/lib/NGCP/Panel/Controller/API/NcosLevelsItem.pm index 4bc845b9d8..f8f36dd558 100644 --- a/lib/NGCP/Panel/Controller/API/NcosLevelsItem.pm +++ b/lib/NGCP/Panel/Controller/API/NcosLevelsItem.pm @@ -30,7 +30,11 @@ sub relation{ } __PACKAGE__->set_config({ - allowed_roles => [qw/admin reseller/], + allowed_roles => { + Default => [qw/admin reseller/], + Journal => [qw/admin reseller/], + GET => [qw/admin reseller subscriberadmin/], + }, }); sub GET :Allow { diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index 0f9c05636b..1cb31cd494 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -2483,15 +2483,19 @@ sub load_preference_list :Private { my $reseller_id = $c->stash->{contract}->contact->reseller_id; - my $ncos_levels_rs = $c->model('DB') - ->resultset('ncos_levels') - ->search_rs({ reseller_id => $reseller_id, }); + my $ncos_levels_rs = $c->model('DB')->resultset('ncos_levels')->search_rs({ + reseller_id => $reseller_id, + $c->user->roles eq 'subscriberadmin' ? (expose_to_customer => 1) : () + }); + $c->stash(ncos_levels_rs => $ncos_levels_rs, ncos_levels => [$ncos_levels_rs->all]); - my $ncos_sets_rs = $c->model('DB') - ->resultset('ncos_sets') - ->search_rs({ reseller_id => $reseller_id, }); + my $ncos_sets_rs = $c->model('DB')->resultset('ncos_sets')->search_rs({ + reseller_id => $reseller_id, + $c->user->roles eq 'subscriberadmin' ? (expose_to_customer => 1) : () + }); + $c->stash(ncos_sets_rs => $ncos_sets_rs, ncos_sets => [$ncos_sets_rs->all]); diff --git a/lib/NGCP/Panel/Controller/NCOS.pm b/lib/NGCP/Panel/Controller/NCOS.pm index 6c92e86cca..29afda26d4 100644 --- a/lib/NGCP/Panel/Controller/NCOS.pm +++ b/lib/NGCP/Panel/Controller/NCOS.pm @@ -9,6 +9,7 @@ use NGCP::Panel::Form; use NGCP::Panel::Utils::Message; use NGCP::Panel::Utils::Navigation; use NGCP::Panel::Utils::Datatables; +use NGCP::Panel::Utils::NCOS; sub auto :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) { my ($self, $c) = @_; @@ -31,6 +32,7 @@ sub levels_list :Chained('/') :PathPart('ncos') :CaptureArgs(0) { { name => 'mode', search => 1, title => $c->loc('Mode') }, { name => 'timeset.name', search => 1, title => $c->loc('Timeset') }, { name => 'description', search => 1, title => $c->loc('Description') }, + { name => 'expose_to_customer', search => 1, title => $c->loc('Expose to Customer') }, ]); $c->stash(template => 'ncos/list.tt'); @@ -122,6 +124,8 @@ sub edit :Chained('base') :PathPart('edit') { ); if($posted && $form->validated) { try { + my $old_expose_to_customer = $level->expose_to_customer; + my $expose_to_customer = $form->values->{expose_to_customer}; $form->values->{reseller_id} = $form->values->{reseller}{id}; delete $form->values->{reseller}; $form->values->{time_set_id} = $form->values->{timeset}{id}; @@ -134,6 +138,9 @@ sub edit :Chained('base') :PathPart('edit') { } } $level->update($form->values); + if ($old_expose_to_customer && !$expose_to_customer) { + NGCP::Panel::Utils::NCOS::revoke_exposed_ncos_level($c, $level->id); + } delete $c->session->{created_objects}->{reseller}; NGCP::Panel::Utils::Message::info( c => $c, diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index 1e004a32c1..8af834f2fc 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -2634,13 +2634,19 @@ sub load_preference_list :Private { hdr_sets_rs => $header_rule_sets_rs, hdr_sets => [$header_rule_sets_rs->all]); - my $ncos_levels_rs = $c->model('DB') - ->resultset('ncos_levels')->search({ reseller_id => $reseller_id }); + my $ncos_levels_rs = $c->model('DB')->resultset('ncos_levels')->search({ + reseller_id => $reseller_id, + $c->user->roles eq 'subscriberadmin' ? (expose_to_customer => 1) : () + }); + $c->stash(ncos_levels_rs => $ncos_levels_rs, ncos_levels => [$ncos_levels_rs->all]); - my $ncos_sets_rs = $c->model('DB') - ->resultset('ncos_sets')->search_rs({ reseller_id => $reseller_id, }); + my $ncos_sets_rs = $c->model('DB')->resultset('ncos_sets')->search_rs({ + reseller_id => $reseller_id, + $c->user->roles eq 'subscriberadmin' ? (expose_to_customer => 1) : () + }); + $c->stash(ncos_sets_rs => $ncos_sets_rs, ncos_sets => [$ncos_sets_rs->all]); diff --git a/lib/NGCP/Panel/Form/NCOS/AdminLevel.pm b/lib/NGCP/Panel/Form/NCOS/AdminLevel.pm index 565b5fe341..16f82525a8 100644 --- a/lib/NGCP/Panel/Form/NCOS/AdminLevel.pm +++ b/lib/NGCP/Panel/Form/NCOS/AdminLevel.pm @@ -11,7 +11,7 @@ has_field 'reseller' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/reseller level mode description timeset/], + render_list => [qw/reseller level mode description timeset expose_to_customer/], ); has_block 'actions' => ( diff --git a/lib/NGCP/Panel/Form/NCOS/ResellerLevel.pm b/lib/NGCP/Panel/Form/NCOS/ResellerLevel.pm index 21c5cc33bb..310069ff29 100644 --- a/lib/NGCP/Panel/Form/NCOS/ResellerLevel.pm +++ b/lib/NGCP/Panel/Form/NCOS/ResellerLevel.pm @@ -34,6 +34,15 @@ has_field 'timeset' => ( type => '+NGCP::Panel::Field::TimeSet', ); +has_field 'expose_to_customer' => ( + type => 'Boolean', + label => 'Expose to Customer', + element_attr => { + rel => ['tooltip'], + title => ['Customers can see and use this NCOS Level in their preferences'] + }, +); + has_field 'save' => ( type => 'Submit', value => 'Save', @@ -44,7 +53,7 @@ has_field 'save' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/level mode description timeset/], + render_list => [qw/level mode description timeset expose_to_customer/], ); has_block 'actions' => ( diff --git a/lib/NGCP/Panel/Form/NCOS/ResellerLevelAPI.pm b/lib/NGCP/Panel/Form/NCOS/ResellerLevelAPI.pm index 2352be0214..841c033474 100644 --- a/lib/NGCP/Panel/Form/NCOS/ResellerLevelAPI.pm +++ b/lib/NGCP/Panel/Form/NCOS/ResellerLevelAPI.pm @@ -69,6 +69,15 @@ has_field 'time_set_id' => ( }, ); +has_field 'expose_to_customer' => ( + type => 'Boolean', + label => 'Expose to Customer', + element_attr => { + rel => ['tooltip'], + title => ['Customers can see and use this NCOS Level in their preferences'] + }, +); + 1; # vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Form/NCOS/SubAdminLevelAPI.pm b/lib/NGCP/Panel/Form/NCOS/SubAdminLevelAPI.pm new file mode 100644 index 0000000000..e38aed45a9 --- /dev/null +++ b/lib/NGCP/Panel/Form/NCOS/SubAdminLevelAPI.pm @@ -0,0 +1,34 @@ +package NGCP::Panel::Form::NCOS::SubAdminLevelAPI; + +use HTML::FormHandler::Moose; +extends 'HTML::FormHandler'; + +use HTML::FormHandler::Widget::Block::Bootstrap; + +has '+widget_wrapper' => ( default => 'Bootstrap' ); +has_field 'submitid' => ( type => 'Hidden' ); +sub build_render_list {[qw/submitid fields actions/]} +sub build_form_element_class {[qw(form-horizontal)]} + +has_field 'level' => ( + type => 'Text', + label => 'Level Name', + required => 1, + element_attr => { + rel => ['tooltip'], + title => ['The level name'] + }, +); + +has_field 'description' => ( + type => 'Text', + required => 0, + element_attr => { + rel => ['tooltip'], + title => ['The description of the level'] + }, +); + +1; + +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Role/API/NcosLevels.pm b/lib/NGCP/Panel/Role/API/NcosLevels.pm index 770781d5aa..1fc9d61ce9 100644 --- a/lib/NGCP/Panel/Role/API/NcosLevels.pm +++ b/lib/NGCP/Panel/Role/API/NcosLevels.pm @@ -10,6 +10,7 @@ use boolean qw(true); use Data::HAL qw(); use Data::HAL::Link qw(); use HTTP::Status qw(:constants); +use NGCP::Panel::Utils::NCOS; sub _item_rs { my ($self, $c) = @_; @@ -18,6 +19,12 @@ sub _item_rs { if($c->user->roles eq "admin") { } elsif($c->user->roles eq "reseller") { $item_rs = $item_rs->search({ reseller_id => $c->user->reseller_id }); + } elsif($c->user->roles eq "subscriberadmin") { + my $contract = $c->model('DB')->resultset('contracts')->find($c->user->account_id); + $item_rs = $item_rs->search({ + reseller_id => $contract->contact->reseller_id, + expose_to_customer => 1 + }); } return $item_rs; } @@ -28,6 +35,8 @@ sub get_form { return NGCP::Panel::Form::get("NGCP::Panel::Form::NCOS::AdminLevelAPI", $c); } elsif($c->user->roles eq "reseller") { return NGCP::Panel::Form::get("NGCP::Panel::Form::NCOS::ResellerLevelAPI", $c); + } elsif($c->user->roles eq "subscriberadmin") { + return NGCP::Panel::Form::get("NGCP::Panel::Form::NCOS::SubAdminLevelAPI", $c); } } @@ -113,6 +122,10 @@ sub update_item { $item->update($resource); + if ($old_resource->{expose_to_customer} && !$resource->{expose_to_customer}) { + NGCP::Panel::Utils::NCOS::revoke_exposed_ncos_level($c, $item->id); + } + return $item; } diff --git a/lib/NGCP/Panel/Utils/NCOS.pm b/lib/NGCP/Panel/Utils/NCOS.pm new file mode 100644 index 0000000000..f851e1c49f --- /dev/null +++ b/lib/NGCP/Panel/Utils/NCOS.pm @@ -0,0 +1,30 @@ +package NGCP::Panel::Utils::NCOS; +use strict; +use warnings; + +use English; +use NGCP::Panel::Utils::Preferences; + +sub revoke_exposed_ncos_level { + my ($c, $ncos_level_id) = @_; + + my $used_contract_prefs_rs = $c->model('DB')->resultset('voip_contract_preferences')->search({ + 'attribute.attribute' => 'ncos_id', + value => $ncos_level_id, + },{ + join => 'attribute', + }); + $used_contract_prefs_rs->delete; + + my $used_subscriber_prefs_rs = $c->model('DB')->resultset('voip_usr_preferences')->search({ + 'attribute.attribute' => 'ncos_id', + value => $ncos_level_id, + },{ + join => 'attribute', + }); + $used_subscriber_prefs_rs->delete; +} + +1; + +# vim: set tabstop=4 expandtab: