summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormark <mark>2011-06-23 21:30:10 +0000
committermark <mark>2011-06-23 21:30:10 +0000
commitd8299144d2175f1695adafe29e9549bd9b158e2f (patch)
treeb13ec9c626bcb5a902244714e0933d2d944cb4a9
parent6e0ae9815a528a46b6f0c98fc5cdff67a95ed278 (diff)
large package display in customer/package search, #13364
-rw-r--r--httemplate/elements/search-cust_svc.html53
-rwxr-xr-xhttemplate/search/cust_main.cgi101
-rwxr-xr-xhttemplate/search/cust_pkg.cgi60
3 files changed, 173 insertions, 41 deletions
diff --git a/httemplate/elements/search-cust_svc.html b/httemplate/elements/search-cust_svc.html
new file mode 100644
index 0000000..f7ffbf6
--- /dev/null
+++ b/httemplate/elements/search-cust_svc.html
@@ -0,0 +1,53 @@
+<%doc>
+
+Example:
+
+ <& /elements/search-cust_svc.html,
+ 'svcpart' => 10,
+ 'pkgnum' => 315,
+ 'svcdb' => 'svc_acct',
+ &>
+
+</%doc>
+% if ( $first ) {
+% $first = 0;
+<SCRIPT TYPE="text/javascript">
+function clearhint_search_cust_svc(obj, str) {
+ if (obj.value == str) obj.value='';
+}
+</SCRIPT>
+% }
+<FORM STYLE="display:inline"
+ ACTION="<%$p%>search/cust_pkg_svc.html" METHOD="GET">
+% foreach ('svcpart', 'pkgnum') {
+% if ($opt{$_}) {
+ <INPUT TYPE="hidden" NAME="<% $_ %>" VALUE="<% $opt{$_} %>">
+% }
+% }
+ <INPUT TYPE="text" NAME="search_svc" VALUE="<% $hint %>"
+ onfocus="clearhint_search_cust_svc(this, '<% $hint %>')">
+ <INPUT TYPE="submit" VALUE="Search">
+</FORM>
+<%init>
+
+my %hints = (
+svc_acct => emt('(user or email)'),
+svc_domain => emt('(domain)'),
+svc_broadband => emt('(ip or mac)'),
+svc_forward => emt('(email)'),
+svc_phone => emt('(phone)'),
+svc_pbx => emt('(phone)'),
+'' => '',
+);
+
+my( %opt ) = @_;
+if ( !$opt{'svcdb'} and $opt{'svcpart'} ) {
+ my $part_svc = qsearchs('part_svc', { 'svcpart' => $opt{'svcpart'} });
+ $opt{'svcdb'} = $part_svc->svcdb if $part_svc;
+}
+my $hint = $hints{$opt{'svcdb'} || ''};
+
+</%init>
+<%shared>
+my $first = 1;
+</%shared>
diff --git a/httemplate/search/cust_main.cgi b/httemplate/search/cust_main.cgi
index b8af1fd..000339d 100755
--- a/httemplate/search/cust_main.cgi
+++ b/httemplate/search/cust_main.cgi
@@ -119,13 +119,30 @@
% $cust_main->company,
% );
%
-% my(@lol_cust_svc);
-% my($rowspan)=0;#scalar( @{$all_pkgs{$custnum}} );
-% foreach ( @{$all_pkgs{$custnum}} ) {
-% my @cust_svc = $_->cust_svc;
-% push @lol_cust_svc, \@cust_svc;
-% $rowspan += scalar(@cust_svc) || 1;
+% my @all_cust_svc;
+% my @pkg_rowspans;
+% foreach my $cust_pkg ( @{$all_pkgs{$custnum}} ) {
+% my %cust_svc_by_svcpart;
+% foreach my $svc ( $cust_pkg->cust_svc ) {
+% push @{ $cust_svc_by_svcpart{$svc->svcpart} ||= [] }, $svc;
+% }
+% push @all_cust_svc, \%cust_svc_by_svcpart;
+% if ( !keys %cust_svc_by_svcpart ) {
+% # no services
+% push @pkg_rowspans, 1;
+% }
+% else {
+% my $rows = 0;
+% foreach (values %cust_svc_by_svcpart) {
+% # summarizing takes two rows per svcpart,
+% # full display takes one per cust_svc
+% $rows += ( $large_pkg_size > 0 && $large_pkg_size <= scalar @$_ ) ?
+% 2 : scalar @$_;
+% }
+% push @pkg_rowspans, $rows;
+% }
% }
+% my $rowspan = List::Util::sum(@pkg_rowspans) || 1;
%
% my $view;
% if ( defined $cgi->param('quickpay') && $cgi->param('quickpay') eq 'yes' ) {
@@ -141,16 +158,16 @@
% my $statuscol = $cust_main->statuscolor;
<TR>
- <TD CLASS="grid" ALIGN="right" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %>>
+ <TD CLASS="grid" ALIGN="right" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %>>
<A HREF="<% $view %>"><FONT SIZE=-1><% $cust_main->display_custnum %></FONT></A>
</TD>
- <TD CLASS="grid" ALIGN="center" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %>>
+ <TD CLASS="grid" ALIGN="center" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %>>
<FONT SIZE="-1" COLOR="#<% $statuscol %>"><B><% ucfirst($status) %></B></FONT>
</TD>
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %>>
+ <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %>>
<A HREF="<% $view %>"><FONT SIZE=-1><% "$last, $first" %></FONT></A>
</TD>
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %>>
+ <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %>>
<% $pcompany %>
</TD>
@@ -165,10 +182,10 @@
% : '<FONT SIZE=-1>&nbsp;</FONT>';
%
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %>>
+ <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %>>
<A HREF="<% $view %>"><FONT SIZE=-1><% "$ship_last, $ship_first" %></FONT></A>
</TD>
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %>>
+ <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %>>
<% $pship_company %></A>
</TD>
% }
@@ -177,7 +194,7 @@
% if ( $addl_col eq 'tickets' ) {
% if ( @custom_priorities ) {
- <TD CLASS="inv" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %> ALIGN=right>
+ <TD CLASS="inv" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %> ALIGN=right>
<FONT SIZE=-1>
<TABLE CLASS="inv" CELLSPACING=0 CELLPADDING=0>
% foreach my $priority ( @custom_priorities, '' ) {
@@ -203,7 +220,7 @@
<TH ALIGN=right STYLE="border-top: dashed 1px black">
<FONT SIZE=-1>
% } else {
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %> ALIGN=right>
+ <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %> ALIGN=right>
<FONT SIZE=-1>
% }
% my $ahref = '';
@@ -227,7 +244,7 @@
</FONT></TD>
% } else {
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan || 1 %> ALIGN=right><FONT SIZE=-1>
+ <TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN=<% $rowspan %> ALIGN=right><FONT SIZE=-1>
<% $cust_main->get($addl_col) %>
</FONT></TD>
@@ -245,29 +262,55 @@
% : ';show=packages';
% my $frag = "cust_pkg$pkgnum"; #hack for IE ignoring real #fragment
% my $pkgview = "${p}view/cust_main.cgi?custnum=$custnum$show;fragment=$frag#$frag";
-% my @cust_svc = @{shift @lol_cust_svc};
-% my $rowspan = scalar(@cust_svc) || 1;
+% # cust_svc stuff, built earlier
+% my %cust_svc_by_svcpart = %{ shift @all_cust_svc };
+% my $pkg_rowspan = shift @pkg_rowspans;
- <% $n1 %><TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN="<% $rowspan%>">
+ <% $n1 %><TD CLASS="grid" BGCOLOR="<% $bgcolor %>" ROWSPAN="<% $pkg_rowspan%>">
<A HREF="<% $pkgview %>"><FONT SIZE=-1><% $pkg_comment %></FONT></A>
</TD>
% my $n2 = '';
-% foreach my $cust_svc ( @cust_svc ) {
-% my($label, $value, $svcdb) = $cust_svc->label;
-% my($svcnum) = $cust_svc->svcnum;
-% my($sview) = $p.'view';
- <% $n2 %>
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
+% my $td = '<TD CLASS="grid" BGCOLOR="'.$bgcolor.'">';
+%
+% foreach my $svcpart ( sort keys %cust_svc_by_svcpart ) { #sort order?
+% my $these = $cust_svc_by_svcpart{$svcpart};
+% my $num_cust_svc = scalar @$these; # always at least 1
+% if ( $large_pkg_size > 0 && $num_cust_svc >= $large_pkg_size ) {
+ <% $n2 %>
+% # summarize
+% # link opens a new search for this pkgnum/svcpart combo
+% my $href = $p.'search/cust_pkg_svc.html?svcpart='.$svcpart.
+% ';pkgnum='.$pkgnum;
+ <% $td %>
+ <A HREF="<% $href %>"><% $these->[0]->part_svc->svc %></A>
+ </TD>
+ <% $td %>
+ <A HREF="<% $href %>"><B>(<% mt("view all [_1]", $num_cust_svc) |h %>)</B></A>
+ </TD>
+ </TR><TR>
+ <% $td %></TD>
+ <% $td %><& /elements/search-cust_svc.html,
+ 'svcpart' => $svcpart,
+ 'pkgnum' => $pkgnum,
+ &></TD>
+% $n2="</TR><TR>";
+% }
+% else { # do not summarize
+% foreach my $cust_svc ( @$these ) {
+ <% $n2 %>
+ <% $td %>
<% FS::UI::Web::svc_link($m, $cust_svc->part_svc, $cust_svc) %>
</TD>
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
+ <% $td %>
<% FS::UI::Web::svc_label_link($m, $cust_svc->part_svc, $cust_svc) %>
</TD>
-% $n2="</TR><TR>";
-% }
+% $n2="</TR><TR>";
+% } #foreach $cust_svc
+% }
+% } # foreach $svcpart
%
-% unless ( @cust_svc ) {
+% unless ( %cust_svc_by_svcpart ) {
<TD CLASS="grid" BGCOLOR="<% $bgcolor %>" COLSPAN=2>&nbsp;</TD>
% }
%
@@ -292,6 +335,8 @@ die "access denied"
my $conf = new FS::Conf;
my $maxrecords = $conf->config('maxsearchrecordsperpage');
+# summarize more than this many services of the same svcpart
+my $large_pkg_size = $conf->config('cust_pkg-large_pkg_size') || 0;
my $limit = '';
$limit .= "LIMIT $maxrecords" if $maxrecords;
diff --git a/httemplate/search/cust_pkg.cgi b/httemplate/search/cust_pkg.cgi
index 7a6f49a..8187f77 100755
--- a/httemplate/search/cust_pkg.cgi
+++ b/httemplate/search/cust_pkg.cgi
@@ -71,19 +71,7 @@
}
}
else {
- [ map {
- [
- { 'data' => $_->[0]. ':',
- 'align'=> 'right',
- },
- { 'data' => $_->[1],
- 'align'=> 'left',
- 'link' => $p. 'view/' .
- $_->[2]. '.cgi?'. $_->[3],
- },
- ];
- } $cust_pkg->labels
- ];
+ [ $process_svc_labels->( $cust_pkg ) ]
}
}
],
@@ -261,4 +249,50 @@ my $html_init = sub {
return $text;
};
+my $large_pkg_size = $conf->config('cust_pkg-large_pkg_size');
+
+my $process_svc_labels = sub {
+ my $cust_pkg = shift;
+ my @out;
+ foreach my $part_svc ( $cust_pkg->part_svc) {
+ # some false laziness with view/cust_main/packages/services.html
+
+ my $num_cust_svc = $cust_pkg->num_cust_svc( $part_svc->svcpart );
+
+ if ( $large_pkg_size > 0 and $large_pkg_size <= $num_cust_svc ) {
+ my $href = $p.'search/cust_pkg_svc.html?svcpart='.$part_svc->svcpart.
+ ';pkgnum='.$cust_pkg->pkgnum;
+ push @out, [
+ { 'data' => $part_svc->svc . ':',
+ 'align' => 'right',
+ 'rowspan' => 2 },
+ { 'data' => mt('(view all [_1])', $num_cust_svc),
+ 'data_style' => 'b',
+ 'align' => 'left',
+ 'link' => $href, },
+ ],
+ [
+ { 'data' => include('/elements/search-cust_svc.html',
+ 'svcpart' => $part_svc->svcpart,
+ 'pkgnum' => $cust_pkg->pkgnum,
+ ),
+ 'align' => 'left' },
+ ];
+ }
+ else {
+ foreach ( map { [ $_->label ] } @{ $part_svc->cust_pkg_svc } ) {
+ push @out, [
+ { 'data' => $_->[0]. ':',
+ 'align'=> 'right', },
+ { 'data' => $_->[1],
+ 'align'=> 'left',
+ 'link' => $p. 'view/' .
+ $_->[2]. '.cgi?'. $_->[3], },
+ ];
+ }
+ }
+ } #foreach $cust_pkg
+ return @out;
+};
+
</%init>