added LNP web template and controller

2.0@2434
Daniel Tiefnig 16 years ago
parent 89c4b1d964
commit 06d94fcb0d

@ -0,0 +1,397 @@
package admin::Controller::lnp;
use strict;
use warnings;
use base 'Catalyst::Controller';
=head1 NAME
admin::Controller::lnp - Catalyst Controller
=head1 DESCRIPTION
Catalyst Controller.
=head1 METHODS
=head2 index
Display and edit LNP providers and numbers.
=cut
sub index : Private {
my ( $self, $c ) = @_;
$c->stash->{template} = 'tt/lnp.tt';
my $providers;
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_lnp_providers',
undef,
\$providers
);
$c->stash->{providers} = $$providers{result} if eval { @{$$providers{result}} };
$c->stash->{edit_provider} = $c->request->params->{edit_provider};
$c->stash->{edit_number} = $c->request->params->{edit_number};
if(exists $c->session->{searched_lnp_numbers}) {
$c->stash->{searched_numbers} = $c->session->{searched_lnp_numbers};
$self->_do_search_numbers($c, $c->session->{searched_lnp_numbers})
unless exists $c->session->{lnp_numbers}{numbers};
}
# TODO: paginate!
if(ref $c->session->{lnp_numbers}{numbers} eq 'ARRAY' and
@{$c->session->{lnp_numbers}{numbers}})
{
my $nums = $c->session->{lnp_numbers};
$c->stash->{numbers} = $$nums{numbers};
$c->stash->{num_total_count} = $$nums{total_count};
if($$nums{total_count} > @{$$nums{numbers}}) {
$c->stash->{pagination} =
admin::Utils::paginate($c, $nums, $c->session->{searched_lnp_numbers}{offset}, $c->session->{searched_lnp_numbers}{limit});
$c->stash->{max_offset} = $#{$c->stash->{pagination}};
# delete_number will decrease offset if no number remains on current page
if(@{$$nums{numbers}} == 1) {
$c->stash->{last_one} = 1;
}
}
}
if(exists $c->session->{parefill}) {
$c->stash->{parefill} = $c->session->{parefill};
delete $c->session->{parefill};
}
if(exists $c->session->{narefill}) {
$c->stash->{narefill} = $c->session->{narefill};
delete $c->session->{narefill};
}
if(exists $c->session->{nerefill}) {
$c->stash->{nerefill} = $c->session->{nerefill};
delete $c->session->{nerefill};
} elsif($c->request->params->{edit_number}) {
foreach my $num (eval { @{$c->session->{lnp_numbers}{numbers}} }) {
if($$num{id} == $c->request->params->{edit_number}) {
$c->stash->{nerefill} = $num;
last;
}
}
}
return 1;
}
=head2 do_create_provider
Create a new LNP provider in the database.
=cut
sub do_create_provider : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
$settings{id} = $c->request->params->{id};
unless(defined $settings{id} and $settings{id} =~ /^\d+$/) {
$messages{paddidmsg} = 'Web.Syntax.ID';
}
$settings{name} = $c->request->params->{name};
unless(length $settings{name}) {
$messages{paddnamsg} = 'Web.Syntax.LNPProvName';
}
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'billing', 'create_lnp_provider',
{ %settings },
undef))
{
$messages{provmsg} = 'Web.LNPProvider.Created';
$c->session->{messages} = \%messages;
$c->response->redirect("/lnp");
return;
}
}
$messages{proverr} = 'Client.Voip.InputErrorFound';
$c->session->{messages} = \%messages;
$c->session->{parefill} = \%settings;
$c->response->redirect("/lnp");
return;
}
=head2 do_update_provider
Update settings of an LNP provider in the database.
=cut
sub do_update_provider : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $provider = $c->request->params->{id};
unless(defined $provider and $provider =~ /^\d+$/) {
$c->response->redirect("/lnp");
return;
}
my $name = $c->request->params->{name};
unless(length $name) {
$messages{peditnamsg} = 'Web.Syntax.LNPProvName';
}
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'billing', 'update_lnp_provider',
{ id => $provider,
name => $name,
},
undef))
{
$messages{provmsg} = 'Web.LNPProvider.Updated';
$c->session->{messages} = \%messages;
delete $c->session->{lnp_numbers};
$c->response->redirect("/lnp");
return;
}
$c->response->redirect("/lnp?edit_provider=$provider");
return;
}
$messages{proverr} = 'Client.Voip.InputErrorFound';
$c->session->{messages} = \%messages;
$c->response->redirect("/lnp?edit_provider=$provider");
return;
}
=head2 do_delete_provider
Delete an LNP provider from the database.
=cut
sub do_delete_provider : Local {
my ( $self, $c ) = @_;
my $provider = $c->request->params->{id};
unless(defined $provider and $provider =~ /^\d+$/) {
$c->response->redirect("/lnp");
return;
}
if($c->model('Provisioning')->call_prov( $c, 'billing', 'delete_lnp_provider',
{ id => $provider },
undef))
{
$c->session->{messages} = { provmsg => 'Web.LNPProvider.Deleted' };
delete $c->session->{lnp_numbers};
$c->response->redirect("/lnp");
return;
}
$c->response->redirect("/lnp");
return;
}
=head2 search_numbers
Search LNP numbers in the database.
=cut
sub search_numbers : Local {
my ( $self, $c ) = @_;
my %filter;
$filter{lnp_provider_id} = $c->request->params->{search_provid}
if $c->request->params->{search_provid};
$filter{number} = $c->request->params->{search_number}
if $c->request->params->{search_number};
$filter{exact_number} = $c->request->params->{exact_number};
$filter{offset} = $c->request->params->{offset} || 0;
$filter{limit} = 10;
$self->_do_search_numbers($c, \%filter);
$c->session->{searched_lnp_numbers} = \%filter;
$c->response->redirect("/lnp#search_numbers");
return;
}
=head2 do_create_number
Create a new ported number in the database.
=cut
sub do_create_number : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
$settings{number} = $c->request->params->{number};
$settings{number} =~ s/^00//;
$settings{number} =~ s/^\+//;
$settings{lnp_provider_id} = $c->request->params->{lnp_provider_id};
$settings{start} = $c->request->params->{start}
if $c->request->params->{start};
$settings{end} = $c->request->params->{end}
if $c->request->params->{end};
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'billing', 'create_lnp_number',
{ data => \%settings },
undef))
{
$messages{cnumsg} = 'Web.LNPNumber.Created';
$c->session->{messages} = \%messages;
delete $c->session->{lnp_numbers};
$c->response->redirect("/lnp#create_number");
return;
}
}
$c->session->{messages} = \%messages;
$c->session->{narefill} = \%settings;
$c->response->redirect("/lnp#create_number");
return;
}
=head2 do_update_number
Update an existing ported number in the database.
=cut
sub do_update_number : Local {
my ( $self, $c ) = @_;
my %messages;
my %settings;
my $id = $c->request->params->{id};
unless(defined $id and $id =~ /^\d+$/) {
$c->response->redirect("/lnp");
return;
}
$settings{number} = $c->request->params->{number};
$settings{number} =~ s/^00//;
$settings{number} =~ s/^\+//;
$settings{lnp_provider_id} = $c->request->params->{lnp_provider_id};
$settings{start} = $c->request->params->{start}
if $c->request->params->{start};
$settings{end} = $c->request->params->{end}
if $c->request->params->{end};
unless(keys %messages) {
if($c->model('Provisioning')->call_prov( $c, 'billing', 'update_lnp_number',
{ id => $id,
data => \%settings
},
undef))
{
$messages{cnumsg} = 'Web.LNPNumber.Updated';
$c->session->{messages} = \%messages;
delete $c->session->{lnp_numbers};
$c->response->redirect("/lnp#stored_numbers");
return;
}
}
$c->session->{messages} = \%messages;
$c->session->{nerefill} = \%settings;
$c->response->redirect("/lnp?edit_number=$id#stored_numbers");
return;
}
=head2 do_delete_number
Delete a ported number from the database.
=cut
sub do_delete_number : Local {
my ( $self, $c ) = @_;
my $id = $c->request->params->{id};
if($id and
$c->model('Provisioning')->call_prov( $c, 'billing', 'delete_lnp_number',
{ id => $id },
undef))
{
$c->session->{messages}{enumsg} = 'Web.LNPNumber.Deleted';
$c->session->{searched_lnp_numbers}{offset}-- if $c->request->params->{last_one};
delete $c->session->{lnp_numbers};
}
$c->response->redirect("/lnp#stored_numbers");
return;
}
sub _do_search_numbers {
my ( $self, $c, $filter ) = @_;
my %sfilter;
$sfilter{number} = $$filter{number} if defined $$filter{number};
$sfilter{lnp_provider_id} = $$filter{lnp_provider_id} if defined $$filter{lnp_provider_id};
$sfilter{number} = '%' . $sfilter{number} . '%' unless $$filter{exact_number};
$sfilter{offset} = $$filter{offset} || 0;
$sfilter{limit} = $$filter{limit};
$sfilter{offset} *= $sfilter{limit};
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_lnp_numbers',
{ filter => \%sfilter },
\$c->session->{lnp_numbers}
);
if(ref $c->session->{lnp_numbers}{numbers} eq 'ARRAY') {
my $providers;
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_lnp_providers',
undef,
\$providers
);
if(@{$$providers{result}}) {
foreach my $num (@{$c->session->{lnp_numbers}{numbers}}) {
for(@{$$providers{result}}) {
$$num{lnp_provider} = $$_{name}
if $$num{lnp_provider_id} == $$_{id};
}
}
}
}
return 1;
}
=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;

