customers by otaker report (ugly search/cust_main.cgi mods; revert if they
[freeside.git] / httemplate / search / cust_main.cgi
index f21dd7e..7995698 100755 (executable)
@@ -45,22 +45,37 @@ $limit .= "LIMIT $maxrecords" if $maxrecords;
 my $offset = $cgi->param('offset') || 0;
 $limit .= " OFFSET $offset" if $offset;
 
-my $total;
+my $total = 0;
 
 my(@cust_main, $sortby, $orderby);
-if ( $cgi->param('browse') ) {
-  my $query = $cgi->param('browse');
-  if ( $query eq 'custnum' ) {
-    $sortby=\*custnum_sort;
-    $orderby = 'ORDER BY custnum';
-  } elsif ( $query eq 'last' ) {
-    $sortby=\*last_sort;
-    $orderby = 'ORDER BY last';
-  } elsif ( $query eq 'company' ) {
-    $sortby=\*company_sort;
-    $orderby = 'ORDER BY company';
+if ( $cgi->param('browse')
+     || $cgi->param('otaker_on')
+) {
+
+  my %search = ();
+  if ( $cgi->param('browse') ) {
+    my $query = $cgi->param('browse');
+    if ( $query eq 'custnum' ) {
+      $sortby=\*custnum_sort;
+      $orderby = 'ORDER BY custnum';
+    } elsif ( $query eq 'last' ) {
+      $sortby=\*last_sort;
+      $orderby = 'ORDER BY last';
+    } elsif ( $query eq 'company' ) {
+      $sortby=\*company_sort;
+      $orderby = 'ORDER BY company';
+    } else {
+      die "unknown browse field $query";
+    }
   } else {
-    die "unknown browse field $query";
+    $sortby = \*last_sort; #??
+    $orderby = 'ORDER BY last'; #??
+    if ( $cgi->param('otaker_on') ) {
+      $cgi->param('otaker') =~ /^(\w{1,32})$/ or eidiot "Illegal otaker\n";
+      $search{otaker} = $1;
+    } else {
+      die "unknown query...";
+    }
   }
 
   my $ncancelled = '';
@@ -72,7 +87,7 @@ if ( $cgi->param('browse') ) {
     #grep { $_->ncancelled_pkgs || ! $_->all_pkgs }
     #needed for MySQL???    OR cust_pkg.cancel = \"\"
     $ncancelled = "
-      WHERE 0 < ( SELECT COUNT(*) FROM cust_pkg
+       0 < ( SELECT COUNT(*) FROM cust_pkg
                     WHERE cust_pkg.custnum = cust_main.custnum
                       AND ( cust_pkg.cancel IS NULL
                             OR cust_pkg.cancel = 0
@@ -84,14 +99,32 @@ if ( $cgi->param('browse') ) {
     ";
   }
 
-  my $statement = "SELECT COUNT(*) FROM cust_main $ncancelled";
+  #EWWWWWW
+  my $qual = join(' AND ',
+            map { "$_ = ". dbh->quote($search{$_}) } keys %search );
+
+  if ( $ncancelled ) {
+    $qual .= ' AND ' if $qual;
+    $qual .= $ncancelled;
+  }
+    
+  $qual = " WHERE $qual" if $qual;
+
+  my $statement = "SELECT COUNT(*) FROM cust_main $qual";
   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];
 
-  my @just_cust_main = qsearch('cust_main',{}, '',
+  if ( $ncancelled ) {
+    if ( %search ) {
+      $ncancelled = " AND $ncancelled";
+    } else {
+      $ncancelled = " WHERE $ncancelled";
+    }
+  }
+  my @just_cust_main = qsearch('cust_main', \%search, '',
     "$ncancelled $orderby $limit"
   );    
 
@@ -134,6 +167,9 @@ if ( $cgi->param('browse') ) {
     if $cgi->param('showcancelledcustomers') eq '0' #see if it was set by me
        || ( $conf->exists('hidecancelledcustomers')
              && ! $cgi->param('showcancelledcustomers') );
+
+  my %saw = ();
+  @cust_main = grep { !$saw{$_->custnum}++ } @cust_main;
 }
 
 my %all_pkgs;
@@ -150,10 +186,16 @@ if ( scalar(@cust_main) == 1 && ! $cgi->param('referral_custnum') ) {
   } else {
     print $cgi->redirect(popurl(2). "view/cust_main.cgi?". $cust_main[0]->custnum);
   }
-  exit;
+  #exit;
 } elsif ( scalar(@cust_main) == 0 ) {
+%>
+<!-- mason kludge -->
+<%
   eidiot "No matching customers found!\n";
 } else { 
+%>
+<!-- mason kludge -->
+<%
 
   $total ||= scalar(@cust_main);
   print header("Customer Search Results",menubar(
@@ -389,24 +431,37 @@ sub lastsearch {
     or eidiot "Illegal last name";
   my($last)=$1;
 
-#  if ( $last_type{'Exact'}
-#       && ! $last_type{'Fuzzy'} 
-#     #  && ! $last_type{'Sound-alike'}
-#  ) {
+  if ( $last_type{'Exact'} || $last_type{'Fuzzy'} ) {
+    push @cust_main, qsearch( 'cust_main',
+                              { 'last' => { 'op'    => 'ILIKE',
+                                            'value' => $last    } } );
+
+    push @cust_main, qsearch( 'cust_main',
+                              { 'ship_last' => { 'op'    => 'ILIKE',
+                                                 'value' => $last    } } )
+      if defined dbdef->table('cust_main')->column('ship_last');
+  }
 
-    push @cust_main, qsearch('cust_main',{'last'=>$last});
+  if ( $last_type{'Substring'} || $last_type{'All'} ) {
 
-    push @cust_main, qsearch('cust_main',{'ship_last'=>$last})
+    push @cust_main, qsearch( 'cust_main',
+                              { 'last' => { 'op'    => 'ILIKE',
+                                            'value' => "%$last%" } } );
+
+    push @cust_main, qsearch( 'cust_main',
+                              { 'ship_last' => { 'op'    => 'ILIKE',
+                                                 'value' => "%$last%" } } )
       if defined dbdef->table('cust_main')->column('ship_last');
 
-#  } else {
-  if ( $last_type{'Fuzzy'} ) {
+  }
+
+  if ( $last_type{'Fuzzy'} || $last_type{'All'} ) {
 
     &FS::cust_main::check_and_rebuild_fuzzyfiles;
     my $all_last = &FS::cust_main::all_last;
 
     my %last;
-    if ($last_type{'Fuzzy'}) { 
+    if ( $last_type{'Fuzzy'} || $last_type{'All'} ) { 
       foreach ( amatch($last, [ qw(i) ], @$all_last) ) {
         $last{$_}++; 
       }
@@ -422,6 +477,7 @@ sub lastsearch {
     }
 
   }
+
   \@cust_main;
 }
 
@@ -437,24 +493,37 @@ sub companysearch {
     or eidiot "Illegal company";
   my($company)=$1;
 
-#  if ( $company_type{'Exact'}
-#       && ! $company_type{'Fuzzy'} 
-#     #  && ! $company_type{'Sound-alike'}
-#  ) {
+  if ( $company_type{'Exact'} || $company_type{'Fuzzy'} ) {
+    push @cust_main, qsearch( 'cust_main',
+                              { 'company' => { 'op'    => 'ILIKE',
+                                               'value' => $company } } );
+
+    push @cust_main, qsearch( 'cust_main',
+                              { 'ship_company' => { 'op'    => 'ILIKE',
+                                                    'value' => $company } } )
+      if defined dbdef->table('cust_main')->column('ship_last');
+  }
 
-    push @cust_main, qsearch('cust_main',{'company'=>$company});
+  if ( $company_type{'Substring'} || $company_type{'All'} ) {
 
-    push @cust_main, qsearch('cust_main',{'ship_company'=>$company})
+    push @cust_main, qsearch( 'cust_main',
+                              { 'company' => { 'op'    => 'ILIKE',
+                                               'value' => "%$company%" } } );
+
+    push @cust_main, qsearch( 'cust_main',
+                              { 'ship_company' => { 'op'    => 'ILIKE',
+                                                    'value' => "%$company%" } })
       if defined dbdef->table('cust_main')->column('ship_last');
 
-#  } else {
-  if ( $company_type{'Fuzzy'} ) {
+  }
+
+  if ( $company_type{'Fuzzy'} || $company_type{'All'} ) {
 
     &FS::cust_main::check_and_rebuild_fuzzyfiles;
     my $all_company = &FS::cust_main::all_company;
 
     my %company;
-    if ($company_type{'Fuzzy'}) { 
+    if ( $company_type{'Fuzzy'} || $company_type{'All'} ) { 
       foreach ( amatch($company, [ qw(i) ], @$all_company ) ) {
         $company{$_}++;
       }