1 package FS::ClientAPI::Agent;
3 #some false laziness w/MyAccount
7 use Digest::MD5 qw(md5_hex);
8 use Cache::SharedMemoryCache; #store in db?
9 use FS::Record qw(qsearchs); # qsearch);
13 FS::ClientAPI->register_handlers(
14 'Agent/agent_login' => \&agent_login,
15 'Agent/agent_info' => \&agent_info,
16 'Agent/agent_list_customers' => \&agent_list_customers,
20 my $cache = new Cache::SharedMemoryCache( {
21 'namespace' => 'FS::ClientAPI::Agent',
27 #don't allow a blank login to first unconfigured agent with no user/pass
28 return { error => 'Must specify your reseller username and password.' }
29 unless length($p->{'username'}) && length($p->{'password'});
31 my $agent = qsearchs( 'agent', {
32 'username' => $p->{'username'},
33 '_password' => $p->{'password'},
36 unless ( $agent ) { return { error => 'Incorrect password.' } }
39 'agentnum' => $agent->agentnum,
40 'agent' => $agent->agent,
45 $session_id = md5_hex(md5_hex(time(). {}. rand(). $$))
46 } until ( ! defined $cache->get($session_id) ); #just in case
48 $cache->set( $session_id, $session, '1 hour' );
51 'session_id' => $session_id,
58 my $session = $cache->get($p->{'session_id'})
59 or return { 'error' => "Can't resume session" }; #better error message
63 my $agentnum = $session->{'agentnum'};
65 my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
66 or return { 'error' => "unknown agentnum $agentnum" };
69 'agentnum' => $agentnum,
70 'agent' => $agent->agent,
71 'num_prospect' => $agent->num_prospect_cust_main,
72 'num_active' => $agent->num_active_cust_main,
73 'num_susp' => $agent->num_susp_cust_main,
74 'num_cancel' => $agent->num_cancel_cust_main,
80 sub agent_list_customers {
83 my $session = $cache->get($p->{'session_id'})
84 or return { 'error' => "Can't resume session" }; #better error message
88 my $agentnum = $session->{'agentnum'};
90 my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
91 or return { 'error' => "unknown agentnum $agentnum" };
98 map $agent->$_(), map $_.'_cust_main',
99 grep $p->{$_}, qw( prospect active susp cancel );
101 { customers => [ map {
103 my $hashref = $cust_main->hashref;
104 $hashref->{$_} = $cust_main->$_()
105 foreach qw(name status statuscolor);
106 delete $hashref->{$_} foreach qw( payinfo paycvv );