send commission reports by email, #33101
[freeside.git] / httemplate / search / customer_accounting_summary.html
index 0e9e24f..744b313 100644 (file)
@@ -87,7 +87,7 @@ as <A HREF="<% "$myself;_type=xls" %>">Excel spreadsheet</A><BR>
 <style type="text/css">
 .report * {
   background-color: #f8f8f8;
-  border: 1px solid black;
+  border: 1px solid #999999;
   padding: 2px;
 }
 .report td {
@@ -121,10 +121,7 @@ die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');
 
 my ($agentnum,$sel_agent);
-if ( $cgi->param('agentnum') eq 'all' ) {
-  $agentnum = 0;
-}
-elsif ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
+if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
   $agentnum = $1;
   $sel_agent = qsearchs('agent', { 'agentnum' => $agentnum } );
   die "agentnum $agentnum not found!" unless $sel_agent;
@@ -142,14 +139,22 @@ $title .=  $sel_part_referral->referral.' '
 
 $title .= 'Customer Accounting Summary Report';
 
-my @custs = ();
-@custs = qsearch('cust_main', {} );
-
 my @items  = ('netsales', 'cashflow');
 my @params = ( [], [] );
-my $setuprecur = '';
-if ( $cgi->param('setuprecur') ) {
-  $setuprecur = 1;
+my $grossdiscount = $cgi->param('grossdiscount');
+my $setuprecur = $cgi->param('setuprecur');
+if ($setuprecur && $grossdiscount) {
+  #see blocks below for more details on each option
+  @items  = ('gross', 'discounted', 'receipts', 'gross', 'discounted', 'receipts');
+  @params = ( 
+    [ setuprecur => 'setup' ],
+    [ setuprecur => 'setup' ],
+    [ setuprecur => 'setup' ],
+    [ setuprecur => 'recur' ],
+    [ setuprecur => 'recur' ],
+    [ setuprecur => 'recur' ],
+  );
+} elsif ($setuprecur) {
   # instead of 'cashflow' (payments - refunds), use 'receipts'
   # (applied payments), because it's divisible into setup and recur.
   @items = ('netsales', 'receipts', 'netsales', 'receipts');
@@ -159,22 +164,33 @@ if ( $cgi->param('setuprecur') ) {
     [ setuprecur => 'recur' ],
     [ setuprecur => 'recur' ],
   );
+} elsif ($grossdiscount) {
+  # instead of 'netsales' (invoiced - netcredits)
+  # use 'gross' (invoiced + discounted) and 'discounted' (sum of discounts on invoices)
+  @items  = ('gross', 'discounted', 'cashflow');
+  @params = ( [], [], [] );
 }
+
+
 my @labels = ();
 my @cross_params = ();
-my @custnames = ();
 
 my $status = $cgi->param('status');
 die "invalid status" unless $status =~ /^\w+|$/;
 
-foreach my $cust_main ( @custs ) {
-  # XXX should do this in the qsearch
-  next unless ($status eq '' || $status eq $cust_main->status); 
-  next unless ($agentnum == 0 || $cust_main->agentnum eq $agentnum);
-  next unless ($refnum   == 0 || $cust_main->refnum eq $refnum);
+my %search_hash;
+foreach (qw(agentnum refnum status)) {
+  if ( defined $cgi->param($_) ) {
+    $search_hash{$_} = $cgi->param($_);
+  }
+}
+$search_hash{'classnum'} = [ $cgi->param('cust_classnum') ] 
+  if grep { $_ eq 'cust_classnum' } $cgi->param;
 
-  push @custnames, $cust_main->name;
+my $query = FS::cust_main::Search->search(\%search_hash);
+my @cust_main = qsearch($query);
 
+foreach my $cust_main (@cust_main) {
   push @cross_params, [ ('custnum' => $cust_main->custnum) ];
 }
 
@@ -207,10 +223,10 @@ my @cells; # arrayrefs of cell info
 # header row
 $rows[0] = {};
 $cells[0] = [
-  { header => 1, rowspan => 2, colspan => ($setuprecur ? 2 : 1) },
+  { header => 1, rowspan => 2, colspan => ($setuprecur ? 4 : 3) },
   ($setuprecur ? '' : ()),
   map {
-    { header => 1, colspan => 2, value => time2str('%b %Y', $_) },
+    { header => 1, colspan => ($grossdiscount ? 3 : 2), value => time2str('%b %Y', $_) },
     ''
   } @{ $data->{speriod} }
 ];
@@ -220,14 +236,20 @@ $rows[1] = {};
 $cells[1] = [ '',
   ($setuprecur ? '' : ()),
   map { 
-  ( { header => 1, value => mt('Billed') },
-    { header => 1, value => mt('Paid') }
+  ( ($grossdiscount 
+      ? (
+         { header => 1, value => mt('Gross') },
+         { header => 1, value => mt('Discount') }
+      )
+      : { header => 1, value => mt('Billed') } 
+    ),
+    { header => 1, value => mt('Paid') },
   ) } (1..$ncols)
 ];
 
 # use PDL; # ha ha, I just might.
 my $row = 0;
-foreach my $name (@custnames) { # correspond to cross_params
+foreach my $cust_main (@cust_main) { # correspond to cross_params
   my $skip = 1; # skip the customer iff ALL of their values are zero
   for my $subrow (0..($setuprecur ? 1 : 0)) { # the setup/recur axis
     push @rows, { class => $subrow ? 'shaded' : '' };
@@ -235,9 +257,19 @@ foreach my $name (@custnames) { # correspond to cross_params
     if ( $subrow == 0 ) {
       # customer name
       push @thisrow,
-        { value => $name,
-          header => 1,
-          rowspan => ($setuprecur ? 2 : 1) };
+        { value   => $cust_main->name,
+          header  => 1,
+          rowspan => ($setuprecur ? 2 : 1),
+        },
+        { value   => $cust_main->state, #cust_main->bill_location->state,
+          header  => 1,
+          rowspan => ($setuprecur ? 2 : 1),
+        },
+        { value => $cust_main->salesnum ? $cust_main->sales->salesperson : '',
+          header  => 1,
+          rowspan => ($setuprecur ? 2 : 1),
+        },
+      ;
     } else {
       push @thisrow, '';
     }
@@ -248,12 +280,12 @@ foreach my $name (@custnames) { # correspond to cross_params
           header => 1 };
     }
     for my $col (0..$ncols-1) { # the month
-      for my $subcol (0..1) { # the billed/paid axis
-        my $item = $subrow * 2 + $subcol;
+      for my $subcol (0..($grossdiscount ? 2 : 1)) { # the billed/paid or gross/discount/paid axis
+        my $item = $subrow * ($grossdiscount ? 3 : 2) + $subcol;
         my $value = $data->{data}[$item][$col][$row];
         $skip = 0 if abs($value) > 0.005;
         push @thisrow, { value => sprintf('%0.2f', $value), format => 'money' };
-        $total[( ($ncols * $subrow) + $col ) * 2 + $subcol] += $value;
+        $total[( ($ncols * $subrow) + $col ) * ($grossdiscount ? 3 : 2) + $subcol] += $value;
       } #subcol
     } #col
     push @cells, \@thisrow;
@@ -276,6 +308,7 @@ for my $subrow (0..($setuprecur ? 1 : 0)) {
     push @thisrow,
       { value => mt('Total'),
         header => 1,
+        colspan => 3,
         rowspan => ($setuprecur ? 2 : 1), };
   } else {
     push @thisrow, '';
@@ -285,8 +318,8 @@ for my $subrow (0..($setuprecur ? 1 : 0)) {
       { value => $subrow ? mt('recurring') : mt('setup'),
         header => 1 };
   }
-  for my $col (0..($ncols * 2)-1) { # month and billed/paid axis
-    my $value = $total[($subrow * $ncols * 2) + $col];
+  for my $col (0..($ncols * ($grossdiscount ? 3 : 2))-1) { # month and billed/paid or gross/discount/paid axis
+    my $value = $total[($subrow * $ncols * ($grossdiscount ? 3 : 2)) + $col];
     push @thisrow, { value => sprintf('%0.2f', $value), format => 'money' };
   }
   push @cells, \@thisrow;