Implement group, admin and ext handling for PBX.

agranig/peering-route
Andreas Granig 13 years ago
parent 754f1f7887
commit 23675b4da3

@ -9,10 +9,11 @@ use NGCP::Panel::Form::CustomerBalance;
use NGCP::Panel::Form::Customer::Subscriber;
use NGCP::Panel::Form::Customer::PbxAdminSubscriber;
use NGCP::Panel::Form::Customer::PbxExtensionSubscriber;
use NGCP::Panel::Form::Customer::PbxGroup;
use NGCP::Panel::Utils::Message;
use NGCP::Panel::Utils::Navigation;
use NGCP::Panel::Utils::DateTime;
use UUID qw/generate unparse/;
use NGCP::Panel::Utils::Subscriber;
=head1 NAME
@ -135,19 +136,39 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) {
desc => "Invalid product id for this customer contract.",
) unless($product);
$c->stash->{pbxgroup_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => "id", search => 1, title => "#" },
{ name => "name", search => 1, title => "Name" },
{ name => "extension", search => 1, title => "Extension" },
]);
my @subscribers = ();
my @pbx_groups = ();
foreach my $s($contract->first->voip_subscribers->search_rs({ status => 'active' })->all) {
my $sub = { $s->get_columns };
if($c->config->{features}->{cloudpbx}) {
$sub->{voip_pbx_group} = { $s->provisioning_voip_subscriber->voip_pbx_group->get_columns }
if($s->provisioning_voip_subscriber->voip_pbx_group);
}
$sub->{domain} = $s->domain->domain;
$sub->{admin} = $s->provisioning_voip_subscriber->admin if
$s->provisioning_voip_subscriber;
$sub->{primary_number} = {$s->primary_number->get_columns} if(defined $s->primary_number);
$sub->{locations} = [ map { { $_->get_columns } } $c->model('DB')->resultset('location')->
search({
username => $s->username,
domain => $s->domain->domain,
})->all ];
push @subscribers, $sub;
if($c->config->{features}->{cloudpbx} && $s->provisioning_voip_subscriber->is_pbx_group) {
my $grp = $contract->first->voip_pbx_groups->find({ subscriber_id => $s->provisioning_voip_subscriber->id });
$sub->{voip_pbx_group} = { $grp->get_columns } if $grp;
push @pbx_groups, $sub;
} else {
push @subscribers, $sub;
}
}
$c->stash->{subscribers} = \@subscribers;
$c->stash->{pbx_groups} = \@pbx_groups;
$c->stash(product => $product);
$c->stash(balance => $balance);
@ -166,14 +187,19 @@ sub details :Chained('base') :PathPart('details') :Args(0) {
sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
my ($self, $c) = @_;
my $pbx;
my $pbx = 0; my $pbxadmin = 0;
$pbx = 1 if $c->stash->{product}->class eq 'pbxaccount';
my @admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers(
voip_subscriber_rs => $c->stash->{subscribers});
my $form;
my $admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers(
voip_subscribers => $c->stash->{subscribers});
if($c->config->{features}->{cloudpbx} && $pbx) {
# we need to create an admin subscriber first
# TODO: should we check whether one of the existing subscribers has the admin flag set?
unless(@{ $c->stash->{subscribers} }) {
unless(@{ $admin_subscribers }) {
$pbxadmin = 1;
$form = NGCP::Panel::Form::Customer::PbxAdminSubscriber->new(ctx => $c);
} else {
$form = NGCP::Panel::Form::Customer::PbxExtensionSubscriber->new(ctx => $c);
@ -192,132 +218,58 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => [qw/domain.create/],
fields => {
'domain.create' => $c->uri_for('/domain/create'),
'group.create' => $c->uri_for_action('/customer/pbx_group_create', $c->req->captures),
},
back_uri => $c->req->uri,
);
if($form->validated) {
my $schema = $c->model('DB');
my $contract = $c->stash->{contract};
my $reseller = $contract->contact->reseller;
my $billing_domain = $schema->resultset('domains')
->find($c->request->params->{'domain.id'});
my $prov_domain = $schema->resultset('voip_domains')
->find({domain => $billing_domain->domain});
my $billing_subscriber;
try {
$schema->txn_do(sub {
my ($uuid_bin, $uuid_string);
UUID::generate($uuid_bin);
UUID::unparse($uuid_bin, $uuid_string);
# TODO: check if we find a reseller and contract and domains
my $number; my $cli = 0;
if(defined $c->request->params->{'e164.cc'} &&
$c->request->params->{'e164.cc'} ne '') {
$cli = $c->request->params->{'e164.cc'} .
($c->request->params->{'e164.ac'} || '') .
$c->request->params->{'e164.sn'};
$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,
username => $c->request->params->{username},
password => $c->request->params->{password},
webusername => $c->request->params->{webusername} || $c->request->params->{username},
webpassword => $c->request->params->{webpassword},
admin => $c->request->params->{administrative} || 0,
account_id => $contract->id,
domain_id => $prov_domain->id,
create_timestamp => NGCP::Panel::Utils::DateTime::current_local,
});
my $voip_preferences = $schema->resultset('voip_preferences')->search({
'usr_pref' => 1,
});
$voip_preferences->find({ 'attribute' => 'account_id' })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
'value' => $contract->id,
});
$voip_preferences->find({ 'attribute' => 'ac' })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
'value' => $c->request->params->{'e164.ac'},
}) if (defined $c->request->params->{'e164.ac'} &&
length($c->request->params->{'e164.ac'}) > 0);
if(defined $c->request->params->{'e164.cc'} &&
length($c->request->params->{'e164.cc'}) > 0) {
$voip_preferences->find({ 'attribute' => 'cc' })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
'value' => $c->request->params->{'e164.cc'},
});
$cli = $c->request->params->{'e164.cc'} .
(defined $c->request->params->{'e164.ac'} &&
length($c->request->params->{'e164.ac'}) > 0 ?
$c->request->params->{'e164.ac'} : ''
) .
$c->request->params->{'e164.sn'};
$voip_preferences->find({ 'attribute' => 'cli' })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
'value' => $cli,
});
}
$schema->resultset('voicemail_users')->create({
customer_id => $uuid_string,
mailbox => $cli,
password => sprintf("%04d", int(rand 10000)),
email => '',
});
if($number) {
$schema->resultset('dbaliases')->create({
alias_username => $number->cc .
($number->ac || '').
$number->sn,
alias_domain => $prov_subscriber->domain->domain,
username => $prov_subscriber->username,
domain => $prov_subscriber->domain->domain,
});
my $preferences = {};
if($pbx && !$pbxadmin) {
my $admin = $admin_subscribers->[0];
$form->params->{domain}{id} = $admin->{domain_id};
# TODO: make DT selection multi-select capable
# set pbx_group preferences somehow for the related group subscriber as well
$form->params->{pbx_group_id} = $form->params->{group}{id};
delete $form->params->{group};
my $base_number = $admin->{primary_number};
if($base_number) {
# $preferences->{base_cli} = $base_number->cc . $base_number->ac . $base_number->sn;
if($form->params->{extension}) {
$form->params->{e164}{cc} = $base_number->{cc};
$form->params->{e164}{ac} = $base_number->{ac};
$form->params->{e164}{sn} = $base_number->{sn} . $form->params->{extension};
}
}
delete $c->session->{created_objects}->{domain};
});
$c->flash(messages => [{type => 'success', text => 'Subscriber successfully created!'}]);
$c->response->redirect($c->uri_for_action('/customer/details', [$contract->id]));
return;
}
if($pbx) {
$preferences->{cloud_pbx} = 1;
}
$billing_subscriber = NGCP::Panel::Utils::Subscriber::create_subscriber(
c => $c,
contract => $c->stash->{contract},
params => $form->params,
admin_default => $pbxadmin,
preferences => $preferences,
);
delete $c->session->{created_objects}->{domain};
delete $c->session->{created_objects}->{group};
$c->flash(messages => [{type => 'success', text => 'Subscriber successfully created.'}]);
} catch($e) {
NGCP::Panel::Utils::Message->error(
c => $c,
error => $e,
desc => "Failed to create subscriber.",
);
$c->response->redirect($c->uri_for_action('/customer/details', [$contract->id]));
return;
}
NGCP::Panel::Utils::Navigation::back_or($c,
$c->uri_for_action('/customer/details', [$c->stash->{contract}->id])
);
}
$c->stash(close_target => $c->uri_for());
$c->stash(create_flag => 1);
$c->stash(form => $form)
}
@ -417,6 +369,100 @@ sub edit_balance :Chained('base') :PathPart('balance/edit') :Args(0) {
}
sub pbx_group_ajax :Chained('base') :PathPart('pbx/group/ajax') :Args(0) {
my ($self, $c) = @_;
my $res = $c->model('DB')->resultset('voip_pbx_groups')->search({
contract_id => $c->stash->{contract}->id,
});
NGCP::Panel::Utils::Datatables::process($c, $res, $c->stash->{pbxgroup_dt_columns});
$c->detach( $c->view("JSON") );
}
sub pbx_group_create :Chained('base') :PathPart('pbx/group/create') :Args(0) {
my ($self, $c) = @_;
my $posted = ($c->request->method eq 'POST');
my $admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers(
voip_subscribers => $c->stash->{subscribers});
unless(@{ $admin_subscribers }) {
NGCP::Panel::Utils::Message->error(
c => $c,
error => 'cannot create pbx group without having an admin subscriber',
desc => "Can't create a PBX group without having an administrative subscriber.",
);
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for_action('/customer/details', $c->req->captures));
}
my $form;
$form = NGCP::Panel::Form::Customer::PbxGroup->new;
my $params = {};
$params = $params->merge($c->session->{created_objects});
$form->process(
posted => $posted,
params => $c->request->params,
item => $params,
);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) {
try {
$c->model('DB')->schema->txn_do( sub {
my $preferences = {};
my $admin = $admin_subscribers->[0];
my $base_number = $admin->{primary_number};
if($base_number) {
# TODO: this pref doesn't exist yet in the db
# $preferences->{base_cli} = $base_number->cc . $base_number->ac . $base_number->sn;
if($form->params->{extension}) {
$form->params->{e164}{cc} = $base_number->{cc};
$form->params->{e164}{ac} = $base_number->{ac};
$form->params->{e164}{sn} = $base_number->{sn} . $form->params->{extension};
}
}
$form->params->{is_pbx_group} = 1;
$form->params->{domain}{id} = $admin->{domain_id};
$form->params->{status} = 'active';
$form->params->{username} = lc $form->params->{name};
$form->params->{username} =~ s/\s+/_/g;
$preferences->{cloud_pbx} = 1;
my $billing_subscriber = NGCP::Panel::Utils::Subscriber::create_subscriber(
c => $c,
contract => $c->stash->{contract},
params => $form->params,
admin_default => 0,
preferences => $preferences,
);
foreach my $k(qw/is_pbx_group username password e164 pbx_group domain status/) {
delete $form->params->{$k};
}
$form->params->{subscriber_id} = $billing_subscriber->provisioning_voip_subscriber->id;
my $group = $c->stash->{contract}->voip_pbx_groups->create($form->params);
$c->session->{created_objects}->{group} = { id => $group->id };
});
$c->flash(messages => [{type => 'success', text => 'PBX group successfully created.'}]);
} catch ($e) {
NGCP::Panel::Utils::Message->error(
c => $c,
error => $e,
desc => "Failed to create PBX group.",
);
}
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for_action('/customer/details', $c->req->captures));
}
$c->stash(
close_target => $c->uri_for,
create_flag => 1,
form => $form
);
}
=head1 AUTHOR

