% # activate rolldown buttons for hidden package blocks % my $pager = include('/elements/pager.html', % offset => $offset, % num_rows => scalar(@packages), % total => $num_pkgs, % maxrecords => $maxrecords, % ); % if ( $num_pkgs > $maxrecords ) { % }
% 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', ], &> % } % } <% $br++ ? ' | ' : '' %> % if ( $cust_main->num_cancelled_pkgs ) { % if ( $cgi->param('showcancelledpackages') eq '0' #see if it was set by me % || ( $conf->exists('hidecancelledpackages') % && ! $cgi->param('showcancelledpackages') % ) % ) % { % my $prev = $cgi->param('showcancelledpackages'); % $cgi->param('showcancelledpackages', 1); <% mt('show') |h %> % $cgi->param('showcancelledpackages', $prev); % } else { % $cgi->param('showcancelledpackages', 0); <% mt('hide') |h %> % $cgi->param('showcancelledpackages', 1); % } <% mt('cancelled packages') |h %> % } <% $br++ ? ' | ' : '' %> % if ( $cgi->param('showoldpackages') ) { % $cgi->param('showoldpackages', 0); <% mt('hide old packages') |h %> % $cgi->param('showoldpackages', 1); % } else { % $cgi->param('showoldpackages', 1); <% mt('show old packages') |h %> % $cgi->param('showoldpackages', 0); % }
<% $pager %>
% $opt{cust_main} = $cust_main; % $opt{packages} = \@packages; % $opt{cust_location_cache} = {}; % if ( $conf->exists('cust_pkg-group_by_location') ) { <& locations.html, %opt &> % } else { # in this format, put all packages in one section <& /elements/table-grid.html &> <& packages/section.html, %opt &>
% } % if ( $num_pkgs > $maxrecords ) { <% $pager %> % } <%init> my $cust_main = shift; my %opt = @_; my $conf = new FS::Conf; my $curuser = $FS::CurrentUser::CurrentUser; my $countrydefault = scalar($conf->config('countrydefault')) || 'US'; my $hide_cancelled = 0; if ( $cgi->param('showcancelledpackages') eq '0' #see if it was set by me || ( $conf->exists('hidecancelledpackages') && ! $cgi->param('showcancelledpackages') ) ) { $hide_cancelled = 1; } my $cust_pkg_fields = join(', ', map { "cust_pkg.$_ AS $_" } fields('cust_pkg') ); my $part_pkg_fields = join(', ', ( map { "part_pkg.$_ AS part_pkg_$_" } fields('part_pkg') ), 'setup_option.optionvalue AS part_pkg__setup_fee', 'recur_option.optionvalue AS part_pkg__recur_fee', ); my $group_by = join(', ', map "cust_pkg.$_", fields('cust_pkg') ). ', '. join(', ', map "part_pkg.$_", fields('part_pkg') ); my $num_svcs = '( SELECT COUNT(*) FROM cust_svc '. ' WHERE cust_svc.pkgnum = cust_pkg.pkgnum ) AS num_svcs'; 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' => $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", } ); 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; #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); } #for past changes setfrom($cust_pkg); $cust_pkg->{'_cust_pkg_discount_active'} = [ $cust_pkg->cust_pkg_discount_active ]; } sub setfrom { my $cust_pkg = shift; 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); setfrom($changed_from); } }