svc_domain needs to import dbh sub from Record
[freeside.git] / htdocs / search / cust_bill.cgi
1 #!/usr/bin/perl -Tw
2 #
3 # $Id: cust_bill.cgi,v 1.6 2001-04-22 01:38:39 ivan Exp $
4 #
5 # Usage: post form to:
6 #        http://server.name/path/cust_bill.cgi
7 #
8 # ivan@voicenet.com 97-apr-4
9 #
10 # Changes to allow page to work at a relative position in server
11 #       bmccane@maxbaud.net     98-apr-3
12 #
13 # $Log: cust_bill.cgi,v $
14 # Revision 1.6  2001-04-22 01:38:39  ivan
15 # svc_domain needs to import dbh sub from Record
16 # view/cust_main.cgi needs to use ->owed method, not check (depriciated) owed field
17 # search/cust_bill.cgi redirect error when there's only one invoice
18 #
19 # Revision 1.5  2000/07/17 16:45:41  ivan
20 # first shot at invoice browsing and some other cleanups
21 #
22 # Revision 1.4  1999/02/28 00:03:54  ivan
23 # removed misleading comments
24 #
25 # Revision 1.3  1999/01/19 05:14:11  ivan
26 # for mod_perl: no more top-level my() variables; use vars instead
27 # also the last s/create/new/;
28 #
29 # Revision 1.2  1998/12/17 09:41:07  ivan
30 # s/CGI::(Base|Request)/CGI.pm/;
31 #
32
33 use strict;
34 use vars qw ( $cgi $invnum $query $sortby @cust_bill );
35 use CGI;
36 use CGI::Carp qw(fatalsToBrowser);
37 use Date::Format;
38 use FS::UID qw(cgisuidsetup);
39 use FS::CGI qw(popurl header menubar eidiot table );
40 use FS::Record qw(qsearch qsearchs);
41 use FS::cust_bill;
42 use FS::cust_main;
43
44 $cgi = new CGI;
45 cgisuidsetup($cgi);
46
47 if ( $cgi->keywords ) {
48   my($query) = $cgi->keywords;
49   if ( $query eq 'invnum' ) {
50     $sortby = \*invnum_sort;
51     @cust_bill = qsearch('cust_bill', {} );
52   } elsif ( $query eq 'date' ) {
53     $sortby = \*date_sort;
54     @cust_bill = qsearch('cust_bill', {} );
55   } elsif ( $query eq 'custnum' ) {
56     $sortby = \*custnum_sort;
57     @cust_bill = qsearch('cust_bill', {} );
58   } elsif ( $query eq 'OPEN_invnum' ) {
59     $sortby = \*invnum_sort;
60     @cust_bill = grep $_->owed != 0, qsearch('cust_bill', {} );
61   } elsif ( $query eq 'OPEN_date' ) {
62     $sortby = \*date_sort;
63     @cust_bill = grep $_->owed != 0, qsearch('cust_bill', {} );
64   } elsif ( $query eq 'OPEN_custnum' ) {
65     $sortby = \*custnum_sort;
66     @cust_bill = grep $_->owed != 0, qsearch('cust_bill', {} );
67   } elsif ( $query =~ /^OPEN(\d+)_invnum$/ ) {
68     my $open = $1 * 86400;
69     $sortby = \*invnum_sort;
70     @cust_bill =
71       grep $_->owed != 0 && $_->_date < time - $open, qsearch('cust_bill', {} );
72   } elsif ( $query =~ /^OPEN(\d+)_date$/ ) {
73     my $open = $1 * 86400;
74     $sortby = \*date_sort;
75     @cust_bill =
76       grep $_->owed != 0 && $_->_date < time - $open, qsearch('cust_bill', {} );
77   } elsif ( $query =~ /^OPEN(\d+)_custnum$/ ) {
78     my $open = $1 * 86400;
79     $sortby = \*custnum_sort;
80     @cust_bill =
81       grep $_->owed != 0 && $_->_date < time - $open, qsearch('cust_bill', {} );
82   } else {
83     die "unknown query string $query";
84   }
85 } else {
86   $cgi->param('invnum') =~ /^\s*(FS-)?(\d+)\s*$/;
87   $invnum = $2;
88   @cust_bill = qsearchs('cust_bill', { 'invnum' => $invnum } );
89   $sortby = \*invnum_sort;
90 }
91
92 if ( scalar(@cust_bill) == 1 ) {
93   my $invnum = $cust_bill[0]->invnum;
94   print $cgi->redirect(popurl(2). "view/cust_bill.cgi?$invnum");  #redirect
95 } elsif ( scalar(@cust_bill) == 0 ) {
96   eidiot("Invoice not found.");
97 } else {
98   my $total = scalar(@cust_bill);
99   print $cgi->header( '-expires' => 'now' ),
100         &header("Invoice Search Results", menubar(
101           'Main Menu', popurl(2)
102         )), "$total matching invoices found<BR>", &table(), <<END;
103       <TR>
104         <TH></TH>
105         <TH>Balance</TH>
106         <TH>Amount</TH>
107         <TH>Date</TH>
108         <TH>Contact name</TH>
109         <TH>Company</TH>
110       </TR>
111 END
112
113   my(%saw, $cust_bill);
114   foreach $cust_bill (
115     sort $sortby grep(!$saw{$_->invnum}++, @cust_bill)
116   ) {
117     my($invnum, $owed, $charged, $date ) = (
118       $cust_bill->invnum,
119       $cust_bill->owed,
120       $cust_bill->charged,
121       $cust_bill->_date,
122     );
123     my $pdate = time2str("%b %d %Y", $date);
124
125     my $rowspan = 1;
126
127     my $view = popurl(2). "view/cust_bill.cgi?$invnum";
128     print <<END;
129       <TR>
130         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$invnum</FONT></A></TD>
131         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>\$$owed</FONT></A></TD>
132         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>\$$charged</FONT></A></TD>
133         <TD ROWSPAN=$rowspan><A HREF="$view"><FONT SIZE=-1>$pdate</FONT></A></TD>
134 END
135     my $custnum = $cust_bill->custnum;
136     my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } );
137     if ( $cust_main ) {
138       my $cview = popurl(2). "view/cust_main.cgi?". $cust_main->custnum;
139       my ( $name, $company ) = (
140         $cust_main->last. ', '. $cust_main->first,
141         $cust_main->company,
142       );
143       print <<END;
144         <TD ROWSPAN=$rowspan><A HREF="$cview"><FONT SIZE=-1>$name</FONT></A></TD>
145         <TD ROWSPAN=$rowspan><A HREF="$cview"><FONT SIZE=-1>$company</FONT></A></TD>
146 END
147     } else {
148       print <<END
149         <TD ROWSPAN=$rowspan COLSPAN=2>WARNING: couldn't find cust_main.custnum $custnum (cust_bill.invnum $invnum)</TD>
150 END
151     }
152
153     print "</TR>";
154   }
155
156   print <<END;
157     </TABLE>
158   </BODY>
159 </HTML>
160 END
161
162 }
163
164 #
165
166 sub invnum_sort {
167   $a->invnum <=> $b->invnum;
168 }
169
170 sub custnum_sort {
171   $a->custnum <=> $b->custnum || $a->invnum <=> $b->invnum;
172 }
173
174 sub date_sort {
175   $a->_date <=> $b->_date || $a->invnum <=> $b->invnum;
176 }