From 0a51b87d75f8c93de863f729ef1ca568ca227e32 Mon Sep 17 00:00:00 2001 From: mark Date: Mon, 25 Oct 2010 22:22:42 +0000 Subject: summary display of bulk packages with many services, RT#9821 --- httemplate/misc/unprovision.cgi | 32 +++++-- httemplate/search/cust_pkg_svc.html | 117 +++++++++++++++++++++++ httemplate/search/cust_svc.html | 6 ++ httemplate/view/cust_main/packages.html | 1 + httemplate/view/cust_main/packages/services.html | 44 ++++++++- httemplate/view/elements/svc_Common.html | 16 ++-- 6 files changed, 196 insertions(+), 20 deletions(-) create mode 100644 httemplate/search/cust_pkg_svc.html (limited to 'httemplate') diff --git a/httemplate/misc/unprovision.cgi b/httemplate/misc/unprovision.cgi index 4ab15fdc0..6f2c23815 100755 --- a/httemplate/misc/unprovision.cgi +++ b/httemplate/misc/unprovision.cgi @@ -1,6 +1,8 @@ %if ( $error ) { % errorpage($error); -%} else { +%} elsif ( $pkgnum ) { +<% $cgi->redirect(popurl(2)."search/cust_pkg_svc.html?svcpart=$svcpart;pkgnum=$pkgnum") %> +%} else { # $custnum should always exist <% $cgi->redirect(popurl(2)."view/cust_main.cgi?$custnum") %> %} <%init> @@ -9,18 +11,28 @@ die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Unprovision customer service'); #untaint svcnum -my($query) = $cgi->keywords; -$query =~ /^(\d+)$/; -my $svcnum = $1; +my @svcnums; +my ($pkgnum, $svcpart, $custnum); +if( $cgi->param('svcnum') ) { + @svcnums = grep { $_ } map { /^(\d+)$/ && $1 } $cgi->param('svcnum'); + $pkgnum = $cgi->param('pkgnum'); + $svcpart = $cgi->param('svcpart'); + $custnum = $cgi->param('custnum'); +} +else { + @svcnums = map { /^(\d+)$/ && $1 } $cgi->keywords; +} -#my $svc_acct = qsearchs('svc_acct',{'svcnum'=>$svcnum}); -#die "Unknown svcnum!" unless $svc_acct; +my $error = ''; +foreach my $svcnum (@svcnums) { -my $cust_svc = qsearchs('cust_svc',{'svcnum'=>$svcnum}); -die "Unknown svcnum!" unless $cust_svc; + my $cust_svc = qsearchs('cust_svc',{'svcnum'=>$svcnum}); + die "Unknown svcnum!" unless $cust_svc; -my $custnum = $cust_svc->cust_pkg->custnum; + $custnum ||= $cust_svc->cust_pkg->custnum; -my $error = $cust_svc->cancel; + $error .= $cust_svc->cancel; + +} diff --git a/httemplate/search/cust_pkg_svc.html b/httemplate/search/cust_pkg_svc.html new file mode 100644 index 000000000..4f27d6617 --- /dev/null +++ b/httemplate/search/cust_pkg_svc.html @@ -0,0 +1,117 @@ +<% include( 'elements/search.html', + 'title' => $part_svc->svc.' services in package #'.$pkgnum, + 'name' => 'services', + 'html_form' => $html_form, + 'query' => $sql_query, + 'count_query' => $count_query, + 'redirect' => $link, + 'header' => [ '#', + 'Service', + '', #checkboxes + ], + 'fields' => [ 'svcnum', + sub { + ($_[0]->label)[1] + }, + sub { + $areboxes = 1; + '' + }, + ], + 'links' => [ $link, + $link, + '', + ], + 'align' => 'rrlc', + 'color' => [ + ('')x4, + ], + 'style' => [ + ('')x4, + ], + 'html_foot' => sub { $areboxes ? $html_foot : '' } + ) +%> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('List services'); + +my $pkgnum = $cgi->param('pkgnum'); +$pkgnum =~ /^(\d+)$/ or die "invalid pkgnum: $pkgnum"; +my @extra_sql = ( "cust_svc.pkgnum = $pkgnum" ); + +my $svcpart = $cgi->param('svcpart'); +$svcpart =~ /^(\d+)$/ or die "invalid svcpart: $svcpart"; +push @extra_sql, "cust_svc.svcpart = $svcpart"; +my $part_svc = qsearchs('part_svc', {svcpart => $svcpart}); +my $svcdb = $part_svc->svcdb; + +my $orderby = 'ORDER BY svcnum'; #others? + +my $addl_from = " LEFT JOIN part_svc USING (svcpart) +LEFT JOIN cust_pkg USING (pkgnum) +LEFT JOIN cust_main USING (custnum) +INNER JOIN $svcdb USING (svcnum)"; + +my $search_string; +if ( length( $cgi->param('search_svc') ) ) { + + $search_string = $cgi->param('search_svc'); + $search_string =~ s/(^\s+|\s+$)//; + push @extra_sql, "FS::$svcdb"->search_sql($search_string); + +} + +#here is the agent virtualization +push @extra_sql, $FS::CurrentUser::CurrentUser->agentnums_sql( + 'null_right' => 'View/link unlinked services' + ); + +my $extra_sql = ' WHERE '. join(' AND ', @extra_sql ); + +my $sql_query = { + 'select' => join(', ', + 'cust_svc.*', + 'part_svc.svc', + ), + 'table' => 'cust_svc', + 'addl_from' => $addl_from, + 'hashref' => {}, + 'extra_sql' => "$extra_sql $orderby", +}; + +#warn Dumper($sql_query)."\n"; + +my $count_query = "SELECT COUNT(*) FROM cust_svc $addl_from $extra_sql"; + +my $link = sub { + my $cust_svc = shift; + my $url = svc_url( + 'm' => $m, + 'action' => 'view', + 'svcdb' => $svcdb, + 'query' => '', + ); + [ $url, 'svcnum' ]; +}; + +my $html_form = qq! + +
!; + +my $areboxes = 0; + +my $html_foot = qq! +
+ + + +
!; + + + diff --git a/httemplate/search/cust_svc.html b/httemplate/search/cust_svc.html index 2c17561f2..61bfc7091 100644 --- a/httemplate/search/cust_svc.html +++ b/httemplate/search/cust_svc.html @@ -93,6 +93,10 @@ if ( length( $cgi->param('search_svc') ) ) { errorpage("No search term specified"); } +if ( $cgi->param('pkgnum') =~ /^(\d+)$/ ) { + push @extra_sql, "cust_svc.pkgnum = $1"; +} + #here is the agent virtualization push @extra_sql, $FS::CurrentUser::CurrentUser->agentnums_sql( 'null_right' => 'View/link unlinked services' @@ -113,6 +117,8 @@ my $sql_query = { 'extra_sql' => "$extra_sql $orderby", }; +warn Dumper($sql_query)."\n"; + my $count_query = "SELECT COUNT(*) FROM cust_svc $addl_from $extra_sql"; my $link = sub { diff --git a/httemplate/view/cust_main/packages.html b/httemplate/view/cust_main/packages.html index f0f156bf8..660d0ef86 100755 --- a/httemplate/view/cust_main/packages.html +++ b/httemplate/view/cust_main/packages.html @@ -163,6 +163,7 @@ my %conf_opt = ( 'legacy_link' => $conf->exists('legacy_link'), 'svc_broadband-manage_link' => scalar($conf->config('svc_broadband-manage_link')), 'maestro-status_test' => $conf->exists('maestro-status_test'), + 'cust_pkg-large_pkg_size' => $conf->config('cust_pkg-large_pkg_size'), ); #subroutines diff --git a/httemplate/view/cust_main/packages/services.html b/httemplate/view/cust_main/packages/services.html index 6e30922c5..512efccc4 100644 --- a/httemplate/view/cust_main/packages/services.html +++ b/httemplate/view/cust_main/packages/services.html @@ -4,12 +4,40 @@ + % #foreach my $svcpart (sort {$a->{svcpart} <=> $b->{svcpart}} @{$pkg->{svcparts}}) { % foreach my $part_svc ( $cust_pkg->part_svc ) { -% #foreach my $service (@{$svcpart->{services}}) { -% foreach my $cust_svc ( @{ $part_svc->cust_pkg_svc } ) { +% if ( $opt{'cust_pkg-large_pkg_size'} > 0 and +% $opt{'cust_pkg-large_pkg_size'} <= $cust_pkg->num_svcs ) { +% # summarize + + + +% } +% else { +% foreach my $cust_svc ( @{ $part_svc->cust_pkg_svc } ) { @@ -65,7 +93,8 @@ -% } +% } #foreach $cust_svc +% } % if ( ! $cust_pkg->get('cancel') % && $curuser->access_right('Provision customer service') @@ -137,4 +166,13 @@ sub svc_unprovision_link { qq!', 'Permanently unprovision and delete this service?')">Unprovision!; } +my %hints = ( +svc_acct => '(user or email)', +svc_domain => '(domain)', +svc_broadband => '(ip or mac)', +svc_forward => '(email)', +svc_phone => '(phone)', +svc_pbx => '(phone)', +); + diff --git a/httemplate/view/elements/svc_Common.html b/httemplate/view/elements/svc_Common.html index 852640e0c..8a352f3fa 100644 --- a/httemplate/view/elements/svc_Common.html +++ b/httemplate/view/elements/svc_Common.html @@ -21,6 +21,13 @@ ) + + % if ( $custnum ) { <% include("/elements/header.html","View $label: $value") %> @@ -36,18 +43,13 @@ "javascript:areyousure(\'${p}misc/cancel-unaudited.cgi?$svcnum\')" )) %> - - % } Service #<% $svcnum %> % my $url = $opt{'edit_url'} || $p. 'edit/'. $opt{'table'}. '.cgi?'; | Edit this <% $label %> +| +Unprovision this Service
<% ntable("#cccccc") %>
+% my $href="${p}search/cust_pkg_svc.html?svcpart=".$part_svc->svcpart. +% ";pkgnum=".$cust_pkg->pkgnum; + <% $part_svc->svc %>  + (view all <% $cust_pkg->num_svcs %>) +% my $hint = $hints{$part_svc->svcdb}; +% if ( $hint ) { +
+
+ + + +
+% } #$hint +
<% FS::UI::Web::svc_link($m, $part_svc, $cust_svc) %>
<% ntable("#cccccc",2) %> -- cgit v1.2.1