diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index 2fb6e7238b..73cd47587b 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -143,33 +143,12 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) { { name => "extension", search => 1, title => "Extension" }, ]); - my @subscribers = (); - my @pbx_groups = (); - foreach my $s($contract->first->voip_subscribers->search_rs({ status => 'active' })->all) { - my $sub = { $s->get_columns }; - if($c->config->{features}->{cloudpbx}) { - $sub->{voip_pbx_group} = { $s->provisioning_voip_subscriber->voip_pbx_group->get_columns } - if($s->provisioning_voip_subscriber->voip_pbx_group); - } - $sub->{domain} = $s->domain->domain; - $sub->{admin} = $s->provisioning_voip_subscriber->admin if - $s->provisioning_voip_subscriber; - $sub->{primary_number} = {$s->primary_number->get_columns} if(defined $s->primary_number); - $sub->{locations} = [ map { { $_->get_columns } } $c->model('DB')->resultset('location')-> - search({ - username => $s->username, - domain => $s->domain->domain, - })->all ]; - if($c->config->{features}->{cloudpbx} && $s->provisioning_voip_subscriber->is_pbx_group) { - my $grp = $contract->first->voip_pbx_groups->find({ subscriber_id => $s->provisioning_voip_subscriber->id }); - $sub->{voip_pbx_group} = { $grp->get_columns } if $grp; - push @pbx_groups, $sub; - } else { - push @subscribers, $sub; - } - } - $c->stash->{subscribers} = \@subscribers; - $c->stash->{pbx_groups} = \@pbx_groups; + my $subs = NGCP::Panel::Utils::Subscriber::get_custom_subscriber_struct( + c => $c, + contract => $contract->first + ); + $c->stash->{subscribers} = $subs->{subscribers}; + $c->stash->{pbx_groups} = $subs->{pbx_groups}; $c->stash(product => $product); $c->stash(balance => $balance); @@ -190,14 +169,12 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) { my $pbx = 0; my $pbxadmin = 0; $pbx = 1 if $c->stash->{product}->class eq 'pbxaccount'; - my @admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers( - voip_subscriber_rs => $c->stash->{subscribers}); my $form; - my $admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers( voip_subscribers => $c->stash->{subscribers}); if($c->config->{features}->{cloudpbx} && $pbx) { + $c->stash(customer_id => $c->stash->{contract}->id); # we need to create an admin subscriber first unless(@{ $admin_subscribers }) { $pbxadmin = 1; diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index c9d826dc75..b0da03e461 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -12,6 +12,7 @@ use NGCP::Panel::Utils::Message; use NGCP::Panel::Utils::DateTime; use NGCP::Panel::Form::Subscriber; use NGCP::Panel::Form::SubscriberEdit; +use NGCP::Panel::Form::Customer::PbxExtensionSubscriberEdit; use NGCP::Panel::Form::SubscriberCFSimple; use NGCP::Panel::Form::SubscriberCFTSimple; use NGCP::Panel::Form::SubscriberCFAdvanced; @@ -1477,32 +1478,71 @@ sub details :Chained('master') :PathPart('') :Args(0) { sub edit_master :Chained('master') :PathPart('edit') :Args(0) { my ($self, $c) = @_; - - my $form = NGCP::Panel::Form::SubscriberEdit->new; - my $posted = ($c->request->method eq 'POST'); my $subscriber = $c->stash->{subscriber}; my $prov_subscriber = $subscriber->provisioning_voip_subscriber; + my $form; my $pbx_ext; + if($c->config->{features}->{cloudpbx} && $prov_subscriber->voip_pbx_group) { + $pbx_ext = 1; + $c->stash(customer_id => $subscriber->contract->id); + $form = NGCP::Panel::Form::Customer::PbxExtensionSubscriberEdit->new(ctx => $c); + } else { + $form = NGCP::Panel::Form::SubscriberEdit->new; + } + + my $posted = ($c->request->method eq 'POST'); + my $params; my $lock = $c->stash->{prov_lock}; + my $base_number; + if($pbx_ext) { + my $subs = NGCP::Panel::Utils::Subscriber::get_custom_subscriber_struct( + c => $c, + contract => $subscriber->contract + ); + my $admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers( + voip_subscribers => $subs->{subscribers} + ); + $base_number = $admin_subscribers->[0]->{primary_number}; + } + + # we don't change this on edit + $c->request->params->{username} = $prov_subscriber->username; unless($posted) { $params->{webusername} = $prov_subscriber->webusername; $params->{webpassword} = $prov_subscriber->webpassword; $params->{password} = $prov_subscriber->password; $params->{administrative} = $prov_subscriber->admin; if($subscriber->primary_number) { - $params->{e164}->{cc} = $subscriber->primary_number->cc; - $params->{e164}->{ac} = $subscriber->primary_number->ac; - $params->{e164}->{sn} = $subscriber->primary_number->sn; + unless($pbx_ext) { + $params->{e164}->{cc} = $subscriber->primary_number->cc; + $params->{e164}->{ac} = $subscriber->primary_number->ac; + $params->{e164}->{sn} = $subscriber->primary_number->sn; + } elsif($base_number) { + my $pbx_base_num = $base_number->{cc} . + ($base_number->{ac} // ''). + $base_number->{sn}; + my $full = $subscriber->primary_number->cc . + ($subscriber->primary_number->ac // ''). + $subscriber->primary_number->sn; + if($full =~ s/^${pbx_base_num}(.+)$/$1/) { + $params->{extension} = $full; + } + } + if($pbx_ext) { + $params->{group}{id} = $prov_subscriber->pbx_group_id; + } } - my @alias_nums = (); - for my $num($subscriber->voip_numbers->all) { - next if $subscriber->primary_number && - $num->id == $subscriber->primary_number->id; - push @alias_nums, { e164 => { cc => $num->cc, ac => $num->ac, sn => $num->sn } }; + unless($pbx_ext) { + my @alias_nums = (); + for my $num($subscriber->voip_numbers->all) { + next if $subscriber->primary_number && + $num->id == $subscriber->primary_number->id; + push @alias_nums, { e164 => { cc => $num->cc, ac => $num->ac, sn => $num->sn } }; + } + $params->{alias_number} = \@alias_nums; } - $params->{alias_number} = \@alias_nums; $params->{status} = $subscriber->status; $params->{external_id} = $subscriber->external_id; @@ -1510,8 +1550,11 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) { } $form->process( - params => $posted ? $c->request->params : $params + posted => $posted, + params => $c->request->params, + item => $params ); + NGCP::Panel::Utils::Navigation::check_form_buttons( c => $c, form => $form, @@ -1528,15 +1571,16 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) { my $schema = $c->model('DB'); try { $schema->txn_do(sub { - $prov_subscriber->update({ - webusername => $form->field('webusername')->value, - webpassword => $form->field('webpassword')->value, - password => $form->field('password')->value, - admin => $form->field('administrative')->value, - }); + my $prov_params = {}; + $prov_params->{webusername} = $form->params->{webusername}; + $prov_params->{webpassword} = $form->params->{webpassword}; + $prov_params->{password} = $form->params->{password}; + $prov_params->{admin} = $form->params->{administrative} + unless($pbx_ext); + $prov_subscriber->update($prov_params); $subscriber->update({ - status => $form->field('status')->value, - external_id => $form->field('external_id')->value, + status => $form->params->{status}, + external_id => $form->params->{external_id}, }); if($subscriber->status eq 'locked') { $form->values->{lock} = 4; # update lock below @@ -1554,22 +1598,28 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) { domain => $prov_subscriber->domain->domain, })->delete_all; - # TODO: check for availablity of cc and sn my $num; if($subscriber->primary_number) { - if(!$form->field('e164')->field('cc')->value && - !$form->field('e164')->field('ac')->value && - !$form->field('e164')->field('sn')->value) { + if($pbx_ext) { + $form->params->{e164}{cc} = $subscriber->primary_number->cc; + $form->params->{e164}{ac} = $subscriber->primary_number->ac; + $form->params->{e164}{sn} = $base_number->{sn} . $form->params->{extension}; + } + if(!$form->params->{e164}{cc} && + !$form->params->{e164}{ac} && + !$form->params->{e164}{sn}) { + + # TODO: if it's an admin for pbx, don't allow this! $subscriber->primary_number->delete; $prov_subscriber->voicemail_user->update({ mailbox => '0' }); } else { # check if cc and sn are set if cc is there $num = $subscriber->primary_number->update({ - cc => $form->field('e164')->field('cc')->value, - ac => $form->field('e164')->field('ac')->value || '', - sn => $form->field('e164')->field('sn')->value, + cc => $form->params->{e164}{cc}, + ac => $form->params->{e164}{ac} // '', + sn => $form->params->{e164}{sn}, }); - my $cli = $num->cc.($num->ac || '').$num->sn; + my $cli = $num->cc.($num->ac // '').$num->sn; for my $cfset($prov_subscriber->voip_cf_destination_sets->all) { for my $cf($cfset->voip_cf_destinations->all) { if($cf->destination =~ /\@voicebox\.local$/) { @@ -1582,16 +1632,19 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) { } } $prov_subscriber->voicemail_user->update({ mailbox => $cli }); + + # TODO: if it's an admin for pbx, update all other subscribers as well! + # this means cloud_pbx_base_cli pref, primary number, dbaliases, voicemail, cf } } else { - if($form->field('e164')->field('cc')->value && - $form->field('e164')->field('sn')->value) { + if($form->params->{e164}{cc} && + $form->params->{e164}{sn}) { $num = $schema->resultset('voip_numbers')->create({ subscriber_id => $subscriber->id, reseller_id => $subscriber->contract->contact->reseller_id, - cc => $form->field('e164')->field('cc')->value, - ac => $form->field('e164')->field('ac')->value || '', - sn => $form->field('e164')->field('sn')->value, + cc => $form->params->{e164}{cc}, + ac => $form->params->{e164}{ac} // '', + sn => $form->params->{e164}{sn}, }); $subscriber->update({ primary_number_id => $num->id }); $prov_subscriber->voicemail_user->update({ mailbox => @@ -1624,18 +1677,20 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) { } } } - for my $alias($form->field('alias_number')->fields) { - $num = $subscriber->voip_numbers->create({ - cc => $alias->field('e164')->field('cc')->value, - ac => $alias->field('e164')->field('ac')->value, - sn => $alias->field('e164')->field('sn')->value, - }); - $schema->resultset('dbaliases')->create({ - alias_username => $num->cc.($num->ac || '').$num->sn, - alias_domain => $prov_subscriber->domain->domain, - username => $prov_subscriber->username, - domain => $prov_subscriber->domain->domain, - }); + if($form->field('alias_number')) { + for my $alias($form->field('alias_number')->fields) { + $num = $subscriber->voip_numbers->create({ + cc => $alias->field('e164')->field('cc')->value, + ac => $alias->field('e164')->field('ac')->value, + sn => $alias->field('e164')->field('sn')->value, + }); + $schema->resultset('dbaliases')->create({ + alias_username => $num->cc.($num->ac || '').$num->sn, + alias_domain => $prov_subscriber->domain->domain, + username => $prov_subscriber->username, + domain => $prov_subscriber->domain->domain, + }); + } } $form->values->{lock} ||= 0; @@ -2214,7 +2269,7 @@ EOF } $c->stash( - edit_flag => 1, + reg_create_flag => 1, description => 'Registered Device', form => $form, ); diff --git a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm index fbe0253d9c..1cb5332853 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm @@ -31,7 +31,7 @@ sub field_list { my $group = $self->field('group'); $group->field('id')->ajax_src( - $c->uri_for_action('/customer/pbx_group_ajax', [$c->req->captures->[0]])->as_string + $c->uri_for_action('/customer/pbx_group_ajax', [$c->stash->{customer_id}])->as_string ); } diff --git a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriberEdit.pm b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriberEdit.pm new file mode 100644 index 0000000000..398d013746 --- /dev/null +++ b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriberEdit.pm @@ -0,0 +1,62 @@ +package NGCP::Panel::Form::Customer::PbxExtensionSubscriberEdit; + +use HTML::FormHandler::Moose; +extends 'NGCP::Panel::Form::Customer::PbxSubscriber'; + +has_field 'group' => ( + type => '+NGCP::Panel::Field::PbxGroup', + label => 'Group', + not_nullable => 1, +); + +has_field 'extension' => ( + type => 'PosInteger', + element_attr => { + rel => ['tooltip'], + title => ['Extension Number, e.g. 101'] + }, + required => 1, + label => 'Extension', +); + +has_block 'fields' => ( + tag => 'div', + class => [qw/modal-body/], + render_list => [qw/group webusername webpassword extension password status external_id/ ], +); + +sub field_list { + my $self = shift; + my $c = $self->ctx; + + my $group = $self->field('group'); + $group->field('id')->ajax_src( + $c->uri_for_action('/customer/pbx_group_ajax', [$c->stash->{customer_id}])->as_string + ); +} + + +1; + +=head1 NAME + +NGCP::Panel::Form::Subscriber + +=head1 DESCRIPTION + +Form to modify a subscriber. + +=head1 METHODS + +=head1 AUTHOR + +Gerhard Jungwirth + +=head1 LICENSE + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index d8060553c2..24afab9adf 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -242,6 +242,41 @@ sub create_subscriber { }); } +sub get_custom_subscriber_struct { + my %params = @_; + + my $c = $params{c}; + my $contract = $params{contract}; + + my @subscribers = (); + my @pbx_groups = (); + foreach my $s($contract->voip_subscribers->search_rs({ status => 'active' })->all) { + my $sub = { $s->get_columns }; + if($c->config->{features}->{cloudpbx}) { + $sub->{voip_pbx_group} = { $s->provisioning_voip_subscriber->voip_pbx_group->get_columns } + if($s->provisioning_voip_subscriber->voip_pbx_group); + } + $sub->{domain} = $s->domain->domain; + $sub->{admin} = $s->provisioning_voip_subscriber->admin if + $s->provisioning_voip_subscriber; + $sub->{primary_number} = {$s->primary_number->get_columns} if(defined $s->primary_number); + $sub->{locations} = [ map { { $_->get_columns } } $c->model('DB')->resultset('location')-> + search({ + username => $s->username, + domain => $s->domain->domain, + })->all ]; + if($c->config->{features}->{cloudpbx} && $s->provisioning_voip_subscriber->is_pbx_group) { + my $grp = $contract->voip_pbx_groups->find({ subscriber_id => $s->provisioning_voip_subscriber->id }); + $sub->{voip_pbx_group} = { $grp->get_columns } if $grp; + push @pbx_groups, $sub; + } else { + push @subscribers, $sub; + } + } + + return { subscribers => \@subscribers, pbx_groups => \@pbx_groups }; +} + 1; =head1 NAME diff --git a/share/templates/subscriber/master.tt b/share/templates/subscriber/master.tt index c206b9e24d..3e5303b17e 100644 --- a/share/templates/subscriber/master.tt +++ b/share/templates/subscriber/master.tt @@ -152,8 +152,8 @@ helper.dt_columns = reg_dt_columns; helper.close_target = close_target; - helper.create_flag = create_flag; - helper.edit_flag = edit_flag; + helper.create_flag = reg_create_flag; + helper.edit_flag = reg_edit_flag; helper.form_object = form; helper.ajax_uri = c.uri_for_action('/subscriber/ajax_registered', [c.req.captures.0]); @@ -182,8 +182,8 @@ helper.dt_columns = capture_dt_columns; helper.close_target = close_target; - helper.create_flag = create_flag; - helper.edit_flag = edit_flag; + helper.create_flag = 0; + helper.edit_flag = 0; helper.form_object = form; helper.ajax_uri = c.uri_for_action('/subscriber/ajax_captured_calls', [c.req.captures.0]); @@ -203,6 +203,7 @@ [% IF edit_flag == 1 -%] + [% IF form.has_for_js; form.render_repeatable_js;