parent
							
								
									be983fb9dd
								
							
						
					
					
						commit
						601ada23bd
					
				| @ -0,0 +1,247 @@ | ||||
| package NGCP::Panel::Controller::NumberBlock; | ||||
| use Sipwise::Base; | ||||
| 
 | ||||
| BEGIN { extends 'Catalyst::Controller'; } | ||||
| 
 | ||||
| use JSON qw(decode_json encode_json); | ||||
| use NGCP::Panel::Form::NumberBlock::BlockAdmin; | ||||
| use NGCP::Panel::Form::NumberBlock::BlockReseller; | ||||
| use NGCP::Panel::Utils::Message; | ||||
| use NGCP::Panel::Utils::Navigation; | ||||
| 
 | ||||
| sub auto { | ||||
|     my ($self, $c) = @_; | ||||
|     $c->log->debug(__PACKAGE__ . '::auto'); | ||||
|     NGCP::Panel::Utils::Navigation::check_redirect_chain(c => $c); | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| sub block_list :Chained('/') :PathPart('numberblock') :CaptureArgs(0) { | ||||
|     my ( $self, $c ) = @_; | ||||
| 
 | ||||
|     $c->stash->{block_rs} = $c->model('DB')->resultset('voip_number_blocks'); | ||||
|     if($c->user->roles eq "admin") { | ||||
|     } elsif($c->user->roles eq "reseller") { | ||||
|         $c->stash->{block_rs} = $c->stash->{block_rs}->search({ | ||||
|             'voip_number_block_resellers.reseller_id' => $c->user->reseller_id | ||||
|         },{ | ||||
|             join => 'voip_number_block_resellers', | ||||
|         }); | ||||
|     } else { | ||||
|         $c->stash->{block_rs} = $c->stash->{block_rs}->search({ | ||||
|             'voip_number_block_resellers.reseller_id' => $c->user->voip_subscriber->contract->contact->reseller_id, | ||||
|         },{ | ||||
|             join => 'voip_number_block_resellers', | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     $c->stash->{block_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ | ||||
|         { name => 'id', search => 1, title => $c->loc('#') }, | ||||
|         { name => 'cc', search => 1, title => $c->loc('Country Code') }, | ||||
|         { name => 'ac', search => 1, title => $c->loc('Area Code') }, | ||||
|         { name => 'sn_prefix', search => 1, title => $c->loc('SN Prefix') }, | ||||
|         { name => 'sn_length', search => 1, title => $c->loc('SN Length') }, | ||||
|         { name => 'allocable', search => 1, title => $c->loc('Allocable?') }, | ||||
|     ]); | ||||
|      | ||||
|     $c->stash(template => 'numberblock/block_list.tt'); | ||||
| } | ||||
| 
 | ||||
| sub block_root :Chained('block_list') :PathPart('') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) { | ||||
|     my ($self, $c) = @_; | ||||
| } | ||||
| 
 | ||||
| sub block_ajax :Chained('block_list') :PathPart('ajax') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) { | ||||
|     my ($self, $c) = @_; | ||||
|     my $rs = $c->stash->{block_rs}; | ||||
|     NGCP::Panel::Utils::Datatables::process($c, $rs, $c->stash->{block_dt_columns}); | ||||
|     $c->detach( $c->view("JSON") ); | ||||
| } | ||||
| 
 | ||||
| sub block_base :Chained('block_list') :PathPart('') :CaptureArgs(1) { | ||||
|     my ($self, $c, $block_id) = @_; | ||||
| 
 | ||||
|     unless($block_id && $block_id->is_integer) { | ||||
|         NGCP::Panel::Utils::Message->error( | ||||
|             c     => $c, | ||||
|             log   => 'Invalid number block id detected', | ||||
|             desc  => $c->loc('Invalid number block id detected'), | ||||
|         ); | ||||
|         NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/numberblock')); | ||||
|     } | ||||
| 
 | ||||
|     my $res = $c->stash->{block_rs}->find($block_id); | ||||
|     unless(defined($res)) { | ||||
|         NGCP::Panel::Utils::Message->error( | ||||
|             c     => $c, | ||||
|             log   => 'Number block does not exist', | ||||
|             desc  => $c->loc('Number block does not exist'), | ||||
|         ); | ||||
|         NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/numberblock')); | ||||
|     } | ||||
|     $c->stash(block => $res); | ||||
| } | ||||
| 
 | ||||
| sub block_create :Chained('block_list') :PathPart('create') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) { | ||||
|     my ($self, $c) = @_; | ||||
| 
 | ||||
|     my $posted = ($c->request->method eq 'POST'); | ||||
|     my $params = {}; | ||||
|     $params = $params->merge($c->session->{created_objects}); | ||||
|     $params->{reseller_list} = ""; | ||||
| 
 | ||||
|     my $form; | ||||
|     if($c->user->roles eq "admin") { | ||||
|         $form = NGCP::Panel::Form::NumberBlock::BlockAdmin->new(ctx => $c); | ||||
|     } else { | ||||
|         $form = NGCP::Panel::Form::NumberBlock::BlockReseller->new(ctx => $c); | ||||
|     } | ||||
|     $form->process( | ||||
|         posted => $posted, | ||||
|         params => $c->request->params, | ||||
|         item   => $params, | ||||
|     ); | ||||
|     NGCP::Panel::Utils::Navigation::check_form_buttons( | ||||
|         c => $c, | ||||
|         form => $form, | ||||
|         fields => { | ||||
|             'reseller.create' => $c->uri_for('/reseller/create'), | ||||
|         }, | ||||
|         back_uri => $c->req->uri, | ||||
|     ); | ||||
|     if($posted && $form->validated) { | ||||
|         try { | ||||
|             my $schema = $c->model('DB'); | ||||
|             $schema->txn_do(sub { | ||||
|                 my $reseller_list = decode_json($form->value->{reseller_list}), | ||||
|                 delete $form->values->{reseller_list}; | ||||
|                 $form->values->{authoritative} = 1; # agranig: hardcode for now, not sure of the purpose | ||||
| 
 | ||||
|                 my $values = $form->values; | ||||
|                 my $num = delete $values->{e164}; | ||||
|                 $num->{sn_prefix} = delete $num->{snbase}; | ||||
|                 $num->{sn_length} = delete $num->{snlength}; | ||||
|                 $num->{ac} //= ''; | ||||
|                 $values = $values->merge($num); | ||||
| 
 | ||||
|                 my $block = $c->stash->{block_rs}->create($values); | ||||
|                 foreach my $r(@{ $reseller_list }) { | ||||
|                     $block->voip_number_block_resellers->create({ | ||||
|                         reseller_id => $r,  | ||||
|                     }); | ||||
|                 } | ||||
|                | ||||
|                 delete $c->session->{created_objects}->{reseller}; | ||||
|             }); | ||||
|             $c->flash(messages => [{type => 'success', text => $c->loc('Number block successfully created')}]); | ||||
|         } catch($e) { | ||||
|             NGCP::Panel::Utils::Message->error( | ||||
|                 c => $c, | ||||
|                 error => $e, | ||||
|                 desc  => $c->loc('Failed to create number block.'), | ||||
|             ); | ||||
|         } | ||||
|         NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/numberblock')); | ||||
|     } | ||||
| 
 | ||||
|     $c->stash(form => $form); | ||||
|     $c->stash(create_flag => 1); | ||||
| } | ||||
| 
 | ||||
