move invoice_latex templating to Text::Template, with special sauce^W^Wbackwards...
[freeside.git] / FS / FS / ClientAPI / Agent.pm
index 212faaa..daede59 100644 (file)
@@ -4,22 +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);
+use FS::Record qw(qsearchs); # qsearch dbdef dbh);
+use FS::ClientAPI_SessionCache;
 use FS::agent;
+use FS::cust_main qw(smart_search);
 
-use FS::ClientAPI;
-FS::ClientAPI->register_handlers(
-  'Agent/agent_login'          => \&agent_login,
-  '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;
@@ -43,19 +39,29 @@ 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,
   };
 }
 
+sub agent_logout {
+  my $p = shift;
+  if ( $p->{'session_id'} ) {
+    _cache->remove($p->{'session_id'});
+    return { 'error' => '' };
+  } else {
+    return { 'error' => "Can't resume session" }; #better error message
+  }
+}
+
 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;
@@ -80,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;
@@ -90,14 +96,19 @@ sub agent_list_customers {
   my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
     or return { 'error' => "unknown agentnum $agentnum" };
 
-  my @cust_main = ();
-
-  warn $p->{'susp'};
+  my @cust_main = smart_search( 'search'   => $p->{'search'},
+                                'agentnum' => $agentnum,
+                              );
 
+  #aggregate searches
   push @cust_main,
     map $agent->$_(), map $_.'_cust_main',
       grep $p->{$_}, qw( prospect active susp cancel );
 
+  #eliminate dups?
+  my %saw = ();
+  @cust_main = grep { !$saw{$_->custnum}++ } @cust_main;
+
   { customers => [ map {
                          my $cust_main = $_;
                          my $hashref = $cust_main->hashref;
@@ -111,3 +122,4 @@ sub agent_list_customers {
 
 }
 
+1;