diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index 4f3335b016..ed143185f6 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -9,10 +9,11 @@ use NGCP::Panel::Form::CustomerBalance; use NGCP::Panel::Form::Customer::Subscriber; use NGCP::Panel::Form::Customer::PbxAdminSubscriber; use NGCP::Panel::Form::Customer::PbxExtensionSubscriber; +use NGCP::Panel::Form::Customer::PbxGroup; use NGCP::Panel::Utils::Message; use NGCP::Panel::Utils::Navigation; use NGCP::Panel::Utils::DateTime; -use UUID qw/generate unparse/; +use NGCP::Panel::Utils::Subscriber; =head1 NAME @@ -135,19 +136,39 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) { desc => "Invalid product id for this customer contract.", ) unless($product); + $c->stash->{pbxgroup_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ + { name => "id", search => 1, title => "#" }, + { name => "name", search => 1, title => "Name" }, + { 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 ]; - push @subscribers, $sub; + 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; $c->stash(product => $product); $c->stash(balance => $balance); @@ -166,14 +187,19 @@ sub details :Chained('base') :PathPart('details') :Args(0) { sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) { my ($self, $c) = @_; - my $pbx; + 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) { # we need to create an admin subscriber first - - # TODO: should we check whether one of the existing subscribers has the admin flag set? - unless(@{ $c->stash->{subscribers} }) { + unless(@{ $admin_subscribers }) { + $pbxadmin = 1; $form = NGCP::Panel::Form::Customer::PbxAdminSubscriber->new(ctx => $c); } else { $form = NGCP::Panel::Form::Customer::PbxExtensionSubscriber->new(ctx => $c); @@ -192,132 +218,58 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) { NGCP::Panel::Utils::Navigation::check_form_buttons( c => $c, form => $form, - fields => [qw/domain.create/], + fields => { + 'domain.create' => $c->uri_for('/domain/create'), + 'group.create' => $c->uri_for_action('/customer/pbx_group_create', $c->req->captures), + }, back_uri => $c->req->uri, ); if($form->validated) { - my $schema = $c->model('DB'); - my $contract = $c->stash->{contract}; - my $reseller = $contract->contact->reseller; - my $billing_domain = $schema->resultset('domains') - ->find($c->request->params->{'domain.id'}); - my $prov_domain = $schema->resultset('voip_domains') - ->find({domain => $billing_domain->domain}); + my $billing_subscriber; try { - $schema->txn_do(sub { - my ($uuid_bin, $uuid_string); - UUID::generate($uuid_bin); - UUID::unparse($uuid_bin, $uuid_string); - - # TODO: check if we find a reseller and contract and domains - - my $number; my $cli = 0; - if(defined $c->request->params->{'e164.cc'} && - $c->request->params->{'e164.cc'} ne '') { - $cli = $c->request->params->{'e164.cc'} . - ($c->request->params->{'e164.ac'} || '') . - $c->request->params->{'e164.sn'}; - - $number = $reseller->voip_numbers->create({ - cc => $c->request->params->{'e164.cc'}, - ac => $c->request->params->{'e164.ac'} || '', - sn => $c->request->params->{'e164.sn'}, - status => 'active', - }); - } - my $billing_subscriber = $contract->voip_subscribers->create({ - uuid => $uuid_string, - username => $c->request->params->{username}, - domain_id => $billing_domain->id, - status => $c->request->params->{status}, - primary_number_id => defined $number ? $number->id : undef, - }); - if(defined $number) { - $number->update({ subscriber_id => $billing_subscriber->id }); - } - - my $prov_subscriber = $schema->resultset('provisioning_voip_subscribers')->create({ - uuid => $uuid_string, - username => $c->request->params->{username}, - password => $c->request->params->{password}, - webusername => $c->request->params->{webusername} || $c->request->params->{username}, - webpassword => $c->request->params->{webpassword}, - admin => $c->request->params->{administrative} || 0, - account_id => $contract->id, - domain_id => $prov_domain->id, - create_timestamp => NGCP::Panel::Utils::DateTime::current_local, - }); - - my $voip_preferences = $schema->resultset('voip_preferences')->search({ - 'usr_pref' => 1, - }); - $voip_preferences->find({ 'attribute' => 'account_id' }) - ->voip_usr_preferences->create({ - 'subscriber_id' => $prov_subscriber->id, - 'value' => $contract->id, - }); - $voip_preferences->find({ 'attribute' => 'ac' }) - ->voip_usr_preferences->create({ - 'subscriber_id' => $prov_subscriber->id, - 'value' => $c->request->params->{'e164.ac'}, - }) if (defined $c->request->params->{'e164.ac'} && - length($c->request->params->{'e164.ac'}) > 0); - if(defined $c->request->params->{'e164.cc'} && - length($c->request->params->{'e164.cc'}) > 0) { - - $voip_preferences->find({ 'attribute' => 'cc' }) - ->voip_usr_preferences->create({ - 'subscriber_id' => $prov_subscriber->id, - 'value' => $c->request->params->{'e164.cc'}, - }); - $cli = $c->request->params->{'e164.cc'} . - (defined $c->request->params->{'e164.ac'} && - length($c->request->params->{'e164.ac'}) > 0 ? - $c->request->params->{'e164.ac'} : '' - ) . - $c->request->params->{'e164.sn'}; - $voip_preferences->find({ 'attribute' => 'cli' }) - ->voip_usr_preferences->create({ - 'subscriber_id' => $prov_subscriber->id, - 'value' => $cli, - }); - } - - $schema->resultset('voicemail_users')->create({ - customer_id => $uuid_string, - mailbox => $cli, - password => sprintf("%04d", int(rand 10000)), - email => '', - }); - if($number) { - $schema->resultset('dbaliases')->create({ - alias_username => $number->cc . - ($number->ac || ''). - $number->sn, - alias_domain => $prov_subscriber->domain->domain, - username => $prov_subscriber->username, - domain => $prov_subscriber->domain->domain, - }); + my $preferences = {}; + if($pbx && !$pbxadmin) { + my $admin = $admin_subscribers->[0]; + $form->params->{domain}{id} = $admin->{domain_id}; + # TODO: make DT selection multi-select capable + # set pbx_group preferences somehow for the related group subscriber as well + $form->params->{pbx_group_id} = $form->params->{group}{id}; + delete $form->params->{group}; + my $base_number = $admin->{primary_number}; + if($base_number) { + # $preferences->{base_cli} = $base_number->cc . $base_number->ac . $base_number->sn; + if($form->params->{extension}) { + $form->params->{e164}{cc} = $base_number->{cc}; + $form->params->{e164}{ac} = $base_number->{ac}; + $form->params->{e164}{sn} = $base_number->{sn} . $form->params->{extension}; + } } - - delete $c->session->{created_objects}->{domain}; - - }); - $c->flash(messages => [{type => 'success', text => 'Subscriber successfully created!'}]); - $c->response->redirect($c->uri_for_action('/customer/details', [$contract->id])); - return; + } + if($pbx) { + $preferences->{cloud_pbx} = 1; + } + $billing_subscriber = NGCP::Panel::Utils::Subscriber::create_subscriber( + c => $c, + contract => $c->stash->{contract}, + params => $form->params, + admin_default => $pbxadmin, + preferences => $preferences, + ); + delete $c->session->{created_objects}->{domain}; + delete $c->session->{created_objects}->{group}; + $c->flash(messages => [{type => 'success', text => 'Subscriber successfully created.'}]); } catch($e) { NGCP::Panel::Utils::Message->error( c => $c, error => $e, desc => "Failed to create subscriber.", ); - $c->response->redirect($c->uri_for_action('/customer/details', [$contract->id])); - return; } + NGCP::Panel::Utils::Navigation::back_or($c, + $c->uri_for_action('/customer/details', [$c->stash->{contract}->id]) + ); } - $c->stash(close_target => $c->uri_for()); $c->stash(create_flag => 1); $c->stash(form => $form) } @@ -417,6 +369,100 @@ sub edit_balance :Chained('base') :PathPart('balance/edit') :Args(0) { } sub pbx_group_ajax :Chained('base') :PathPart('pbx/group/ajax') :Args(0) { + my ($self, $c) = @_; + my $res = $c->model('DB')->resultset('voip_pbx_groups')->search({ + contract_id => $c->stash->{contract}->id, + }); + NGCP::Panel::Utils::Datatables::process($c, $res, $c->stash->{pbxgroup_dt_columns}); + $c->detach( $c->view("JSON") ); +} + +sub pbx_group_create :Chained('base') :PathPart('pbx/group/create') :Args(0) { + my ($self, $c) = @_; + + my $posted = ($c->request->method eq 'POST'); + my $admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers( + voip_subscribers => $c->stash->{subscribers}); + unless(@{ $admin_subscribers }) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => 'cannot create pbx group without having an admin subscriber', + desc => "Can't create a PBX group without having an administrative subscriber.", + ); + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for_action('/customer/details', $c->req->captures)); + } + my $form; + $form = NGCP::Panel::Form::Customer::PbxGroup->new; + my $params = {}; + $params = $params->merge($c->session->{created_objects}); + $form->process( + posted => $posted, + params => $c->request->params, + item => $params, + ); + NGCP::Panel::Utils::Navigation::check_form_buttons( + c => $c, + form => $form, + fields => {}, + back_uri => $c->req->uri, + ); + if($posted && $form->validated) { + try { + $c->model('DB')->schema->txn_do( sub { + my $preferences = {}; + my $admin = $admin_subscribers->[0]; + + my $base_number = $admin->{primary_number}; + if($base_number) { + # TODO: this pref doesn't exist yet in the db + # $preferences->{base_cli} = $base_number->cc . $base_number->ac . $base_number->sn; + + if($form->params->{extension}) { + $form->params->{e164}{cc} = $base_number->{cc}; + $form->params->{e164}{ac} = $base_number->{ac}; + $form->params->{e164}{sn} = $base_number->{sn} . $form->params->{extension}; + } + + } + + $form->params->{is_pbx_group} = 1; + $form->params->{domain}{id} = $admin->{domain_id}; + $form->params->{status} = 'active'; + $form->params->{username} = lc $form->params->{name}; + $form->params->{username} =~ s/\s+/_/g; + $preferences->{cloud_pbx} = 1; + my $billing_subscriber = NGCP::Panel::Utils::Subscriber::create_subscriber( + c => $c, + contract => $c->stash->{contract}, + params => $form->params, + admin_default => 0, + preferences => $preferences, + ); + foreach my $k(qw/is_pbx_group username password e164 pbx_group domain status/) { + delete $form->params->{$k}; + } + $form->params->{subscriber_id} = $billing_subscriber->provisioning_voip_subscriber->id; + my $group = $c->stash->{contract}->voip_pbx_groups->create($form->params); + $c->session->{created_objects}->{group} = { id => $group->id }; + }); + + $c->flash(messages => [{type => 'success', text => 'PBX group successfully created.'}]); + } catch ($e) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => $e, + desc => "Failed to create PBX group.", + ); + } + + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for_action('/customer/details', $c->req->captures)); + } + + $c->stash( + close_target => $c->uri_for, + create_flag => 1, + form => $form + ); } =head1 AUTHOR diff --git a/lib/NGCP/Panel/Controller/Domain.pm b/lib/NGCP/Panel/Controller/Domain.pm index a648a6da6d..f89abf6105 100644 --- a/lib/NGCP/Panel/Controller/Domain.pm +++ b/lib/NGCP/Panel/Controller/Domain.pm @@ -84,7 +84,8 @@ sub create :Chained('dom_list') :PathPart('create') :Args(0) { $new_dom->create_related('domain_resellers', { reseller_id => $reseller_id }); - NGCP::Panel::Utils::Prosody::activate_domain($c, $form->value->{domain}); + NGCP::Panel::Utils::Prosody::activate_domain($c, $form->value->{domain}) + unless($c->config->{features}->{debug}); delete $c->session->{created_objects}->{reseller}; $c->session->{created_objects}->{domain} = { id => $new_dom->id }; }); @@ -186,7 +187,8 @@ sub delete :Chained('base') :PathPart('delete') :Args(0) { $c->model('DB')->schema->txn_do( sub { $c->stash->{'domain_result'}->delete; $c->stash->{'provisioning_domain_result'}->delete; - NGCP::Panel::Utils::Prosody::deactivate_domain($c, $domain); + NGCP::Panel::Utils::Prosody::deactivate_domain($c, $domain) + unless($c->config->{features}->{debug}); }); } catch ($e) { NGCP::Panel::Utils::Message->error( diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index 5f0b28cf7e..da487c9be3 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -276,6 +276,17 @@ sub terminate :Chained('base') :PathPart('terminate') :Args(0) { my $schema = $c->model('DB'); try { $schema->txn_do(sub { + if($subscriber->provisioning_voip_subscriber->is_pbx_group) { + my $pbx_group = $schema->resultset('voip_pbx_groups')->find({ + subscriber_id => $subscriber->provisioning_voip_subscriber->id + }); + if($pbx_group) { + $pbx_group->provisioning_voip_subscribers->update_all({ + pbx_group_id => undef, + }); + } + $pbx_group->delete; + } $subscriber->provisioning_voip_subscriber->delete; $subscriber->voip_numbers->delete_all; $subscriber->update({ status => 'terminated' }); diff --git a/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm b/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm index 53fee2053b..891e633a6d 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm @@ -54,7 +54,7 @@ has_field 'domain' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/group webusername webpassword e164 username domain password status external_id/ ], + render_list => [qw/webusername webpassword e164 username domain password status external_id/ ], ); sub validate { diff --git a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm index ddf9fc9d3f..fbe0253d9c 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm @@ -3,24 +3,39 @@ package NGCP::Panel::Form::Customer::PbxExtensionSubscriber; use HTML::FormHandler::Moose; extends 'NGCP::Panel::Form::Customer::PbxSubscriber'; -has_field 'ext' => ( +has_field 'group' => ( + type => '+NGCP::Panel::Field::PbxGroup', + label => 'Group', + not_nullable => 1, +); + +has_field 'extension' => ( type => 'PosInteger', element_attr => { - class => ['ngcp_e164_sn'], rel => ['tooltip'], title => ['Extension Number, e.g. 101'] }, - do_label => 0, - do_wrapper => 0, required => 1, + label => 'Extension', ); has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/webusername webpassword ext username password status external_id/ ], + render_list => [qw/group webusername webpassword extension username 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->req->captures->[0]])->as_string + ); +} + + 1; =head1 NAME diff --git a/lib/NGCP/Panel/Form/Customer/PbxGroup.pm b/lib/NGCP/Panel/Form/Customer/PbxGroup.pm new file mode 100644 index 0000000000..093a072a61 --- /dev/null +++ b/lib/NGCP/Panel/Form/Customer/PbxGroup.pm @@ -0,0 +1,72 @@ +package NGCP::Panel::Form::Customer::PbxGroup; + +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 'name' => ( + type => 'Text', + required => 1, + label => 'Name', +); + +has_field 'extension' => ( + type => 'Text', + required => 1, + label => 'Extension', +); + +has_field 'hunt_policy' => ( + type => 'Select', + required => 1, + label => 'Hunting Policy', + options => [ + { label => 'Serial Ringing', value => 'serial' }, + { label => 'Parallel Ringing', value => 'parallel' }, + ], + default => 'serial', +); + +has_field 'hunt_policy_timeout' => ( + type => 'PosInteger', + required => 1, + label => 'Serial Ringing Timeout', + default => 10, +); + +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/name extension hunt_policy hunt_policy_timeout/], +); + +has_block 'actions' => ( + tag => 'div', + class => [qw/modal-footer/], + render_list => [qw/save/], +); + +sub validate_name { + my ($self, $field) = @_; + + unless($field->value =~ /^[a-zA-Z0-9_\-\s]+$/) { + $field->add_error("Invalid group name, must only contain letters, digits, - and _ and spaces"); + } +} + +1; +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Form/Customer/PbxSubscriber.pm b/lib/NGCP/Panel/Form/Customer/PbxSubscriber.pm index 7b03edd29e..390718b256 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxSubscriber.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxSubscriber.pm @@ -13,12 +13,6 @@ has_field 'submitid' => ( type => 'Hidden' ); sub build_render_list {[qw/submitid fields actions/]} sub build_form_element_class { [qw/form-horizontal/] } -has_field 'group' => ( - type => '+NGCP::Panel::Field::PbxGroup', - label => 'Group', - not_nullable => 1, -); - has_field 'webusername' => ( type => 'Text', label => 'Web Username', @@ -105,16 +99,6 @@ has_block 'actions' => ( render_list => [qw/save/], ); -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->req->captures->[0]])->as_string - ); -} - 1; =head1 NAME diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 3115a5200b..871f130729 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -4,6 +4,8 @@ use warnings; use Sipwise::Base; use DBIx::Class::Exception; +use NGCP::Panel::Utils::DateTime; +use UUID qw/generate unparse/; my %LOCK = ( 0, 'none', @@ -122,6 +124,122 @@ sub get_lock_string { return $LOCK{$level}; } +sub get_admin_subscribers { + my %params = @_; + my $subs = $params{voip_subscribers}; + my @subscribers = (); + foreach my $s(@{ $subs }) { + push @subscribers, $s if($s->{admin}); + } + return \@subscribers; +} + +sub create_subscriber { + my %params = @_; + my $c = $params{c}; + + my $contract = $params{contract}; + my $params = $params{params}; + my $administrative = $params{admin_default}; + my $preferences = $params{preferences}; + + my $schema = $c->model('DB'); + my $reseller = $contract->contact->reseller; + my $billing_domain = $schema->resultset('domains') + ->find($params->{domain}{id}); + my $prov_domain = $schema->resultset('voip_domains') + ->find({domain => $billing_domain->domain}); + + $schema->txn_do(sub { + my ($uuid_bin, $uuid_string); + UUID::generate($uuid_bin); + UUID::unparse($uuid_bin, $uuid_string); + + # TODO: check if we find a reseller and contract and domains + + my ($number, $cli); + if(defined $params->{e164}{cc} && $params->{e164}{cc} ne '') { + $cli = $params->{e164}{cc} . + ($params->{e164}{ac} || '') . + $params->{e164}{sn}; + + $number = $reseller->voip_numbers->create({ + cc => $params->{e164}{cc}, + ac => $params->{e164}{ac} || '', + sn => $params->{e164}{sn}, + status => 'active', + }); + } + my $billing_subscriber = $contract->voip_subscribers->create({ + uuid => $uuid_string, + username => $params->{username}, + domain_id => $billing_domain->id, + status => $params->{status}, + primary_number_id => defined $number ? $number->id : undef, + }); + if(defined $number) { + $number->update({ subscriber_id => $billing_subscriber->id }); + } + + unless(exists $params->{password}) { + my ($pass_bin, $pass_str); + UUID::generate($pass_bin); + UUID::unparse($pass_bin, $pass_str); + $params->{password} = $pass_str; + } + my $prov_subscriber = $schema->resultset('provisioning_voip_subscribers')->create({ + uuid => $uuid_string, + username => $params->{username}, + password => $params->{password}, + webusername => $params->{webusername} || $params->{username}, + webpassword => $params->{webpassword}, + admin => $params->{administrative} // $administrative, + account_id => $contract->id, + domain_id => $prov_domain->id, + is_pbx_group => $params->{is_pbx_group} // 0, + pbx_group_id => $params->{pbx_group_id}, + create_timestamp => NGCP::Panel::Utils::DateTime::current_local, + }); + + my $voip_preferences = $schema->resultset('voip_preferences')->search({ + 'usr_pref' => 1, + }); + + $preferences->{account_id} = $contract->id; + $preferences->{ac} = $params->{e164}{ac} + if(defined $params->{e164}{ac} && length($params->{e164}{ac}) > 0); + $preferences->{cc} = $params->{e164}{cc} + if(defined $params->{e164}{cc} && length($params->{e164}{cc}) > 0); + $preferences->{cli} = $cli + if(defined $cli); + + foreach my $k(keys %{ $preferences } ) { + $voip_preferences->find({ 'attribute' => $k }) + ->voip_usr_preferences->create({ + 'subscriber_id' => $prov_subscriber->id, + 'value' => $preferences->{$k}, + }); + } + + $schema->resultset('voicemail_users')->create({ + customer_id => $uuid_string, + mailbox => $cli // 0, + password => sprintf("%04d", int(rand 10000)), + email => '', + }); + if($cli) { + $schema->resultset('dbaliases')->create({ + alias_username => $cli, + alias_domain => $prov_subscriber->domain->domain, + username => $prov_subscriber->username, + domain => $prov_subscriber->domain->domain, + }); + } + + return $billing_subscriber; + }); +} + 1; =head1 NAME diff --git a/share/templates/customer/details.tt b/share/templates/customer/details.tt index 47b4652d8f..86e37f59e4 100644 --- a/share/templates/customer/details.tt +++ b/share/templates/customer/details.tt @@ -156,6 +156,9 @@
| Name | +SIP URI | +Primary Number | +Hunting Policy | +Hunting Timeout | ++ |
|---|---|---|---|---|---|
| [% subscriber.voip_pbx_group.name %] | +[% subscriber.username %]@[% subscriber.domain %] | +[% subscriber.primary_number.cc %] [% subscriber.primary_number.ac %] [% subscriber.primary_number.sn %] | +[% subscriber.voip_pbx_group.hunt_policy %] | +[% subscriber.voip_pbx_group.hunt_policy_timeout %] | +
+
@@ -183,6 +239,7 @@
+ [% END -%]
diff --git a/share/templates/subscriber/master.tt b/share/templates/subscriber/master.tt
index a50b462b63..c206b9e24d 100644
--- a/share/templates/subscriber/master.tt
+++ b/share/templates/subscriber/master.tt
@@ -55,7 +55,13 @@
{ value = subscriber.primary_number.cc _ ' ' _ subscriber.primary_number.ac _ ' ' _ subscriber.primary_number.sn, desc = 'Primary Number'},
{ value = subscriber.provisioning_voip_subscriber.admin ? 'yes' : 'no', desc = 'Administrative'},
{ value = subscriber.external_id, desc = 'External #'},
- ]
+ ];
+ IF subscriber.provisioning_voip_subscriber.voip_pbx_group.defined;
+ elements.push(
+ { value = subscriber.provisioning_voip_subscriber.voip_pbx_group.name, desc = 'PBX Group' },
+ );
+ END;
+
-%]
[% FOR elem IN elements -%]
|