diff --git a/lib/NGCP/Panel/Controller/API/Subscribers.pm b/lib/NGCP/Panel/Controller/API/Subscribers.pm index ef536b90f9..46507ea9aa 100644 --- a/lib/NGCP/Panel/Controller/API/Subscribers.pm +++ b/lib/NGCP/Panel/Controller/API/Subscribers.pm @@ -99,7 +99,7 @@ sub GET :Allow { my (@embedded, @links); my $form = $self->get_form($c); for my $subscriber ($subscribers->search({}, {order_by => {-asc => 'me.id'}})->all) { - my $resource = $self->transform_resource($c, $subscriber, $form); + my $resource = $self->resource_from_item($c, $subscriber, $form); push @embedded, $self->hal_from_item($c, $subscriber, $resource, $form); push @links, Data::HAL::Link->new( relation => 'ngcp:'.$self->resource_name, diff --git a/lib/NGCP/Panel/Controller/API/SubscribersItem.pm b/lib/NGCP/Panel/Controller/API/SubscribersItem.pm index 20b7e60695..346bbc4052 100644 --- a/lib/NGCP/Panel/Controller/API/SubscribersItem.pm +++ b/lib/NGCP/Panel/Controller/API/SubscribersItem.pm @@ -51,7 +51,7 @@ sub GET :Allow { last unless $self->resource_exists($c, subscriber => $subscriber); my $form = $self->get_form($c); - my $resource = $self->transform_resource($c, $subscriber, $form); + my $resource = $self->resource_from_item($c, $subscriber, $form); my $hal = $self->hal_from_item($c, $subscriber, $resource, $form); my $response = HTTP::Response->new(HTTP_OK, undef, HTTP::Headers->new( @@ -119,7 +119,7 @@ sub PUT :Allow { $c->response->header(Preference_Applied => 'return=minimal'); $c->response->body(q()); } else { - $resource = $self->transform_resource($c, $subscriber, $form); + $resource = $self->resource_from_item($c, $subscriber, $form); my $hal = $self->hal_from_item($c, $subscriber, $resource, $form); my $response = HTTP::Response->new(HTTP_OK, undef, HTTP::Headers->new( $hal->http_headers, @@ -151,7 +151,7 @@ sub PATCH :Allow { last unless $json; my $form = $self->get_form($c); - my $old_resource = $self->transform_resource($c, $subscriber, $form); + my $old_resource = $self->resource_from_item($c, $subscriber, $form); my $resource = $self->apply_patch($c, $old_resource, $json); last unless $resource; @@ -170,7 +170,7 @@ sub PATCH :Allow { $c->response->header(Preference_Applied => 'return=minimal'); $c->response->body(q()); } else { - $resource = $self->transform_resource($c, $subscriber, $form); + $resource = $self->resource_from_item($c, $subscriber, $form); my $hal = $self->hal_from_item($c, $subscriber, $resource, $form); my $response = HTTP::Response->new(HTTP_OK, undef, HTTP::Headers->new( $hal->http_headers, diff --git a/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm b/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm index 2b24205b48..3fd1af5a55 100644 --- a/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm +++ b/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm @@ -79,7 +79,7 @@ has_field 'save' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/contract domain e164 alias_number webusername webpassword username password status lock external_id administrative is_pbx_group pbx_group display_name profile_set profile/ ], + render_list => [qw/contract domain e164 alias_number email webusername webpassword username password status lock external_id administrative is_pbx_group pbx_group display_name profile_set profile/ ], ); has_block 'actions' => ( diff --git a/lib/NGCP/Panel/Role/API/Subscribers.pm b/lib/NGCP/Panel/Role/API/Subscribers.pm index 5ad752f9b0..bedbf58711 100644 --- a/lib/NGCP/Panel/Role/API/Subscribers.pm +++ b/lib/NGCP/Panel/Role/API/Subscribers.pm @@ -24,7 +24,7 @@ sub get_form { return NGCP::Panel::Form::Subscriber::SubscriberAPI->new(ctx => $c); } -sub transform_resource { +sub resource_from_item { my ($self, $c, $item, $form) = @_; my $bill_resource = { $item->get_inflated_columns }; @@ -37,6 +37,12 @@ sub transform_resource { delete $resource{is_pbx_group}; delete $resource{pbx_group_id}; } + delete $resource{contact_id}; + if($item->contact) { + $resource{email} = $item->contact->email; + } else { + $resource{email} = undef; + } $form //= $self->get_form($c); last unless $self->validate_form( @@ -206,6 +212,8 @@ sub prepare_resource { $resource->{contract_id} = delete $resource->{customer_id}; $resource->{status} //= 'active'; $resource->{administrative} //= 0; + $resource->{profile_set}{id} = delete $resource->{profile_set_id}; + $resource->{profile}{id} = delete $resource->{profile_id}; my $form = $self->get_form($c); return unless $self->validate_form( @@ -439,6 +447,25 @@ sub update_item { } } + if($resource->{email}) { + my $contact = $subscriber->contact; + if($contact && $contact->email ne $resource->{email}) { + $contact->update({ + email => $resource->{email} + }); + } elsif(!$contact) { + $contact = $c->model('DB')->resultset('contacts')->create({ + reseller_id => $subscriber->contract->contact->reseller_id, + email => $resource->{email}, + }); + } # else old email == new email, nothing to do + $resource->{contact_id} = $contact->id; + } elsif($subscriber->contact) { + $subscriber->contact->delete; + $resource->{contact_id} = undef; # mark for clearance + } + delete $resource->{email}; + NGCP::Panel::Utils::Subscriber::update_subscriber_numbers( schema => $c->model('DB'), primary_number => $resource->{e164}, @@ -450,6 +477,7 @@ sub update_item { my $billing_res = { external_id => $resource->{external_id}, status => $resource->{status}, + contact_id => $resource->{contact_id}, }; my $provisioning_res = { password => $resource->{password},