From 124137ca63eb35bdca997b80f30e66abb53f8bea Mon Sep 17 00:00:00 2001 From: Gerhard Jungwirth Date: Thu, 10 Oct 2013 19:38:47 +0200 Subject: [PATCH] MT#4261 number handling on subscriber update Actually use update_subscriber_numbers when updating a subscriber and not only when creating one. Also handle all neccessary side effects. Now we can switch our primary number to a number which has been inactive (that is: did not belong to a subscriber) without an update error. --- lib/NGCP/Panel/Controller/Subscriber.pm | 60 ++++++------------------- lib/NGCP/Panel/Utils/Subscriber.pm | 57 ++++++++++++++++++----- 2 files changed, 58 insertions(+), 59 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index 7080ac2e39..2c80552f34 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -175,7 +175,7 @@ sub create_list :Chained('sub_list') :PathPart('create') :Args(0) :Does(ACL) :AC NGCP::Panel::Utils::Subscriber::update_subscriber_numbers( schema => $schema, - primary_number => $form->params->{e164}, + primary_number => $form->values->{e164}, reseller_id => $reseller->id, subscriber_id => $billing_subscriber->id, ); @@ -1727,57 +1727,23 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) { $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->params->{e164}{cc}, - ac => $form->params->{e164}{ac} // '', - sn => $form->params->{e164}{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$/) { - $cf->update({ destination => 'sip:vmu'.$cli.'@voicebox.local' }); - } elsif($cf->destination =~ /\@fax2mail\.local$/) { - $cf->update({ destination => 'sip:'.$cli.'@fax2mail.local' }); - } elsif($cf->destination =~ /\@conference\.local$/) { - $cf->update({ destination => 'sip:conf='.$cli.'@conference.local' }); - } - } - } - $prov_subscriber->voicemail_user->update({ mailbox => $cli }); + NGCP::Panel::Utils::Subscriber::update_subscriber_numbers( + schema => $schema, + subscriber_id =>$subscriber->id, + reseller_id => $subscriber->contract->contact->reseller_id, + primary_number => $form->params->{e164}, + ); # 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->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->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 => - $form->field('e164')->field('cc')->value . - ($form->field('e164')->field('ac')->value || ''). - $form->field('e164')->field('sn')->value, - }); - } else { - $prov_subscriber->voicemail_user->update({ mailbox => '0' }); - } - + NGCP::Panel::Utils::Subscriber::update_subscriber_numbers( + schema => $schema, + subscriber_id =>$subscriber->id, + reseller_id => $subscriber->contract->contact->reseller_id, + primary_number => $form->values->{e164}, + ); } if($num) { $schema->resultset('voip_dbaliases')->create({ diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 70ebb64499..228dc34ea8 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -323,7 +323,12 @@ sub update_subscriber_numbers { my $subscriber_id = $params{subscriber_id}; my $reseller_id = $params{reseller_id}; my $primary_number = $params{primary_number}; - my $e164 = $params{e164}; # alias numbers + my $alias_numbers = $params{alias_numbers}; # alias numbers + + my $billing_subs = $schema->resultset('voip_subscribers')->find({ + id => $subscriber_id, + }); + my $prov_subs = $billing_subs->provisioning_voip_subscriber; if (defined $primary_number) { @@ -357,21 +362,49 @@ sub update_subscriber_numbers { subscriber_id => $subscriber_id, }); } + } - my $subs = $schema->resultset('voip_subscribers')->find({ - id => $subscriber_id, - }); + if(defined $number) { + my $cli = $number->cc . ($number->ac || '') . $number->sn; - $subs->update({ + if(defined $billing_subs->primary_number + && $billing_subs->primary_number_id != $number->id) { + $billing_subs->primary_number->delete; + } + $billing_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, - }); + if(defined $prov_subs) { + $schema->resultset('voip_dbaliases')->create({ + username => $cli, + domain_id => $prov_subs->domain->id, + subscriber_id => $prov_subs->id, + }); + if(defined $prov_subs->voicemail_user) { + $prov_subs->voicemail_user->update({ + mailbox => $cli, + }); + } + + for my $cfset($prov_subs->voip_cf_destination_sets->all) { + for my $cf($cfset->voip_cf_destinations->all) { + if($cf->destination =~ /\@voicebox\.local$/) { + $cf->update({ destination => 'sip:vmu'.$cli.'@voicebox.local' }); + } elsif($cf->destination =~ /\@fax2mail\.local$/) { + $cf->update({ destination => 'sip:'.$cli.'@fax2mail.local' }); + } elsif($cf->destination =~ /\@conference\.local$/) { + $cf->update({ destination => 'sip:conf='.$cli.'@conference.local' }); + } + } + } + } + } else { + if (defined $billing_subs->primary_number) { + $billing_subs->primary_number->delete; + } + if(defined $prov_subs->voicemail_user) { + $prov_subs->voicemail_user->update({ mailbox => '0' }); + } } }