support multiple primary keys
[freeside.git] / FS / FS / ClientAPI / Agent.pm
index 1cc11d5..daede59 100644 (file)
@@ -4,24 +4,18 @@ package FS::ClientAPI::Agent;
 
 use strict;
 use vars qw($cache);
+use subs qw(_cache);
 use Digest::MD5 qw(md5_hex);
-use Cache::SharedMemoryCache; #store in db?
-use FS::Record qw(qsearchs qsearch dbdef dbh);
+use FS::Record qw(qsearchs); # qsearch dbdef dbh);
+use FS::ClientAPI_SessionCache;
 use FS::agent;
-use FS::cust_main;
+use FS::cust_main qw(smart_search);
 
-use FS::ClientAPI;
-FS::ClientAPI->register_handlers(
-  'Agent/agent_login'          => \&agent_login,
-  'Agent/agent_logout'         => \&agent_logout,
-  'Agent/agent_info'           => \&agent_info,
-  'Agent/agent_list_customers' => \&agent_list_customers,
-);
-
-#store in db?
-my $cache = new Cache::SharedMemoryCache( {
-   'namespace' => 'FS::ClientAPI::Agent',
-} );
+sub _cache {
+  $cache ||= new FS::ClientAPI_SessionCache( {
+               'namespace' => 'FS::ClientAPI::Agent',
+             } );
+}
 
 sub agent_login {
   my $p = shift;
@@ -45,9 +39,9 @@ sub agent_login {
   my $session_id;
   do {
     $session_id = md5_hex(md5_hex(time(). {}. rand(). $$))
-  } until ( ! defined $cache->get($session_id) ); #just in case
+  } until ( ! defined _cache->get($session_id) ); #just in case
 
-  $cache->set( $session_id, $session, '1 hour' );
+  _cache->set( $session_id, $session, '1 hour' );
 
   { 'error'      => '',
     'session_id' => $session_id,
@@ -57,7 +51,7 @@ sub agent_login {
 sub agent_logout {
   my $p = shift;
   if ( $p->{'session_id'} ) {
-    $cache->remove($p->{'session_id'});
+    _cache->remove($p->{'session_id'});
     return { 'error' => '' };
   } else {
     return { 'error' => "Can't resume session" }; #better error message
@@ -67,7 +61,7 @@ sub agent_logout {
 sub agent_info {
   my $p = shift;
 
-  my $session = $cache->get($p->{'session_id'})
+  my $session = _cache->get($p->{'session_id'})
     or return { 'error' => "Can't resume session" }; #better error message
 
   #my %return;
@@ -92,7 +86,7 @@ sub agent_info {
 sub agent_list_customers {
   my $p = shift;
 
-  my $session = $cache->get($p->{'session_id'})
+  my $session = _cache->get($p->{'session_id'})
     or return { 'error' => "Can't resume session" }; #better error message
 
   #my %return;
@@ -102,68 +96,9 @@ sub agent_list_customers {
   my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
     or return { 'error' => "unknown agentnum $agentnum" };
 
-  my @cust_main = ();
-
-  #warn $p->{'search'};
-  if ( $p->{'search'} =~ /^\s*(\d+)\s*$/ ) { # customer # search
-    push @cust_main, qsearch('cust_main', { 'agentnum' => $agentnum,
-                                            'custnum'  => $1         } );
-  } elsif ( $p->{'search'} =~ /^\s*(\S.*\S)\s*$/ ) { #value search
-    my $value = lc($1);
-    my $q_value = dbh->quote($value);
-
-    #exact
-    my $sql = " AND ( LOWER(last) = $q_value OR LOWER(company) = $q_value";
-    $sql .= " OR LOWER(ship_last) = $q_value OR LOWER(ship_company) = $q_value"
-      if defined dbdef->table('cust_main')->column('ship_last');
-    $sql .= ' )';
-
-    push @cust_main, qsearch( 'cust_main',
-                              { 'agentnum' => $agentnum },
-                              '',
-                              $sql
-                            );
-
-    unless ( @cust_main ) {
-      warn "no exact match, trying substring/fuzzy\n";
-
-      #still some false laziness w/ search/cust_main.cgi
-
-      #substring
-      push @cust_main, qsearch( 'cust_main',
-                                { 'agentnum' => $agentnum,
-                                  'last'     => { 'op'    => 'ILIKE',
-                                                  'value' => "%$q_value%" } } );
-
-      push @cust_main, qsearch( 'cust_main',
-                                { 'agentnum'  => $agentnum,
-                                  'ship_last' => { 'op'    => 'ILIKE',
-                                                   'value' => "%$q_value%" } } )
-        if defined dbdef->table('cust_main')->column('ship_last');
-
-      push @cust_main, qsearch( 'cust_main',
-                                { 'agentnum' => $agentnum,
-                                  'company'  => { 'op'    => 'ILIKE',
-                                                  'value' => "%$q_value%" } } );
-
-      push @cust_main, qsearch( 'cust_main',
-                                { 'agentnum'     => $agentnum,
-                                  'ship_company' => { 'op' => 'ILIKE',
-                                                   'value' => "%$q_value%" } } )
-        if defined dbdef->table('cust_main')->column('ship_last');
-
-      #fuzzy
-      push @cust_main, FS::cust_main->fuzzy_search(
-        { 'last'     => $value },
-        { 'agentnum' => $agentnum }
-      );
-      push @cust_main, FS::cust_main->fuzzy_search(
-        { 'company'  => $value },
-        { 'agentnum' => $agentnum }
-      );
-
-    }
-  }
+  my @cust_main = smart_search( 'search'   => $p->{'search'},
+                                'agentnum' => $agentnum,
+                              );
 
   #aggregate searches
   push @cust_main,
@@ -187,3 +122,4 @@ sub agent_list_customers {
 
 }
 
+1;