diff --git a/lib/admin/Controller/lnp.pm b/lib/admin/Controller/lnp.pm new file mode 100644 index 0000000..e2a74d6 --- /dev/null +++ b/lib/admin/Controller/lnp.pm @@ -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 + +=head1 COPYRIGHT + +The billing controller is Copyright (c) 2009 Sipwise GmbH, Austria. All +rights reserved. + +=cut + +# ende gelaende +1; diff --git a/root/css/admin.css b/root/css/admin.css index 8e64396..161effa 100644 --- a/root/css/admin.css +++ b/root/css/admin.css @@ -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; diff --git a/root/layout/menu b/root/layout/menu index 5176426..57f3caf 100644 --- a/root/layout/menu +++ b/root/layout/menu @@ -31,7 +31,11 @@
  • Billing
  • [% END %]
  • SIP Peerings
  • -[%#
  • SIP Server Settings
  • %] + + +

    Number Management

    + [% END %] diff --git a/root/tt/lnp.tt b/root/tt/lnp.tt new file mode 100644 index 0000000..102b7c7 --- /dev/null +++ b/root/tt/lnp.tt @@ -0,0 +1,299 @@ +

    LNP Providers

    + +
    + [% IF messages.provmsg %]
    [% messages.provmsg %]
    [% END %] + [% IF messages.proverr %]
    [% messages.proverr %]
    [% END %] + + + + + + [% FOREACH provider = providers %] + [% IF provider.id == edit_provider %] + + + + + + + + + [% IF messages.peditnamsg %] + + [% END %] + [% ELSE %] + + + + + + + [% END %] + [% END %] + + + + + + +
    IDname + +
    [% provider.id %] + + + + + cancel
    [% messages.peditnamsg %]
    [% provider.id %][% provider.name %] + [% UNLESS Catalyst.session.admin.read_only %] + edit + [% END %] + + [% UNLESS Catalyst.session.admin.read_only %] +
    + + +
    + [% END %] +
    + + + + + + + +
    + [% IF messages.paddidmsg %]
    [% messages.paddidmsg %]
    [% END %] + [% IF messages.paddnamsg %]
    [% messages.paddnamsg %]
    [% END %] +
    + + [% UNLESS Catalyst.session.admin.read_only %] +

    Add Ported Number

    + +
    + [% IF messages.cnumsg %]
    [% messages.cnumsg %]
    [% END %] + [% IF narefill && prov_error %]
    [% prov_error %]
    [% END %] +
    + + + + + + + + + + + + + + + + + +
    number +
    provider + +
    start +
    end +
    + +
    +
    + [% END %] + +

    Search Ported Numbers

    + +
    +
    + +
    + + + +
    + + +
    +
    + + [% IF numbers %] +

    Found Ported Numbers

    + +
    + [% IF messages.enumsg %]
    [% messages.enumsg %]
    [% END %] + + + + + + + + [% bgflip = 1 %] + [% FOREACH number = numbers %] + [% IF edit_number == number.id %] + + [% IF bgflip %] + [% bgflip = 0 %] + + [% ELSE %] + [% bgflip = 1 %] + + [% END %] + + + + + + + + [% IF nerefill && prov_error %] + [% IF bgflip %] + + [% ELSE %] + + [% END %] + + + [% END %] + + [% ELSE %] + [% IF bgflip %] + [% bgflip = 0 %] + + [% ELSE %] + [% bgflip = 1 %] + + [% END %] + + + + + + + + [% END %] + [% END %] +
    numberprovider IDstartend + +
    + + + + + + + + + cancel +
    [% prov_error %]
    [% number.number %][% number.lnp_provider %][% number.start %][% number.end %] + [% UNLESS Catalyst.session.admin.read_only %] + edit + [% END %] + +
    + + + [% UNLESS Catalyst.session.admin.read_only %] + + [% END %] +
    +
    + + [% IF pagination %] + + [% END %] + +
    + + [% END %] + + [% IF searched_numbers && ! numbers %] +
    + No numbers found in the database. +
    + [% END %] +