@ -84,7 +84,8 @@ sub create :Chained('dom_list') :PathPart('create') :Args(0) {
$new_dom->create_related('domain_resellers', {
reseller_id => $reseller_id
});
NGCP::Panel::Utils::Prosody::activate_domain($c, $form->value->{domain});
NGCP::Panel::Utils::Prosody::activate_domain($c, $form->value->{domain})
unless($c->config->{features}->{debug});
delete $c->session->{created_objects}->{reseller};
$c->session->{created_objects}->{domain} = { id => $new_dom->id };
});
@ -186,7 +187,8 @@ sub delete :Chained('base') :PathPart('delete') :Args(0) {
$c->model('DB')->schema->txn_do( sub {
$c->stash->{'domain_result'}->delete;
$c->stash->{'provisioning_domain_result'}->delete;
NGCP::Panel::Utils::Prosody::deactivate_domain($c, $domain);
NGCP::Panel::Utils::Prosody::deactivate_domain($c, $domain)
unless($c->config->{features}->{debug});
});
} catch ($e) {
NGCP::Panel::Utils::Message->error(

@ -276,6 +276,17 @@ sub terminate :Chained('base') :PathPart('terminate') :Args(0) {
my $schema = $c->model('DB');
try {
$schema->txn_do(sub {
if($subscriber->provisioning_voip_subscriber->is_pbx_group) {
my $pbx_group = $schema->resultset('voip_pbx_groups')->find({
subscriber_id => $subscriber->provisioning_voip_subscriber->id
});
if($pbx_group) {
$pbx_group->provisioning_voip_subscribers->update_all({
pbx_group_id => undef,
});
}
$pbx_group->delete;
}
$subscriber->provisioning_voip_subscriber->delete;
$subscriber->voip_numbers->delete_all;
$subscriber->update({ status => 'terminated' });

@ -54,7 +54,7 @@ has_field 'domain' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/group webusername webpassword e164 username domain password status external_id/ ],
render_list => [qw/webusername webpassword e164 username domain password status external_id/ ],
);
sub validate {

@ -3,24 +3,39 @@ package NGCP::Panel::Form::Customer::PbxExtensionSubscriber;
use HTML::FormHandler::Moose;
extends 'NGCP::Panel::Form::Customer::PbxSubscriber';
has_field 'ext' => (
has_field 'group' => (
type => '+NGCP::Panel::Field::PbxGroup',
label => 'Group',
not_nullable => 1,
);
has_field 'extension' => (
type => 'PosInteger',
element_attr => {
class => ['ngcp_e164_sn'],
rel => ['tooltip'],
title => ['Extension Number, e.g. 101']
},
do_label => 0,
do_wrapper => 0,
required => 1,
label => 'Extension',
);
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/webusername webpassword ext username password status external_id/ ],
render_list => [qw/group webusername webpassword extension username password status external_id/ ],
);
sub field_list {
my $self = shift;
my $c = $self->ctx;
my $group = $self->field('group');
$group->field('id')->ajax_src(
$c->uri_for_action('/customer/pbx_group_ajax', [$c->req->captures->[0]])->as_string
);
}
1;
=head1 NAME

@ -0,0 +1,72 @@
package NGCP::Panel::Form::Customer::PbxGroup;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
use Moose::Util::TypeConstraints;
use HTML::FormHandler::Widget::Block::Bootstrap;
has '+widget_wrapper' => ( default => 'Bootstrap' );
has_field 'submitid' => ( type => 'Hidden' );
sub build_render_list {[qw/submitid fields actions/]}
sub build_form_element_class {[qw(form-horizontal)]}
has_field 'name' => (
type => 'Text',
required => 1,
label => 'Name',
);
has_field 'extension' => (
type => 'Text',
required => 1,
label => 'Extension',
);
has_field 'hunt_policy' => (
type => 'Select',
required => 1,
label => 'Hunting Policy',
options => [
{ label => 'Serial Ringing', value => 'serial' },
{ label => 'Parallel Ringing', value => 'parallel' },
],
default => 'serial',
);
has_field 'hunt_policy_timeout' => (
type => 'PosInteger',
required => 1,
label => 'Serial Ringing Timeout',
default => 10,
);
has_field 'save' => (
type => 'Submit',
value => 'Save',
element_class => [qw/btn btn-primary/],
label => '',
);
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/name extension hunt_policy hunt_policy_timeout/],
);
has_block 'actions' => (
tag => 'div',
class => [qw/modal-footer/],
render_list => [qw/save/],
);
sub validate_name {
my ($self, $field) = @_;
unless($field->value =~ /^[a-zA-Z0-9_\-\s]+$/) {
$field->add_error("Invalid group name, must only contain letters, digits, - and _ and spaces");
}
}
1;
# vim: set tabstop=4 expandtab:

@ -13,12 +13,6 @@ has_field 'submitid' => ( type => 'Hidden' );
sub build_render_list {[qw/submitid fields actions/]}
sub build_form_element_class { [qw/form-horizontal/] }
has_field 'group' => (
type => '+NGCP::Panel::Field::PbxGroup',
label => 'Group',
not_nullable => 1,
);
has_field 'webusername' => (
type => 'Text',
label => 'Web Username',
@ -105,16 +99,6 @@ has_block 'actions' => (
render_list => [qw/save/],
);
sub field_list {
my $self = shift;
my $c = $self->ctx;
my $group = $self->field('group');
$group->field('id')->ajax_src(
$c->uri_for_action('/customer/pbx_group_ajax', [$c->req->captures->[0]])->as_string
);
}
1;
=head1 NAME

@ -4,6 +4,8 @@ use warnings;
use Sipwise::Base;
use DBIx::Class::Exception;
use NGCP::Panel::Utils::DateTime;
use UUID qw/generate unparse/;
my %LOCK = (
0, 'none',
@ -122,6 +124,122 @@ sub get_lock_string {
return $LOCK{$level};
}
sub get_admin_subscribers {
my %params = @_;
my $subs = $params{voip_subscribers};
my @subscribers = ();
foreach my $s(@{ $subs }) {
push @subscribers, $s if($s->{admin});
}
return \@subscribers;
}
sub create_subscriber {
my %params = @_;
my $c = $params{c};
my $contract = $params{contract};
my $params = $params{params};
my $administrative = $params{admin_default};
my $preferences = $params{preferences};
my $schema = $c->model('DB');
my $reseller = $contract->contact->reseller;
my $billing_domain = $schema->resultset('domains')
->find($params->{domain}{id});
my $prov_domain = $schema->resultset('voip_domains')
->find({domain => $billing_domain->domain});
$schema->txn_do(sub {
my ($uuid_bin, $uuid_string);
UUID::generate($uuid_bin);
UUID::unparse($uuid_bin, $uuid_string);
# TODO: check if we find a reseller and contract and domains
my ($number, $cli);
if(defined $params->{e164}{cc} && $params->{e164}{cc} ne '') {
$cli = $params->{e164}{cc} .
($params->{e164}{ac} || '') .
$params->{e164}{sn};
$number = $reseller->voip_numbers->create({
cc => $params->{e164}{cc},
ac => $params->{e164}{ac} || '',
sn => $params->{e164}{sn},
status => 'active',
});
}
my $billing_subscriber = $contract->voip_subscribers->create({
uuid => $uuid_string,
username => $params->{username},
domain_id => $billing_domain->id,
status => $params->{status},
primary_number_id => defined $number ? $number->id : undef,
});
if(defined $number) {
$number->update({ subscriber_id => $billing_subscriber->id });
}
unless(exists $params->{password}) {
my ($pass_bin, $pass_str);
UUID::generate($pass_bin);
UUID::unparse($pass_bin, $pass_str);
$params->{password} = $pass_str;
}
my $prov_subscriber = $schema->resultset('provisioning_voip_subscribers')->create({
uuid => $uuid_string,
username => $params->{username},
password => $params->{password},
webusername => $params->{webusername} || $params->{username},
webpassword => $params->{webpassword},
admin => $params->{administrative} // $administrative,
account_id => $contract->id,
domain_id => $prov_domain->id,
is_pbx_group => $params->{is_pbx_group} // 0,
pbx_group_id => $params->{pbx_group_id},
create_timestamp => NGCP::Panel::Utils::DateTime::current_local,
});
my $voip_preferences = $schema->resultset('voip_preferences')->search({
'usr_pref' => 1,
});
$preferences->{account_id} = $contract->id;
$preferences->{ac} = $params->{e164}{ac}
if(defined $params->{e164}{ac} && length($params->{e164}{ac}) > 0);
$preferences->{cc} = $params->{e164}{cc}
if(defined $params->{e164}{cc} && length($params->{e164}{cc}) > 0);
$preferences->{cli} = $cli
if(defined $cli);
foreach my $k(keys %{ $preferences } ) {
$voip_preferences->find({ 'attribute' => $k })
->voip_usr_preferences->create({
'subscriber_id' => $prov_subscriber->id,
'value' => $preferences->{$k},
});
}
$schema->resultset('voicemail_users')->create({
customer_id => $uuid_string,
mailbox => $cli // 0,
password => sprintf("%04d", int(rand 10000)),
email => '',
});
if($cli) {
$schema->resultset('dbaliases')->create({
alias_username => $cli,
alias_domain => $prov_subscriber->domain->domain,
username => $prov_subscriber->username,
domain => $prov_subscriber->domain->domain,
});
}
return $billing_subscriber;
});
}
1;
=head1 NAME

@ -156,6 +156,9 @@
<tr>
<th>SIP URI</th>
<th>Primary Number</th>
[% IF c.config.features.cloudpbx && product.class == 'pbxaccount' -%]
<th>PBX Group</th>
[% END -%]
<th>Registered Devices</th>
<th class="ngcp-actions-column"></th>
</tr>
@ -165,6 +168,11 @@
<tr class="sw_action_row">
<td>[% subscriber.username %]@[% subscriber.domain %]</td>
<td>[% subscriber.primary_number.cc %] [% subscriber.primary_number.ac %] [% subscriber.primary_number.sn %]</td>
[% IF c.config.features.cloudpbx && product.class == 'pbxaccount' -%]
<td>
[% subscriber.voip_pbx_group.name -%]
</td>
[% END -%]
<td>
[% FOR location IN subscriber.locations -%]
[% location.user_agent %]<br/>
@ -172,6 +180,54 @@
</td>
<td class="ngcp-actions-column">
<div class="sw_actions">
[% UNLESS c.user.readonly -%]
<a class="btn btn-secondary btn-small" href="[% c.uri_for_action("/subscriber/terminate", [subscriber.id]) %]" data-confirm="Terminate"><i class="icon-remove"></i> Terminate</a>
[% END -%]
<a class="btn btn-primary btn-small" href="[% c.uri_for_action("/subscriber/details", [subscriber.id]) %]"><i class="icon-th-list"></i> Details</a>
<a class="btn btn-tertiary btn-small" href="[% c.uri_for_action("/subscriber/preferences", [subscriber.id]) %]"><i class="icon-list"></i> Preferences</a>
</div>
</td>
</tr>
[% END -%]
</tbody>
</table>
</div>
</div>
</div>
[% IF c.config.features.cloudpbx && subscribers.size -%]
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#customer_details" href="#collapse_pbxgroups">PBX Groups</a>
</div>
<div class="accordion-body collapse" id="collapse_pbxgroups">
<div class="accordion-inner">
<a class="btn btn-large btn-primary" href="[% c.uri_for_action('/customer/pbx_group_create', [ c.req.captures.0 ]) %]"><i class="icon-star"></i> Create PBX Group</a>
<div class="ngcp-separator"></div>
<table class="table table-bordered table-striped table-highlight table-hover" id="subscribers_table">
<thead>
<tr>
<th>Name</th>
<th>SIP URI</th>
<th>Primary Number</th>
<th>Hunting Policy</th>
<th>Hunting Timeout</th>
<th class="ngcp-actions-column"></th>
</tr>
</thead>
<tbody>
[% FOR subscriber IN pbx_groups -%]
<tr class="sw_action_row">
<td>[% subscriber.voip_pbx_group.name %]</td>
<td>[% subscriber.username %]@[% subscriber.domain %]</td>
<td>[% subscriber.primary_number.cc %] [% subscriber.primary_number.ac %] [% subscriber.primary_number.sn %]</td>
<td>[% subscriber.voip_pbx_group.hunt_policy %]</td>
<td>[% subscriber.voip_pbx_group.hunt_policy_timeout %]</td>
<td class="ngcp-actions-column">
<div class="sw_actions">
[% UNLESS c.user.readonly -%]
<a class="btn btn-secondary btn-small" href="[% c.uri_for_action("/subscriber/terminate", [subscriber.id]) %]" data-confirm="Terminate"><i class="icon-remove"></i> Terminate</a>
[% END -%]
<a class="btn btn-primary btn-small" href="[% c.uri_for_action("/subscriber/details", [subscriber.id]) %]"><i class="icon-th-list"></i> Details</a>
<a class="btn btn-tertiary btn-small" href="[% c.uri_for_action("/subscriber/preferences", [subscriber.id]) %]"><i class="icon-list"></i> Preferences</a>
</div>
@ -183,6 +239,7 @@
</div>
</div>
</div>
[% END -%]
<div class="accordion-group">
<div class="accordion-heading">

@ -55,7 +55,13 @@
{ value = subscriber.primary_number.cc _ ' ' _ subscriber.primary_number.ac _ ' ' _ subscriber.primary_number.sn, desc = 'Primary Number'},
{ value = subscriber.provisioning_voip_subscriber.admin ? 'yes' : 'no', desc = 'Administrative'},
{ value = subscriber.external_id, desc = 'External #'},
]
];
IF subscriber.provisioning_voip_subscriber.voip_pbx_group.defined;
elements.push(
{ value = subscriber.provisioning_voip_subscriber.voip_pbx_group.name, desc = 'PBX Group' },
);
END;
-%]
[% FOR elem IN elements -%]
<tr>

Loading…
Cancel
Save