From 7d351c73b22ddf496f5d2194755e28e10f3c14db Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Tue, 19 Nov 2013 15:09:11 +0100 Subject: [PATCH] MT#5009 Manually backport number termination/reuse --- lib/NGCP/Panel/Controller/Customer.pm | 103 +++--------------------- lib/NGCP/Panel/Controller/Subscriber.pm | 5 +- lib/NGCP/Panel/Utils/Contract.pm | 8 ++ lib/NGCP/Panel/Utils/Preferences.pm | 33 ++++++++ lib/NGCP/Panel/Utils/Subscriber.pm | 102 +++++++++++++++++++++++ share/templates/customer/details.tt | 2 +- 6 files changed, 157 insertions(+), 96 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index d21a288d70..8b22a31757 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -169,100 +169,15 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) { ->find({domain => $billing_domain->domain}); 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 = {}; + my $billing_subscriber = NGCP::Panel::Utils::Subscriber::create_subscriber( + c => $c, + schema => $schema, + contract => $c->stash->{contract}, + params => $form->params, + admin_default => 0, + preferences => $preferences, + ); delete $c->session->{created_objects}->{domain}; diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index 2a892778ef..0f35a2bb43 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -259,7 +259,10 @@ sub terminate :Chained('base') :PathPart('terminate') :Args(0) { try { $schema->txn_do(sub { $subscriber->provisioning_voip_subscriber->delete; - $subscriber->voip_numbers->delete_all; + $subscriber->voip_numbers->update_all({ + subscriber_id => undef, + reseller_id => undef, + }); $subscriber->update({ status => 'terminated' }); }); $c->flash(messages => [{type => 'success', text => 'Successfully terminated subscriber'}]); diff --git a/lib/NGCP/Panel/Utils/Contract.pm b/lib/NGCP/Panel/Utils/Contract.pm index 86d79c607b..ea2e540ebf 100644 --- a/lib/NGCP/Panel/Utils/Contract.pm +++ b/lib/NGCP/Panel/Utils/Contract.pm @@ -69,6 +69,10 @@ sub recursively_lock_contract { if($status eq 'terminated') { $subscriber->provisioning_voip_subscriber->delete if($subscriber->provisioning_voip_subscriber); + $subscriber->voip_numbers->update_all({ + reseller_id => undef, + subscriber_id => undef, + }); } elsif($status eq 'locked') { NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber( c => $c, @@ -120,6 +124,10 @@ sub recursively_lock_contract { if($status eq 'terminated') { $subscriber->provisioning_voip_subscriber->delete if($subscriber->provisioning_voip_subscriber); + $subscriber->voip_numbers->update_all({ + reseller_id => undef, + subscriber_id => undef, + }); } elsif($status eq 'locked') { NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber( c => $c, diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index fd27cb7f5e..6b16d251f1 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -405,6 +405,39 @@ sub _set_rewrite_preferences { } +sub get_usr_preference_rs { + my %params = @_; + + my $c = $params{c}; + my $attribute = $params{attribute}; + my $prov_subscriber = $params{prov_subscriber}; + + my $pref_rs = $c->model('DB')->resultset('voip_preferences')->find({ + attribute => $attribute, 'usr_pref' => 1, + })->voip_usr_preferences; + if($prov_subscriber) { + $pref_rs = $pref_rs->search({ + subscriber_id => $prov_subscriber->id, + }); + } + return $pref_rs; +} + +sub get_dom_preference_rs { + my %params = @_; + + my $c = $params{c}; + my $attribute = $params{attribute}; + my $prov_domain = $params{prov_domain}; + + my $preference = $c->model('DB')->resultset('voip_preferences')->find({ + attribute => $attribute, 'dom_pref' => 1, + })->voip_dom_preferences->search_rs({ + domain_id => $prov_domain->id, + }); + return $preference; +} + 1; =head1 NAME diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 2fba602db7..a1d6412c53 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -237,6 +237,108 @@ sub update_subscriber_numbers { return; } +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 = $params{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 $billing_subscriber = $contract->voip_subscribers->create({ + uuid => $uuid_string, + username => $params->{username}, + domain_id => $billing_domain->id, + status => $params->{status}, + primary_number_id => undef, # will be filled in next step + }); + my ($cli); + if(defined $params->{e164}{cc} && $params->{e164}{cc} ne '') { + $cli = $params->{e164}{cc} . + ($params->{e164}{ac} || '') . + $params->{e164}{sn}; + + update_subscriber_numbers( + schema => $schema, + subscriber_id => $billing_subscriber->id, + reseller_id => $reseller->id, + primary_number => $params->{e164}, + ); + } + + 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, + create_timestamp => NGCP::Panel::Utils::DateTime::current_local, + }); + + $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 } ) { + my $pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + c => $c, attribute => $k, prov_subscriber => $prov_subscriber); + if($pref->first && $pref->first->attribute->max_occur == 1) { + $pref->first->update({ + 'value' => $preferences->{$k}, + }); + } else { + $pref->create({ + '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('voip_dbaliases')->create({ + username => $cli, + domain_id => $prov_subscriber->domain->id, + subscriber_id => $prov_subscriber->id, + }); + } + + return $billing_subscriber; + }); +} + 1; =head1 NAME diff --git a/share/templates/customer/details.tt b/share/templates/customer/details.tt index 9315243c20..6e0e47424f 100644 --- a/share/templates/customer/details.tt +++ b/share/templates/customer/details.tt @@ -1,4 +1,4 @@ -[% site_config.title = 'Customer Details for #' _ contract.id _ " (" _ product.name _ ")" -%] +[% site_config.title = 'Customer Details for #' _ contract.id -%] [% lock_levels = [