From f9bf64f3cdfed2a78f23af2afbe79b60a065f4e8 Mon Sep 17 00:00:00 2001 From: Gerhard Jungwirth Date: Thu, 10 Oct 2013 17:35:36 +0200 Subject: [PATCH] MT#4261 Proper number handling on subscribers Outsource the handling of the primary number from the subscriber controller to a util sub called update_subscriber_numbers. It also takes care to reuse a number that has subscriber_id set to NULL which caused the original problem in the ticket. Cherry-picked from master Conflicts: lib/NGCP/Panel/Utils/Subscriber.pm --- lib/NGCP/Panel/Controller/Subscriber.pm | 32 +++---------- lib/NGCP/Panel/Utils/Subscriber.pm | 62 +++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 25 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index dff5386e4a..4334b4aa26 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -133,28 +133,12 @@ sub create_list :Chained('sub_list') :PathPart('create') :Args(0) { my $reseller = $contract->contact->reseller; - my $number; - if(defined $c->request->params->{'e164.cc'} && - $c->request->params->{'e164.cc'} ne '') { - - - $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, @@ -167,15 +151,13 @@ sub create_list :Chained('sub_list') :PathPart('create') :Args(0) { domain_id => $prov_domain->id, create_timestamp => NGCP::Panel::Utils::DateTime::current_local, }); - if($number) { - $schema->resultset('voip_dbaliases')->create({ - username => $number->cc . - ($number->ac || ''). - $number->sn, - domain_id => $prov_subscriber->domain->id, - subscriber_id=> $prov_subscriber->id, - }); - } + + NGCP::Panel::Utils::Subscriber::update_subscriber_numbers( + schema => $schema, + primary_number => $form->params->{e164}, + reseller_id => $reseller->id, + subscriber_id => $billing_subscriber->id, + ); my $cli = 0; my $voip_preferences = $schema->resultset('voip_preferences')->search({ diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 3115a5200b..251baec52e 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -122,6 +122,68 @@ sub get_lock_string { return $LOCK{$level}; } +sub update_subscriber_numbers { + my %params = @_; + + my $schema = $params{schema}; + my $subscriber_id = $params{subscriber_id}; + my $reseller_id = $params{reseller_id}; + my $primary_number = $params{primary_number}; + my $e164 = $params{e164}; # alias numbers + + if (defined $primary_number) { + + my $number; + if (defined $primary_number->{cc} + && $primary_number->{cc} ne '') { + + my $old_number = $schema->resultset('voip_numbers')->search({ + cc => $primary_number->{cc}, + ac => $primary_number->{ac} || '', + sn => $primary_number->{sn}, + subscriber_id => [undef, $subscriber_id], + },{ + for => 'update', + })->first; + + if(defined $old_number) { + $old_number->update({ + status => 'active', + reseller_id => $reseller_id, + subscriber_id => $subscriber_id, + }); + $number = $old_number; + } else { + $number = $schema->resultset('voip_numbers')->create({ + cc => $primary_number->{cc}, + ac => $primary_number->{ac} || '', + sn => $primary_number->{sn}, + status => 'active', + reseller_id => $reseller_id, + subscriber_id => $subscriber_id, + }); + } + + my $subs = $schema->resultset('voip_subscribers')->find({ + id => $subscriber_id, + }); + + $subs->update({ + primary_number_id => $number->id, + }); + $schema->resultset('voip_dbaliases')->create({ + username => $number->cc . + ($number->ac || ''). + $number->sn, + domain_id => $subs->provisioning_voip_subscriber->domain->id, + subscriber_id => $subs->provisioning_voip_subscriber->id, + }); + } + } + + return; +} + 1; =head1 NAME