add badly-named new report
[freeside.git] / httemplate / search / cust_pay.cgi
1 <%
2
3 my $sortby;
4 my @cust_pay;
5 if ( $cgi->param('magic') && $cgi->param('magic') eq '_date' ) {
6
7   my %search;
8   my @search;
9
10   if ( $cgi->param('payby') ) {
11     $cgi->param('payby') =~ /^(CARD|CHEK|BILL)(-(VisaMC|Amex|Discover))?$/
12       or die "illegal payby ". $cgi->param('payby');
13     $search{'payby'} = $1;
14     if ( $3 ) {
15       if ( $3 eq 'VisaMC' ) {
16         #avoid posix regexes for portability
17         push @search, " (    substring(payinfo from 1 for 1) = '4'  ".
18                       "   OR substring(payinfo from 1 for 2) = '51' ".
19                       "   OR substring(payinfo from 1 for 2) = '52' ".
20                       "   OR substring(payinfo from 1 for 2) = '53' ".
21                       "   OR substring(payinfo from 1 for 2) = '54' ".
22                       "   OR substring(payinfo from 1 for 2) = '54' ".
23                       "   OR substring(payinfo from 1 for 2) = '55' ".
24                       " ) ";
25       } elsif ( $3 eq 'Amex' ) {
26         push @search, " (    substring(payinfo from 1 for 2 ) = '34' ".
27                       "   OR substring(payinfo from 1 for 2 ) = '37' ".
28                       " ) ";
29       } elsif ( $3 eq 'Discover' ) {
30         push @search, " substring(payinfo from 1 for 4 ) = '6011' ";
31       } else {
32         die "unknown card type $3";
33       }
34     }
35   }
36
37   #false laziness with cust_pkg.cgi
38   if ( $cgi->param('beginning')
39        && $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/ ) {
40     my $beginning = str2time($1);
41     push @search, "_date >= $beginning ";
42   }
43   if ( $cgi->param('ending')
44             && $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/ ) {
45     my $ending = str2time($1) + 86399;
46     push @search, " _date <= $ending ";
47   }
48   my $search;
49   if ( @search ) {
50     $search = ( scalar(keys %search) ? ' AND ' : ' WHERE ' ).
51               join(' AND ', @search);
52   }
53
54   @cust_pay = qsearch('cust_pay', \%search, '', $search );
55
56   $sortby = \*date_sort;
57
58 } else {
59
60   $cgi->param('payinfo') =~ /^\s*(\d+)\s*$/ or die "illegal payinfo";
61   my $payinfo = $1;
62
63   $cgi->param('payby') =~ /^(\w+)$/ or die "illegal payby";
64   my $payby = $1;
65
66   @cust_pay = qsearch('cust_pay', { 'payinfo' => $payinfo,
67                                      'payby'   => $payby    } );
68   $sortby = \*date_sort;
69
70 }
71
72 if (0) {
73 #if ( scalar(@cust_pay) == 1 ) {
74 #  my $invnum = $cust_bill[0]->invnum;
75 #  print $cgi->redirect(popurl(2). "view/cust_bill.cgi?$invnum");  #redirect
76 } elsif ( scalar(@cust_pay) == 0 ) {
77 %>
78 <!-- mason kludge -->
79 <%
80   idiot("Payment not found.");
81   #exit;
82 } else {
83   my $total = scalar(@cust_pay);
84   my $s = $total > 1 ? 's' : '';
85 %>
86 <!-- mason kludge -->
87 <%
88   print header("Payment Search Results", menubar(
89           'Main Menu', popurl(2)
90         )), "$total matching payment$s found<BR>", &table(), <<END;
91       <TR>
92         <TH></TH>
93         <TH>Amount</TH>
94         <TH>Date</TH>
95         <TH>Contact name</TH>
96         <TH>Company</TH>
97       </TR>
98 END
99
100   my(%saw, $cust_pay);
101   my $tot_amount = 0;
102   foreach my $cust_pay (
103     sort $sortby grep(!$saw{$_->paynum}++, @cust_pay)
104   ) {
105     my($paynum, $custnum, $payby, $payinfo, $amount, $date ) = (
106       $cust_pay->paynum,
107       $cust_pay->custnum,
108       $cust_pay->payby,
109       $cust_pay->payinfo,
110       sprintf("%.2f", $cust_pay->paid),
111       $cust_pay->_date,
112     );
113     $tot_amount += $amount;
114     my $pdate = time2str("%b&nbsp;%d&nbsp;%Y", $date);
115
116     my $rowspan = 1;
117
118     my $view = popurl(2). "view/cust_main.cgi?". $custnum. 
119                "#". $payby. $payinfo;
120
121     my $payment_info;
122     if ( $payby eq 'CARD' ) {
123       $payment_info = 'Card&nbsp;#'. 'x'x(length($payinfo)-4).
124                       substr($payinfo,(length($payinfo)-4));
125     } elsif ( $payby eq 'CHEK' ) {
126       $payment_info = "E-check&nbsp;acct#$payinfo";
127     } elsif ( $payby eq 'BILL' ) {
128       $payment_info = "Check&nbsp;#$payinfo";
129     } else {
130       $payment_info = "$payby&nbsp;$payinfo";
131     }
132
133     print <<END;
134       <TR>
135         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$payment_info</FONT></A></TD>
136         <TD ROWSPAN=$rowspan ALIGN="right"><A HREF="$view"><FONT SIZE=-1>\$$amount</FONT></A></TD>
137         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$pdate</FONT></A></TD>
138 END
139     my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } );
140     if ( $cust_main ) {
141       #my $cview = popurl(2). "view/cust_main.cgi?". $cust_main->custnum;
142       my ( $name, $company ) = (
143         $cust_main->last. ', '. $cust_main->first,
144         $cust_main->company,
145       );
146       print <<END;
147         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$name</FONT></A></TD>
148         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$company</FONT></A></TD>
149 END
150     } else {
151       print <<END
152         <TD ROWSPAN=$rowspan COLSPAN=2>WARNING: couldn't find cust_main.custnum $custnum (cust_pay.paynum $paynum)</TD>
153 END
154     }
155
156     print "</TR>";
157   }
158
159   $tot_amount = sprintf("%.2f", $tot_amount);
160   print '</TABLE><BR>'. table(). <<END;
161       <TR>
162         <TH>Total&nbsp;Amount</TH>
163         <TD ALIGN="right">\$$tot_amount</TD>
164       </TR>
165     </TABLE>
166   </BODY>
167 </HTML>
168 END
169
170 }
171
172 #
173
174 #sub invnum_sort {
175 #  $a->invnum <=> $b->invnum;
176 #}
177 #
178 #sub custnum_sort {
179 #  $a->custnum <=> $b->custnum || $a->invnum <=> $b->invnum;
180 #}
181
182 sub date_sort {
183   $a->_date <=> $b->_date || $a->invnum <=> $b->invnum;
184 }
185 %>