add suspended package browse (closes: Bug#467)
[freeside.git] / httemplate / search / cust_pkg.cgi
index 54e02ce..78a5bb3 100755 (executable)
@@ -13,64 +13,139 @@ $limit .= " OFFSET $offset" if $offset;
 
 my $total;
 
-my $unconf = '';
 my($query) = $cgi->keywords;
 my $sortby;
-if ( $query eq 'pkgnum' ) {
-  $sortby=\*pkgnum_sort;
-
-} elsif ( $query eq 'APKG_pkgnum' ) {
-
-  $sortby=\*pkgnum_sort;
-
-  $unconf = "
-    WHERE 0 <
-      ( SELECT count(*) FROM pkg_svc
-          WHERE pkg_svc.pkgpart = cust_pkg.pkgpart
-            AND pkg_svc.quantity > ( SELECT count(*) FROM cust_svc
-                                       WHERE cust_svc.pkgnum = cust_pkg.pkgnum
-                                         AND cust_svc.svcpart = pkg_svc.svcpart
-                                   )
-      )
-  ";
-
-  #@cust_pkg=();
-  ##perhaps this should go in cust_pkg as a qsearch-like constructor?
-  #my($cust_pkg);
-  #foreach $cust_pkg (
-  #  qsearch('cust_pkg',{}, '', "ORDER BY pkgnum $limit" )
-  #) {
-  #  my($flag)=0;
-  #  my($pkg_svc);
-  #  PKG_SVC: 
-  #  foreach $pkg_svc (qsearch('pkg_svc',{ 'pkgpart' => $cust_pkg->pkgpart })) {
-  #    if ( $pkg_svc->quantity 
-  #         > scalar(qsearch('cust_svc',{
-  #             'pkgnum' => $cust_pkg->pkgnum,
-  #             'svcpart' => $pkg_svc->svcpart,
-  #           }))
-  #       )
-  #    {
-  #      $flag=1;
-  #      last PKG_SVC;
-  #    }
-  #  }
-  #  push @cust_pkg, $cust_pkg if $flag;
-  #}
+my @cust_pkg;
+
+if ( $cgi->param('magic') && $cgi->param('magic') eq 'bill' ) {
+  $sortby=\*bill_sort;
+  my $range = '';
+  if ( $cgi->param('beginning')
+       && $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/ ) {
+    my $beginning = str2time($1);
+    $range = " WHERE bill >= $beginning ";
+  }
+  if ( $cgi->param('ending')
+            && $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/ ) {
+    my $ending = str2time($1) + 86400;
+    $range .= ( $range ? ' AND ' : ' WHERE ' ). " bill <= $ending ";
+  }
+
+  #false laziness with below
+  my $statement = "SELECT COUNT(*) FROM cust_pkg $range";
+  warn $statement;
+  my $sth = dbh->prepare($statement) or die dbh->errstr." preparing $statement";
+  $sth->execute or die "Error executing \"$statement\": ". $sth->errstr;
   
+  $total = $sth->fetchrow_arrayref->[0];
+  
+  @cust_pkg = qsearch('cust_pkg',{}, '', " $range ORDER BY bill $limit" );
+
 } else {
-  die "Empty QUERY_STRING!";
-}
 
-my $statement = "SELECT COUNT(*) FROM cust_pkg $unconf";
-my $sth = dbh->prepare($statement)
-  or die dbh->errstr. " doing $statement";
-$sth->execute or die "Error executing \"$statement\": ". $sth->errstr;
+  my $qual = '';
+  if ( $query eq 'pkgnum' ) {
+    $sortby=\*pkgnum_sort;
+
+  } elsif ( $query eq 'SUSP_pkgnum' ) {
+
+    $sortby=\*pkgnum_sort;
+
+    $qual = 'WHERE susp IS NOT NULL AND susp != 0';
+
+  } elsif ( $query eq 'APKG_pkgnum' ) {
+  
+    $sortby=\*pkgnum_sort;
+  
+    #@cust_pkg=();
+    ##perhaps this should go in cust_pkg as a qsearch-like constructor?
+    #my($cust_pkg);
+    #foreach $cust_pkg (
+    #  qsearch('cust_pkg',{}, '', "ORDER BY pkgnum $limit" )
+    #) {
+    #  my($flag)=0;
+    #  my($pkg_svc);
+    #  PKG_SVC: 
+    #  foreach $pkg_svc (qsearch('pkg_svc',{ 'pkgpart' => $cust_pkg->pkgpart })) {
+    #    if ( $pkg_svc->quantity 
+    #         > scalar(qsearch('cust_svc',{
+    #             'pkgnum' => $cust_pkg->pkgnum,
+    #             'svcpart' => $pkg_svc->svcpart,
+    #           }))
+    #       )
+    #    {
+    #      $flag=1;
+    #      last PKG_SVC;
+    #    }
+    #  }
+    #  push @cust_pkg, $cust_pkg if $flag;
+    #}
+
+    if ( driver_name eq 'mysql' ) {
+      #$query = "DROP TABLE temp1_$$,temp2_$$;";
+      #my $sth = dbh->prepare($query);
+      #$sth->execute;
 
-$total = $sth->fetchrow_arrayref->[0];
+      $query = "CREATE TEMPORARY TABLE temp1_$$ TYPE=MYISAM
+                  SELECT cust_svc.pkgnum,cust_svc.svcpart,COUNT(*) as count
+                    FROM cust_pkg,cust_svc,pkg_svc
+                      WHERE cust_pkg.pkgnum = cust_svc.pkgnum
+                      AND cust_svc.svcpart = pkg_svc.svcpart
+                      AND cust_pkg.pkgpart = pkg_svc.pkgpart
+                      GROUP BY cust_svc.pkgnum,cust_svc.svcpart";
+      $sth = dbh->prepare($query) or die dbh->errstr. " preparing $query";
+         
+      $sth->execute or die "Error executing \"$query\": ". $sth->errstr;
+  
+      $query = "CREATE TEMPORARY TABLE temp2_$$ TYPE=MYISAM
+                  SELECT cust_pkg.pkgnum FROM cust_pkg
+                    LEFT JOIN pkg_svc ON (cust_pkg.pkgpart=pkg_svc.pkgpart)
+                    LEFT JOIN temp1_$$ ON (cust_pkg.pkgnum = temp1_$$.pkgnum
+                                           AND pkg_svc.svcpart=temp1_$$.svcpart)
+                    WHERE ( pkg_svc.quantity > temp1_$$.count
+                            OR temp1_$$.pkgnum IS NULL )
+                          AND pkg_svc.quantity != 0;";
+      $sth = dbh->prepare($query) or die dbh->errstr. " preparing $query";   
+      $sth->execute or die "Error executing \"$query\": ". $sth->errstr;
+      $qual = " LEFT JOIN temp2_$$ ON cust_pkg.pkgnum = temp2_$$.pkgnum
+                  WHERE temp2_$$.pkgnum IS NOT NULL";
+
+    } else {
+
+     $qual = "
+       WHERE 0 <
+         ( SELECT count(*) FROM pkg_svc
+             WHERE pkg_svc.pkgpart = cust_pkg.pkgpart
+               AND pkg_svc.quantity > ( SELECT count(*) FROM cust_svc
+                                        WHERE cust_svc.pkgnum = cust_pkg.pkgnum
+                                          AND cust_svc.svcpart = pkg_svc.svcpart
+                                      )
+         )
+     ";
+
+    }
+    
+  } else {
+    die "Empty or unknown QUERY_STRING!";
+  }
+  
+  my $statement = "SELECT COUNT(*) FROM cust_pkg $qual";
+  my $sth = dbh->prepare($statement) or die dbh->errstr." preparing $statement";
+  $sth->execute or die "Error executing \"$statement\": ". $sth->errstr;
+  
+  $total = $sth->fetchrow_arrayref->[0];
 
-my @cust_pkg = qsearch('cust_pkg',{}, '', "$unconf ORDER BY pkgnum $limit" );
+  my $tblname = driver_name eq 'mysql' ? 'cust_pkg.' : '';
+  @cust_pkg =
+    qsearch('cust_pkg',{}, '', "$qual ORDER BY ${tblname}pkgnum $limit" );
 
+  if ( driver_name eq 'mysql' ) {
+    $query = "DROP TABLE temp1_$$,temp2_$$;";
+    my $sth = dbh->prepare($query) or die dbh->errstr. " doing $query";
+    $sth->execute; # or die "Error executing \"$query\": ". $sth->errstr;
+  }
+  
+}
 
 if ( scalar(@cust_pkg) == 1 ) {
   my($pkgnum)=$cust_pkg[0]->pkgnum;
@@ -194,11 +269,11 @@ END
     my $p = popurl(2);
     print $n1, <<END;
       <TD ROWSPAN=$rowspan><A HREF="${p}view/cust_pkg.cgi?$pkgnum"><FONT SIZE=-1>$pkgnum - $pkg</FONT></A></TD>
-      <TD>$setup</TD>
-      <TD>$bill</TD>
-      <TD>$susp</TD>
-      <TD>$expire</TD>
-      <TD>$cancel</TD>
+      <TD ROWSPAN=$rowspan>$setup</TD>
+      <TD ROWSPAN=$rowspan>$bill</TD>
+      <TD ROWSPAN=$rowspan>$susp</TD>
+      <TD ROWSPAN=$rowspan>$expire</TD>
+      <TD ROWSPAN=$rowspan>$cancel</TD>
 END
     if ( $cust_main ) {
       print <<END;
@@ -243,4 +318,8 @@ sub pkgnum_sort {
   $a->getfield('pkgnum') <=> $b->getfield('pkgnum');
 }
 
+sub bill_sort {
+  $a->getfield('bill') <=> $b->getfield('bill');
+}
+
 %>