package NGCP::Panel::Controller::Pbx; use Sipwise::Base; use namespace::sweep; BEGIN { extends 'Catalyst::Controller'; } use NGCP::Panel::Utils::Message; use NGCP::Panel::Utils::DateTime; use NGCP::Panel::Utils::Contract; use NGCP::Panel::Utils::InvoiceTemplate; use NGCP::Panel::Form::Invoice::Invoice; sub auto :Private { my ($self, $c) = @_; $c->log->debug(__PACKAGE__ . '::auto'); NGCP::Panel::Utils::Navigation::check_redirect_chain(c => $c); return 1; } sub base :Chained('/') :PathPart('') :CaptureArgs(0) { my ($self, $c) = @_; $c->stash->{schema} = $c->config->{deviceprovisioning}->{secure} ? 'https' : 'http'; $c->stash->{host} = $c->config->{deviceprovisioning}->{host} // $c->req->uri->host; $c->stash->{port} = $c->config->{deviceprovisioning}->{port} // 1444; } sub spa_directory_getsearch :Chained('base') :PathPart('pbx/directory/spasearch') :Args(1) { my ($self, $c, $id) = @_; my $schema = $c->stash->{schema}; my $host = $c->stash->{host}; my $port = $c->stash->{port}; my $baseuri = "$schema://$host:$port/pbx/directory/spa/$id"; my $data = ''; $data = < Search User Enter (part of) Name $baseuri q A EOF $c->log->debug("providing config to $id"); $c->log->debug($data); $c->response->content_type('text/xml'); $c->response->body($data); return; } sub spa_directory_list :Chained('base') :PathPart('pbx/directory/spa') :Args(1) { my ($self, $c, $id) = @_; unless($id) { $c->response->content_type('text/plain'); if($c->config->{features}->{debug}) { $c->response->body("404 - device id not given"); } else { $c->response->body("404 - device not found"); } $c->response->status(404); return; } $id =~ s/^([^\=]+)\=0$/$1/; $id = lc $id; my $dev = $c->model('DB')->resultset('autoprov_field_devices')->find({ identifier => $id }); unless($dev) { $c->response->content_type('text/plain'); if($c->config->{features}->{debug}) { $c->response->body("404 - device id '" . $id . "' not found"); } else { $c->response->body("404 - device not found"); } $c->response->status(404); return; } my $schema = $c->stash->{schema}; my $host = $c->stash->{host}; my $port = $c->stash->{port}; my $baseuri = "$schema://$host:$port/pbx/directory/spa/$id"; my $data = ''; my $delim = '?'; my $q; my $dirsuffix = ''; if(exists $c->req->params->{q} && length($c->req->params->{q})) { $q = $c->req->params->{q}; $baseuri .= "?q=$q"; $delim = '&'; $dirsuffix = ' (Search Results)'; } my $customer = $dev->contract; my $page = $c->req->params->{page} // 1; my $rows = 10; my $rs = $customer->voip_subscribers->search({ 'status' => 'active', 'provisioning_voip_subscriber.pbx_extension' => { '!=' => undef }, 'voip_usr_preferences.value' => { '!=' => undef }, 'attribute.attribute' => 'display_name', defined $q ? ('voip_usr_preferences.value' => { like => "%$q%" }) : (), },{ join => { provisioning_voip_subscriber => { voip_usr_preferences => 'attribute' } }, '+select' => [qw/voip_usr_preferences.value/], '+as' => [qw/display_name/], order_by => { '-asc' => 'voip_usr_preferences.value' }, }); my $total = $rs->count; my ($nextpage, $prevpage); if(($total / $rows) > $page ) { $nextpage = $page + 1; } if($page > 1) { $prevpage = $page - 1; } my @entries = (); foreach my $sub($rs->search(undef,{page => $page, rows => $rows})->all) { my $prov_sub = $sub->provisioning_voip_subscriber; next unless($prov_sub && $prov_sub->pbx_extension); my $display_name = $sub->get_column('display_name'); push @entries, { name => $display_name, ext => $prov_sub->pbx_extension }; } my $nexturi = $baseuri . $delim . 'page='.($nextpage//0); my $prevuri = $baseuri . $delim . 'page='.($prevpage//0); my $searchuri = "$schema://$host:$port/pbx/directory/spasearch/$id"; $data = "PBX Address Book$dirsuffixSelect the User"; $data .= join '', map {"$$_{name}$$_{ext}"} @entries; $data .= "DialSoftKey:Dial1"; if($prevpage) { $data .= "Prev$prevuri2"; } else { $data .= "Search$searchuri2"; } $data .= "Next$nexturi3" if($nextpage); $data .= "CancelInit:Services4"; $data .= ''; $c->log->debug("providing config to $id"); $c->log->debug($data); $c->response->content_type('text/xml'); $c->response->body($data); } __PACKAGE__->meta->make_immutable; 1; # vim: set tabstop=4 expandtab: