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