hopefully fix tax report for taxclass & named tax edge cases
[freeside.git] / httemplate / search / svc_acct.cgi
index 0a4338b..29e851d 100755 (executable)
@@ -32,7 +32,7 @@ if ( $query =~ /^UN_(.*)$/ ) {
       WHERE 0 <
         ( SELECT count(*) FROM cust_svc
             WHERE cust_svc.svcnum = svc_acct.svcnum
-              AND ( pkgnum IS NULL OR pkgnum = 0 OR pkgnum = $empty )
+              AND ( pkgnum IS NULL OR pkgnum = 0 )
         )
     ";
   }
@@ -48,14 +48,31 @@ if ( $query eq 'svcnum' ) {
   $orderby = "ORDER BY ${tblname}username";
 } elsif ( $query eq 'uid' ) {
   $sortby=\*uid_sort;
-  $orderby = ( $unlinked ? 'AND' : 'WHERE' ).
+  $orderby = ( $unlinked ? ' AND' : ' WHERE' ).
              " ${tblname}uid IS NOT NULL ORDER BY ${tblname}uid";
+} elsif ( $cgi->param('popnum') =~ /^(\d+)$/ ) {
+  $unlinked .= ( $unlinked ? 'AND' : 'WHERE' ).
+               " popnum = $1";
+  $sortby=\*username_sort;
+  $orderby = "ORDER BY ${tblname}username";
+} elsif ( $cgi->param('svcpart') =~ /^(\d+)$/ ) {
+  $unlinked .= ( $unlinked ? ' AND' : ' WHERE' ).
+               " $1 = ( SELECT svcpart FROM cust_svc ".
+               "        WHERE cust_svc.svcnum = svc_acct.svcnum ) ";
+  $sortby=\*uid_sort;
+  #$sortby=\*svcnum_sort;
 } else {
   $sortby=\*uid_sort;
   @svc_acct = @{&usernamesearch};
 }
 
-if ( $query eq 'svcnum' || $query eq 'username' || $query eq 'uid' ) {
+
+if (    $query eq 'svcnum'
+     || $query eq 'username'
+     || $query eq 'uid'
+     || $cgi->param('popnum') =~ /^(\d+)$/
+     || $cgi->param('svcpart') =~ /^(\d+)$/
+   ) {
 
   my $statement = "SELECT COUNT(*) FROM svc_acct $unlinked";
   my $sth = dbh->prepare($statement)
@@ -244,10 +261,50 @@ sub uid_sort {
 
 sub usernamesearch {
 
+  my @svc_acct;
+
+  my %username_type;
+  foreach ( $cgi->param('username_type') ) {
+    $username_type{$_}++;
+  }
+
   $cgi->param('username') =~ /^([\w\-\.\&]+)$/; #untaint username_text
-  my($username)=$1;
+  my $username = $1;
+
+  if ( $username_type{'Exact'} || $username_type{'Fuzzy'} ) {
+    push @svc_acct, qsearch( 'svc_acct',
+                             { 'username' => { 'op'    => 'ILIKE',
+                                               'value' => $username } } );
+  }
+
+  if ( $username_type{'Substring'} || $username_type{'All'} ) {
+    push @svc_acct, qsearch( 'svc_acct',
+                             { 'username' => { 'op'    => 'ILIKE',
+                                               'value' => "%$username%" } } );
+  }
+
+  if ( $username_type{'Fuzzy'} || $username_type{'All'} ) {
+    &FS::svc_acct::check_and_rebuild_fuzzyfiles;
+    my $all_username = &FS::svc_acct::all_username;
+
+    my %username;
+    if ( $username_type{'Fuzzy'} || $username_type{'All'} ) { 
+      foreach ( amatch($username, [ qw(i) ], @$all_username) ) {
+        $username{$_}++; 
+      }
+    }
+
+    #if ($username_type{'Sound-alike'}) {
+    #}
+
+    foreach ( keys %username ) {
+      push @svc_acct, qsearch('svc_acct',{'username'=>$_});
+    }
+
+  }
 
-  [ qsearch('svc_acct',{'username'=>$username}) ];
+  #[ qsearch('svc_acct',{'username'=>$username}) ];
+  \@svc_acct;
 
 }