MT#7545 Allow multiple pbx groups per subscriber

gjungwirth/voicemail_number
Andreas Granig 11 years ago
parent adffda31ac
commit f41626e521

@ -207,6 +207,9 @@ sub field_to_json : Private {
when(/\+NGCP::Panel::Field::AliasNumber/) {
return "Array";
}
when(/\+NGCP::Panel::Field::PbxGroupAPI/) {
return "Array";
}
# usually {xxx}{id}
when(/\+NGCP::Panel::Field::/) {
return "Number";
@ -239,6 +242,8 @@ sub get_collection_properties {
$name = 'primary_number';
} elsif($f->type =~ /AliasNumber/) {
$name = 'alias_numbers';
} elsif($f->type =~ /PbxGroupAPI/) {
$name = 'pbx_group_ids';
} elsif($f->type =~ /Country$/) {
$name = 'country';
} elsif($f->type !~ /Regex|EmailList|SubscriberStatusSelect|SubscriberLockSelect|Identifier|PosInteger/) {

@ -251,6 +251,7 @@ sub POST :Allow {
my $customer = $r->{customer};
my $alias_numbers = $r->{alias_numbers};
my $preferences = $r->{preferences};
my $groups = $r->{groups};
$resource = $r->{resource};
try {
@ -275,7 +276,23 @@ sub POST :Allow {
);
$subscriber->discard_changes; # reload row because of new number
# TODO: pbx prefs (group handling, display name, extension etc)
foreach my $group(@{ $groups }) {
$subscriber->provisioning_voip_subscriber->voip_pbx_groups->create({
group_id => $group->provisioning_voip_subscriber->id,
});
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $group->id,
username => $subscriber->username,
domain => $subscriber->domain->domain,
group_rs => $schema->resultset('voip_subscribers')->search({
contract_id => $customer->id,
status => { '!=' => 'terminated' },
}),
);
}
} catch(DBIx::Class::Exception $e where { /Duplicate entry '([^']+)' for key 'number_idx'/ }) {
$e =~ /Duplicate entry '([^']+)' for key 'number_idx'/;

@ -108,7 +108,7 @@ sub PUT :Allow {
$resource = $r->{resource};
my $form = $self->get_form($c);
$subscriber = $self->update_item($c, $subscriber, $r, $resource, $form);
$subscriber = $self->update_item($c, $schema, $subscriber, $r, $resource, $form);
last unless $subscriber;
$guard->commit;
@ -159,7 +159,7 @@ sub PATCH :Allow {
last unless $r;
$resource = $r->{resource};
$subscriber = $self->update_item($c, $subscriber, $r, $resource, $form);
$subscriber = $self->update_item($c, $schema, $subscriber, $r, $resource, $form);
last unless $subscriber;
$guard->commit;

@ -557,7 +557,7 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
if($c->config->{features}->{cloudpbx} && $pbx) {
$c->stash(customer_id => $c->stash->{contract}->id);
# we need to create an admin subscriber first
# we need to create a pilot subscriber first
unless($c->stash->{pilot}) {
$pbxadmin = 1;
$form = NGCP::Panel::Form::Customer::PbxAdminSubscriber->new(ctx => $c);
@ -573,6 +573,12 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
params => $params,
unselect => 1, # no numbers assigned yet, keep selection list empty
);
NGCP::Panel::Utils::Subscriber::prepare_group_select(
c => $c,
subscriber => $c->stash->{pilot},
params => $params,
unselect => 1, # no groups assigned yet, keep selection list empty
);
}
} else {
$form = NGCP::Panel::Form::Customer::Subscriber->new(ctx => $c);
@ -604,12 +610,11 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
my $schema = $c->model('DB');
$schema->txn_do(sub {
my $preferences = {};
my $pbxgroups;
if($pbx && !$pbxadmin) {
my $pilot = $c->stash->{pilot};
$form->params->{domain}{id} = $pilot->domain_id;
# TODO: make DT selection multi-select capable
$form->params->{pbx_group_id} = $form->params->{group}{id};
delete $form->params->{group};
$pbxgroups = decode_json($form->value->{group_select});
my $base_number = $pilot->primary_number;
if($base_number) {
$preferences->{cloud_pbx_base_cli} = $base_number->cc . $base_number->ac . $base_number->sn;
@ -661,15 +666,6 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
preferences => $preferences,
);
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $form->params->{pbx_group_id},
username => $form->params->{username},
domain => $billing_subscriber->domain->domain,
) if($pbx && !$pbxadmin && $form->params->{pbx_group_id});
if($pbx && !$pbxadmin) {
NGCP::Panel::Utils::Subscriber::update_subadmin_sub_aliases(
schema => $schema,
@ -678,6 +674,22 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
alias_selected => decode_json($form->value->{alias_select}),
sadmin => $c->stash->{pilot},
);
foreach my $group_id(@{ $pbxgroups }) {
my $group = $c->model('DB')->resultset('voip_subscribers')->find($group_id);
next unless($group && $group->provisioning_voip_subscriber && $group->provisioning_voip_subscriber->is_pbx_group);
$billing_subscriber->provisioning_voip_subscriber->voip_pbx_groups->create({
group_id => $group->provisioning_voip_subscriber->id,
});
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $group_id,
username => $billing_subscriber->username,
domain => $billing_subscriber->domain->domain,
);
}
}
});

@ -1998,9 +1998,6 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet
$params->{pbx_extension} = $prov_subscriber->pbx_extension;
}
if($pbx_ext) {
$params->{group}{id} = $prov_subscriber->pbx_group_id;
}
if($subscriber->contact) {
$params->{email} = $subscriber->contact->email;
}
@ -2016,6 +2013,11 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet
subscriber => $subscriber,
params => $params,
);
NGCP::Panel::Utils::Subscriber::prepare_group_select(
c => $c,
subscriber => $subscriber,
params => $params,
);
$params->{status} = $subscriber->status;
$params->{external_id} = $subscriber->external_id;
@ -2074,9 +2076,6 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet
$prov_params->{admin} = $form->params->{administrative} // 0;
}
}
$prov_params->{pbx_group_id} = $form->params->{group}{id}
if($pbx_ext);
my $old_group_id = $prov_subscriber->pbx_group_id;
if($form->params->{display_name}) {
@ -2164,14 +2163,46 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet
$prov_subscriber->update($prov_params);
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $old_group_id,
new_group_id => $prov_subscriber->pbx_group_id,
username => $subscriber->username,
domain => $subscriber->domain->domain,
) if($pbx_ext && defined $old_group_id && $old_group_id != $prov_subscriber->pbx_group_id);
my @old_groups = $prov_subscriber->voip_pbx_groups->get_column('group_id')->all;
my $new_group_ids = decode_json($form->value->{group_select});
my @new_groups = ();
foreach my $group_id(@{ $new_group_ids }) {
# add subscriber to group if not there yet
my $group = $schema->resultset('voip_subscribers')->find($group_id);
next unless($group && $group->provisioning_voip_subscriber && $group->provisioning_voip_subscriber->is_pbx_group);
push @new_groups, $group->provisioning_voip_subscriber->id;
unless($group->provisioning_voip_subscriber->id ~~ [ @old_groups ]) {
$prov_subscriber->voip_pbx_groups->create({
group_id => $group->provisioning_voip_subscriber->id,
});
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $group_id,
username => $subscriber->username,
domain => $subscriber->domain->domain,
);
}
}
foreach my $group_id(@old_groups) {
# remove subscriber from group if not there anymore
unless($group_id ~~ [ @new_groups ]) {
my $group = $schema->resultset('provisioning_voip_subscribers')->find($group_id);
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $group->voip_subscriber->id,
new_group_id => undef,
username => $subscriber->username,
domain => $subscriber->domain->domain,
);
$prov_subscriber->voip_pbx_groups->search({
group_id => $group_id,
subscriber_id => $prov_subscriber->id,
})->delete;
}
}
my $old_ext_id = $subscriber->external_id;
$subscriber->update({

@ -0,0 +1,15 @@
package NGCP::Panel::Field::PbxGroupAPI;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Field';
has_field 'dummy' => (
type => 'Text',
required => 0,
label => 'PBX Group IDs',
do_label => 1,
);
1;
# vim: set tabstop=4 expandtab:

@ -4,12 +4,6 @@ use HTML::FormHandler::Moose;
use NGCP::Panel::Field::PosInteger;
extends 'NGCP::Panel::Form::Customer::PbxSubscriber';
has_field 'group' => (
type => '+NGCP::Panel::Field::PbxGroup',
label => 'Group',
validate_when_empty => 1,
);
has_field 'pbx_extension' => (
type => '+NGCP::Panel::Field::PosInteger',
element_attr => {
@ -23,7 +17,7 @@ has_field 'pbx_extension' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/group alias_select pbx_extension display_name email webusername webpassword username password administrative status external_id profile_set profile/ ],
render_list => [qw/group_select alias_select pbx_extension display_name email webusername webpassword username password administrative status external_id profile_set profile/ ],
);
override 'field_list' => sub {
@ -33,14 +27,6 @@ override 'field_list' => sub {
super();
print ">>>>>>>>>>>>>> PbxExtensionSubscriber::field_list\n";
my $group = $self->field('group');
$group->field('id')->ajax_src(
$c->uri_for_action('/customer/pbx_group_ajax', [$c->stash->{customer_id}])->as_string
);
if($c->stash->{subscriber}) {
my $profile_set_field = $self->field('profile_set');

@ -6,7 +6,6 @@ use Moose::Util::TypeConstraints;
use HTML::FormHandler::Widget::Block::Bootstrap;
use NGCP::Panel::Field::PbxGroup;
use NGCP::Panel::Utils::Form;
with 'NGCP::Panel::Render::RepeatableJs';
@ -28,6 +27,18 @@ has_field 'e164' => (
},
);
has_field 'group_select' => (
type => '+NGCP::Panel::Field::DataTable',
label => 'Groups',
do_label => 0,
do_wrapper => 0,
required => 0,
template => 'helpers/datatables_multifield.tt',
ajax_src => '/invalid',
table_titles => ['#', 'Name', 'Extension'],
table_fields => ['id', 'username', 'provisioning_voip_subscriber_pbx_extension'],
);
has_field 'alias_select' => (
type => '+NGCP::Panel::Field::DataTable',
label => 'Numbers',
@ -180,17 +191,30 @@ sub field_list {
my $sub;
if($c->stash->{pilot}) {
$sub = $c->stash->{pilot};
} elsif($c->stash->{subscriber} && $c->stash->{subscriber}->provisioning_voip_subscriber->admin) {
} elsif($c->stash->{subscriber} && $c->stash->{subscriber}->provisioning_voip_subscriber->is_pbx_pilot) {
$sub = $c->stash->{subscriber};
}
if($sub) {
print ">>>>>>>>>>>>>>>> setting alias_select, url=" . $c->uri_for_action("/subscriber/aliases_ajax", [$sub->id]) . "\n";
$self->field('alias_select')->ajax_src(
$c->uri_for_action("/subscriber/aliases_ajax", [$sub->id])->as_string
);
}
}
if($self->field('group_select')) {
my $sub;
if($c->stash->{pilot}) {
$sub = $c->stash->{pilot};
} elsif($c->stash->{subscriber}) {
$sub = $c->stash->{subscriber};
}
if($sub) {
$self->field('group_select')->ajax_src(
$c->uri_for_action("/customer/pbx_group_ajax", [$sub->contract_id])->as_string
);
}
}
my $profile_set = $self->field('profile_set');
if($profile_set) {

@ -79,12 +79,18 @@ has_field 'is_pbx_group' => (
},
);
has_field 'pbx_group' => (
type => '+NGCP::Panel::Field::SubscriberPbxGroup',
label => 'PBX Group',
has_field 'pbx_group_ids' => (
type => '+NGCP::Panel::Field::PbxGroupAPI',
setup_for_js => 1,
do_wrapper => 1,
do_label => 0,
tags => {
controls_div => 1,
},
wrapper_class => [qw/hfh-rep/],
element_attr => {
rel => ['tooltip'],
title => ['The PBX group id this subscriber belongs to.'],
title => ['An array of PBX group ids this subscriber belongs to.'],
},
);
@ -130,7 +136,7 @@ has_field 'save' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/customer domain pbx_extension e164 alias_numbers email webusername webpassword username password status lock external_id administrative is_pbx_group pbx_group is_pbx_pilot display_name profile_set profile/ ],
render_list => [qw/customer domain pbx_extension e164 alias_numbers email webusername webpassword username password status lock external_id administrative is_pbx_group pbx_group_ids is_pbx_pilot display_name profile_set profile/ ],
);
has_block 'actions' => (

@ -39,7 +39,6 @@ sub resource_from_item {
delete $resource{is_pbx_group};
delete $resource{is_pbx_pilot};
delete $resource{pbx_extension};
delete $resource{pbx_group_id};
}
unless($self->is_true($resource{is_pbx_group})) {
delete $resource{pbx_hunt_policy};
@ -61,6 +60,13 @@ sub resource_from_item {
run => 0,
);
if($customer->get_column('product_class') eq 'pbxaccount') {
$resource{pbx_group_ids} = [];
foreach my $group($item->provisioning_voip_subscriber->voip_pbx_groups->all) {
push @{ $resource{pbx_group_ids} }, int($group->group->voip_subscriber->id);
}
}
if($item->primary_number) {
$resource{primary_number}->{cc} = $item->primary_number->cc;
$resource{primary_number}->{ac} = $item->primary_number->ac;
@ -201,7 +207,8 @@ sub get_billing_profile {
sub prepare_resource {
my ($self, $c, $schema, $resource, $item) = @_;
my @groups = ();
my $domain;
if($resource->{domain}) {
$domain = $c->model('DB')->resultset('domains')
@ -294,7 +301,7 @@ sub prepare_resource {
my $preferences = {};
my $admin = 0;
unless($customer->get_column('product_class') eq 'pbxaccount') {
for my $pref(qw/is_pbx_group pbx_group_id pbx_extension pbx_hunt_policy pbx_hunt_timeout is_pbx_pilot/) {
for my $pref(qw/is_pbx_group pbx_extension pbx_hunt_policy pbx_hunt_timeout is_pbx_pilot/) {
delete $resource->{$pref};
}
$admin = $resource->{admin} // 0;
@ -337,20 +344,25 @@ sub prepare_resource {
$resource->{e164}->{sn} = $pilot->primary_number->sn . $resource->{pbx_extension};
unless($self->is_true($resource->{is_pbx_group})) {
unless($resource->{pbx_group_id}) {
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "A pbx_group_id is required if customer is PBX and pilot subscriber exists.");
return;
}
my $group_subscriber = $c->model('DB')->resultset('voip_subscribers')->find({
id => $resource->{pbx_group_id},
contract_id => $resource->{customer_id},
'provisioning_voip_subscriber.is_pbx_group' => 1,
},{
join => 'provisioning_voip_subscriber',
});
unless($group_subscriber) {
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid pbx_group_id, does not exist for this contract.");
return;
if(exists $resource->{pbx_group_ids}) {
unless(ref $resource->{pbx_group_ids} eq "ARRAY") {
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid pbx_group_ids parameter, must be an array.");
return;
}
foreach my $group_id(@{ $resource->{pbx_group_ids} }) {
my $group_subscriber = $c->model('DB')->resultset('voip_subscribers')->find({
id => $group_id,
contract_id => $resource->{customer_id},
'provisioning_voip_subscriber.is_pbx_group' => 1,
},{
join => 'provisioning_voip_subscriber',
});
unless($group_subscriber) {
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid id '$group_id' in pbx_group_ids, does not exist for this customer.");
return;
}
push @groups, $group_subscriber;
}
}
}
}
@ -424,18 +436,20 @@ sub prepare_resource {
customer => $customer,
alias_numbers => $alias_numbers,
preferences => $preferences,
groups => \@groups,
};
return $r;
}
sub update_item {
my ($self, $c, $item, $full_resource, $resource, $form) = @_;
my ($self, $c, $schema, $item, $full_resource, $resource, $form) = @_;
my $subscriber = $item;
my $customer = $full_resource->{customer};
my $alias_numbers = $full_resource->{alias_numbers};
my $preferences = $full_resource->{preferences};
my $groups = $full_resource->{groups};
if($subscriber->provisioning_voip_subscriber->is_pbx_pilot && !$self->is_true($resource->{is_pbx_pilot})) {
@ -475,7 +489,7 @@ sub update_item {
my ($profile_set, $profile);
if($resource->{profile_set}{id}) {
my $profile_set_rs = $c->model('DB')->resultset('voip_subscriber_profile_sets');
my $profile_set_rs = $schema->resultset('voip_subscriber_profile_sets');
if($c->user->roles eq "admin") {
} elsif($c->user->roles eq "reseller") {
$profile_set_rs = $profile_set_rs->search({
@ -513,7 +527,7 @@ sub update_item {
}
}
if(keys %old_profile_attributes) {
my $cfs = $c->model('DB')->resultset('voip_preferences')->search({
my $cfs = $schema->resultset('voip_preferences')->search({
id => { -in => [ keys %old_profile_attributes ] },
attribute => { -in => [qw/cfu cfb cft cfna/] },
});
@ -533,7 +547,7 @@ sub update_item {
email => $resource->{email},
});
} elsif(!$contact) {
$contact = $c->model('DB')->resultset('contacts')->create({
$contact = $schema->resultset('contacts')->create({
reseller_id => $subscriber->contract->contact->reseller_id,
email => $resource->{email},
});
@ -546,7 +560,7 @@ sub update_item {
delete $resource->{email};
NGCP::Panel::Utils::Subscriber::update_subscriber_numbers(
schema => $c->model('DB'),
schema => $schema,
primary_number => $resource->{e164},
alias_numbers => $alias_numbers,
reseller_id => $customer->contact->reseller_id,
@ -565,7 +579,6 @@ sub update_item {
admin => $resource->{administrative} // 0,
is_pbx_pilot => $resource->{is_pbx_pilot} // 0,
is_pbx_group => $resource->{is_pbx_group} // 0,
pbx_group_id => $resource->{pbx_group_id},
modify_timestamp => NGCP::Panel::Utils::DateTime::current_local,
profile_set_id => $profile_set ? $profile_set->id : undef,
profile_id => $profile ? $profile->id : undef,
@ -574,7 +587,6 @@ sub update_item {
if($self->is_true($resource->{is_pbx_group})) {
$provisioning_res->{pbx_hunt_policy} = $resource->{pbx_hunt_policy};
$provisioning_res->{pbx_hunt_timeout} = $resource->{pbx_hunt_timeout};
$provisioning_res->{pbx_group_id} = undef;
}
$subscriber->update($billing_res);
@ -586,6 +598,52 @@ sub update_item {
preferences => $preferences,
);
my @old_groups = $subscriber->provisioning_voip_subscriber
->voip_pbx_groups->get_column('group_id')->all;
my @new_groups = ();
foreach my $group(@{ $groups }) {
push @new_groups, $group->provisioning_voip_subscriber->id;
unless($group->provisioning_voip_subscriber->id ~~ [ @old_groups ]) {
$subscriber->provisioning_voip_subscriber->voip_pbx_groups->create({
group_id => $group->provisioning_voip_subscriber->id,
});
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $group->id,
username => $subscriber->username,
domain => $subscriber->domain->domain,
group_rs => $schema->resultset('voip_subscribers')->search({
contract_id => $customer->id,
status => { '!=' => 'terminated' },
}),
);
}
foreach my $group_id(@old_groups) {
# remove subscriber from group if not there anymore
unless($group_id ~~ [ @new_groups ]) {
my $group = $schema->resultset('provisioning_voip_subscribers')->find($group_id);
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $group->voip_subscriber->id,
new_group_id => undef,
username => $subscriber->username,
domain => $subscriber->domain->domain,
group_rs => $schema->resultset('voip_subscribers')->search({
contract_id => $customer->id,
status => { '!=' => 'terminated' },
}),
);
$subscriber->provisioning_voip_subscriber->voip_pbx_groups->search({
group_id => $group_id,
subscriber_id => $subscriber->provisioning_voip_subscriber->id,
})->delete;
}
}
}
# TODO: status handling (termination, ...)
return $subscriber;

@ -239,7 +239,6 @@ sub create_subscriber {
domain_id => $prov_domain->id,
is_pbx_pilot => $params->{is_pbx_pilot} // 0,
is_pbx_group => $params->{is_pbx_group} // 0,
pbx_group_id => $params->{pbx_group_id},
pbx_extension => $params->{pbx_extension},
pbx_hunt_policy => $params->{pbx_hunt_policy},
pbx_hunt_timeout => $params->{pbx_hunt_timeout},
@ -352,6 +351,7 @@ sub update_pbx_group_prefs {
my $new_group_id = $params{new_group_id};
my $username = $params{username};
my $domain = $params{domain};
my $group_rs = $params{group_rs} // $c->stash->{pbx_groups};
return if(defined $old_group_id && defined $new_group_id && $old_group_id == $new_group_id);
@ -360,7 +360,7 @@ sub update_pbx_group_prefs {
my $uri = "sip:$username\@$domain";
if($old_group_id) {
$old_grp_subscriber= $c->stash->{pbx_groups}
$old_grp_subscriber= $group_rs
->find($old_group_id)
->provisioning_voip_subscriber;
if($old_grp_subscriber) {
@ -372,7 +372,7 @@ sub update_pbx_group_prefs {
}
}
if($new_group_id) {
$new_grp_subscriber = $c->stash->{pbx_groups}
$new_grp_subscriber = $group_rs
->find($new_group_id)
->provisioning_voip_subscriber;
if($new_grp_subscriber) {
@ -504,8 +504,7 @@ sub update_subscriber_numbers {
if ( (defined $old_cc && defined $old_sn)
&& $billing_subs->contract->billing_mappings->first->product->class eq "pbxaccount"
&& ! defined $prov_subs->pbx_group_id
&& $prov_subs->admin ) {
&& $prov_subs->is_pbx_pilot ) {
my $customer_subscribers_rs = $billing_subs->contract->voip_subscribers;
my $my_cc = $primary_number->{cc};
my $my_ac = $primary_number->{ac};
@ -670,23 +669,23 @@ sub terminate {
my $schema = $c->model('DB');
$schema->txn_do(sub {
if($subscriber->provisioning_voip_subscriber->is_pbx_group) {
my $group = $schema->resultset('provisioning_voip_subscribers')->search({
pbx_group_id => $subscriber->id
});
$group->update({
pbx_group_id => undef,
});
$schema->resultset('voip_pbx_groups')->search({
group_id => $subscriber->provisioning_voip_subscriber->id,
})->delete;
}
my $prov_subscriber = $subscriber->provisioning_voip_subscriber;
if($prov_subscriber) {
update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $prov_subscriber->pbx_group_id,
new_group_id => undef,
username => $prov_subscriber->username,
domain => $prov_subscriber->domain->domain,
) if($prov_subscriber->pbx_group_id);
foreach my $groups($prov_subscriber->voip_pbx_groups->all) {
my $group_sub = $groups->group;
update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $group_sub->voip_subscriber->id,
new_group_id => undef,
username => $prov_subscriber->username,
domain => $prov_subscriber->domain->domain,
);
}
$prov_subscriber->delete;
}
if(!$prov_subscriber->admin && $c->stash->{admin_subscriber}) {
@ -809,6 +808,23 @@ sub prepare_alias_select {
$params->{alias_select} = encode_json(\@alias_options);
}
sub prepare_group_select {
my (%p) = @_;
my $c = $p{c};
my $subscriber = $p{subscriber};
my $params = $p{params};
my $unselect = $p{unselect} // 0;
my @group_options = ();
my $group_rs = $c->model('DB')->resultset('voip_pbx_groups')->search({
'subscriber_id' => $subscriber->provisioning_voip_subscriber->id,
});
unless($unselect) {
@group_options = map { $_->group->voip_subscriber->id } $group_rs->all;
}
$params->{group_select} = encode_json(\@group_options);
}
sub apply_rewrite {
my (%params) = @_;

@ -85,8 +85,16 @@
IF (c.user.roles == "admin" || c.user.roles == "reseller") && c.user.show_passwords;
elements.push({ value = subscriber.provisioning_voip_subscriber.password, desc = c.loc('SIP Password') });
END;
IF subscriber.provisioning_voip_subscriber.pbx_group_id.defined;
elements.push({ value = subscriber.provisioning_voip_subscriber.voip_pbx_group.username, desc = c.loc('PBX Group') });
IF subscriber.provisioning_voip_subscriber.voip_pbx_groups.count;
group_subs = subscriber.provisioning_voip_subscriber.voip_pbx_groups.all;
group_str = '';
FOR group IN group_subs;
group_str = group_str _ group.group.username;
IF !loop.last;
group_str = group_str _ '<br/>';
END;
END;
elements.push({ value = group_str, desc = c.loc('PBX Groups') });
END;
IF c.user.roles == "admin" || c.user.roles == "reseller";
elements.push({ value = subscriber.provisioning_voip_subscriber.admin ? 'yes' : 'no', desc = c.loc('Administrative') });

Loading…
Cancel
Save