| sub block_edit :Chained('block_base') :PathPart('edit') :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) { | ||||
|     my ($self, $c) = @_; | ||||
| 
 | ||||
|     my $block = $c->stash->{block}; | ||||
|     my $posted = ($c->request->method eq 'POST'); | ||||
|     my $params = { $block->get_inflated_columns }; | ||||
|     $params->{e164}{cc} = delete $params->{ac}; | ||||
|     $params->{e164}{ac} = delete $params->{cc}; | ||||
|     $params->{e164}{snbase} = delete $params->{sn_prefix}; | ||||
|     $params->{e164}{snlength} = delete $params->{sn_length}; | ||||
|     $params = $params->merge($c->session->{created_objects}); | ||||
|     my @resellers = $block->search_related('voip_number_block_resellers')->get_column('reseller_id')->all; | ||||
|     $params->{reseller_list} = encode_json(\@resellers); | ||||
| 
 | ||||
|     my $form; | ||||
|     if($c->user->roles eq "admin") { | ||||
|         $form = NGCP::Panel::Form::NumberBlock::BlockAdmin->new(ctx => $c); | ||||
|     } else { | ||||
|         $form = NGCP::Panel::Form::NumberBlock::BlockReseller->new(ctx => $c); | ||||
|     } | ||||
|     $form->process( | ||||
|         posted => $posted, | ||||
|         params => $c->request->params, | ||||
|         item   => $params, | ||||
|     ); | ||||
|     NGCP::Panel::Utils::Navigation::check_form_buttons( | ||||
|         c => $c, | ||||
|         form => $form, | ||||
|         fields => { | ||||
|             'reseller.create' => $c->uri_for('/reseller/create'), | ||||
|         }, | ||||
|         back_uri => $c->req->uri, | ||||
|     ); | ||||
|     if($posted && $form->validated) { | ||||
|         try { | ||||
|             my $schema = $c->model('DB'); | ||||
|             $schema->txn_do(sub { | ||||
|                 my $reseller_list = decode_json($form->value->{reseller_list}), | ||||
|                 delete $form->value->{reseller_list}; | ||||
|                 my $values = $form->values; | ||||
|                 my $num = delete $values->{e164}; | ||||
|                 $num->{sn_prefix} = delete $num->{snbase}; | ||||
|                 $num->{sn_length} = delete $num->{snlength}; | ||||
|                 $num->{ac} //= ''; | ||||
|                 $values = $values->merge($num); | ||||
| 
 | ||||
|                 $block->update($values); | ||||
|                 $block->search_related('voip_number_block_resellers')->delete; | ||||
|                 for my $r(@{ $reseller_list }) { | ||||
|                     $block->search_related('voip_number_block_resellers')->create({ | ||||
|                         reseller_id => $r, | ||||
|                     }); | ||||
|                 } | ||||
|                | ||||
|                 delete $c->session->{created_objects}->{reseller}; | ||||
|             }); | ||||
|             $c->flash(messages => [{type => 'success', text => $c->loc('Number block successfully updated')}]); | ||||
|         } catch($e) { | ||||
|             NGCP::Panel::Utils::Message->error( | ||||
|                 c => $c, | ||||
|                 error => $e, | ||||
|                 desc  => $c->loc('Failed to update number block.'), | ||||
|             ); | ||||
|         } | ||||
|         NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/numberblock')); | ||||
|     } | ||||
| 
 | ||||
|     $c->stash(form => $form); | ||||
|     $c->stash(edit_flag => 1); | ||||
| } | ||||
| 
 | ||||
