Filter terminated elements; visual cleanups.

Don't show terminated resellers and contracts.
Wrap customer details into accordion.
agranig/1_0_subfix
Andreas Granig 12 years ago
parent 9afd656365
commit 6d38442876

@ -21,7 +21,6 @@ sub contract_list :Chained('/') :PathPart('contract') :CaptureArgs(0) {
{ name => "id", search => 1, title => "#" }, { name => "id", search => 1, title => "#" },
{ name => "external_id", search => 1, title => "External #" }, { name => "external_id", search => 1, title => "External #" },
{ name => "contact.reseller.name", search => 1, title => "Reseller" }, { name => "contact.reseller.name", search => 1, title => "Reseller" },
{ name => "contact.reseller.name", search => 1, title => "Reseller" },
{ name => "contact.email", search => 1, title => "Contact Email" }, { name => "contact.email", search => 1, title => "Contact Email" },
{ name => "billing_mappings.billing_profile.name", search => 1, title => "Billing Profile" }, { name => "billing_mappings.billing_profile.name", search => 1, title => "Billing Profile" },
{ name => "status", search => 1, title => "Status" }, { name => "status", search => 1, title => "Status" },
@ -30,6 +29,7 @@ sub contract_list :Chained('/') :PathPart('contract') :CaptureArgs(0) {
my $mapping_rs = $c->model('DB')->resultset('billing_mappings'); my $mapping_rs = $c->model('DB')->resultset('billing_mappings');
my $rs = $c->model('DB')->resultset('contracts') my $rs = $c->model('DB')->resultset('contracts')
->search({ ->search({
'me.status' => { '!=' => 'terminated' },
'billing_mappings.id' => { 'billing_mappings.id' => {
'=' => $mapping_rs->search({ '=' => $mapping_rs->search({
contract_id => { -ident => 'me.id' }, contract_id => { -ident => 'me.id' },

@ -61,6 +61,13 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) {
my $contract = $c->model('DB')->resultset('contracts') my $contract = $c->model('DB')->resultset('contracts')
->search_rs(id => $contract_id); ->search_rs(id => $contract_id);
unless($c->user->is_superuser) {
$contract = $contract->search({
'contact.reseller_id' => $c->user->reseller_id,
}, {
join => 'contact',
});
}
my $stime = DateTime->now->truncate(to => 'month'); my $stime = DateTime->now->truncate(to => 'month');
my $etime = $stime->clone->add(months => 1); my $etime = $stime->clone->add(months => 1);
@ -126,6 +133,8 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) {
sub details :Chained('base') :PathPart('details') :Args(0) { sub details :Chained('base') :PathPart('details') :Args(0) {
my ($self, $c) = @_; my ($self, $c) = @_;
$c->stash->{contact_hash} = { $c->stash->{contract}->contact->get_inflated_columns };
} }
sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) { sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {

@ -61,12 +61,24 @@ sub sub_list :Chained('/') :PathPart('subscriber') :CaptureArgs(0) {
template => 'subscriber/list.tt', template => 'subscriber/list.tt',
); );
$c->stash->{subscribers_rs} = $c->model('DB')->resultset('voip_subscribers')->search({
'me.status' => { '!=' => 'terminated' },
});
unless($c->user->is_superuser) {
$c->stash->{subscribers_rs} = $c->stash->{subscribers_rs}->search({
'contact.reseller_id' => $c->user->reseller_id,
},{
join => { 'contract' => 'contact'},
});
}
$c->stash->{dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ $c->stash->{dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => "id", search => 1, title => "#" }, { name => "id", search => 1, title => "#" },
{ name => "contract_id", search => 1, title => "Contract #"},
{ name => "contract.contact.email", search => 1, title => "Contact Email" },
{ name => "username", search => 1, title => "Username" }, { name => "username", search => 1, title => "Username" },
{ name => "domain.domain", search => 1, title => "Domain" }, { name => "domain.domain", search => 1, title => "Domain" },
{ name => "status", search => 1, title => "Status" }, { name => "status", search => 1, title => "Status" },
{ name => "contract_id", search => 1, title => "Contract #"},
]); ]);
} }
@ -105,20 +117,20 @@ sub create_list :Chained('sub_list') :PathPart('create') :Args(0) {
UUID::generate($uuid_bin); UUID::generate($uuid_bin);
UUID::unparse($uuid_bin, $uuid_string); UUID::unparse($uuid_bin, $uuid_string);
# TODO: check if we find a reseller and contract and domains
my $reseller = $schema->resultset('resellers')
->find($c->request->params->{'reseller.id'});
my $contract = $schema->resultset('contracts') my $contract = $schema->resultset('contracts')
->find($c->request->params->{'contract.id'}); ->find($form->params->{contract}{id});
my $billing_domain = $schema->resultset('domains') my $billing_domain = $schema->resultset('domains')
->find($c->request->params->{'domain.id'}); ->find($form->params->{domain}{id});
my $prov_domain = $schema->resultset('voip_domains') my $prov_domain = $schema->resultset('voip_domains')
->find({domain => $billing_domain->domain}); ->find({domain => $billing_domain->domain});
my $reseller = $contract->contact->reseller;
my $number; my $number;
if(defined $c->request->params->{'e164.cc'} && if(defined $c->request->params->{'e164.cc'} &&
$c->request->params->{'e164.cc'} ne '') { $c->request->params->{'e164.cc'} ne '') {
$number = $reseller->voip_numbers->create({ $number = $reseller->voip_numbers->create({
cc => $c->request->params->{'e164.cc'}, cc => $c->request->params->{'e164.cc'},
ac => $c->request->params->{'e164.ac'} || '', ac => $c->request->params->{'e164.ac'} || '',
@ -224,16 +236,14 @@ sub base :Chained('/subscriber/sub_list') :PathPart('') :CaptureArgs(1) {
my ($self, $c, $subscriber_id) = @_; my ($self, $c, $subscriber_id) = @_;
unless($subscriber_id && $subscriber_id->is_integer) { unless($subscriber_id && $subscriber_id->is_integer) {
$c->flash(messages => [{type => 'error', text => 'Invalid subscriber id detected!'}]); $c->flash(messages => [{type => 'error', text => 'Invalid subscriber id detected'}]);
$c->response->redirect($c->uri_for()); NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/subscriber'));
return;
} }
my $res = $c->model('DB')->resultset('voip_subscribers')->find({ id => $subscriber_id }); my $res = $c->stash->{subscribers_rs}->find({ id => $subscriber_id });
unless(defined $res) { unless(defined $res) {
$c->flash(messages => [{type => 'error', text => 'Subscriber does not exist!'}]); $c->flash(messages => [{type => 'error', text => 'Subscriber does not exist'}]);
$c->response->redirect($c->uri_for('/subscriber')); NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/subscriber'));
$c->detach;
} }
$c->stash(subscriber => $res); $c->stash(subscriber => $res);
@ -247,26 +257,12 @@ sub base :Chained('/subscriber/sub_list') :PathPart('') :CaptureArgs(1) {
sub ajax :Chained('sub_list') :PathPart('ajax') :Args(0) { sub ajax :Chained('sub_list') :PathPart('ajax') :Args(0) {
my ($self, $c) = @_; my ($self, $c) = @_;
my $dispatch_to = '_ajax_resultset_' . $c->user->auth_realm;
my $resultset = $self->$dispatch_to($c);
my $resultset = $c->stash->{subscribers_rs};
NGCP::Panel::Utils::Datatables::process($c, $resultset, $c->stash->{dt_columns}); NGCP::Panel::Utils::Datatables::process($c, $resultset, $c->stash->{dt_columns});
$c->detach( $c->view("JSON") ); $c->detach( $c->view("JSON") );
} }
sub _ajax_resultset_admin {
my ($self, $c) = @_;
return $c->model('DB')->resultset('voip_subscribers')->search;
}
sub _ajax_resultset_reseller {
my ($self, $c) = @_;
# TODO: filter for reseller
return $c->model('DB')->resultset('voip_subscribers');
}
sub terminate :Chained('base') :PathPart('terminate') :Args(0) { sub terminate :Chained('base') :PathPart('terminate') :Args(0) {
my ($self, $c) = @_; my ($self, $c) = @_;

@ -10,8 +10,8 @@ has_field 'id' => (
required => 1, required => 1,
template => 'share/templates/helpers/datatables_field.tt', template => 'share/templates/helpers/datatables_field.tt',
ajax_src => '/contract/customer/ajax', ajax_src => '/contract/customer/ajax',
table_titles => ['#', 'Contact Email', 'External #', 'Status'], table_titles => ['#', 'Reseller', 'Contact Email', 'External #', 'Status'],
table_fields => ['id', 'contact_email', 'external_id', 'status'], table_fields => ['id', 'contact_reseller_name', 'contact_email', 'external_id', 'status'],
); );
has_field 'create' => ( has_field 'create' => (

@ -15,12 +15,6 @@ has_field 'submitid' => ( type => 'Hidden' );
sub build_render_list {[qw/submitid fields actions/]} sub build_render_list {[qw/submitid fields actions/]}
sub build_form_element_class {[qw(form-horizontal)]} sub build_form_element_class {[qw(form-horizontal)]}
has_field 'reseller' => (
type => '+NGCP::Panel::Field::Reseller',
label => 'Reseller',
not_nullable => 1,
);
has_field 'contract' => ( has_field 'contract' => (
type => '+NGCP::Panel::Field::CustomerContract', type => '+NGCP::Panel::Field::CustomerContract',
label => 'Customer', label => 'Customer',
@ -157,7 +151,7 @@ has_field 'save' => (
has_block 'fields' => ( has_block 'fields' => (
tag => 'div', tag => 'div',
class => [qw/modal-body/], class => [qw/modal-body/],
render_list => [qw/reseller contract webusername webpassword e164 username domain password status external_id administrative/ ], render_list => [qw/contract webusername webpassword e164 username domain password status external_id administrative/ ],
); );
has_block 'actions' => ( has_block 'actions' => (

@ -26,169 +26,247 @@
<div class="ngcp-separator"></div> <div class="ngcp-separator"></div>
<h3>Billing Profiles</h3> <div class="accordion" id="customer_details">
<table class="table table-bordered table-striped table-highlight table-hover"> <div class="accordion-group">
<thead> <div class="accordion-heading">
<tr> <a class="accordion-toggle" data-toggle="collapse" data-parent="#customer_details" href="#collapse_contact">Contact Details</a>
<th>Date</th> </div>
<th>Billing Profile Name</th> <div class="accordion-body collapse" id="collapse_contact">
</tr> <div class="accordion-inner">
</thead> <table class="table table-bordered table-striped table-highlight table-hover">
<tbody> <thead>
[% FOR mapping IN contract.billing_mappings.all -%] <th>Name</th>
[% bprof = mapping.billing_profile -%] <th>Value</th>
<tr class="sw_action_row"> </thead>
<td> <tbody>
[% bprof.start_date ? bprof.start_date : 'NULL' %] - [% bprof.end_date ? bprof.end_date : 'NULL' %] <tr>
</td> <td>Email</td>
<td>[% bprof.name %]</td> <td>[% contact_hash.email%]</td>
</tr> </tr>
[% END -%] <tr>
</tbody> <td>Name</td>
</table> <td>[% contact_hash.firstname %] [% contact_hash.lastname %]</td>
</tr>
<tr>
<td>Company</td>
<td>[% contact_hash.company%]</td>
</tr>
<tr>
<td>Address</td>
<td>
[% contact_hash.street %]<br/>
[% contact_hash.postcode %] [% contact_hash.city %]<br/>
[% contact_hash.country %]
</td>
</tr>
<tr>
<td>Phone/Fax</td>
<td>
Mobile: [% contact_hash.mobilenumber %]<br/>
Fixed: [% contact_hash.phonenumber %]<br/>
Fax: [% contact_hash.faxnumber %]<br/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h3>Subscribers</h3> <div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#customer_details" href="#collapse_bilprofs">Billing Profiles</a>
</div>
<div class="accordion-body collapse" id="collapse_bilprofs">
<div class="accordion-inner">
<table class="table table-bordered table-striped table-highlight table-hover">
<thead>
<tr>
<th>Date</th>
<th>Billing Profile Name</th>
</tr>
</thead>
<tbody>
[% FOR mapping IN contract.billing_mappings.all -%]
[% bprof = mapping.billing_profile -%]
<tr class="sw_action_row">
<td>
[% bprof.start_date ? bprof.start_date : 'NULL' %] - [% bprof.end_date ? bprof.end_date : 'NULL' %]
</td>
<td>[% bprof.name %]</td>
</tr>
[% END -%]
</tbody>
</table>
</div>
</div>
</div>
<a class="btn btn-large btn-primary" href="[% c.uri_for_action('/customer/subscriber_create', [ c.req.captures.0 ]) %]"><i class="icon-star"></i> Create Subscriber</a> <div class="accordion-group">
<div class="ngcp-separator"></div> <div class="accordion-heading">
<table class="table table-bordered table-striped table-highlight table-hover" id="subscribers_table"> <a class="accordion-toggle" data-toggle="collapse" data-parent="#customer_details" href="#collapse_subs">Subscribers</a>
<thead> </div>
<tr> <div class="accordion-body collapse" id="collapse_subs">
<th>SIP URI</th> <div class="accordion-inner">
<th>Primary Number</th> <a class="btn btn-large btn-primary" href="[% c.uri_for_action('/customer/subscriber_create', [ c.req.captures.0 ]) %]"><i class="icon-star"></i> Create Subscriber</a>
<th>Registered Devices</th> <div class="ngcp-separator"></div>
<th class="ngcp-actions-column"></th> <table class="table table-bordered table-striped table-highlight table-hover" id="subscribers_table">
</tr> <thead>
</thead> <tr>
<tbody> <th>SIP URI</th>
[% FOR subscriber IN subscribers -%] <th>Primary Number</th>
<tr class="sw_action_row"> <th>Registered Devices</th>
<td>[% subscriber.username %]@[% subscriber.domain %]</td> <th class="ngcp-actions-column"></th>
<td>[% subscriber.primary_number.cc %] [% subscriber.primary_number.ac %] [% subscriber.primary_number.sn %]</td> </tr>
<td> </thead>
[% FOR location IN subscriber.locations -%] <tbody>
[% location.user_agent %]<br/> [% FOR subscriber IN subscribers -%]
[% END -%] <tr class="sw_action_row">
</td> <td>[% subscriber.username %]@[% subscriber.domain %]</td>
<td class="ngcp-actions-column"> <td>[% subscriber.primary_number.cc %] [% subscriber.primary_number.ac %] [% subscriber.primary_number.sn %]</td>
<div class="sw_actions"> <td>
<a class="btn btn-primary btn-small" href="[% c.uri_for_action("/subscriber/details", [subscriber.id]) %]"><i class="icon-th-list"></i> Details</a> [% FOR location IN subscriber.locations -%]
<a class="btn btn-tertiary btn-small" href="[% c.uri_for_action("/subscriber/preferences", [subscriber.id]) %]"><i class="icon-list"></i> Preferences</a> [% location.user_agent %]<br/>
</div> [% END -%]
</td> </td>
</tr> <td class="ngcp-actions-column">
[% END -%] <div class="sw_actions">
</tbody> <a class="btn btn-primary btn-small" href="[% c.uri_for_action("/subscriber/details", [subscriber.id]) %]"><i class="icon-th-list"></i> Details</a>
</table> <a class="btn btn-tertiary btn-small" href="[% c.uri_for_action("/subscriber/preferences", [subscriber.id]) %]"><i class="icon-list"></i> Preferences</a>
</div>
<h3>Contract Balance</h3> </td>
</tr>
[% END -%]
</tbody>
</table>
</div>
</div>
</div>
<table class="table table-bordered table-striped table-highlight table-hover"> <div class="accordion-group">
<thead> <div class="accordion-heading">
<tr> <a class="accordion-toggle" data-toggle="collapse" data-parent="#customer_details" href="#collapse_balance">Contract Balance</a>
<th></th> </div>
<th>Cash</th> <div class="accordion-body collapse" id="collapse_balance">
<th>Free time</th> <div class="accordion-inner">
<th class="ngcp-actions-column"></th> <table class="table table-bordered table-striped table-highlight table-hover">
</tr> <thead>
</thead> <tr>
<tbody> <th></th>
<tr class="sw_action_row"> <th>Cash</th>
<td>Current totals</td> <th>Free time</th>
<td>[% balance.cash_balance %]</td> <th class="ngcp-actions-column"></th>
<td>[% balance.free_time_balance %]</td> </tr>
<td class="ngcp-actions-column"> </thead>
<div class="sw_actions pull-right"> <tbody>
<a class="btn btn-small btn-primary" <tr class="sw_action_row">
href="[% c.uri_for_action("/customer/edit_balance", [contract.id]) %]"> <td>Current totals</td>
<i class="icon-edit"></i> Edit</i> <td>[% balance.cash_balance %]</td>
</a> <td>[% balance.free_time_balance %]</td>
</div> <td class="ngcp-actions-column">
</td> <div class="sw_actions pull-right">
</tr> <a class="btn btn-small btn-primary"
<tr> href="[% c.uri_for_action("/customer/edit_balance", [contract.id]) %]">
<td>Spent this interval</td> <i class="icon-edit"></i> Edit</i>
<td>[% balance.cash_balance_interval %]</td> </a>
<td>[% balance.free_time_balance_interval %]</td> </div>
<td></td> </td>
</tr> </tr>
</tbody> <tr>
</table> <td>Spent this interval</td>
<td>[% balance.cash_balance_interval %]</td>
<td>[% balance.free_time_balance_interval %]</td>
<td></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<h3>Fraud Limits</h3> <div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#customer_details" href="#collapse_fraud">Fraud Limits</a>
</div>
<div class="accordion-body collapse" id="collapse_fraud">
<div class="accordion-inner">
<table class="table table-bordered table-striped table-highlight table-hover">
<thead>
<tr>
<th></th>
<th>Limit</th>
<th>Lock Level</th>
<th>Notify</th>
<th class="ngcp-actions-column"></th>
</tr>
</thead>
<tbody>
<tr class="sw_action_row">
<td>Monthly Settings</td>
[% fraud_def_message = (fraud.fraud_interval_limit.defined ? "none" : "billing profile default") %]
<td>[% fraud.fraud_interval_limit.defined ? fraud.fraud_interval_limit : fraud_def_message %]</td>
<td>
[% IF fraud.fraud_interval_lock.defined -%]
<select disabled="disabled">
[% FOR l IN lock_levels -%]
<option [% fraud.fraud_interval_lock == l.level ? 'selected="selected"' : '' %]>[% l.text %]</option>
[% END -%]
</select>
[% ELSE -%]
[% fraud_def_message %]
[% END -%]
</td>
<td>[% fraud.fraud_interval_notify.defined ? fraud.fraud_interval_notify : fraud_def_message %]</td>
<td class="ngcp-actions-column">
<div class="sw_actions pull-right">
<a class="btn btn-small btn-primary"
href="[% c.uri_for_action("/customer/edit_fraud", [c.req.captures.0], "month") %]">
<i class="icon-edit"></i> Edit</i>
</a>
<a class="btn btn-small btn-secondary" data-confirm="Delete"
href="[% c.uri_for_action("/customer/delete_fraud", [c.req.captures.0], "month") %]">
<i class="icon-trash"></i> Delete</i>
</a>
</div>
</td>
</tr>
<tr class="sw_action_row">
<td>Daily Settings</td>
[% fraud_def_message = (fraud.fraud_daily_limit.defined ? "none" : "billing profile default") %]
<td>[% fraud.fraud_daily_limit.defined ? fraud.fraud_daily_limit : fraud_def_message %]</td>
<td>
[% IF fraud.fraud_daily_lock.defined -%]
<select disabled="disabled">
[% FOR l IN lock_levels -%]
<option [% fraud.fraud_daily_lock == l.level ? 'selected="selected"' : '' %]>[% l.text %]</option>
[% END -%]
</select>
[% ELSE -%]
[% fraud_def_message %]
[% END -%]
</td>
<td>[% fraud.fraud_daily_notify.defined ? fraud.fraud_daily_notify : fraud_def_message %]</td>
<td class="ngcp-actions-column">
<div class="sw_actions pull-right">
<a class="btn btn-small btn-primary"
href="[% c.uri_for_action("/customer/edit_fraud", [c.req.captures.0], "day") %]">
<i class="icon-edit"></i> Edit</i>
</a>
<a class="btn btn-small btn-secondary" data-confirm="Delete"
href="[% c.uri_for_action("/customer/delete_fraud", [c.req.captures.0], "day") %]">
<i class="icon-trash"></i> Delete</i>
</a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<table class="table table-bordered table-striped table-highlight table-hover">
<thead>
<tr>
<th></th>
<th>Limit</th>
<th>Lock Level</th>
<th>Notify</th>
<th class="ngcp-actions-column"></th>
</tr>
</thead>
<tbody>
<tr class="sw_action_row">
<td>Monthly Settings</td>
[% fraud_def_message = (fraud.fraud_interval_limit.defined ? "none" : "billing profile default") %]
<td>[% fraud.fraud_interval_limit.defined ? fraud.fraud_interval_limit : fraud_def_message %]</td>
<td>
[% IF fraud.fraud_interval_lock.defined -%]
<select disabled="disabled">
[% FOR l IN lock_levels -%]
<option [% fraud.fraud_interval_lock == l.level ? 'selected="selected"' : '' %]>[% l.text %]</option>
[% END -%]
</select>
[% ELSE -%]
[% fraud_def_message %]
[% END -%]
</td>
<td>[% fraud.fraud_interval_notify.defined ? fraud.fraud_interval_notify : fraud_def_message %]</td>
<td class="ngcp-actions-column">
<div class="sw_actions pull-right">
<a class="btn btn-small btn-primary"
href="[% c.uri_for_action("/customer/edit_fraud", [c.req.captures.0], "month") %]">
<i class="icon-edit"></i> Edit</i>
</a>
<a class="btn btn-small btn-secondary" data-confirm="Delete"
href="[% c.uri_for_action("/customer/delete_fraud", [c.req.captures.0], "month") %]">
<i class="icon-trash"></i> Delete</i>
</a>
</div>
</td>
</tr>
<tr class="sw_action_row">
<td>Daily Settings</td>
[% fraud_def_message = (fraud.fraud_daily_limit.defined ? "none" : "billing profile default") %]
<td>[% fraud.fraud_daily_limit.defined ? fraud.fraud_daily_limit : fraud_def_message %]</td>
<td>
[% IF fraud.fraud_daily_lock.defined -%]
<select disabled="disabled">
[% FOR l IN lock_levels -%]
<option [% fraud.fraud_daily_lock == l.level ? 'selected="selected"' : '' %]>[% l.text %]</option>
[% END -%]
</select>
[% ELSE -%]
[% fraud_def_message %]
[% END -%]
</td>
<td>[% fraud.fraud_daily_notify.defined ? fraud.fraud_daily_notify : fraud_def_message %]</td>
<td class="ngcp-actions-column">
<div class="sw_actions pull-right">
<a class="btn btn-small btn-primary"
href="[% c.uri_for_action("/customer/edit_fraud", [c.req.captures.0], "day") %]">
<i class="icon-edit"></i> Edit</i>
</a>
<a class="btn btn-small btn-secondary" data-confirm="Delete"
href="[% c.uri_for_action("/customer/delete_fraud", [c.req.captures.0], "day") %]">
<i class="icon-trash"></i> Delete</i>
</a>
</div>
</td>
</tr>
</tbody>
</table>
[% IF create_flag == 1 -%] [% IF create_flag == 1 -%]
[% [%
PROCESS "helpers/modal.tt"; PROCESS "helpers/modal.tt";

@ -14,7 +14,7 @@
UNLESS c.user.read_only; UNLESS c.user.read_only;
helper.dt_buttons = [ helper.dt_buttons = [
{ name = 'Terminate', uri = "/subscriber/'+full.id+'/terminate", class = 'btn-small btn-secondary', icon = 'icon-trash', condition = 'full.status != "terminated"' }, { name = 'Terminate', uri = "/subscriber/'+full.id+'/terminate", class = 'btn-small btn-secondary', icon = 'icon-remove', condition = 'full.status != "terminated"' },
{ name = 'Details', uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-tertiary', icon = 'icon-th-list', condition = 'full.status != "terminated"' }, { name = 'Details', uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-tertiary', icon = 'icon-th-list', condition = 'full.status != "terminated"' },
{ name = 'Customer', uri = "/customer/'+full.contract_id+'/details", class = 'btn-small btn-tertiary', icon = 'icon-user' }, { name = 'Customer', uri = "/customer/'+full.contract_id+'/details", class = 'btn-small btn-tertiary', icon = 'icon-user' },
]; ];

Loading…
Cancel
Save