z-index: 1;
text-align: center;
}
+
</STYLE>
+
% # activate rolldown buttons for hidden package blocks
<SCRIPT TYPE="text/javascript">
function toggle_rolldown() {
if ( el ) el.scrollIntoView(true);
</&>
</SCRIPT>
-% unless ( $opt{no_links} ) {
-
-% my $s = 0;
-% if ( $curuser->access_right('Qualify service') ) {
- <% $s++ ? ' | ' : '' %>
- <& qual_link.html, $cust_main &>
-% }
-
-% if ( $curuser->access_right('Order customer package') ) {
- <% $s++ ? ' | ' : '' %>
- <& /elements/order_pkg_link.html, 'cust_main'=>$cust_main &>
-% }
-
-% if ( $curuser->access_right('One-time charge')
-% && $conf->config('payby-default') ne 'HIDE'
-% ) {
- <% $s++ ? ' | ' : '' %>
- <& /elements/one_time_charge_link.html, 'custnum'=>$cust_main->custnum &>
-% }
-
-% if ( $curuser->access_right('Bulk move customer services') ) {
- <% $s++ ? ' | ' : '' %>
-
- <& /elements/popup_link-cust_main.html,
- 'label' => emt('Move services between packages'),
- 'action' => "${p}edit/bulk-cust_svc-pkgnum.html",
- 'cust_main' => $cust_main,
- 'actionlabel' => emt('Move services'),
- 'width' => 968, #763,
- 'height' => 575,
- &>
+<TABLE>
+ <TR>
+ <TD ALIGN="left" VALIGN="top">
-% }
+% my $br = 0;
+
+% if ( $total_pkgs > $maxrecords ) {
+
+% if ( 1 ) { #FS::pkg_class->num_pkg_class ) {
+ <% $br++ ? ' | ' : '' %>
+ Class: <& /elements/select-cust-pkg_class.html,
+ curr_value => scalar($cgi->param('classnum')),
+ onchange => 'classnum_changed(this);',
+ pre_options => [ '-1' => 'all',
+ '0' => '(none)',
+ ],
+ &>
+% }
+
+ <% $br++ ? ' | ' : '' %>
+ Status: <& /elements/select-cust_pkg-status.html,
+ curr_value => scalar($cgi->param('status')),
+ onchange => 'status_changed(this);',
+ &>
+
+% if ( 1 ) { #$cust_main->num_cust_location ) {
+ <% $br++ ? ' | ' : '' %>
+ Location: <& /elements/select-cust_location.html,
+ cust_main => $cust_main,
+ curr_value => scalar($cgi->param('locationnum')),
+ addnew => 0,
+ onchange => 'locationnum_changed(this);',
+ pre_options => [ '-1' => 'all', ],
+ &>
+% }
+
+ <SCRIPT TYPE="text/javascript">
+
+ function classnum_changed(what) {
+% my $classnum = $cgi->param('classnum');
+% $cgi->delete('classnum');
+ window.location = '<% $cgi->self_url %>;classnum=' + what.options[what.selectedIndex].value;
+% $cgi->param('classnum', $classnum);
+ }
-% if ( $curuser->access_right('Bulk change customer packages') ) {
- <% $s++ ? ' | ' : '' %>
- <A HREF="<% $p %>edit/cust_pkg.cgi?<% $cust_main->custnum %>"><% mt('Bulk order and cancel packages') |h %></A>
-% }
+ function status_changed(what) {
+% my $status = $cgi->param('status');
+% $cgi->delete('status');
+ window.location = '<% $cgi->self_url %>;status=' + what.options[what.selectedIndex].value;
+% $cgi->param('status', $status);
+ }
-<BR><BR>
+ function locationnum_changed(what) {
+% my $locationnum = $cgi->param('locationnum');
+% $cgi->delete('locationnum');
+ window.location = '<% $cgi->self_url %>;locationnum=' + what.options[what.selectedIndex].value;
+% $cgi->param('locationnum', $locationnum);
+ }
-% } # unless $opt{no_links}
+ </SCRIPT>
-<TABLE>
- <TR>
- <TD ALIGN="left" VALIGN="top">
+% }
+<% $br++ ? ' | ' : '' %>
% if ( $cust_main->num_cancelled_pkgs ) {
% if ( $cgi->param('showcancelledpackages') eq '0' #see if it was set by me
% || ( $conf->exists('hidecancelledpackages')
% {
% my $prev = $cgi->param('showcancelledpackages');
% $cgi->param('showcancelledpackages', 1);
- ( <a href="<% $cgi->self_url %>"><% mt('show') |h %>
+ <a href="<% $cgi->self_url %>"><% mt('show') |h %>
% $cgi->param('showcancelledpackages', $prev);
% } else {
% $cgi->param('showcancelledpackages', 0);
- ( <a href="<% $cgi->self_url %>"><% mt('hide') |h %>
+ <a href="<% $cgi->self_url %>"><% mt('hide') |h %>
% $cgi->param('showcancelledpackages', 1);
% }
- <% mt('cancelled packages') |h %></a> )
+ <% mt('cancelled packages') |h %></a>
% }
-% if ( $num_old_packages ) {
+
+<% $br++ ? ' | ' : '' %>
+% if ( $cgi->param('showoldpackages') ) {
+% $cgi->param('showoldpackages', 0);
+ <a href="<% $cgi->self_url %>"><% mt('hide old packages') |h %></a>
+% $cgi->param('showoldpackages', 1);
+% } else {
% $cgi->param('showoldpackages', 1);
- ( <a href="<% $cgi->self_url %>"><% mt('show old packages') |h %></a> )
-% } elsif ( $cgi->param('showoldpackages') ) {
+ <a href="<% $cgi->self_url %>"><% mt('show old packages') |h %></a>
% $cgi->param('showoldpackages', 0);
- ( <a href="<% $cgi->self_url %>"><% mt('hide old packages') |h %></a> )
% }
</TD>
-% unless ( $opt{no_links} ) {
+ </TR>
- <TD ALIGN="right">
- <A HREF="<%$p%>search/report_cust_pkg.html?custnum=<% $cust_main->custnum %>"><% mt('Package reports') |h %></A>
-% if ( $curuser->access_right('Qualify service') ) {
- | <A HREF="<%$p%>search/qual.cgi?custnum=<% $cust_main->custnum %>"><% mt('View Qualifications') |h %></A>
-% }
- <BR>
- <% mt('Service reports:') |h %>
- <A HREF="<%$p%>search/report_svc_acct.html?custnum=<% $cust_main->custnum %>"><% mt('accounts') |h %></A><BR>
- <% mt('Usage reports:') |h %>
- <A HREF="<%$p%>search/report_cdr.html?custnum=<% $cust_main->custnum %>"><% mt('CDRs') |h %></A>
+% my $pager = include('/elements/pager.html',
+% offset => $offset,
+% num_rows => scalar(@packages),
+% total => $num_pkgs,
+% maxrecords => $maxrecords,
+% );
+% if ( $num_pkgs > $maxrecords ) {
+ <TR>
+ <TD COLSPAN=2>
+ <% $pager %>
</TD>
-
-% } # unless $opt{no_links}
-
</TR>
+% }
<TR>
<TD COLSPAN=2>
</TD>
</TR>
+% if ( $num_pkgs > $maxrecords ) {
+ <TR>
+ <TD COLSPAN=2>
+ <% $pager %>
+ </TD>
+ </TR>
+% }
+
</TABLE>
<%init>
my $num_svcs = '( SELECT COUNT(*) FROM cust_svc '.
' WHERE cust_svc.pkgnum = cust_pkg.pkgnum ) AS num_svcs';
-# don't exclude cancelled packages at this stage
-my @packages = $cust_main->all_pkgs( {
+my $addl_from = '
+ LEFT JOIN part_pkg USING ( pkgpart )
+ LEFT JOIN cust_pkg AS chgto ON ( chgto.change_to_pkgnum = cust_pkg.pkgnum )
+ LEFT JOIN cust_pkg AS chgfrom ON ( chgfrom.change_pkgnum = cust_pkg.pkgnum )
+';
+
+my $extra_sql =
+ ' AND cust_pkg.main_pkgnum IS NULL '. # supplemental package of something else
+ ' AND chgto.pkgnum IS NULL '. # ordered, not-yet-active change target
+ ' AND chgfrom.pkgnum IS NULL '; # canceled package changed into another
+
+unless ( $cgi->param('showoldpackages') ) {
+ my $years = $conf->config('cust_main-packages-years') || 2;
+ my $then = time - $years * 31556926; #60*60*24*365.2422 is close enough
+
+ $extra_sql .= " AND (
+ ( part_pkg.freq = '0'
+ AND ( cust_pkg.setup IS NULL OR cust_pkg.setup > $then )
+ )
+ OR ( part_pkg.freq != '0'
+ AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel > $then )
+ )
+ OR EXISTS ( SELECT 1 FROM cust_svc WHERE cust_svc.pkgnum = cust_pkg.pkgnum )
+ )";
+}
+
+if ( $cgi->param('classnum') =~ /^(\d+)$/ ) {
+ my $classnum = $1;
+ if ( $classnum == 0 ) {
+ $extra_sql .= " AND part_pkg.classnum IS NULL ";
+ } else {
+ $extra_sql .= " AND part_pkg.classnum = $classnum ";
+ }
+}
+
+if ( $cgi->param('status') =~ /^([\w ]+)$/ ) {
+ my $status = $1;
+ $extra_sql .= ' AND '. FS::cust_pkg->status_sql. " = '$status' ";
+}
+
+if ( $cgi->param('locationnum') =~ /^(\d+)$/ ) {
+ my $locationnum = $1;
+ $extra_sql .= " AND cust_pkg.locationnum = $locationnum ";
+}
+
+my $total_pkgs = $cust_main->all_pkgs;
+
+my $method = $hide_cancelled ? 'ncancelled_pkgs' : 'all_pkgs';
+my $num_pkgs = $cust_main->$method({
+ 'addl_from' => $addl_from,
+ 'extra_sql' => $extra_sql,
+});
+
+my $maxrecords = 10;
+my $offset = $cgi->param('offset') =~ /^(\d+)$/ ? $1 : 0;
+$cgi->delete('offset');
+
+my @packages = $cust_main->$method( {
'select' => "$cust_pkg_fields, $part_pkg_fields, $num_svcs",
- 'addl_from' => qq{
- LEFT JOIN part_pkg USING ( pkgpart )
+ 'addl_from' => $addl_from. "
LEFT JOIN part_pkg_option AS setup_option
ON ( cust_pkg.pkgpart = setup_option.pkgpart
AND setup_option.optionname = 'setup_fee' )
LEFT JOIN part_pkg_option AS recur_option
ON ( cust_pkg.pkgpart = recur_option.pkgpart
AND recur_option.optionname = 'recur_fee' )
- },
+ ",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => "ORDER BY pkgnum ASC LIMIT $maxrecords OFFSET $offset",
} );
-my %change_to_from; # target pkgnum => current cust_pkg, for future changes
-my %changed_from; # old pkgnum => new cust_pkg, for past changes
-
foreach my $cust_pkg ( @packages ) {
+
my %hash = $cust_pkg->hash;
my %part_pkg = map { /^part_pkg_(.+)$/ or die; ( $1 => $hash{$_} ); }
grep { /^part_pkg_/ } keys %hash;
$cust_pkg->{'_pkgpart'} = new FS::part_pkg \%part_pkg;
- if ( $cust_pkg->change_to_pkgnum ) {
- $change_to_from{$cust_pkg->change_to_pkgnum} = $cust_pkg;
- }
- if ( $cust_pkg->change_pkgnum ) {
- $changed_from{$cust_pkg->change_pkgnum} = $cust_pkg;
- }
-}
-# filter out hidden package changes
-if ( keys %change_to_from or keys %changed_from ) {
- my @displayable_packages;
- foreach my $cust_pkg (@packages) {
-
- if ( exists( $change_to_from{$cust_pkg->pkgnum} ) ) {
-
- # $cust_pkg is an ordered, not-yet-active package change target
- my $change_from = $change_to_from{ $cust_pkg->pkgnum };
- $cust_pkg->set('change_from_pkg', $change_from);
- $change_from->set('change_to_pkg', $cust_pkg);
-
- } elsif ( exists( $changed_from{$cust_pkg->pkgnum} ) ) {
-
- # $cust_pkg is a canceled package changed into another packge
- # hide it under the destination package's history
- my $changed_to = $changed_from{$cust_pkg->pkgnum};
- $cust_pkg->set('changed_to_pkg', $changed_to);
- $changed_to->set('changed_from_pkg', $cust_pkg);
-
- } else {
- push @displayable_packages, $cust_pkg;
- }
+ #arrayref of supplementals
+ $cust_pkg->set('_supplemental', [
+ qsearch('cust_pkg', { main_pkgnum=>$cust_pkg->pkgnum })
+ ] );
+ #for future changes
+ if ( $cust_pkg->change_to_pkgnum ) {
+ my $change_to =
+ qsearchs('cust_pkg', { pkgnum=>$cust_pkg->change_to_pkgnum });
+ $cust_pkg->set('change_to_pkg', $change_to);
+ $change_to->set('change_from_pkg', $cust_pkg);
}
- @packages = @displayable_packages;
-}
-# filter all cancelled packages if the user wants
-if ( $hide_cancelled ) {
- @packages = grep { !$_->get('cancel') } @packages;
-}
+ #for past changes
+ setfrom($cust_pkg);
-# filter out 'old' packages
-my $num_old_packages = scalar(@packages);
+ $cust_pkg->{'_cust_pkg_discount_active'} =
+ [ $cust_pkg->cust_pkg_discount_active ];
-unless ( $cgi->param('showoldpackages') ) {
- my $years = $conf->config('cust_main-packages-years') || 2;
- my $then = time - $years * 31556926; #60*60*24*365.2422 is close enough
+}
- my %hide = ( 'cancelled' => 'cancel',
- 'one-time charge' => 'setup',
- );
+sub setfrom {
+ my $cust_pkg = shift;
- @packages =
- grep { !exists($hide{$_->status}) or $_->get($hide{$_->status}) > $then
- or $_->num_svcs #don't hide packages w/services
- }
- @packages;
-}
+ if ( $cust_pkg->change_pkgnum ) {
+ my $changed_from =
+ qsearchs('cust_pkg', { pkgnum=>$cust_pkg->change_pkgnum });
+ $cust_pkg->set('changed_from_pkg', $changed_from);
+ $changed_from->set('changed_to_pkg', $cust_pkg);
-$num_old_packages -= scalar(@packages);
+ setfrom($changed_from);
-# don't include supplemental packages in this list; they'll be found from
-# their main packages
-# (as will change-target packages)
-@packages = grep !$_->main_pkgnum, @packages;
+ }
-foreach my $cust_pkg ( @packages ) {
- $cust_pkg->{'_cust_pkg_discount_active'} =
- [ $cust_pkg->cust_pkg_discount_active ];
}
</%init>