@ -257,6 +257,20 @@ h3 {
width: 140px;
}
/* decrease input text fields for LNP number edit */
.ilnpnumedit {
margin: 0 -2px 0 -6px;
width: 115px;
}
.ilnpproedit {
margin: 0 -4px 0 -2px;
width: 145px;
}
.ilnptimedit {
margin: 0 -2px;
width: 135px;
}
/* decrease input text fields for ac */
.ishort {
width: 50px;

@ -31,7 +31,11 @@
<li><a href="/billing">Billing</a></li>
[% END %]
<li><a href="/peering">SIP Peerings</a></li>
[%# <li><a href="/sipserver">SIP Server Settings</a></li> %]
</ul>
<h3>Number Management</h3>
<ul>
<li><a href="/lnp">LNP</a></li>
</ul>
[% END %]

@ -0,0 +1,299 @@
<h3 id="provider">LNP Providers</h3>
<div class="p1">
[% IF messages.provmsg %]<div class="goodmsg">[% messages.provmsg %]</div>[% END %]
[% IF messages.proverr %]<div class="errormsg">[% messages.proverr %]</div>[% END %]
<table>
<tr class="table_header">
<td>ID</td>
<td>name</td>
<td />
<td />
</tr>
[% FOREACH provider = providers %]
[% IF provider.id == edit_provider %]
<tr>
<form action="/lnp/do_update_provider" method="post">
<td>[% provider.id %]</td>
<td>
<input type="text" name="name" title="descriptive name, free-form"
value="[% provider.name %]" />
</td>
<td>
<input type="hidden" name="id" value="[% provider.id %]" />
<div class="postlink">
<label for="listedit[% provider.id %]">save</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif"
alt="" id="listedit[% provider.id %]" />
</div>
</td>
<td><a href="/lnp" class="aaction">cancel</a></td>
</form>
</tr>
[% IF messages.peditnamsg %]
<tr><td colspan="4"><div class="errormsg">[% messages.peditnamsg %]</div></td></tr>
[% END %]
[% ELSE %]
<tr>
<td>[% provider.id %]</td>
<td>[% provider.name %]</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/lnp?edit_provider=[% provider.id %]" class="aaction">edit</a>
[% END %]
</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<form action="/lnp/do_delete_provider" method="post">
<input type="hidden" name="id" value="[% provider.id %]" />
<div class="postlink">
<label for="provdel[% provider.id %]">delete</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif"
alt="" id="provdel[% provider.id %]" />
</div>
</form>
[% END %]
</td>
</tr>
[% END %]
[% END %]
<tr>
<form action="/lnp/do_create_provider" method="post">
<td>
<input type="text" class="ishort" name="id" title="unique, integer ID"
value="[% parefill.id %]" />
</td>
<td>
<input type="text" name="name" title="descriptive name, free-form"
value="[% parefill.name %]" />
</td>
<td>
<div class="postlink">
<label for="listpadd">add</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif"
alt="" id="listpadd" />
</div>
</td>
<td />
</form>
</tr>
</table>
[% IF messages.paddidmsg %]<div class="errormsg">[% messages.paddidmsg %]</div>[% END %]
[% IF messages.paddnamsg %]<div class="errormsg">[% messages.paddnamsg %]</div>[% END %]
</div>
[% UNLESS Catalyst.session.admin.read_only %]
<h3 id="create_number">Add Ported Number</h3>
<div class="p1">
[% IF messages.cnumsg %]<div class="goodmsg">[% messages.cnumsg %]</div>[% END %]
[% IF narefill && prov_error %]<div class="errormsg">[% prov_error %]</div>[% END %]
<form action="/lnp/do_create_number" method="post">
<table>
<tr>
<td>number</td>
<td><input type="text" name="number" value="[% narefill.number %]"
title="E.164 phone number with intl. prefix" />
</td>
</tr>
<tr>
<td>provider</td>
<td>
<select size="1" name="lnp_provider_id">
[% FOREACH provider = providers %]
<option value="[% provider.id %]"
[% IF narefill.lnp_provider_id == provider.id %]selected="selected"[% END %]
>[% provider.name %]</option>
[% END %]
</select>
</td>
</tr>
<tr>
<td>start</td>
<td><input type="text" name="start" value="[% narefill.start %]"
title="SQL date or timestamp in &quot;YYYY-MM-DD hh:mm:ss&quot; format" />
</td>
</tr>
<tr>
<td>end</td>
<td><input type="text" name="end" value="[% narefill.end %]"
title="SQL date or timestamp in &quot;YYYY-MM-DD hh:mm:ss&quot; format" />
</td>
</tr>
</table>
<input type="submit" value="Add &#187;" class="but" />
</form>
</div>
[% END %]
<h3 id="search_numbers">Search Ported Numbers</h3>
<div class="p1">
<form action="lnp/search_numbers" method="post" class="search_subscriber">
<label class="search_label" for="search_by_provid">Provider:</label>
<select size="1" name="search_provid">
<option value="0" [% UNLESS nerefill.lnp_provider_id %]selected="selected"[% END %] />
[% FOREACH provider = providers %]
<option value="[% provider.id %]"
[% IF searched_numbers.lnp_provider_id == provider.id %]selected="selected"[% END %]
>[% provider.name %]</option>
[% END %]
</select><br clear="all" />
<label class="search_label" for="search_by_number">Number:</label>
<input type="text" id="search_by_number" name="search_number" title="SQL wildcards allowed"
value="[% searched_numbers.number %]"
value="[% search_number %]" />
<input type="checkbox" id="exact_number" name="exact_number"
[% IF searched_numbers.exact_number %]checked="checked"[% END %] />
<label for="exact_number">exact match</label><br />
<input type="submit" value="Search &#187;" class="but" />
</form>
</div>
[% IF numbers %]
<h3 id="stored_numbers">Found Ported Numbers</h3>
<div class="p1">
[% IF messages.enumsg %]<div class="goodmsg">[% messages.enumsg %]</div>[% END %]
<table width="100%" style="border-spacing: 0px">
<tr class="table_header">
<td>number</td>
<td>provider ID</td>
<td style="width:135px;" >start</td>
<td style="width:135px;" >end</td>
<td style="width:30px;" />
<td style="width:30px;" />
</tr>
[% bgflip = 1 %]
[% FOREACH number = numbers %]
[% IF edit_number == number.id %]
<form action="/lnp/do_update_number" method="post">
[% IF bgflip %]
[% bgflip = 0 %]
<tr class="tr_alt">
[% ELSE %]
[% bgflip = 1 %]
<tr>
[% END %]
<td><input type="text" class="ilnpnumedit" name="number" value="[% nerefill.number %]"
title="E.164 phone number with intl. prefix" />
</td>
<td>
<select size="1" class="ilnpproedit" name="lnp_provider_id">
[% FOREACH provider = providers %]
<option value="[% provider.id %]"
[% IF nerefill.lnp_provider_id == provider.id %]selected="selected"[% END %]
>[% provider.name %]</option>
[% END %]
</select>
</td>
<td><input type="text" class="ilnptimedit" name="start" value="[% nerefill.start %]"
title="SQL date or timestamp in &quot;YYYY-MM-DD hh:mm:ss&quot; format" />
</td>
<td><input type="text" class="ilnptimedit" name="end" value="[% nerefill.end %]"
title="SQL date or timestamp in &quot;YYYY-MM-DD hh:mm:ss&quot; format" />
</td>
<td>
<input type="hidden" name="id" value="[% number.id %]" />
<div class="postlink">
<label for="numedit[% number.id %]">save</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif"
alt="" id="numedit[% number.id %]" />
</div>
</td>
<td>
<a href="/lnp#stored_numbers" class="aaction">cancel</a>
</td>
</tr>
[% IF nerefill && prov_error %]
[% IF bgflip %]
<tr>
[% ELSE %]
<tr class="tr_alt">
[% END %]
<td colspan="6"><div class="errormsg">[% prov_error %]</div></td>
</tr>
[% END %]
</form>
[% ELSE %]
[% IF bgflip %]
[% bgflip = 0 %]
<tr class="tr_alt">
[% ELSE %]
[% bgflip = 1 %]
<tr>
[% END %]
<td>[% number.number %]</td>
<td>[% number.lnp_provider %]</td>
<td style="white-space:nowrap;">[% number.start %]</td>
<td style="white-space:nowrap;">[% number.end %]</td>
<td>
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/lnp?edit_number=[% number.id %]#stored_numbers" class="aaction">edit</a>
[% END %]
</td>
<td>
<form action="/lnp/do_delete_number" method="post">
<input type="hidden" name="id" value="[% number.id %]" />
<input type="hidden" name="last_one" value="[% last_one %]" />
[% UNLESS Catalyst.session.admin.read_only %]
<div class="postlink">
<label for="numdel[% number.id %]">delete</label>
<input type="image" class="hidden" src="/static/images/dot_trans.gif"
alt="" id="numdel[% number.id %]" />
</div>
[% END %]
</form>
</td>
</tr>
[% END %]
[% END %]
</table>
[% IF pagination %]
<div class="pagination">
<ul>
[% IF searched_numbers.offset == 0 %]
<li class="disablepage">&#171; prev</li>
[% ELSE %]
<li class="nextpage">
<a href="/lnp/search_numbers?offset=[% searched_numbers.offset - 1 %]#stored_numbers">&#171; prev</a>
</li>
[% END %]
[% FOREACH pagine = pagination %]
[% IF pagine.offset == searched_numbers.offset %]
<li class="currentpage">
[% pagine.offset + 1 %]
</li>
[% ELSIF pagine.offset == -1 %]
...
[% ELSE %]
<li>
<a href="/lnp/search_numbers?offset=[% pagine.offset %]#stored_numbers">[% pagine.offset + 1 %]</a>
</li>
[% END %]
[% END %]
[% IF searched_numbers.offset >= max_offset %]
<li class="disablepage">
next &#187;
</li>
[% ELSE %]
<li class="nextpage">
<a href="/lnp/search_numbers?offset=[% searched_numbers.offset + 1 %]#stored_numbers">next &#187;</a>
</li>
[% END %]
</ul>
</div>
[% END %]
</div>
[% END %]
[% IF searched_numbers && ! numbers %]
<div class="p1">
No numbers found in the database.
</div>
[% END %]
Loading…
Cancel
Save