| sub block_delete :Chained('block_base') :PathPart('delete') :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) { | ||||
|     my ($self, $c) = @_; | ||||
| 
 | ||||
|      | ||||
|     try { | ||||
|         my $schema = $c->model('DB'); | ||||
|         $schema->txn_do(sub{ | ||||
|             $c->stash->{block}->search_related('voip_number_block_resellers')->delete; | ||||
|             $c->stash->{block}->delete; | ||||
|         }); | ||||
|         $c->flash(messages => [{type => 'success', text => $c->loc('Number block successfully deleted')}]); | ||||
|     } catch($e) { | ||||
|         NGCP::Panel::Utils::Message->error( | ||||
|             c => $c, | ||||
|             error => $e, | ||||
|             desc  => $c->loc('Failed to delete number block.'), | ||||
|         ); | ||||
|     } | ||||
|     NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/numberblock')); | ||||
| } | ||||
| 
 | ||||
| __PACKAGE__->meta->make_immutable; | ||||
| 
 | ||||
| 1; | ||||
| 
 | ||||
| # vim: set tabstop=4 expandtab: | ||||
| @ -0,0 +1,27 @@ | ||||
| package NGCP::Panel::Form::NumberBlock::BlockAdmin; | ||||
| 
 | ||||
| use HTML::FormHandler::Moose; | ||||
| extends 'NGCP::Panel::Form::NumberBlock::BlockReseller'; | ||||
| use Moose::Util::TypeConstraints; | ||||
| 
 | ||||
