-#false lazinessish w/search/cust_pkg.cgi
-my $classnum = 0;
-my @pkg_class = ();
-if ( $cgi->param('classnum') =~ /^(\d*)$/ ) {
- $classnum = $1;
- if ( $classnum ) {
- @pkg_class = ( qsearchs('pkg_class', { 'classnum' => $classnum } ) );
- die "classnum $classnum not found!" unless $pkg_class[0];
- $title .= $pkg_class[0]->classname.' ';
- } elsif ( $classnum eq '' ) {
- $title .= 'Empty class ';
- @pkg_class = ( '(empty class)' );
- } elsif ( $classnum eq '0' ) {
- @pkg_class = qsearch('pkg_class', {} ); # { 'disabled' => '' } );
- push @pkg_class, '(empty class)';
+my( $refnum, $sel_part_referral, $all_part_referral ) = ('', '', '');
+if ( $cgi->param('refnum') eq 'all' ) {
+ $refnum = 0;
+ $all_part_referral = 'ALL';
+}
+elsif ( $cgi->param('refnum') =~ /^(\d+)$/ ) {
+ $refnum = $1;
+ $bottom_link .= "refnum=$refnum;";
+ $sel_part_referral = qsearchs('part_referral', { 'refnum' => $refnum } );
+ die "part_referral $refnum not found!" unless $sel_part_referral;
+}
+$title .= $sel_part_referral->referral.' '
+ if $sel_part_referral;
+
+$title .= 'Sales Report (Gross)';
+$title .= ', average per customer package' if $average_per_cust_pkg;
+
+my @cust_classnums = grep /^\d+$/, $cgi->param('cust_classnum');
+$bottom_link .= "cust_classnum=$_;" foreach @cust_classnums;
+
+#classnum (here)
+# not specified: no longer happens (unless you de-select all classes)
+# 0: empty class
+# N: classnum
+#classnum (link)
+# not specified: all classes
+# 0: empty class
+# N: classnum
+
+#started out as false lazinessish w/FS::cust_pkg::search_sql (previously search/cust_pkg.cgi), but not much left the sane now after #24776
+
+my ($class_table, $name_col, $value_col, $class_param);
+my $all_report_options;
+
+if ( $cgi->param('class_mode') eq 'report' ) {
+ $class_param = 'report_optionnum'; # CGI param name, also used in the report engine
+ $class_table = 'part_pkg_report_option'; # table containing classes
+ $name_col = 'name'; # the column of that table containing the label
+ $value_col = 'num'; # the column containing the class number
+ # in 'exact' mode we want to run the query in ALL mode.
+ # in 'breakdown' mode want to run the query in ALL mode but using the
+ # power set of the classes selected.
+ $all_report_options = 1
+ unless $cgi->param('class_agg_break') eq 'aggregate';
+} else { # class_mode eq 'pkg'
+ $class_param = 'classnum';
+ $class_table = 'pkg_class';
+ $name_col = 'classname';
+ $value_col = 'classnum';
+}
+
+my @classnums = sort {$a <=> $b} grep /^\d+$/, $cgi->param($class_param);
+my @classnames = map { if ( $_ ) {
+ my $class = qsearchs($class_table, {$value_col=>$_} );
+ $class->$name_col;
+ } else {
+ '(empty class)';
+ }
+ }
+ @classnums;
+my @not_classnums;
+
+$bottom_link .= "$class_param=$_;" foreach @classnums;
+
+if ( $cgi->param('class_agg_break') eq 'aggregate' or
+ $cgi->param('class_agg_break') eq 'exact' ) {
+
+ $title .= ' '. join(', ', @classnames)
+ unless scalar(@classnames) > scalar(qsearch($class_table,{'disabled'=>''}));
+ #not efficient for lots of package classes
+
+} elsif ( $cgi->param('class_agg_break') eq 'breakdown' ) {
+
+ if ( $cgi->param('class_mode') eq 'report' ) {
+ # The new way:
+ # Actually break down all subsets of the (selected) report classes.
+ my @subsets = FS::part_pkg_report_option->subsets(@classnums);
+ my @classnum_space = @classnums;
+ @classnums = @classnames = ();
+ while(@subsets) {
+ my $these = shift @subsets;
+ # applied topology!
+ my $not_these = [ @classnum_space ];
+ my $i = 0;
+ foreach (@$these) {
+ $i++ until $not_these->[$i] == $_;
+ splice(@$not_these, $i, 1);
+ }
+ push @classnums, $these;
+ push @not_classnums, $not_these;
+ push @classnames, shift @subsets;
+ } #while subsets