diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index 8698726cf5..5f95e7f687 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -367,7 +367,21 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) { my $old_bprof_id = $billing_mapping->billing_profile_id; $c->log->debug(">>>>>>>>>>> old bprof_id=$old_bprof_id"); my $old_prepaid = $billing_mapping->billing_profile->prepaid; + my $old_ext_id = $contract->external_id; $contract->update($form->params); + + if($contract->external_id ne $old_ext_id) { + foreach my $sub($contract->voip_subscribers->all) { + my $prov_sub = $sub->provisioning_voip_subscriber; + next unless($prov_sub); + NGCP::Panel::Utils::Subscriber::update_preferences( + c => $c, + prov_subscriber => $prov_sub, + preferences => { ext_contract_id => $contract->external_id } + ); + } + } + if($bprof_id != $old_bprof_id) { $contract->billing_mappings->create({ billing_profile_id => $bprof_id, @@ -573,6 +587,12 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) { $preferences->{display_name} = $form->params->{display_name} if($form->params->{display_name}); } + if($c->stash->{contract}->external_id) { + $preferences->{ext_contract_id} = $c->stash->{contract}->external_id; + } + if($c->stash->{external_id}) { + $preferences->{ext_subscriber_id} = $c->stash->{external_id}; + } if($c->stash->{billing_mapping}->billing_profile->prepaid) { $preferences->{prepaid} = 1; } diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index 33e77d5c84..46c0bee543 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -206,11 +206,25 @@ sub create_list :Chained('sub_list') :PathPart('create') :Args(0) :Does(ACL) :AC 'value' => 1, }); } + if(defined $billing_subscriber->external_id) { + $voip_preferences->find({ 'attribute' => 'ext_subscriber_id' }) + ->voip_usr_preferences->create({ + 'subscriber_id' => $prov_subscriber->id, + 'value' => $billing_subscriber->external_id, + }); + } $voip_preferences->find({ 'attribute' => 'account_id' }) ->voip_usr_preferences->create({ 'subscriber_id' => $prov_subscriber->id, 'value' => $prov_subscriber->contract->id, }); + if($contract->external_id) { + $voip_preferences->find({ 'attribute' => 'ext_contract_id' }) + ->voip_usr_preferences->create({ + 'subscriber_id' => $prov_subscriber->id, + 'value' => $contract->external_id, + }); + } $voip_preferences->find({ 'attribute' => 'ac' }) ->voip_usr_preferences->create({ 'subscriber_id' => $prov_subscriber->id, @@ -1955,6 +1969,15 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet status => $form->params->{status}, external_id => $form->params->{external_id}, }); + if(defined $subscriber->external_id) { + my $ext_pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + c => $c, attribute => 'ext_subscriber_id', prov_subscriber => $prov_subscriber); + unless($ext_pref->first) { + $ext_pref->create({ value => $subscriber->external_id }); + } else { + $ext_pref->first->update({ value => $subscriber->external_id }); + } + } if($subscriber->status eq 'locked') { $form->values->{lock} = 4; # update lock below } elsif($old_status eq 'locked' && $subscriber->status eq 'active') { diff --git a/lib/NGCP/Panel/Role/API/Customers.pm b/lib/NGCP/Panel/Role/API/Customers.pm index 0d99ad8a9c..fb1ce5ec1c 100644 --- a/lib/NGCP/Panel/Role/API/Customers.pm +++ b/lib/NGCP/Panel/Role/API/Customers.pm @@ -177,8 +177,22 @@ sub update_customer { } } + my $old_ext_id = $customer->external_id; + $customer->update($resource); + if($customer->external_id ne $old_ext_id) { + foreach my $sub($customer->voip_subscribers->all) { + my $prov_sub = $sub->provisioning_voip_subscriber; + next unless($prov_sub); + NGCP::Panel::Utils::Subscriber::update_preferences( + c => $c, + prov_subscriber => $prov_sub, + preferences => { ext_contract_id => $customer->external_id } + ); + } + } + if($old_resource->{status} ne $resource->{status}) { if($customer->id == 1) { $self->error($c, HTTP_FORBIDDEN, "Cannot set customer status to '".$resource->{status}."' for customer id '1'"); diff --git a/lib/NGCP/Panel/Role/API/Subscribers.pm b/lib/NGCP/Panel/Role/API/Subscribers.pm index c153769771..3670be3e7f 100644 --- a/lib/NGCP/Panel/Role/API/Subscribers.pm +++ b/lib/NGCP/Panel/Role/API/Subscribers.pm @@ -60,6 +60,14 @@ sub transform_resource { push @{ $resource{alias_numbers} }, $alias; } } + + my $pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + c => $c, attribute => 'lock', + prov_subscriber => $item->provisioning_voip_subscriber); + if($pref->first) { + $resource{lock} = $pref->first->value; + } + $resource{customer_id} = int(delete $resource{contract_id}); $resource{id} = int($item->id); $resource{domain} = $item->domain->domain; @@ -264,6 +272,12 @@ sub prepare_resource { $preferences->{cloud_pbx_base_cli} = $base_number->{cc} . $base_number->{ac} . $base_number->{sn}; } } + if(exists $resource->{external_id}) { + $preferences->{ext_subscriber_id} = $resource->{external_id}; + } + if(defined $customer->external_id) { + $preferences->{ext_contract_id} = $customer->external_id; + } my $billing_profile = $self->get_billing_profile($c, $customer); return unless($billing_profile); @@ -320,6 +334,7 @@ sub prepare_resource { alias_numbers => $alias_numbers, preferences => $preferences, }; + return $r; } @@ -347,16 +362,18 @@ sub update_item { return; } } - try { - NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber( - c => $c, - prov_subscriber => $subscriber->provisioning_voip_subscriber, - level => $resource->{lock}, - ); - } catch($e) { - $c->log->error("failed to lock subscriber id ".$subscriber->id." with level ".$resource->{lock}); - $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update subscriber lock"); - return; + if(defined $resource->{lock}) { + try { + NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber( + c => $c, + prov_subscriber => $subscriber->provisioning_voip_subscriber, + level => $resource->{lock}, + ); + } catch($e) { + $c->log->error("failed to lock subscriber id ".$subscriber->id." with level ".$resource->{lock}); + $self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to update subscriber lock"); + return; + } } NGCP::Panel::Utils::Subscriber::update_subscriber_numbers( @@ -385,6 +402,11 @@ sub update_item { $subscriber->update($billing_res); $subscriber->provisioning_voip_subscriber->update($provisioning_res); $subscriber->discard_changes; + NGCP::Panel::Utils::Subscriber::update_preferences( + c => $c, + prov_subscriber => $subscriber->provisioning_voip_subscriber, + preferences => $preferences + ); # TODO: status handling (termination, ...) diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 847bb4bc58..aa4ece8b9a 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -198,19 +198,10 @@ sub create_subscriber { $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}, - }); - } - } + update_preferences(c => $c, + prov_subscriber => $prov_subscriber, + preferences => $preferences + ); $schema->resultset('voicemail_users')->create({ customer_id => $uuid_string, @@ -230,6 +221,27 @@ sub create_subscriber { }); } +sub update_preferences { + my (%params) = @_; + my $c = $params{c}; + my $prov_subscriber = $params{prov_subscriber}; + my $preferences = $params{preferences}; + + 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}, + }); + } + } +} + sub get_custom_subscriber_struct { my %params = @_; @@ -527,9 +539,11 @@ sub update_subscriber_numbers { subscriber_id => undef, reseller_id => undef, }); - $prov_subs->voip_dbaliases->search({ - id => { 'not in' => \@dbnums }, - })->delete; + if($prov_subs) { + $prov_subs->voip_dbaliases->search({ + id => { 'not in' => \@dbnums }, + })->delete; + } return; }