agent interface
[freeside.git] / FS / FS / ClientAPI / Agent.pm
1 package FS::ClientAPI::Agent;
2
3 #some false laziness w/MyAccount
4
5 use strict;
6 use vars qw($cache);
7 use Digest::MD5 qw(md5_hex);
8 use Cache::SharedMemoryCache; #store in db?
9 use FS::Record qw(qsearchs); # qsearch);
10 use FS::agent;
11
12 use FS::ClientAPI;
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,
17 );
18
19 #store in db?
20 my $cache = new Cache::SharedMemoryCache( {
21    'namespace' => 'FS::ClientAPI::Agent',
22 } );
23
24 sub agent_login {
25   my $p = shift;
26
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'});
30
31   my $agent = qsearchs( 'agent', {
32     'username'  => $p->{'username'},
33     '_password' => $p->{'password'},
34   } );
35
36   unless ( $agent ) { return { error => 'Incorrect password.' } }
37
38   my $session = { 
39     'agentnum' => $agent->agentnum,
40     'agent'    => $agent->agent,
41   };
42
43   my $session_id;
44   do {
45     $session_id = md5_hex(md5_hex(time(). {}. rand(). $$))
46   } until ( ! defined $cache->get($session_id) ); #just in case
47
48   $cache->set( $session_id, $session, '1 hour' );
49
50   { 'error'      => '',
51     'session_id' => $session_id,
52   };
53 }
54
55 sub agent_info {
56   my $p = shift;
57
58   my $session = $cache->get($p->{'session_id'})
59     or return { 'error' => "Can't resume session" }; #better error message
60
61   #my %return;
62
63   my $agentnum = $session->{'agentnum'};
64
65   my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
66     or return { 'error' => "unknown agentnum $agentnum" };
67
68   { 'error'        => '',
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,
75     #%return,
76   };
77
78 }
79
80 sub agent_list_customers {
81   my $p = shift;
82
83   my $session = $cache->get($p->{'session_id'})
84     or return { 'error' => "Can't resume session" }; #better error message
85
86   #my %return;
87
88   my $agentnum = $session->{'agentnum'};
89
90   my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
91     or return { 'error' => "unknown agentnum $agentnum" };
92
93   my @cust_main = ();
94
95   warn $p->{'susp'};
96
97   push @cust_main,
98     map $agent->$_(), map $_.'_cust_main',
99       grep $p->{$_}, qw( prospect active susp cancel );
100
101   { customers => [ map {
102                          my $cust_main = $_;
103                          my $hashref = $cust_main->hashref;
104                          $hashref->{$_} = $cust_main->$_()
105                            foreach qw(name status statuscolor);
106                          delete $hashref->{$_} foreach qw( payinfo paycvv );
107                          $hashref;
108                    } @cust_main
109                  ],
110   }
111
112 }
113