| has_field 'reseller_list' => ( | ||||
|     type => '+NGCP::Panel::Field::DataTable', | ||||
|     label => 'Resellers', | ||||
|     do_label => 0, | ||||
|     do_wrapper => 0, | ||||
|     required => 0, | ||||
|     template => 'helpers/datatables_multifield.tt', | ||||
|     ajax_src => '/reseller/ajax', | ||||
|     table_titles => ['#', 'Reseller'], | ||||
|     table_fields => ['id', 'name'], | ||||
| ); | ||||
| 
 | ||||
| has_block 'fields' => ( | ||||
|     tag => 'div', | ||||
|     class => [qw/modal-body/], | ||||
|     render_list => [qw/reseller_list e164 allocable/], | ||||
| ); | ||||
| 
 | ||||
| 1; | ||||
| 
 | ||||
| # vim: set tabstop=4 expandtab: | ||||
| @ -0,0 +1,58 @@ | ||||
| package NGCP::Panel::Form::NumberBlock::BlockReseller; | ||||
| 
 | ||||
| use HTML::FormHandler::Moose; | ||||
| extends 'HTML::FormHandler'; | ||||
| use Moose::Util::TypeConstraints; | ||||
| 
 | ||||
| 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 'e164' => ( | ||||
|     type => '+NGCP::Panel::Field::E164Range', | ||||
|     required => 1, | ||||
|     element_attr => { | ||||
|         rel => ['tooltip'], | ||||
|         title => ['The E164 number block.'], | ||||
|     }, | ||||
|     label => 'Number Block', | ||||
|     do_label => 1, | ||||
|     do_wrapper => 1, | ||||
|     wrapper_class => [qw/hfh-rep-field/], | ||||
| 
 | ||||
| ); | ||||
| 
 | ||||
| has_field 'allocable' => ( | ||||
|     type => 'Boolean', | ||||
|     required => 0, | ||||
|     element_attr => { | ||||
|         rel => ['tooltip'], | ||||
|         title => ['Allow numbers to be allocated from this block.'], | ||||
|     }, | ||||
| ); | ||||
| 
 | ||||
| has_field 'save' => ( | ||||
|     type => 'Submit', | ||||
|     value => 'Save', | ||||
|     element_class => [qw/btn btn-primary/], | ||||
|     label => '', | ||||
| ); | ||||
| 
 | ||||
| has_block 'fields' => ( | ||||
|     tag => 'div', | ||||
|     class => [qw/modal-body/], | ||||
|     render_list => [qw/e164 allocable/], | ||||
| ); | ||||
| 
 | ||||
| has_block 'actions' => ( | ||||
|     tag => 'div', | ||||
|     class => [qw/modal-footer/], | ||||
|     render_list => [qw/save/], | ||||
| ); | ||||
| 
 | ||||
| 1; | ||||
| 
 | ||||
