[freeside-commits] branch master updated. ecd1baba392d971b49a50f133349f85aaec548a0

Ivan ivan at 420.am
Sat Sep 7 02:05:54 PDT 2013


The branch, master has been updated
       via  ecd1baba392d971b49a50f133349f85aaec548a0 (commit)
       via  7c1409560cf16d68b3ba132d3e2698a83153b484 (commit)
      from  9f0b89668b7f1e8962a3bbdbc44fa3abd2f1c161 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit ecd1baba392d971b49a50f133349f85aaec548a0
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Sat Sep 7 02:05:53 2013 -0700

    select multiple package classes (or report classes) on sales report, RT#24776

diff --git a/FS/FS/Report/Table.pm b/FS/FS/Report/Table.pm
index ffd2ac4..03ee273 100644
--- a/FS/FS/Report/Table.pm
+++ b/FS/FS/Report/Table.pm
@@ -325,16 +325,15 @@ sub _subtract_11mo {
 sub cust_pkg_setup_cost {
   my( $self, $speriod, $eperiod, $agentnum, %opt ) = @_;
   my $where = '';
-  my $comparison = '';
-  if ( $opt{'classnum'} =~ /^(\d+)$/ ) {
-    if ( $1 == 0 ) {
-      $comparison = 'IS NULL';
-    }
-    else {
-      $comparison = "= $1";
-    }
-    $where = "AND part_pkg.classnum $comparison";
+
+  if ( $opt{'classnum'} ne '' ) {
+    my $classnums = $opt{'classnum'};
+    $classnums = [ $classnums ] if !ref($classnums);
+    @$classnums = grep /^\d+$/, @$classnums;
+    $where .= ' AND COALESCE(part_pkg.classnum,0) IN ('. join(',', @$classnums).
+                                                    ')';
   }
+
   $agentnum ||= $opt{'agentnum'};
 
   my $total_sql = " SELECT SUM(part_pkg.setup_cost) ";
@@ -357,16 +356,15 @@ sub cust_pkg_setup_cost {
 sub cust_pkg_recur_cost {
   my( $self, $speriod, $eperiod, $agentnum, %opt ) = @_;
   my $where = '';
-  my $comparison = '';
-  if ( $opt{'classnum'} =~ /^(\d+)$/ ) {
-    if ( $1 == 0 ) {
-      $comparison = 'IS NULL';
-    }
-    else {
-      $comparison = "= $1";
-    }
-    $where = " AND part_pkg.classnum $comparison";
+
+  if ( $opt{'classnum'} ne '' ) {
+    my $classnums = $opt{'classnum'};
+    $classnums = [ $classnums ] if !ref($classnums);
+    @$classnums = grep /^\d+$/, @$classnums;
+    $where .= ' AND COALESCE(part_pkg.classnum,0) IN ('. join(',', @$classnums).
+                                                    ')';
   }
+
   $agentnum ||= $opt{'agentnum'};
   # duplication of in_time_period_and_agent
   # because we do it a little differently here
@@ -592,6 +590,7 @@ sub cust_bill_pkg_detail {
 sub cust_bill_pkg_discount {
   my( $self, $speriod, $eperiod, $agentnum, %opt ) = @_;
 
+  #need to do this the new multi-classnum way if it gets re-enabled
   #my $where = '';
   #my $comparison = '';
   #if ( $opt{'classnum'} =~ /^(\d+)$/ ) {
@@ -701,24 +700,20 @@ sub for_opts {
 }
 
 sub with_classnum {
-  my $self = shift;
-  my ($classnum, $use_override) = @_;
-  return '' unless $classnum =~ /^\d+$/;
-  my $comparison;
-  if ( $classnum == 0 ) {
-    $comparison = 'IS NULL';
-  }
-  else {
-    $comparison = "= $classnum";
-  }
+  my ($self, $classnum, $use_override) = @_;
+  return '' if $classnum eq '';
+
+  $classnum = [ $classnum ] if !ref($classnum);
+  @$classnum = grep /^\d+$/, @$classnum;
+  my $in = 'IN ('. join(',', @$classnum). ')';
+
   if ( $use_override ) {
-    return "(
-      part_pkg.classnum $comparison AND pkgpart_override IS NULL OR
-      override.classnum $comparison AND pkgpart_override IS NOT NULL
+    "(
+         ( COALESCE(part_pkg.classnum, 0) $in AND pkgpart_override IS NULL)
+      OR ( COALESCE(override.classnum, 0) $in AND pkgpart_override IS NOT NULL )
     )";
-  }
-  else {
-    return "part_pkg.classnum $comparison";
+  } else {
+    "COALESCE(part_pkg.classnum, 0) $in";
   }
 }
 
@@ -737,14 +732,14 @@ sub with_usageclass {
 }
 
 sub with_report_option {
-  my $self = shift;
+  my ($self, $num, $use_override) = @_;
   # $num can be a single number, or a comma-delimited list of numbers,
-  # or '0' to match only the empty set.
-  #
+  # or an arrayref.  0 matches the empty set
   # or the word 'multiple' for all packages with more than one report class
-  my ($num, $use_override) = @_;
   return '' if !defined($num);
 
+  $num = join(',', @$num) if ref($num);
+
   # stringify the set of report options for each pkgpart
   my $table = $use_override ? 'override' : 'part_pkg';
   my $subselect = "
@@ -757,14 +752,18 @@ sub with_report_option {
   my $comparison;
   if ( $num eq 'multiple' ) {
     $comparison = "(SELECT COUNT(*) FROM ($subselect) AS x) > 1";
-  } elsif ( $num eq '0' ) {
-    $comparison = "NOT EXISTS ($subselect)";
   } else {
+
+    my @num = split(/\s*,\s*/, $num);
+
     #$comparison = "(SELECT COALESCE(string_agg(num, ','), '') FROM ( #Pg 9-ism
     $comparison = "(SELECT COALESCE(array_to_string(array_agg(num), ','), '')
-    FROM (
-    $subselect
-    ) AS x) = '$num'";
+                      FROM ($subselect) AS x
+                   ) = '". join(',', grep $_, @num). "'";
+
+    $comparison = "( $comparison OR NOT EXISTS ($subselect) )"
+      if grep !$_, @num;
+
   }
   if ( $use_override ) {
     # then also allow the non-override package to match
diff --git a/httemplate/elements/select-table.html b/httemplate/elements/select-table.html
index b6c1573..9f26a35 100644
--- a/httemplate/elements/select-table.html
+++ b/httemplate/elements/select-table.html
@@ -37,6 +37,7 @@ Example:
     'post_options'   => [ 'value' => 'option' ], #after normal options
     'empty_label'    => '', #better specify it though, the default might change
     'multiple'       => 0, # bool
+    'all_selected'   => 0, # useful with multiple
     'disable_empty'  => 0, # bool (implied by multiple)
     'label_showkey'  => 0, # bool
     'label_callback' => sub { my $record = shift; return "label"; },
@@ -75,8 +76,9 @@ Example:
 % while ( @pre_options ) { 
 %   my $pre_opt   = shift(@pre_options);
 %   my $pre_label = shift(@pre_options);
-%   my $selected =    ( ref($value) && $value->{$pre_opt} )
-%                  || ( $value eq $pre_opt );
+%   my $selected = $opt{'all_selected'}
+%                   || ( ref($value) && $value->{$pre_opt} )
+%                   || ( $value eq $pre_opt );
     <OPTION VALUE="<% $pre_opt %>"
             <% $selected ? 'SELECTED' : '' %>
     ><% $pre_label %>
diff --git a/httemplate/graph/cust_bill_pkg.cgi b/httemplate/graph/cust_bill_pkg.cgi
index 96404a4..01d309d 100644
--- a/httemplate/graph/cust_bill_pkg.cgi
+++ b/httemplate/graph/cust_bill_pkg.cgi
@@ -73,22 +73,19 @@ my @cust_classnums = grep /^\d+$/, $cgi->param('cust_classnum');
 $bottom_link .= "cust_classnum=$_;" foreach @cust_classnums;
 
 #classnum (here)
-# 0: all classes
-# not specified: empty class
+# 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
 
-#false lazinessish w/FS::cust_pkg::search_sql (previously search/cust_pkg.cgi)
-my $classnum = 0;
-my (@classnums, @classnames);
-my $all_class = '';
+#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);
 
-if ( $cgi->param('mode') eq 'report' ) {
+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
@@ -100,50 +97,43 @@ if ( $cgi->param('mode') eq 'report' ) {
   $value_col = 'classnum';
 }
 
-if ( $cgi->param($class_param) eq 'all' ) { # all, aggregated
-  $all_class = 'ALL';
-  @classnums = ('');
-  @classnames = ('');
-} elsif ( $cgi->param($class_param) =~ /^(\d*)$/ ) {
+my @classnums = grep /^\d+$/, $cgi->param($value_col);
+my @classnames = map { if ( $_ ) {
+                         my $class = qsearchs($class_table, {$value_col=>$_} );
+                         $class->classname;
+                       } else {
+                         '(empty class)';
+                       }
+                     }
+                   @classnums;
 
-  $classnum = $1;
-  if ( $classnum ) { #a specific class
-    my $class = qsearchs($class_table, { $value_col => $classnum })
-      or die "$class_table #$classnum not found";
+$bottom_link .= "$class_param=$_;" foreach @classnums;
 
-    $title .= ' '.$class->get($name_col);
-    $bottom_link .= "$class_param=$classnum;";
+if ( $cgi->param('class_agg_break') eq 'aggregate' ) {
 
-    @classnums = ($classnum);
-    @classnames = ($class->get($name_col));
+  $link .= ";$class_param=$_" foreach @classnums;
 
-  } elsif ( $classnum eq '0' ) { #the empty class
+  $title .= ' '. join(', ', @classnames)
+    unless scalar(@classnames) > scalar(qsearch($class_table,{'disabled'=>''}));
+                                 #not efficient for lots of package classes
 
-    $title .= ' Empty class ';
-    @classnums = ( '' );
-    @classnames = ( '(empty class)' );
-    $bottom_link .= "$class_param=0;";
+} elsif ( $cgi->param('class_agg_break') eq 'breakdown' ) {
 
-  } elsif ( $classnum eq '' ) { #all, breakdown
+  if ( $cgi->param('mode') eq 'report' ) {
+    # In theory, a package can belong to any subset of the report classes,
+    # so the report groups should be all the _subsets_, but for now we're
+    # handling the simple case where each package belongs to one report
+    # class. Packages with multiple classes will go into one bin at the
+    # end.
+    push @classnames, '(multiple classes)';
+    push @classnums, 'multiple';
+  }
 
-    my @classes = qsearch($class_table, {});
-    @classnames = map { $_->get($name_col) } @classes;
-    @classnums  = map { $_->get($value_col) } @classes;
+} else {
+  die "guru meditation #434";
+}
 
-    push @classnames, '(empty class)';
-    push @classnums, '0';
-
-    if ( $cgi->param('mode') eq 'report' ) {
-      # In theory, a package can belong to any subset of the report classes,
-      # so the report groups should be all the _subsets_, but for now we're
-      # handling the simple case where each package belongs to one report
-      # class. Packages with multiple classes will go into one bin at the
-      # end.
-      push @classnames, '(multiple classes)';
-      push @classnums, 'multiple';
-    }
-  }
-} #eslaf
+#eslaf
 
 my $hue = 0;
 #my $hue_increment = 170;
@@ -195,9 +185,14 @@ foreach my $agent ( $all_agent || $sel_agent || qsearch('agent', { 'disabled' =>
     qsearch('part_referral', { 'disabled' => '' } ) 
   ) {
 
-    for (my $i = 0; $i < scalar @classnums; $i++) {
-      my $row_classnum = $classnums[$i];
-      my $row_classname = $classnames[$i];
+    my @base_params = (
+                        'use_override'         => $use_override,
+                        'average_per_cust_pkg' => $average_per_cust_pkg,
+                        'distribute'           => $distribute,
+                      );
+
+    if ( $cgi->param('class_agg_break') eq 'aggregate' ) {
+
       foreach my $component ( @components ) {
 
         push @items, 'cust_bill_pkg';
@@ -205,26 +200,26 @@ foreach my $agent ( $all_agent || $sel_agent || qsearch('agent', { 'disabled' =>
         push @labels,
           ( $all_agent || $sel_agent ? '' : $agent->agent.' ' ).
           ( $all_part_referral || $sel_part_referral ? '' : $part_referral->referral.' ' ).
-          $row_classname .  ' ' . $charge_labels{$component};
+          $charge_labels{$component};
 
         my $row_agentnum = $all_agent || $agent->agentnum;
         my $row_refnum = $all_part_referral || $part_referral->refnum;
-        push @params, [ ($all_class ? () : ($class_param => $row_classnum) ),
+        push @params, [
+                        @base_params,
+                        $class_param => \@classnums,
                         ($all_agent ? () : ('agentnum' => $row_agentnum) ),
                         ($all_part_referral ? () : ('refnum' => $row_refnum) ),
-                        'use_override'         => $use_override,
                         'charges'              => $component,
-                        'average_per_cust_pkg' => $average_per_cust_pkg,
-                        'distribute'           => $distribute,
                       ];
 
-        push @links, "$link;".
-                     ($all_agent ? '' : "agentnum=$row_agentnum;").
-                     ($all_part_referral ? '' : "refnum=$row_refnum;").
-                     (join('',map {"cust_classnum=$_;"} @cust_classnums)).
-                     ($all_class ? '' : "$class_param=$row_classnum;").
-                     "distribute=$distribute;".
-                     "use_override=$use_override;charges=$component;";
+        my $rowlink = "$link;".
+                      ($all_agent ? '' : "agentnum=$row_agentnum;").
+                      ($all_part_referral ? '' : "refnum=$row_refnum;").
+                      (join('',map {"cust_classnum=$_;"} @cust_classnums)).
+                      "distribute=$distribute;".
+                      "use_override=$use_override;charges=$component;";
+        $rowlink .= "$class_param=$_;" foreach @classnums;
+        push @links, $rowlink;
 
         @recur_colors = ($col_scheme->colors)[0,4,8,1,5,9]
           unless @recur_colors;
@@ -234,7 +229,51 @@ foreach my $agent ( $all_agent || $sel_agent || qsearch('agent', { 'disabled' =>
         push @no_graph, 0;
 
       } #foreach $component
-    } #foreach $row_classnum
+
+    } elsif ( $cgi->param('class_agg_break') eq 'breakdown' ) {
+
+      for (my $i = 0; $i < scalar @classnums; $i++) {
+        my $row_classnum = $classnums[$i];
+        my $row_classname = $classnames[$i];
+        foreach my $component ( @components ) {
+
+          push @items, 'cust_bill_pkg';
+
+          push @labels,
+            ( $all_agent || $sel_agent ? '' : $agent->agent.' ' ).
+            ( $all_part_referral || $sel_part_referral ? '' : $part_referral->referral.' ' ).
+            $row_classname .  ' ' . $charge_labels{$component};
+
+          my $row_agentnum = $all_agent || $agent->agentnum;
+          my $row_refnum = $all_part_referral || $part_referral->refnum;
+          push @params, [
+                          @base_params,
+                          $class_param => $row_classnum,
+                          ($all_agent ? () : ('agentnum' => $row_agentnum) ),
+                          ($all_part_referral ? () : ('refnum' => $row_refnum)),
+                          'charges'              => $component,
+                        ];
+
+          push @links, "$link;".
+                       ($all_agent ? '' : "agentnum=$row_agentnum;").
+                       ($all_part_referral ? '' : "refnum=$row_refnum;").
+                       (join('',map {"cust_classnum=$_;"} @cust_classnums)).
+                       "$class_param=$row_classnum;".
+                       "distribute=$distribute;".
+                       "use_override=$use_override;charges=$component;";
+
+          @recur_colors = ($col_scheme->colors)[0,4,8,1,5,9]
+            unless @recur_colors;
+          @onetime_colors = ($col_scheme->colors)[2,6,10,3,7,11]
+            unless @onetime_colors;
+          push @colors, shift @recur_colors;
+          push @no_graph, 0;
+
+        } #foreach $component
+      } #foreach $row_classnum
+
+    } #$cgi->param('class_agg_break')
+
   } #foreach $part_referral
 
   if ( $cgi->param('agent_totals') and !$all_agent ) {
@@ -254,17 +293,19 @@ foreach my $agent ( $all_agent || $sel_agent || qsearch('agent', { 'disabled' =>
                    "distribute=$distribute;".
                    "charges=$component";
     
-    # Also apply any refnum/classnum filters
-    if ( !$all_class and scalar(@classnums) == 1 ) {
-      # then a specific class has been chosen, but it may be the empty class
-      push @row_params, $class_param => $classnums[0];
-      $row_link .= ";$class_param=".$classnums[0];
+    # package class filters
+    if ( $cgi->param('class_agg_break') eq 'aggregate' ) {
+      push @row_params, $class_param => \@classnums;
+      $row_link .= ";$class_param=".$_ foreach @classnums;
     }
+
+    # refnum filters
     if ( $sel_part_referral ) {
       push @row_params, 'refnum' => $sel_part_referral->refnum;
       $row_link .= ";refnum=".$sel_part_referral->refnum;
     }
 
+    # customer class filters
     $row_link .= ";cust_classnum=$_" foreach @cust_classnums;
 
     push @items, 'cust_bill_pkg';
diff --git a/httemplate/graph/report_cust_bill_pkg.html b/httemplate/graph/report_cust_bill_pkg.html
index d3d8e66..c9e2567 100644
--- a/httemplate/graph/report_cust_bill_pkg.html
+++ b/httemplate/graph/report_cust_bill_pkg.html
@@ -2,7 +2,11 @@
 
 <FORM ACTION="cust_bill_pkg.cgi" METHOD="GET">
 
-<TABLE>
+<TABLE BGCOLOR="#cccccc" CELLSPACING=0>
+
+<TR>
+  <TH CLASS="background" COLSPAN=2 ALIGN="left"><FONT SIZE="+1"><% mt('Search options') |h %></FONT></TH>
+</TR>
 
 <% include('/elements/tr-select-from_to.html' ) %>
 
@@ -17,15 +21,15 @@ function enable_agent_totals(obj) {
   obj.form.agent_totals.disabled = !(
     obj.form.agentnum.value == '' && (
       obj.form.refnum.value == ''   ||
-      obj.form.classnum.value == 0  ||
+      document.getElementById('class_agg_break_breakdown').checked ||
       obj.form.use_setup.value == 1 ||
       obj.form.use_usage.value == 1
     )
   );
 }
 
-function mode_changed() {
-  var options = document.getElementsByName('mode');
+function class_mode_changed() {
+  var options = document.getElementsByName('class_mode');
   var mode;
   for(var i=0; i < options.length; i++) {
     if (options[i].checked) {
@@ -43,7 +47,7 @@ function mode_changed() {
     div_report.style.display = '';
   }
 }
-window.onload = mode_changed;
+window.onload = class_mode_changed;
 </SCRIPT>
 
 <& /elements/tr-select-agent.html,
@@ -71,38 +75,70 @@ window.onload = mode_changed;
 &>
 
 <TR>
-  <TD ALIGN="right">
-    <INPUT TYPE="radio" NAME="mode" VALUE="pkg" onchange="mode_changed('pkg')" CHECKED>
+
+  <TD>
+    <INPUT TYPE="radio" NAME="class_mode" VALUE="pkg" onchange="class_mode_changed('pkg')" CHECKED>
     <% emt('Package class') %>
     <BR>
-    <INPUT TYPE="radio" NAME="mode" VALUE="report" onchange="mode_changed('report')">
+    <INPUT TYPE="radio" NAME="class_mode" VALUE="report" onchange="class_mode_changed('report')">
     <% emt('Report class') %>
   </TD>
+
   <TD>
-    <DIV ID="pkg_class">
-    <& /elements/select-pkg_class.html,
-      'field'       => 'classnum',
-      'pre_options' => [ 'all'  => 'all (aggregate)',
-                            ''  => 'all (breakdown)',
-                           '0'  => '(empty class)' ],
-      'disable_empty' => 1,
-      'onchange'    => 'enable_agent_totals',
-    &>
-    </DIV>
-    <DIV ID="report_class" STYLE="display: none">
-    <& /elements/select-table.html,
-      'field'       => 'report_optionnum',
-      'table'       => 'part_pkg_report_option',
-      'name_col'    => 'name',
-      'value_col'   => 'num',
-      'pre_options' => [ 'all' => 'all (aggregate)',
-                            '' => 'all (breakdown)', 
-                           '0'  => '(empty class)' ],
-      'disable_empty' => 1,
-      'onchange'    => 'enable_agent_totals',
-    &>
-    </DIV>
+    <TABLE>
+      <TR>
+
+        <TD>
+          <DIV ID="pkg_class">
+          <& /elements/select-pkg_class.html,
+            'field'         => 'classnum',
+            'multiple'      => 1,
+            'all_selected'  => 1,
+            'pre_options'   => [ #'all'  => 'all (aggregate)',
+                                #   ''  => 'all (breakdown)',
+                                  '0'  => '(empty class)' ],
+            'disable_empty' => 1,
+            'onchange'      => 'enable_agent_totals',
+          &>
+          </DIV>
+          <DIV ID="report_class" STYLE="display: none">
+          <& /elements/select-table.html,
+            'field'         => 'report_optionnum',
+            'table'         => 'part_pkg_report_option',
+            'name_col'      => 'name',
+            'value_col'     => 'num',
+            'multiple'      => 1,
+            'all_selected'  => 1,
+            'pre_options'   => [ #'all' => 'all (aggregate)',
+                               #   '' => 'all (breakdown)', 
+                                 '0'  => '(empty class)' ],
+            'disable_empty' => 1,
+            'onchange'      => 'enable_agent_totals',
+          &>
+          </DIV>
+        </TD>
+
+        <TD>
+          <INPUT TYPE="radio" NAME="class_agg_break" ID="class_agg_break_aggregate" VALUE="aggregate" CHECKED>
+          <% emt('Aggregate') %>
+          <BR>
+          <INPUT TYPE="radio" NAME="class_agg_break" VALUE="breakdown">
+          <% emt('Breakdown') %>
+        </TD>
+
+      </TR>
+    </TABLE>
   </TD>
+
+</TR>
+
+
+<TR>
+  <TH CLASS="background" COLSPAN=2> </TH>
+</TR>
+
+<TR>
+  <TH CLASS="background" COLSPAN=2 ALIGN="left"><FONT SIZE="+1"><% mt('Display options') |h %></FONT></TH>
 </TR>
 
 <!--
diff --git a/httemplate/search/cust_bill_pkg.cgi b/httemplate/search/cust_bill_pkg.cgi
index 7ed320f..4c5e90f 100644
--- a/httemplate/search/cust_bill_pkg.cgi
+++ b/httemplate/search/cust_bill_pkg.cgi
@@ -132,8 +132,8 @@ Filtering parameters:
 - classnum: Filter on package class.
 
 - report_optionnum: Filter on package report class.  Can be a single report
-  class number, a comma-separated list, the word "multiple", or an empty 
-  string (for "no report class").
+  class number or a comma-separated list (where 0 is "no report class"), or the
+  word "multiple".
 
 - use_override: Apply "classnum" and "taxclass" filtering based on the 
   override (bundle) pkgpart, rather than always using the true pkgpart.
@@ -349,15 +349,22 @@ if ( $cgi->param('nottax') ) {
   # not specified: all classes
   # 0: empty class
   # N: classnum
-  if ( $cgi->param('classnum') =~ /^(\d+)$/ ) {
-    push @where, "COALESCE($part_pkg.classnum, 0) = $1";
+  if ( grep { $_ eq 'classnum' } $cgi->param ) {
+    my @classnums = grep /^\d+$/, $cgi->param('classnum');
+    push @where, "COALESCE($part_pkg.classnum, 0) IN ( ".
+                     join(',', @classnums ).
+                 ' )'
+      if @classnums;
+  }
+
+  if ( grep { $_ eq 'report_optionnum' } $cgi->param ) {
+    my @nums = grep /^\w+$/, $cgi->param('report_optionnum');
+    my $num = join(',', @nums);
+    push @where, # code reuse FTW
+      FS::Report::Table->with_report_option( $num, $cgi->param('use_override'));
   }
 
   if ( $cgi->param('report_optionnum') =~ /^(\w+)$/ ) {
-    # code reuse FTW
-    my $num = $1;
-    push @where, 
-      FS::Report::Table->with_report_option( $1, $cgi->param('use_override') )
     ;
   }
 

commit 7c1409560cf16d68b3ba132d3e2698a83153b484
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Fri Sep 6 22:15:08 2013 -0700

    doc

diff --git a/httemplate/search/cust_bill_pkg.cgi b/httemplate/search/cust_bill_pkg.cgi
index 744286a..7ed320f 100644
--- a/httemplate/search/cust_bill_pkg.cgi
+++ b/httemplate/search/cust_bill_pkg.cgi
@@ -294,6 +294,10 @@ if ( $cgi->param('salesnum') =~ /^(\d+)$/ ) {
 
   push @where, "$cmp_salesnum = $salesnum";
 
+  #because currently we're called from sales_pkg_class.html for a specific
+  # class (or empty class) but not for all classes
+  #will have to do something to distinguish if someone wants the sales report
+  # (report_cust_bill_pkg.html) to have a sales person dropdown
   $cgi->param('classnum', 0) unless $cgi->param('classnum');
 }
 

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/Report/Table.pm                      |   85 +++++++-------
 httemplate/elements/select-table.html      |    6 +-
 httemplate/graph/cust_bill_pkg.cgi         |  169 +++++++++++++++++-----------
 httemplate/graph/report_cust_bill_pkg.html |   98 +++++++++++-----
 httemplate/search/cust_bill_pkg.cgi        |   27 +++--
 5 files changed, 237 insertions(+), 148 deletions(-)




More information about the freeside-commits mailing list