implemented NCOS web admin forms

2.0@2434
Daniel Tiefnig 17 years ago
parent 06d94fcb0d
commit 3f13028ac5

@ -0,0 +1,474 @@
package admin::Controller::ncos;
use strict;
use warnings;
use base 'Catalyst::Controller';
=head1 NAME
admin::Controller::ncos - Catalyst Controller
=head1 DESCRIPTION
Catalyst Controller.
=head1 METHODS
=head2 index
Display and edit NCOS levels.
=cut
sub index : Private {
my ( $self, $c ) = @_;
$c->stash->{template} = 'tt/ncos.tt';
my $levels;
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_ncos_levels',
undef,
\$levels
);
$c->stash->{levels} = $$levels{result} if eval { @{$$levels{result}} };
$c->stash->{edit_level} = $c->request->params->{edit_level};
if(exists $c->session->{crefill}) {
$c->stash->{crefill} = $c->session->{crefill};
delete $c->session->{crefill};
}
if(exists $c->session->{erefill}) {
$c->stash->{erefill} = $c->session->{erefill};
delete $c->session->{erefill};
} elsif($c->request->params->{edit_level}) {
foreach my $lvl (eval { @{$$levels{result}} }) {
if($$lvl{level} == $c->request->params->{edit_level}) {
$c->stash->{erefill} = $lvl;
last;
}
}
}
return 1;
}
=head2 do_create_level
Create a new NCOS level in the database.
=cut
sub do_create_level : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
$settings{level} = $c->request->params->{level};
$settings{data}{mode} = $c->request->params->{mode}
if defined $c->request->params->{mode};
$settings{data}{description} = $c->request->params->{description}
if length $c->request->params->{description};
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'billing', 'create_ncos_level',
\%settings,
undef))
{
$messages{clvlmsg} = 'Web.NCOS.LevelCreated';
$c->session->{messages} = \%messages;
$c->response->redirect("/ncos#create_level");
return;
}
}
$messages{clvlerr} = 'Client.Voip.InputErrorFound';
$c->session->{messages} = \%messages;
$c->session->{crefill} = \%settings;
$c->response->redirect("/ncos#create_level");
return;
}
=head2 do_update_level
Update settings of an NCOS level in the database.
=cut
sub do_update_level : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
$settings{level} = $c->request->params->{level};
unless(length $settings{level}) {
$c->response->redirect("/ncos");
return;
}
$settings{data}{mode} = $c->request->params->{mode}
if defined $c->request->params->{mode};
$settings{data}{description} = $c->request->params->{description};
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'billing', 'update_ncos_level',
\%settings,
undef))
{
$messages{provmsg} = 'Web.NCOSLevel.Updated';
$c->session->{messages} = \%messages;
$c->response->redirect("/ncos");
return;
}
$c->response->redirect("/ncos?edit_level=$settings{level}");
return;
}
$messages{elvlerr} = 'Client.Voip.InputErrorFound';
$c->session->{messages} = \%messages;
$c->response->redirect("/ncos?edit_level=$settings{level}");
return;
}
=head2 do_delete_level
Delete an NCOS level from the database.
=cut
sub do_delete_level : Local {
my ( $self, $c ) = @_;
my %settings;
$settings{level} = $c->request->params->{level};
unless(length $settings{level}) {
$c->response->redirect("/ncos");
return;
}
if($c->model('Provisioning')->call_prov( $c, 'billing', 'delete_ncos_level',
\%settings,
undef))
{
$c->session->{messages} = { provmsg => 'Web.NCOSLevel.Deleted' };
$c->response->redirect("/ncos");
return;
}
$c->response->redirect("/ncos");
return;
}
=head2 lists
Display and edit NCOS pattern and LNP lists.
=cut
sub lists : Local {
my ( $self, $c ) = @_;
$c->stash->{template} = 'tt/ncos_lists.tt';
my $level = $c->request->params->{level};
my $lvli;
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_ncos_level',
{ level => $level },
\$lvli
);
$c->stash->{level} = $lvli;
$c->stash->{level}{level} = $level;
my $patterns;
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_ncos_pattern_list',
{ level => $level },
\$patterns
);
$c->stash->{patterns} = $$patterns{result} if eval { @{$$patterns{result}} };
my $lnpids;
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_ncos_lnp_list',
{ level => $level },
\$lnpids
);
$c->stash->{lnpids} = $$lnpids{result} if eval { @{$$lnpids{result}} };
my $providers;
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_lnp_providers',
{ level => $level },
\$providers
);
foreach my $lnpid (eval { @{$$lnpids{result}} }) {
for(eval { @{$$providers{result}} }) {
if($$_{id} == $$lnpid{lnp_provider_id}) {
$$lnpid{lnp_provider} = $$_{name};
}
}
}
# filter already used LNP providers
@{$$providers{result}} = grep { my $tmp = $$_{id};
! grep { $$_{lnp_provider_id} == $tmp }
eval { @{$$lnpids{result}} }
}
eval { @{$$providers{result}} };
$c->stash->{providers} = $$providers{result} if @{$$providers{result}};
$c->stash->{edit_pattern} = $c->request->params->{edit_pattern};
$c->stash->{edit_lnpid} = $c->request->params->{edit_lnpid};
if(exists $c->session->{pcrefill}) {
$c->stash->{pcrefill} = $c->session->{pcrefill};
delete $c->session->{pcrefill};
}
if(exists $c->session->{perefill}) {
$c->stash->{perefill} = $c->session->{perefill};
delete $c->session->{perefill};
} elsif($c->request->params->{edit_pattern}) {
foreach my $pat (eval { @{$$patterns{result}} }) {
if($$pat{pattern} eq $c->request->params->{edit_pattern}) {
$c->stash->{perefill} = $pat;
last;
}
}
}
if(exists $c->session->{lcrefill}) {
$c->stash->{lcrefill} = $c->session->{lcrefill};
delete $c->session->{lcrefill};
}
if(exists $c->session->{lerefill}) {
$c->stash->{lerefill} = $c->session->{lerefill};
delete $c->session->{lerefill};
} elsif($c->request->params->{edit_lnpid}) {
foreach my $lnpid (eval { @{$$lnpids{result}} }) {
if($$lnpid{lnp_provider_id} == $c->request->params->{edit_lnpid}) {
$c->stash->{lerefill} = $lnpid;
last;
}
}
}
return 1;
}
=head2 do_create_pattern
Creates a new entry in the pattern list of an NCOS level.
=cut
sub do_create_pattern : Local {
my ( $self, $c ) = @_;
my %settings;
$settings{level} = $c->request->params->{level};
$settings{patterns}[0]{pattern} = $c->request->params->{pattern};
$settings{patterns}[0]{description} = $c->request->params->{description};
$settings{purge_existing} = 0;
if($c->model('Provisioning')->call_prov( $c, 'billing', 'set_ncos_pattern_list',
\%settings,
undef))
{
$c->session->{messages} = { patmsg => 'Web.NCOSPattern.Created' };
$c->response->redirect("/ncos/lists?level=$settings{level}");
return;
}
$c->session->{messages}{paterr} = 'Client.Voip.InputErrorFound';
$c->session->{pcrefill} = $settings{patterns}[0];
$c->response->redirect("/ncos/lists?level=$settings{level}");
return;
}
=head2 do_delete_pattern
Deletes an entry from the pattern list of an NCOS level.
=cut
sub do_delete_pattern : Local {
my ( $self, $c ) = @_;
my %settings;
$settings{level} = $c->request->params->{level};
my $pattern = $c->request->params->{pattern};
my $patterns;
unless($c->model('Provisioning')->call_prov( $c, 'billing', 'get_ncos_pattern_list',
\%settings,
\$patterns))
{
$c->response->redirect("/ncos/lists?level=$settings{level}");
return;
}
@{$settings{patterns}} = grep { $$_{pattern} ne $pattern } @{$$patterns{result}};
$settings{purge_existing} = 1;
if($c->model('Provisioning')->call_prov( $c, 'billing', 'set_ncos_pattern_list',
\%settings,
undef))
{
$c->session->{messages} = { patmsg => 'Web.NCOSPattern.Deleted' };
$c->response->redirect("/ncos/lists?level=$settings{level}");
return;
}
$c->response->redirect("/ncos/lists?level=$settings{level}");
return;
}
=head2 do_update_pattern
Updates an entry from the pattern list of an NCOS level.
=cut
sub do_update_pattern : Local {
my ( $self, $c ) = @_;
my %settings;
$settings{level} = $c->request->params->{level};
my $oldpattern = $c->request->params->{oldpattern};
my $newpattern = $c->request->params->{newpattern};
my $description = $c->request->params->{description};
my $patterns;
unless($c->model('Provisioning')->call_prov( $c, 'billing', 'get_ncos_pattern_list',
\%settings,
\$patterns))
{
$c->response->redirect("/ncos/lists?level=$settings{level}");
return;
}
@{$settings{patterns}} = grep { $$_{pattern} ne $oldpattern } @{$$patterns{result}};
$settings{purge_existing} = 1;
push @{$settings{patterns}}, { pattern => $newpattern, description => $description };
if($c->model('Provisioning')->call_prov( $c, 'billing', 'set_ncos_pattern_list',
\%settings,
undef))
{
$c->session->{messages} = { patmsg => 'Web.NCOSPattern.Updated' };
$c->response->redirect("/ncos/lists?level=$settings{level}");
return;
}
$c->session->{messages}{paterr} = 'Client.Voip.InputErrorFound';
$c->session->{perefill} = $settings{patterns}[-1];
$c->response->redirect("/ncos/lists?level=$settings{level}&edit_pattern=$oldpattern");
return;
}
=head2 do_set_lnp_provider_id
Creates or updates an entry in the LNP provider list of an NCOS level.
=cut
sub do_set_lnp_provider_id : Local {
my ( $self, $c ) = @_;
my %settings;
$settings{level} = $c->request->params->{level};
$settings{lnp_provider_ids}[0]{lnp_provider_id} = $c->request->params->{lnp_provider_id};
$settings{lnp_provider_ids}[0]{description} = $c->request->params->{description};
$settings{purge_existing} = 0;
if($c->model('Provisioning')->call_prov( $c, 'billing', 'set_ncos_lnp_list',
\%settings,
undef))
{
if($c->request->params->{new}) {
$c->session->{messages}{lnpmsg} = 'Web.NCOSLNP.Created';
$c->response->redirect("/ncos/lists?level=$settings{level}#LNP");
} else {
$c->session->{messages}{lnpmsg} = 'Web.NCOSLNP.Updated';
$c->response->redirect("/ncos/lists?level=$settings{level}&edit_lnpid=".
$c->request->params->{lnp_provider_id} ."#LNP");
}
return;
}
$c->session->{messages}{lnperr} = 'Client.Voip.InputErrorFound';
if($c->request->params->{new}) {
$c->session->{lcrefill} = $settings{lnp_provider_ids}[0];
$c->response->redirect("/ncos/lists?level=$settings{level}#LNP");
} else {
$c->session->{lerefill} = $settings{lnp_provider_ids}[0];
$c->response->redirect("/ncos/lists?level=$settings{level}&edit_lnpid=".
$c->request->params->{lnp_provider_id} ."#LNP");
}
return;
}
=head2 do_delete_lnp_provider_id
Deletes an entry from the LNP provider list of an NCOS level.
=cut
sub do_delete_lnp_provider_id : Local {
my ( $self, $c ) = @_;
my %settings;
$settings{level} = $c->request->params->{level};
my $lnpid = $c->request->params->{lnp_provider_id};
my $lnpids;
unless($c->model('Provisioning')->call_prov( $c, 'billing', 'get_ncos_lnp_list',
\%settings,
\$lnpids))
{
$c->response->redirect("/ncos/lists?level=$settings{level}#LNP");
return;
}
@{$settings{lnp_provider_ids}} = grep { $$_{lnp_provider_id} != $lnpid } @{$$lnpids{result}};
$settings{purge_existing} = 1;
if($c->model('Provisioning')->call_prov( $c, 'billing', 'set_ncos_lnp_list',
\%settings,
undef))
{
$c->session->{messages} = { lnpmsg => 'Web.NCOSLNP.Deleted' };
$c->response->redirect("/ncos/lists?level=$settings{level}#LNP");
return;
}
$c->response->redirect("/ncos/lists?level=$settings{level}#LNP");
return;
}
=head1 BUGS AND LIMITATIONS
=over
=item none
=back
=head1 SEE ALSO
Provisioning model, Sipwise::Provisioning::Billing, Catalyst
=head1 AUTHORS
Daniel Tiefnig <dtiefnig@sipwise.com>
=head1 COPYRIGHT
The billing controller is Copyright (c) 2009 Sipwise GmbH, Austria. All
rights reserved.
=cut
# ende gelaende
1;