| # vim: set tabstop=4 expandtab: | ||||
| @ -0,0 +1,28 @@ | ||||
| [% site_config.title = c.loc('Number Blocks') -%] | ||||
| [% | ||||
|     helper.name = c.loc('Number Blocks'); | ||||
|     helper.identifier = 'number_blocks'; | ||||
|     helper.messages = messages; | ||||
|     helper.dt_columns = block_dt_columns; | ||||
|     helper.length_change = 1; | ||||
| 
 | ||||
|     helper.close_target = close_target; | ||||
|     helper.create_flag = create_flag; | ||||
|     helper.edit_flag = edit_flag; | ||||
|     helper.form_object = form; | ||||
|     helper.ajax_uri = c.uri_for_action( "/numberblock/block_ajax" ); | ||||
| 
 | ||||
|     UNLESS c.user.read_only; | ||||
|         helper.dt_buttons = [ | ||||
|             { name = c.loc('Edit'), uri = "/numberblock/'+full.id+'/edit", class = 'btn-small btn-primary', icon = 'icon-edit' }, | ||||
|             { name = c.loc('Delete'), uri = "/numberblock/'+full.id+'/delete", class = 'btn-small btn-secondary', icon = 'icon-trash' }, | ||||
|             { name = c.loc('Details'), uri = "/numberblock/'+full.id+'/details", class = 'btn-small btn-primary', icon = 'icon-list' }, | ||||
|         ]; | ||||
|         helper.top_buttons = [ | ||||
|             { name = c.loc('Create Number Block'), uri = c.uri_for_action('/numberblock/block_create'), icon = 'icon-star' }, | ||||
|         ]; | ||||
|     END; | ||||
| 
 | ||||
|     PROCESS 'helpers/datatables.tt'; | ||||
| -%] | ||||
| [% # vim: set tabstop=4 syntax=html expandtab: -%] | ||||
| @ -0,0 +1,46 @@ | ||||
| [% site_config.title = c.loc('Subscriber Profiles for Profile Set [_1]', set.name) -%] | ||||
| [% | ||||
|     helper.name = c.loc('Subscriber Profile'); | ||||
|     helper.identifier = 'subscriber_profile'; | ||||
|     helper.messages = messages; | ||||
|     helper.dt_columns = profile_dt_columns; | ||||
|     helper.length_change = 1; | ||||
| 
 | ||||
|     helper.close_target = close_target; | ||||
|     helper.create_flag = create_flag; | ||||
|     helper.edit_flag = edit_flag; | ||||
|     helper.form_object = form; | ||||
|     helper.ajax_uri = c.uri_for_action( "/subscriberprofile/profile_ajax", [c.req.captures.0] ); | ||||
| 
 | ||||
|     IF clone_flag; | ||||
|         helper.name = c.loc('cloned Subscriber Profile'); | ||||
|     END; | ||||
| 
 | ||||
|     UNLESS c.user.read_only; | ||||
|         UNLESS c.user.roles == "reseller" && !c.config.profile_sets.reseller_edit; | ||||
|             helper.dt_buttons = [ | ||||
|                 { name = c.loc('Edit'), uri = "/subscriberprofile/" _ set.id _ "/profile/'+full.id+'/edit", class = 'btn-small btn-primary', icon = 'icon-edit' }, | ||||
|                 { name = c.loc('Delete'), uri = "/subscriberprofile/" _ set.id _ "/profile/'+full.id+'/delete", class = 'btn-small btn-secondary', icon = 'icon-trash' }, | ||||
|                 { name = c.loc('Clone'), uri = "/subscriberprofile/" _ set.id _ "/profile/'+full.id+'/clone", class = 'btn-small btn-tertiary', icon = 'icon-retweet' }, | ||||
|             ]; | ||||
|             helper.top_buttons = [ | ||||
|                 { name = c.loc('Profile Sets'), uri = c.uri_for('/subscriberprofile'), icon = 'icon-list' }, | ||||
|                 { name = c.loc('Create Subscriber Profile'), uri = c.uri_for_action('/subscriberprofile/profile_create', c.req.captures), icon = 'icon-star' }, | ||||
|             ]; | ||||
|         ELSE; | ||||
|             helper.dt_buttons = [ | ||||
|                 { name = c.loc('Edit'), uri = "/subscriberprofile/" _ set.id _ "/profile/'+full.id+'/edit", class = 'btn-small btn-primary', icon = 'icon-edit' }, | ||||
|             ]; | ||||
|             helper.top_buttons = [ | ||||
|                 { name = c.loc('Profile Sets'), uri = c.uri_for('/subscriberprofile'), icon = 'icon-list' }, | ||||
|             ]; | ||||
|         END; | ||||
|     ELSE; | ||||
|         helper.top_buttons = [ | ||||
|             { name = c.loc('Profile Sets'), uri = c.uri_for('/subscriberprofile'), icon = 'icon-list' }, | ||||
|         ]; | ||||
|     END; | ||||
| 
 | ||||
|     PROCESS 'helpers/datatables.tt'; | ||||
| -%] | ||||
| [% # vim: set tabstop=4 syntax=html expandtab: -%] | ||||
					Loading…
					
					
				
		Reference in new issue