1 package FS::ClientAPI::Agent;
3 #some false laziness w/MyAccount
8 use Digest::MD5 qw(md5_hex);
9 use FS::Record qw(qsearchs); # qsearch dbdef dbh);
10 use FS::ClientAPI_SessionCache;
12 use FS::cust_main::Search qw(smart_search);
15 $cache ||= new FS::ClientAPI_SessionCache( {
16 'namespace' => 'FS::ClientAPI::Agent',
23 my $conf = new FS::Conf;
24 return { error=>'Disabled' } unless $conf->exists('selfservice-agent_signup');
26 #add a customer record and set agent_custnum?
28 my $agent = new FS::agent {
29 'typenum' => $conf->config('selfservice-agent_signup-agent_type'),
30 'agent' => $p->{'agent'},
31 'username' => $p->{'username'},
32 '_password' => $p->{'password'},
36 my $error = $agent->insert;
38 return { 'error' => $error } if $error;
40 agent_login({ 'username' => $p->{'username'},
41 'password' => $p->{'password'},
48 #don't allow a blank login to first unconfigured agent with no user/pass
49 return { error => 'Must specify your reseller username and password.' }
50 unless length($p->{'username'}) && length($p->{'password'});
52 my $agent = qsearchs( 'agent', {
53 'username' => $p->{'username'},
54 '_password' => $p->{'password'},
57 unless ( $agent ) { return { error => 'Incorrect password.' } }
60 'agentnum' => $agent->agentnum,
61 'agent' => $agent->agent,
66 $session_id = md5_hex(md5_hex(time(). {}. rand(). $$))
67 } until ( ! defined _cache->get($session_id) ); #just in case
69 _cache->set( $session_id, $session, '1 hour' );
72 'session_id' => $session_id,
78 if ( $p->{'session_id'} ) {
79 _cache->remove($p->{'session_id'});
80 return { 'error' => '' };
82 return { 'error' => "Can't resume session" }; #better error message
89 my $session = _cache->get($p->{'session_id'})
90 or return { 'error' => "Can't resume session" }; #better error message
94 my $agentnum = $session->{'agentnum'};
96 my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
97 or return { 'error' => "unknown agentnum $agentnum" };
100 'agentnum' => $agentnum,
101 'agent' => $agent->agent,
102 'num_prospect' => $agent->num_prospect_cust_main,
103 'num_active' => $agent->num_active_cust_main,
104 'num_susp' => $agent->num_susp_cust_main,
105 'num_cancel' => $agent->num_cancel_cust_main,
111 sub agent_list_customers {
114 my $session = _cache->get($p->{'session_id'})
115 or return { 'error' => "Can't resume session" }; #better error message
119 my $agentnum = $session->{'agentnum'};
121 my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
122 or return { 'error' => "unknown agentnum $agentnum" };
124 my @cust_main = smart_search( 'search' => $p->{'search'},
125 'agentnum' => $agentnum,
130 map $agent->$_(), map $_.'_cust_main',
131 grep $p->{$_}, qw( prospect active susp cancel );
135 @cust_main = grep { !$saw{$_->custnum}++ } @cust_main;
137 { customers => [ map {
139 my $hashref = $cust_main->hashref;
140 $hashref->{$_} = $cust_main->$_()
141 foreach qw(name status statuscolor);
142 delete $hashref->{$_} foreach qw( payinfo paycvv );