@ -252,6 +252,11 @@ h3 {
width: 95px;
}
/* increase input text fields */
.ilong {
width: 300px;
}
/* decrease input text fields */
.imedium {
width: 140px;

@ -36,6 +36,7 @@
<h3>Number Management</h3>
<ul>
<li><a href="/lnp">LNP</a></li>
<li><a href="/ncos">NCOS</a></li>
</ul>
[% END %]

@ -0,0 +1,126 @@
<h3>Existing NCOS Levels</h3>
<div class="p1">
[% IF messages.elvlmsg %]<div class="goodmsg">[% messages.elvlmsg %]</div>[% END %]
[% IF messages.elvlerr %]<div class="errormsg">[% messages.elvlerr %]</div>[% END %]
[% IF levels %]
<table class="ncoslevels">
<tr class="table_header">
<td style="width:60px;">Level</td>
<td style="width:80px;">Mode</td>
<td style="width:310px;">Description</td>
<td style="width:40px;" />
<td style="width:60px;" />
</tr>
[% FOREACH level = levels %]
[% IF level.level == edit_level %]
<tr>
<form action="/ncos/do_update_level" method="post">
<input type="hidden" name="level" value="[% level.level %]" />
<td class="tdkey">[% level.level %]</td>
<td>
<select size="1" name="mode">
<option value="blacklist"
[% IF erefill.mode == 'blacklist' %]selected="selected"[% END %]
>blacklist</option>
<option value="whitelist"
[% IF erefill.mode == 'whitelist' %]selected="selected"[% END %]
>whitelist</option>
</select>
</td>
<td>
<input type="text" class="ilong" title="free-form description string"
name="description" value="[% erefill.description %]" />
</td>
<td>
<div class="postlink">
<label for="lvlsave[% level.level %]">save</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="lvlsave[% level.level %]" />
</div>
</td>
</form>
<td><a href="/ncos" class="aaction">cancel</a></td>
</tr>
[% IF messages.elvl %]
<tr><td colspan="5"><div class="errormsg">[% messages.elvl %]</div></td></tr>
[% END %]
[% ELSE %]
<tr>
<td><a href="/ncos/lists?level=[% level.level %]" class="aaction">[% level.level %]</a></td>
<td>[% level.mode %]</td>
<td>[% level.description %]</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/ncos?edit_level=[% level.level %]" class="aaction">edit</a>
[% END %]
</td>
<form action="/ncos/do_delete_level" method="post">
<input type="hidden" name="level" value="[% level.level %]" />
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<div class="postlink">
<label for="lvldel[% level.level %]">delete</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="lvldel[% level.level %]" />
</div>
[% END %]
</td>
</form>
</tr>
[% END %]
[% END %]
</table>
[% ELSE %]
No NCOS levels found in the database.
[% END %]
</div>
[% UNLESS Catalyst.session.admin.read_only %]
<h3 id="create_level">Create NCOS Level</h3>
<div class="p1">
[% IF messages.clvlmsg %]<div class="goodmsg">[% messages.clvlmsg %]</div>[% END %]
[% IF messages.clvlerr %]<div class="errormsg">[% messages.clvlerr %]</div>[% END %]
<form action="/ncos/do_create_level" method="post">
<table class="ncoslevels">
<tr class="table_header">
<td style="width:60px;">Level</td>
<td style="width:80px;">Mode</td>
<td style="width:310px;">Description</td>
<td style="width:40px;" />
<td style="width:60px;" />
</tr>
<tr>
<td><input type="text" class="ishort" title="unique identifier, string"
name="level" value="[% crefill.level %]" />
</td>
<td>
<select size="1" name="mode">
<option value="blacklist"
[% IF crefill.mode == 'blacklist' %]selected="selected"[% END %]
>blacklist</option>
<option value="whitelist"
[% IF crefill.mode == 'whitelist' %]selected="selected"[% END %]
>whitelist</option>
</select>
</td>
<td>
<input type="text" class="ilong" title="free-form description string"
name="description" value="[% crefill.description %]" />
</td>
<td>
<div class="postlink">
<label for="lvladd">add</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="lvladd" />
</div>
</td>
<td />
</tr>
</table>
</form>
[% IF crefill && prov_error %]<div class="errormsg">[% prov_error %]</div>[% END %]
</div>
[% END %]

@ -0,0 +1,203 @@
<h2>NCOS Level <a href="/ncos/lists?level=[% level.level %]">[% level.level %]</a></h2>
<div class="actions">
<a href="/ncos" class="aaction">back</a>
</div>
<br />
<div class="p1">
<table>
<tr><td class="tdkey">Mode:</td><td>[% level.mode %]</td></tr>
<tr><td class="tdkey">Description:</td><td>[% level.description %]</td></tr>
</table>
</div>
<h3 id="pattern">Number Patterns</h3>
<div class="p1">
[% IF messages.patmsg %]<div class="goodmsg">[% messages.patmsg %]</div>[% END %]
[% IF messages.paterr %]<div class="errormsg">[% messages.paterr %]</div>[% END %]
<table class="ncospatterns">
<tr class="table_header">
<td style="width:120px;">Pattern</td>
<td style="width:310px;">Description</td>
<td style="width:40px;" />
<td style="width:60px;" />
</tr>
[% id = 0 %]
[% FOREACH pattern = patterns %]
[% id = id + 1 %]
[% IF pattern.pattern == edit_pattern %]
<tr>
<form action="/ncos/do_update_pattern" method="post">
<input type="hidden" name="level" value="[% level.level %]" />
<input type="hidden" name="oldpattern" value="[% pattern.pattern %]" />
<td>
<input type="text" title="POSIX regular expression"
name="newpattern" value="[% perefill.pattern %]" />
</td>
<td>
<input type="text" class="ilong" title="free-form description string"
name="description" value="[% perefill.description %]" />
</td>
<td>
<div class="postlink">
<label for="patsave">save</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="patsave" />
</div>
</td>
</form>
<td><a href="/ncos/lists?level=[% level.level %]" class="aaction">cancel</a></td>
</tr>
[% IF messages.epat %]
<tr><td colspan="5"><div class="errormsg">[% messages.epat %]</div></td></tr>
[% END %]
[% IF perefill && prov_error %]<tr><td colspan="5"><div class="errormsg">[% prov_error %]</div></td></tr>[% END %]
[% ELSE %]
<tr>
<td>[% pattern.pattern %]</td>
<td>[% pattern.description %]</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/ncos/lists?level=[% level.level %]&amp;edit_pattern=[% pattern.pattern %]" class="aaction">edit</a>
[% END %]
</td>
<form action="/ncos/do_delete_pattern" method="post">
<input type="hidden" name="level" value="[% level.level %]" />
<input type="hidden" name="pattern" value="[% pattern.pattern %]" />
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<div class="postlink">
<label for="patdel[% id %]">delete</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="patdel[% id %]" />
</div>
[% END %]
</td>
</form>
</tr>
[% END %]
[% END %]
<tr>
<form action="/ncos/do_create_pattern" method="post">
<input type="hidden" name="level" value="[% level.level %]" />
<td>
<input type="text" title="POSIX regular expression"
name="pattern" value="[% pcrefill.pattern %]" />
</td>
<td>
<input type="text" class="ilong" title="free-form description string"
name="description" value="[% pcrefill.description %]" />
</td>
<td>
<div class="postlink">
<label for="patadd">add</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="patadd" />
</div>
</td>
</form>
<td />
</tr>
</table>
[% IF messages.cpat %]<div class="errormsg">[% messages.cpat %]</div>[% END %]
[% IF pcrefill && prov_error %]<div class="errormsg">[% prov_error %]</div>[% END %]
</div>
<h3 id="LNP">LNP Provider List</h3>
<div class="p1">
[% IF messages.lnpmsg %]<div class="goodmsg">[% messages.lnpmsg %]</div>[% END %]
[% IF messages.lnperr %]<div class="errormsg">[% messages.lnperr %]</div>[% END %]
<table class="ncoslnp">
<tr class="table_header">
<td style="width:120px;">LNP Provider</td>
<td style="width:310px;">Description</td>
<td style="width:40px;" />
<td style="width:60px;" />
</tr>
[% id = 0 %]
[% FOREACH lnpid = lnpids %]
[% id = id + 1 %]
[% IF lnpid.lnp_provider_id == edit_lnpid %]
<tr>
<form action="/ncos/do_set_lnp_provider_id" method="post">
<input type="hidden" name="level" value="[% level.level %]" />
<input type="hidden" name="lnp_provider_id" value="[% lnpid.lnp_provider_id %]" />
<td class="tdkey">[% lnpid.lnp_provider %]</td>
<td>
<input type="text" class="ilong" title="free-form description string"
name="description" value="[% lerefill.description %]" />
</td>
<td>
<div class="postlink">
<label for="lnpsave">save</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="lnpsave" />
</div>
</td>
</form>
<td><a href="/ncos/lists?level=[% level.level %]#LNP" class="aaction">cancel</a></td>
</tr>
[% IF messages.elnp %]
<tr><td colspan="5"><div class="errormsg">[% messages.elnp %]</div></td></tr>
[% END %]
[% IF lerefill && prov_error %]<tr><td colspan="5"><div class="errormsg">[% prov_error %]</div></td></tr>[% END %]
[% ELSE %]
<tr>
<td>[% lnpid.lnp_provider %]</td>
<td>[% lnpid.description %]</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/ncos/lists?level=[% level.level %]&amp;edit_lnpid=[% lnpid.lnp_provider_id %]" class="aaction">edit</a>
[% END %]
</td>
<form action="/ncos/do_delete_lnp_provider_id" method="post">
<input type="hidden" name="level" value="[% level.level %]" />
<input type="hidden" name="lnp_provider_id" value="[% lnpid.lnp_provider_id %]" />
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<div class="postlink">
<label for="lnpdel[% id %]">delete</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="lnpdel[% id %]" />
</div>
[% END %]
</td>
</form>
</tr>
[% END %]
[% END %]
[% IF providers %]
<tr>
<form action="/ncos/do_set_lnp_provider_id" method="post">
<input type="hidden" name="level" value="[% level.level %]" />
<input type="hidden" name="new" value="1" />
<td>
<select size="1" name="lnp_provider_id">
[% FOREACH provider = providers %]
<option value="[% provider.id %]"
[% IF lcrefill.lnp_provider_id == provider.id %]selected="selected"[% END %]
>[% provider.name %]</option>
[% END %]
</select>
</td>
<td>
<input type="text" class="ilong" title="free-form description string"
name="description" value="[% lcrefill.description %]" />
</td>
<td>
<div class="postlink">
<label for="lnpadd">add</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif" alt="" id="lnpadd" />
</div>
</td>
</form>
<td />
</tr>
[% ELSE %]
<tr><td colspan="5" class="tdcenter">No unused LNP providers found.</td></tr>
[% END %]
</table>
[% IF messages.clnp %]<div class="errormsg">[% messages.clnp %]</div>[% END %]
[% IF lcrefill && prov_error %]<div class="errormsg">[% prov_error %]</div>[% END %]
</div>
Loading…
Cancel
Save