removed <!-- $Id$ --> from all files to fix any redirects, whew
[freeside.git] / httemplate / search / svc_acct.cgi
index 64085ea..a3fed83 100755 (executable)
@@ -1,54 +1,61 @@
 <%
-# <!-- $Id: svc_acct.cgi,v 1.6 2001-10-24 15:29:31 ivan Exp $ -->
 
-use strict;
-use vars qw( $cgi @svc_acct $sortby $query $mydomain );
-use CGI;
-use CGI::Carp qw(fatalsToBrowser);
-use FS::UID qw(cgisuidsetup);
-use FS::Record qw(qsearch qsearchs dbdef);
-use FS::CGI qw(header idiot popurl table);
-use FS::svc_acct;
-use FS::cust_main;
+my $mydomain = '';
 
-$mydomain = '';
+my $conf = new FS::Conf;
+my $maxrecords = $conf->config('maxsearchrecordsperpage');
 
-$cgi = new CGI;
-&cgisuidsetup($cgi);
+my $orderby = ''; #removeme
 
-($query)=$cgi->keywords;
+my $limit = '';
+$limit .= "LIMIT $maxrecords" if $maxrecords;
+
+my $offset = $cgi->param('offset') || 0;
+$limit .= " OFFSET $offset" if $offset;
+
+my $total;
+
+my($query)=$cgi->keywords;
 $query ||= ''; #to avoid use of unitialized value errors
-#this tree is a little bit redundant
+
+my $unlinked = '';
+if ( $query =~ /^UN_(.*)$/ ) {
+  $query = $1;
+  $unlinked = '
+    WHERE 0 <
+      ( SELECT count(*) FROM cust_svc
+          WHERE cust_svc.svcnum = svc_acct.svcnum
+            AND pkgnum IS NULL
+      )
+  ';
+}
+
+my(@svc_acct, $sortby);
 if ( $query eq 'svcnum' ) {
   $sortby=\*svcnum_sort;
-  @svc_acct=qsearch('svc_acct',{});
+  $orderby = 'ORDER BY svcnum';
 } elsif ( $query eq 'username' ) {
   $sortby=\*username_sort;
-  @svc_acct=qsearch('svc_acct',{});
+  $orderby = 'ORDER BY username';
 } elsif ( $query eq 'uid' ) {
   $sortby=\*uid_sort;
-  @svc_acct=grep $_->uid ne '', qsearch('svc_acct',{});
-} elsif ( $query eq 'UN_svcnum' ) {
-  $sortby=\*svcnum_sort;
-  @svc_acct = grep qsearchs('cust_svc',{
-      'svcnum' => $_->svcnum,
-      'pkgnum' => '',
-    }), qsearch('svc_acct',{});
-} elsif ( $query eq 'UN_username' ) {
-  $sortby=\*username_sort;
-  @svc_acct = grep qsearchs('cust_svc',{
-      'svcnum' => $_->svcnum,
-      'pkgnum' => '',
-    }), qsearch('svc_acct',{});
-} elsif ( $query eq 'UN_uid' ) {
-  $sortby=\*uid_sort;
-  @svc_acct = grep qsearchs('cust_svc',{
-      'svcnum' => $_->svcnum,
-      'pkgnum' => '',
-    }), qsearch('svc_acct',{});
+  $orderby = ( $unlinked ? 'AND' : 'WHERE' ). ' uid IS NOT NULL ORDER BY uid';
 } else {
   $sortby=\*uid_sort;
-  &usernamesearch;
+  @svc_acct = @{&usernamesearch};
+}
+
+if ( $query eq 'svcnum' || $query eq 'username' || $query eq 'uid' ) {
+
+  my $statement = "SELECT COUNT(*) FROM svc_acct $unlinked";
+  my $sth = dbh->prepare($statement)
+    or die dbh->errstr. " doing $statement";
+  $sth->execute or die "Error executing \"$statement\": ". $sth->errstr;
+
+  $total = $sth->fetchrow_arrayref->[0];
+
+  @svc_acct = qsearch('svc_acct', {}, '', "$unlinked $orderby $limit");
+
 }
 
 if ( scalar(@svc_acct) == 1 ) {
@@ -58,10 +65,37 @@ if ( scalar(@svc_acct) == 1 ) {
 } elsif ( scalar(@svc_acct) == 0 ) { #error
   idiot("Account not found");
 } else {
-  my($total)=scalar(@svc_acct);
-  print $cgi->header( '-expires' => 'now' ),
-        header("Account Search Results",''),
-        "$total matching accounts found",
+  $total ||= scalar(@svc_acct);
+
+  #begin pager
+  my $pager = '';
+  if ( $total != scalar(@svc_acct) && $maxrecords ) {
+    unless ( $offset == 0 ) {
+      $cgi->param('offset', $offset - $maxrecords);
+      $pager .= '<A HREF="'. $cgi->self_url.
+                '"><B><FONT SIZE="+1">Previous</FONT></B></A> ';
+    }
+    my $poff;
+    my $page;
+    for ( $poff = 0; $poff < $total; $poff += $maxrecords ) {
+      $page++;
+      if ( $offset == $poff ) {
+        $pager .= qq!<FONT SIZE="+2">$page</FONT> !;
+      } else {
+        $cgi->param('offset', $poff);
+        $pager .= qq!<A HREF="!. $cgi->self_url. qq!">$page</A> !;
+      }
+    }
+    unless ( $offset + $maxrecords > $total ) {
+      $cgi->param('offset', $offset + $maxrecords);
+      $pager .= '<A HREF="'. $cgi->self_url.
+                '"><B><FONT SIZE="+1">Next</FONT></B></A> ';
+    }
+  }
+  #end pager
+
+  print header("Account Search Results",''),
+        "$total matching accounts found<BR><BR>$pager",
         &table(), <<END;
       <TR>
         <TH><FONT SIZE=-1>#</FONT></TH>
@@ -166,14 +200,14 @@ END
 
   }
  
-  print '</TABLE>';
+  print "</TABLE>$pager<BR>";
 
   if ( $mydomain ) {
     print "<BR><FONT COLOR=\"#FF0000\">*</FONT> The <I>$mydomain</I> domain ".
           "is contained in your legacy <CODE>domain</CODE> ".
           "<A HREF=\"${p}docs/config.html#domain\">configuration file</A>.  ".
           "You should run the <CODE>bin/fs-migrate-svc_acct_sm</CODE> script ".
-          "to create a proper svc_domain record for this domain."
+          "to create a proper svc_domain record for this domain.";
   }
 
   print '</BODY></HTML>';
@@ -197,9 +231,8 @@ sub usernamesearch {
   $cgi->param('username') =~ /^([\w\d\-]+)$/; #untaint username_text
   my($username)=$1;
 
-  @svc_acct=qsearch('svc_acct',{'username'=>$username});
+  [ qsearch('svc_acct',{'username'=>$username}) ];
 
 }
 
-
 %>