update unearned revenue report based on feedback from kevin
[freeside.git] / httemplate / search / cust_pay.cgi
index 8ebd654..51dd3b3 100755 (executable)
@@ -1,26 +1,93 @@
 <%
 
-$cgi->param('payinfo') =~ /^\s*(\d+)\s*$/ or die "illegal payinfo";
-my $payinfo = $1;
-$cgi->param('payby') =~ /^(\w+)$/ or die "illegal payby";
-my $payby = $1;
-my @cust_pay = qsearch('cust_pay', { 'payinfo' => $payinfo,
+my $sortby;
+my @cust_pay;
+if ( $cgi->param('magic') && $cgi->param('magic') eq '_date' ) {
+
+  my %search;
+  my @search;
+
+  if ( $cgi->param('payby') ) {
+    $cgi->param('payby') =~ /^(CARD|CHEK|BILL)(-(VisaMC|Amex|Discover))?$/
+      or die "illegal payby ". $cgi->param('payby');
+    $search{'payby'} = $1;
+    if ( $3 ) {
+      if ( $3 eq 'VisaMC' ) {
+        #avoid posix regexes for portability
+        push @search, " (    substring(payinfo from 1 for 1) = '4'  ".
+                      "   OR substring(payinfo from 1 for 2) = '51' ".
+                      "   OR substring(payinfo from 1 for 2) = '52' ".
+                      "   OR substring(payinfo from 1 for 2) = '53' ".
+                      "   OR substring(payinfo from 1 for 2) = '54' ".
+                      "   OR substring(payinfo from 1 for 2) = '54' ".
+                      "   OR substring(payinfo from 1 for 2) = '55' ".
+                      " ) ";
+      } elsif ( $3 eq 'Amex' ) {
+        push @search, " (    substring(payinfo from 1 for 2 ) = '34' ".
+                      "   OR substring(payinfo from 1 for 2 ) = '37' ".
+                      " ) ";
+      } elsif ( $3 eq 'Discover' ) {
+        push @search, " substring(payinfo from 1 for 4 ) = '6011' ";
+      } else {
+        die "unknown card type $3";
+      }
+    }
+  }
+
+  #false laziness with cust_pkg.cgi
+  if ( $cgi->param('beginning')
+       && $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/ ) {
+    my $beginning = str2time($1);
+    push @search, "_date >= $beginning ";
+  }
+  if ( $cgi->param('ending')
+            && $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/ ) {
+    my $ending = str2time($1) + 86399;
+    push @search, " _date <= $ending ";
+  }
+  my $search;
+  if ( @search ) {
+    $search = ( scalar(keys %search) ? ' AND ' : ' WHERE ' ).
+              join(' AND ', @search);
+  }
+
+  @cust_pay = qsearch('cust_pay', \%search, '', $search );
+
+  $sortby = \*date_sort;
+
+} else {
+
+  $cgi->param('payinfo') =~ /^\s*(\d+)\s*$/ or die "illegal payinfo";
+  my $payinfo = $1;
+
+  $cgi->param('payby') =~ /^(\w+)$/ or die "illegal payby";
+  my $payby = $1;
+
+  @cust_pay = qsearch('cust_pay', { 'payinfo' => $payinfo,
                                      'payby'   => $payby    } );
-my $sortby = \*date_sort;
+  $sortby = \*date_sort;
+
+}
 
 if (0) {
 #if ( scalar(@cust_pay) == 1 ) {
 #  my $invnum = $cust_bill[0]->invnum;
 #  print $cgi->redirect(popurl(2). "view/cust_bill.cgi?$invnum");  #redirect
 } elsif ( scalar(@cust_pay) == 0 ) {
-  idiot("Check # not found.");
+%>
+<!-- mason kludge -->
+<%
+  idiot("Payment not found.");
   #exit;
 } else {
   my $total = scalar(@cust_pay);
   my $s = $total > 1 ? 's' : '';
-  print header("Check # Search Results", menubar(
+%>
+<!-- mason kludge -->
+<%
+  print header("Payment Search Results", menubar(
           'Main Menu', popurl(2)
-        )), "$total matching check$s found<BR>", &table(), <<END;
+        )), "$total matching payment$s found<BR>", &table(), <<END;
       <TR>
         <TH></TH>
         <TH>Amount</TH>
@@ -31,26 +98,41 @@ if (0) {
 END
 
   my(%saw, $cust_pay);
+  my $tot_amount = 0;
   foreach my $cust_pay (
     sort $sortby grep(!$saw{$_->paynum}++, @cust_pay)
   ) {
-    my($paynum, $custnum, $payinfo, $amount, $date ) = (
+    my($paynum, $custnum, $payby, $payinfo, $amount, $date ) = (
       $cust_pay->paynum,
       $cust_pay->custnum,
+      $cust_pay->payby,
       $cust_pay->payinfo,
       sprintf("%.2f", $cust_pay->paid),
       $cust_pay->_date,
     );
-    my $pdate = time2str("%b %d %Y", $date);
+    $tot_amount += $amount;
+    my $pdate = time2str("%b&nbsp;%d&nbsp;%Y", $date);
 
     my $rowspan = 1;
 
     my $view = popurl(2). "view/cust_main.cgi?". $custnum. 
                "#". $payby. $payinfo;
 
+    my $payment_info;
+    if ( $payby eq 'CARD' ) {
+      $payment_info = 'Card&nbsp;#'. 'x'x(length($payinfo)-4).
+                      substr($payinfo,(length($payinfo)-4));
+    } elsif ( $payby eq 'CHEK' ) {
+      $payment_info = "E-check&nbsp;acct#$payinfo";
+    } elsif ( $payby eq 'BILL' ) {
+      $payment_info = "Check&nbsp;#$payinfo";
+    } else {
+      $payment_info = "$payby&nbsp;$payinfo";
+    }
+
     print <<END;
       <TR>
-        <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$payinfo</FONT></A></TD>
+        <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$payment_info</FONT></A></TD>
         <TD ROWSPAN=$rowspan ALIGN="right"><A HREF="$view"><FONT SIZE=-1>\$$amount</FONT></A></TD>
         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$pdate</FONT></A></TD>
 END
@@ -73,7 +155,13 @@ END
 
     print "</TR>";
   }
-  print <<END;
+
+  $tot_amount = sprintf("%.2f", $tot_amount);
+  print '</TABLE><BR>'. table(). <<END;
+      <TR>
+        <TH>Total&nbsp;Amount</TH>
+        <TD ALIGN="right">\$$tot_amount</TD>
+      </TR>
     </TABLE>
   </BODY>
 </HTML>