remove unnecessary complication from ClientAPI dispatch foo
[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 dbdef dbh);
10 use FS::agent;
11 use FS::cust_main qw(smart_search);
12
13 #store in db?
14 my $cache = new Cache::SharedMemoryCache( {
15    'namespace' => 'FS::ClientAPI::Agent',
16 } );
17
18 sub agent_login {
19   my $p = shift;
20
21   #don't allow a blank login to first unconfigured agent with no user/pass
22   return { error => 'Must specify your reseller username and password.' }
23     unless length($p->{'username'}) && length($p->{'password'});
24
25   my $agent = qsearchs( 'agent', {
26     'username'  => $p->{'username'},
27     '_password' => $p->{'password'},
28   } );
29
30   unless ( $agent ) { return { error => 'Incorrect password.' } }
31
32   my $session = { 
33     'agentnum' => $agent->agentnum,
34     'agent'    => $agent->agent,
35   };
36
37   my $session_id;
38   do {
39     $session_id = md5_hex(md5_hex(time(). {}. rand(). $$))
40   } until ( ! defined $cache->get($session_id) ); #just in case
41
42   $cache->set( $session_id, $session, '1 hour' );
43
44   { 'error'      => '',
45     'session_id' => $session_id,
46   };
47 }
48
49 sub agent_logout {
50   my $p = shift;
51   if ( $p->{'session_id'} ) {
52     $cache->remove($p->{'session_id'});
53     return { 'error' => '' };
54   } else {
55     return { 'error' => "Can't resume session" }; #better error message
56   }
57 }
58
59 sub agent_info {
60   my $p = shift;
61
62   my $session = $cache->get($p->{'session_id'})
63     or return { 'error' => "Can't resume session" }; #better error message
64
65   #my %return;
66
67   my $agentnum = $session->{'agentnum'};
68
69   my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
70     or return { 'error' => "unknown agentnum $agentnum" };
71
72   { 'error'        => '',
73     'agentnum'     => $agentnum,
74     'agent'        => $agent->agent,
75     'num_prospect' => $agent->num_prospect_cust_main,
76     'num_active'   => $agent->num_active_cust_main,
77     'num_susp'     => $agent->num_susp_cust_main,
78     'num_cancel'   => $agent->num_cancel_cust_main,
79     #%return,
80   };
81
82 }
83
84 sub agent_list_customers {
85   my $p = shift;
86
87   my $session = $cache->get($p->{'session_id'})
88     or return { 'error' => "Can't resume session" }; #better error message
89
90   #my %return;
91
92   my $agentnum = $session->{'agentnum'};
93
94   my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
95     or return { 'error' => "unknown agentnum $agentnum" };
96
97   my @cust_main = smart_search( 'search'   => $p->{'search'},
98                                 'agentnum' => $agentnum,
99                               );
100
101   #aggregate searches
102   push @cust_main,
103     map $agent->$_(), map $_.'_cust_main',
104       grep $p->{$_}, qw( prospect active susp cancel );
105
106   #eliminate dups?
107   my %saw = ();
108   @cust_main = grep { !$saw{$_->custnum}++ } @cust_main;
109
110   { customers => [ map {
111                          my $cust_main = $_;
112                          my $hashref = $cust_main->hashref;
113                          $hashref->{$_} = $cust_main->$_()
114                            foreach qw(name status statuscolor);
115                          delete $hashref->{$_} foreach qw( payinfo paycvv );
116                          $hashref;
117                    } @cust_main
118                  ],
119   }
120
121 }
122