remove
[freeside.git] / httemplate / search / cust_pkg.cgi
1 <!-- $Id: cust_pkg.cgi,v 1.13 2002-01-30 14:18:09 ivan Exp $ -->
2 <%
3
4 my $conf = new FS::Conf;
5 my $maxrecords = $conf->config('maxsearchrecordsperpage');
6
7 my %part_pkg = map { $_->pkgpart => $_ } qsearch('part_pkg', {});
8
9 my $limit = '';
10 $limit .= "LIMIT $maxrecords" if $maxrecords;
11
12 my $offset = $cgi->param('offset') || 0;
13 $limit .= " OFFSET $offset" if $offset;
14
15 my $total;
16
17 my $unconf = '';
18 my($query) = $cgi->keywords;
19 my $sortby;
20 if ( $query eq 'pkgnum' ) {
21   $sortby=\*pkgnum_sort;
22
23 } elsif ( $query eq 'APKG_pkgnum' ) {
24
25   $sortby=\*pkgnum_sort;
26
27   $unconf = "
28     WHERE 0 <
29       ( SELECT count(*) FROM pkg_svc
30           WHERE pkg_svc.pkgpart = cust_pkg.pkgpart
31             AND pkg_svc.quantity > ( SELECT count(*) FROM cust_svc
32                                        WHERE cust_svc.pkgnum = cust_pkg.pkgnum
33                                          AND cust_svc.svcpart = pkg_svc.svcpart
34                                    )
35       )
36   ";
37
38   #@cust_pkg=();
39   ##perhaps this should go in cust_pkg as a qsearch-like constructor?
40   #my($cust_pkg);
41   #foreach $cust_pkg (
42   #  qsearch('cust_pkg',{}, '', "ORDER BY pkgnum $limit" )
43   #) {
44   #  my($flag)=0;
45   #  my($pkg_svc);
46   #  PKG_SVC: 
47   #  foreach $pkg_svc (qsearch('pkg_svc',{ 'pkgpart' => $cust_pkg->pkgpart })) {
48   #    if ( $pkg_svc->quantity 
49   #         > scalar(qsearch('cust_svc',{
50   #             'pkgnum' => $cust_pkg->pkgnum,
51   #             'svcpart' => $pkg_svc->svcpart,
52   #           }))
53   #       )
54   #    {
55   #      $flag=1;
56   #      last PKG_SVC;
57   #    }
58   #  }
59   #  push @cust_pkg, $cust_pkg if $flag;
60   #}
61   
62 } else {
63   die "Empty QUERY_STRING!";
64 }
65
66 my $statement = "SELECT COUNT(*) FROM cust_pkg $unconf";
67 my $sth = dbh->prepare($statement)
68   or die dbh->errstr. " doing $statement";
69 $sth->execute or die "Error executing \"$statement\": ". $sth->errstr;
70
71 $total = $sth->fetchrow_arrayref->[0];
72
73 my @cust_pkg = qsearch('cust_pkg',{}, '', "$unconf ORDER BY pkgnum $limit" );
74
75
76 if ( scalar(@cust_pkg) == 1 ) {
77   my($pkgnum)=$cust_pkg[0]->pkgnum;
78   print $cgi->redirect(popurl(2). "view/cust_pkg.cgi?$pkgnum");
79   exit;
80 } elsif ( scalar(@cust_pkg) == 0 ) { #error
81   eidiot("No packages found");
82 } else {
83   $total ||= scalar(@cust_pkg);
84
85   #begin pager
86   my $pager = '';
87   if ( $total != scalar(@cust_pkg) && $maxrecords ) {
88     unless ( $offset == 0 ) {
89       $cgi->param('offset', $offset - $maxrecords);
90       $pager .= '<A HREF="'. $cgi->self_url.
91                 '"><B><FONT SIZE="+1">Previous</FONT></B></A> ';
92     }
93     my $poff;
94     my $page;
95     for ( $poff = 0; $poff < $total; $poff += $maxrecords ) {
96       $page++;
97       if ( $offset == $poff ) {
98         $pager .= qq!<FONT SIZE="+2">$page</FONT> !;
99       } else {
100         $cgi->param('offset', $poff);
101         $pager .= qq!<A HREF="!. $cgi->self_url. qq!">$page</A> !;
102       }
103     }
104     unless ( $offset + $maxrecords > $total ) {
105       $cgi->param('offset', $offset + $maxrecords);
106       $pager .= '<A HREF="'. $cgi->self_url.
107                 '"><B><FONT SIZE="+1">Next</FONT></B></A> ';
108     }
109   }
110   #end pager
111   
112   print header('Package Search Results',''),
113         "$total matching packages found<BR><BR>$pager", &table(), <<END;
114       <TR>
115         <TH>Package</TH>
116         <TH><FONT SIZE=-1>Setup</FONT></TH>
117         <TH><FONT SIZE=-1>Next<BR>bill</FONT></TH>
118         <TH><FONT SIZE=-1>Susp.</FONT></TH>
119         <TH><FONT SIZE=-1>Expire</FONT></TH>
120         <TH><FONT SIZE=-1>Cancel</FONT></TH>
121         <TH><FONT SIZE=-1>Cust#</FONT></TH>
122         <TH>(bill) name</TH>
123         <TH>company</TH>
124 END
125
126 if ( defined dbdef->table('cust_main')->column('ship_last') ) {
127   print <<END;
128       <TH>(service) name</TH>
129       <TH>company</TH>
130 END
131 }
132
133 print <<END;
134         <TH COLSPAN=2>Services</TH>
135       </TR>
136 END
137
138   my $n1 = '<TR>';
139   my(%saw,$cust_pkg);
140   foreach $cust_pkg (
141     sort $sortby grep(!$saw{$_->pkgnum}++, @cust_pkg)
142   ) {
143     my($cust_main)=qsearchs('cust_main',{'custnum'=>$cust_pkg->custnum});
144     my($pkgnum, $setup, $bill, $susp, $expire, $cancel,
145        $custnum, $last, $first, $company ) = (
146       $cust_pkg->pkgnum,
147       $cust_pkg->getfield('setup')
148         ? time2str("%D", $cust_pkg->getfield('setup') )
149         : '',
150       $cust_pkg->getfield('bill')
151         ? time2str("%D", $cust_pkg->getfield('bill') )
152         : '',
153       $cust_pkg->getfield('susp')
154         ? time2str("%D", $cust_pkg->getfield('susp') )
155         : '',
156       $cust_pkg->getfield('expire')
157         ? time2str("%D", $cust_pkg->getfield('expire') )
158         : '',
159       $cust_pkg->getfield('cancel')
160         ? time2str("%D", $cust_pkg->getfield('cancel') )
161         : '',
162       $cust_pkg->custnum,
163       $cust_main ? $cust_main->last : '',
164       $cust_main ? $cust_main->first : '',
165       $cust_main ? $cust_main->company : '',
166     );
167     my($ship_last, $ship_first, $ship_company);
168     if ( defined dbdef->table('cust_main')->column('ship_last') ) {
169       ($ship_last, $ship_first, $ship_company) = (
170         $cust_main
171           ? ( $cust_main->ship_last || $cust_main->getfield('last') )
172           : '',
173         $cust_main 
174           ? ( $cust_main->ship_last
175               ? $cust_main->ship_first
176               : $cust_main->first )
177           : '',
178         $cust_main 
179           ? ( $cust_main->ship_last
180               ? $cust_main->ship_company
181               : $cust_main->company )
182           : '',
183       );
184     }
185     my $pkg = $part_pkg{$cust_pkg->pkgpart}->pkg;
186     #$pkg .= ' - '. $part_pkg{$cust_pkg->pkgpart}->comment;
187     my @cust_svc = qsearch( 'cust_svc', { 'pkgnum' => $pkgnum } );
188     my $rowspan = scalar(@cust_svc) || 1;
189     my $p = popurl(2);
190     print $n1, <<END;
191       <TD ROWSPAN=$rowspan><A HREF="${p}view/cust_pkg.cgi?$pkgnum"><FONT SIZE=-1>$pkgnum - $pkg</FONT></A></TD>
192       <TD>$setup</TD>
193       <TD>$bill</TD>
194       <TD>$susp</TD>
195       <TD>$expire</TD>
196       <TD>$cancel</TD>
197 END
198     if ( $cust_main ) {
199       print <<END;
200       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$custnum</A></FONT></TD>
201       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$last, $first</A></FONT></TD>
202       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$company</A></FONT></TD>
203 END
204       if ( defined dbdef->table('cust_main')->column('ship_last') ) {
205         print <<END;
206       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$ship_last, $ship_first</A></FONT></TD>
207       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$ship_company</A></FONT></TD>
208 END
209       }
210     } else {
211       my $colspan = defined dbdef->table('cust_main')->column('ship_last')
212                     ? 5 : 3;
213       print <<END;
214       <TD ROWSPAN=$rowspan COLSPAN=$colspan>WARNING: couldn't find cust_main.custnum $custnum (cust_pkg.pkgnum $pkgnum)</TD>
215 END
216     }
217
218     my $n2 = '';
219     foreach my $cust_svc ( @cust_svc ) {
220       my($label, $value, $svcdb) = $cust_svc->label;
221       my $svcnum = $cust_svc->svcnum;
222       my $sview = $p. "view";
223       print $n2,qq!<TD><A HREF="$sview/$svcdb.cgi?$svcnum"><FONT SIZE=-1>$label</FONT></A></TD>!,
224             qq!<TD><A HREF="$sview/$svcdb.cgi?$svcnum"><FONT SIZE=-1>$value</FONT></A></TD>!;
225       $n2="</TR><TR>";
226     }
227
228     $n1 = "</TR><TR>";
229
230   }
231     print '</TR>';
232  
233   print "</TABLE>$pager</BODY></HTML>";
234
235 }
236
237 sub pkgnum_sort {
238   $a->getfield('pkgnum') <=> $b->getfield('pkgnum');
239 }
240
241 %>