grey out inactive text boxes as well as disable them (IE doesn't grey out disabled...
[freeside.git] / httemplate / search / cust_pkg.cgi
1 <%
2
3 my $conf = new FS::Conf;
4 my $maxrecords = $conf->config('maxsearchrecordsperpage');
5
6 my %part_pkg = map { $_->pkgpart => $_ } qsearch('part_pkg', {});
7
8 my $limit = '';
9 $limit .= "LIMIT $maxrecords" if $maxrecords;
10
11 my $offset = $cgi->param('offset') || 0;
12 $limit .= " OFFSET $offset" if $offset;
13
14 my $total;
15
16 my($query) = $cgi->keywords;
17 my $sortby;
18 my @cust_pkg;
19
20 if ( $cgi->param('magic') && $cgi->param('magic') eq 'bill' ) {
21   $sortby=\*bill_sort;
22
23   #false laziness with cust_pay.cgi
24   my $range = '';
25   if ( $cgi->param('beginning')
26        && $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/ ) {
27     my $beginning = str2time($1);
28     $range = " WHERE bill >= $beginning ";
29   }
30   if ( $cgi->param('ending')
31             && $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/ ) {
32     my $ending = str2time($1) + 86399;
33     $range .= ( $range ? ' AND ' : ' WHERE ' ). " bill <= $ending ";
34   }
35
36   $range .= ( $range ? 'AND ' : ' WHERE ' ). '( cancel IS NULL OR cancel = 0 )';
37
38   if ( $cgi->param('agentnum') =~ /^(\d+)$/ and $1 ) {
39     $range .= ( $range ? 'AND ' : ' WHERE ' ). 
40               "$1 = ( SELECT agentnum FROM cust_main".
41                     " WHERE cust_main.custnum = cust_pkg.custnum )";
42   }
43
44   #false laziness with below
45   my $statement = "SELECT COUNT(*) FROM cust_pkg $range";
46   warn $statement;
47   my $sth = dbh->prepare($statement) or die dbh->errstr." preparing $statement";
48   $sth->execute or die "Error executing \"$statement\": ". $sth->errstr;
49   
50   $total = $sth->fetchrow_arrayref->[0];
51   
52   @cust_pkg = qsearch('cust_pkg',{}, '', " $range ORDER BY bill $limit" );
53
54 } else {
55
56   my $qual = '';
57   if ( $cgi->param('magic') &&
58        $cgi->param('magic') =~ /^(active|suspended|canceled)$/
59   ) {
60
61     if ( $cgi->param('magic') eq 'active' ) {
62       $qual = 'WHERE ( susp IS NULL OR susp = 0 )'.
63               ' AND ( cancel IS NULL OR cancel = 0)';
64     } elsif ( $cgi->param('magic') eq 'suspended' ) {
65       $qual = 'WHERE susp IS NOT NULL AND susp != 0'.
66               ' AND ( cancel IS NULL OR cancel = 0)';
67     } elsif ( $cgi->param('magic') eq 'canceled' ) {
68       $qual = 'WHERE cancel IS NOT NULL AND cancel != 0';
69     } else {
70       die "guru meditation #420";
71     }
72
73     $sortby = \*pkgnum_sort;
74
75     if ( $cgi->param('pkgpart') =~ /^(\d+)$/ ) {
76       $qual .= " AND pkgpart = $1";
77     }
78
79   } elsif ( $query eq 'pkgnum' ) {
80
81     $sortby=\*pkgnum_sort;
82
83   } elsif ( $query eq 'APKG_pkgnum' ) {
84   
85     $sortby=\*pkgnum_sort;
86   
87     #@cust_pkg=();
88     ##perhaps this should go in cust_pkg as a qsearch-like constructor?
89     #my($cust_pkg);
90     #foreach $cust_pkg (
91     #  qsearch('cust_pkg',{}, '', "ORDER BY pkgnum $limit" )
92     #) {
93     #  my($flag)=0;
94     #  my($pkg_svc);
95     #  PKG_SVC: 
96     #  foreach $pkg_svc (qsearch('pkg_svc',{ 'pkgpart' => $cust_pkg->pkgpart })) {
97     #    if ( $pkg_svc->quantity 
98     #         > scalar(qsearch('cust_svc',{
99     #             'pkgnum' => $cust_pkg->pkgnum,
100     #             'svcpart' => $pkg_svc->svcpart,
101     #           }))
102     #       )
103     #    {
104     #      $flag=1;
105     #      last PKG_SVC;
106     #    }
107     #  }
108     #  push @cust_pkg, $cust_pkg if $flag;
109     #}
110
111     if ( driver_name eq 'mysql' ) {
112       #$query = "DROP TABLE temp1_$$,temp2_$$;";
113       #my $sth = dbh->prepare($query);
114       #$sth->execute;
115
116       $query = "CREATE TEMPORARY TABLE temp1_$$ TYPE=MYISAM
117                   SELECT cust_svc.pkgnum,cust_svc.svcpart,COUNT(*) as count
118                     FROM cust_pkg,cust_svc,pkg_svc
119                       WHERE cust_pkg.pkgnum = cust_svc.pkgnum
120                       AND cust_svc.svcpart = pkg_svc.svcpart
121                       AND cust_pkg.pkgpart = pkg_svc.pkgpart
122                       GROUP BY cust_svc.pkgnum,cust_svc.svcpart";
123       my $sth = dbh->prepare($query) or die dbh->errstr. " preparing $query";
124          
125       $sth->execute or die "Error executing \"$query\": ". $sth->errstr;
126   
127       $query = "CREATE TEMPORARY TABLE temp2_$$ TYPE=MYISAM
128                   SELECT cust_pkg.pkgnum FROM cust_pkg
129                     LEFT JOIN pkg_svc ON (cust_pkg.pkgpart=pkg_svc.pkgpart)
130                     LEFT JOIN temp1_$$ ON (cust_pkg.pkgnum = temp1_$$.pkgnum
131                                            AND pkg_svc.svcpart=temp1_$$.svcpart)
132                     WHERE ( pkg_svc.quantity > temp1_$$.count
133                             OR temp1_$$.pkgnum IS NULL )
134                           AND pkg_svc.quantity != 0;";
135       $sth = dbh->prepare($query) or die dbh->errstr. " preparing $query";   
136       $sth->execute or die "Error executing \"$query\": ". $sth->errstr;
137       $qual = " LEFT JOIN temp2_$$ ON cust_pkg.pkgnum = temp2_$$.pkgnum
138                   WHERE temp2_$$.pkgnum IS NOT NULL";
139
140     } else {
141
142      $qual = "
143        WHERE 0 <
144          ( SELECT count(*) FROM pkg_svc
145              WHERE pkg_svc.pkgpart = cust_pkg.pkgpart
146                AND pkg_svc.quantity > ( SELECT count(*) FROM cust_svc
147                                         WHERE cust_svc.pkgnum = cust_pkg.pkgnum
148                                           AND cust_svc.svcpart = pkg_svc.svcpart
149                                       )
150          )
151      ";
152
153     }
154     
155   } else {
156     die "Empty or unknown QUERY_STRING!";
157   }
158   
159   my $statement = "SELECT COUNT(*) FROM cust_pkg $qual";
160   my $sth = dbh->prepare($statement) or die dbh->errstr." preparing $statement";
161   $sth->execute or die "Error executing \"$statement\": ". $sth->errstr;
162   
163   $total = $sth->fetchrow_arrayref->[0];
164
165   my $tblname = driver_name eq 'mysql' ? 'cust_pkg.' : '';
166   @cust_pkg =
167     qsearch('cust_pkg',{}, '', "$qual ORDER BY ${tblname}pkgnum $limit" );
168
169   if ( driver_name eq 'mysql' ) {
170     $query = "DROP TABLE temp1_$$,temp2_$$;";
171     my $sth = dbh->prepare($query) or die dbh->errstr. " doing $query";
172     $sth->execute; # or die "Error executing \"$query\": ". $sth->errstr;
173   }
174   
175 }
176
177 if ( scalar(@cust_pkg) == 1 ) {
178   my($pkgnum)=$cust_pkg[0]->pkgnum;
179   print $cgi->redirect(popurl(2). "view/cust_pkg.cgi?$pkgnum");
180   #exit;
181 } elsif ( scalar(@cust_pkg) == 0 ) { #error
182 %>
183 <!-- mason kludge -->
184 <%
185   eidiot("No packages found");
186 } else {
187 %>
188 <!-- mason kludge -->
189 <%
190   $total ||= scalar(@cust_pkg);
191
192   #begin pager
193   my $pager = '';
194   if ( $total != scalar(@cust_pkg) && $maxrecords ) {
195     unless ( $offset == 0 ) {
196       $cgi->param('offset', $offset - $maxrecords);
197       $pager .= '<A HREF="'. $cgi->self_url.
198                 '"><B><FONT SIZE="+1">Previous</FONT></B></A> ';
199     }
200     my $poff;
201     my $page;
202     for ( $poff = 0; $poff < $total; $poff += $maxrecords ) {
203       $page++;
204       if ( $offset == $poff ) {
205         $pager .= qq!<FONT SIZE="+2">$page</FONT> !;
206       } else {
207         $cgi->param('offset', $poff);
208         $pager .= qq!<A HREF="!. $cgi->self_url. qq!">$page</A> !;
209       }
210     }
211     unless ( $offset + $maxrecords > $total ) {
212       $cgi->param('offset', $offset + $maxrecords);
213       $pager .= '<A HREF="'. $cgi->self_url.
214                 '"><B><FONT SIZE="+1">Next</FONT></B></A> ';
215     }
216   }
217   #end pager
218   
219   print header('Package Search Results',''),
220         "$total matching packages found<BR><BR>$pager", &table(), <<END;
221       <TR>
222         <TH>Package</TH>
223         <TH><FONT SIZE=-1>Setup</FONT></TH>
224 END
225
226   print '<TH><FONT SIZE=-1>Last<BR>bill</FONT></TH>'
227     if defined dbdef->table('cust_pkg')->column('last_bill');
228
229   print <<END;
230         <TH><FONT SIZE=-1>Next<BR>bill</FONT></TH>
231         <TH><FONT SIZE=-1>Susp.</FONT></TH>
232         <TH><FONT SIZE=-1>Expire</FONT></TH>
233         <TH><FONT SIZE=-1>Cancel</FONT></TH>
234         <TH><FONT SIZE=-1>Cust#</FONT></TH>
235         <TH>(bill) name</TH>
236         <TH>company</TH>
237 END
238
239   print '<TH>(service) name</TH><TH>company</TH>'
240     if defined dbdef->table('cust_main')->column('ship_last');
241
242   print '<TH COLSPAN=2>Services</TH></TR>';
243
244   my $n1 = '<TR>';
245   my(%saw,$cust_pkg);
246   foreach $cust_pkg (
247     sort $sortby grep(!$saw{$_->pkgnum}++, @cust_pkg)
248   ) {
249     my($cust_main)=qsearchs('cust_main',{'custnum'=>$cust_pkg->custnum});
250     my($pkgnum, $setup, $bill, $susp, $expire, $cancel,
251        $custnum, $last, $first, $company ) = (
252       $cust_pkg->pkgnum,
253       $cust_pkg->getfield('setup')
254         ? time2str("%D", $cust_pkg->getfield('setup') )
255         : '',
256       $cust_pkg->getfield('bill')
257         ? time2str("%D", $cust_pkg->getfield('bill') )
258         : '',
259       $cust_pkg->getfield('susp')
260         ? time2str("%D", $cust_pkg->getfield('susp') )
261         : '',
262       $cust_pkg->getfield('expire')
263         ? time2str("%D", $cust_pkg->getfield('expire') )
264         : '',
265       $cust_pkg->getfield('cancel')
266         ? time2str("%D", $cust_pkg->getfield('cancel') )
267         : '',
268       $cust_pkg->custnum,
269       $cust_main ? $cust_main->last : '',
270       $cust_main ? $cust_main->first : '',
271       $cust_main ? $cust_main->company : '',
272     );
273
274     my $last_bill = $cust_pkg->getfield('last_bill')
275                       ? time2str("%D", $cust_pkg->getfield('last_bill') )
276                       : ''
277       if defined dbdef->table('cust_pkg')->column('last_bill');
278
279     my($ship_last, $ship_first, $ship_company);
280     if ( defined dbdef->table('cust_main')->column('ship_last') ) {
281       ($ship_last, $ship_first, $ship_company) = (
282         $cust_main
283           ? ( $cust_main->ship_last || $cust_main->getfield('last') )
284           : '',
285         $cust_main 
286           ? ( $cust_main->ship_last
287               ? $cust_main->ship_first
288               : $cust_main->first )
289           : '',
290         $cust_main 
291           ? ( $cust_main->ship_last
292               ? $cust_main->ship_company
293               : $cust_main->company )
294           : '',
295       );
296     }
297     my $pkg = $part_pkg{$cust_pkg->pkgpart}->pkg;
298     #$pkg .= ' - '. $part_pkg{$cust_pkg->pkgpart}->comment;
299     my @cust_svc = qsearch( 'cust_svc', { 'pkgnum' => $pkgnum } );
300     my $rowspan = scalar(@cust_svc) || 1;
301     my $p = popurl(2);
302     print $n1, <<END;
303       <TD ROWSPAN=$rowspan><A HREF="${p}view/cust_pkg.cgi?$pkgnum"><FONT SIZE=-1>$pkgnum - $pkg</FONT></A></TD>
304       <TD ROWSPAN=$rowspan>$setup</TD>
305 END
306
307     print "<TD ROWSPAN=$rowspan>$last_bill</TD>"
308       if defined dbdef->table('cust_pkg')->column('last_bill');
309
310     print <<END;
311       <TD ROWSPAN=$rowspan>$bill</TD>
312       <TD ROWSPAN=$rowspan>$susp</TD>
313       <TD ROWSPAN=$rowspan>$expire</TD>
314       <TD ROWSPAN=$rowspan>$cancel</TD>
315 END
316     if ( $cust_main ) {
317       print <<END;
318       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$custnum</A></FONT></TD>
319       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$last, $first</A></FONT></TD>
320       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$company</A></FONT></TD>
321 END
322       if ( defined dbdef->table('cust_main')->column('ship_last') ) {
323         print <<END;
324       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$ship_last, $ship_first</A></FONT></TD>
325       <TD ROWSPAN=$rowspan><FONT SIZE=-1><A HREF="${p}view/cust_main.cgi?$custnum">$ship_company</A></FONT></TD>
326 END
327       }
328     } else {
329       my $colspan = defined dbdef->table('cust_main')->column('ship_last')
330                     ? 5 : 3;
331       print <<END;
332       <TD ROWSPAN=$rowspan COLSPAN=$colspan>WARNING: couldn't find cust_main.custnum $custnum (cust_pkg.pkgnum $pkgnum)</TD>
333 END
334     }
335
336     my $n2 = '';
337     foreach my $cust_svc ( @cust_svc ) {
338       my($label, $value, $svcdb) = $cust_svc->label;
339       my $svcnum = $cust_svc->svcnum;
340       my $sview = $p. "view";
341       print $n2,qq!<TD><A HREF="$sview/$svcdb.cgi?$svcnum"><FONT SIZE=-1>$label</FONT></A></TD>!,
342             qq!<TD><A HREF="$sview/$svcdb.cgi?$svcnum"><FONT SIZE=-1>$value</FONT></A></TD>!;
343       $n2="</TR><TR>";
344     }
345
346     $n1 = "</TR><TR>";
347
348   }
349     print '</TR>';
350  
351   print "</TABLE>$pager</BODY></HTML>";
352
353 }
354
355 sub pkgnum_sort {
356   $a->getfield('pkgnum') <=> $b->getfield('pkgnum');
357 }
358
359 sub bill_sort {
360   $a->getfield('bill') <=> $b->getfield('bill');
361 }
362
363 %>