e1624b9300bae113cb29c6b1cbb5a58ae05380af
[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::Search qw(smart_search);
13
14 sub _cache {
15   $cache ||= new FS::ClientAPI_SessionCache( {
16                'namespace' => 'FS::ClientAPI::Agent',
17              } );
18 }
19
20 sub new_agent {
21   my $p = shift;
22
23   my $conf = new FS::Conf;
24   return { error=>'Disabled' } unless $conf->exists('selfservice-agent_signup');
25
26   #add a customer record and set agent_custnum?
27
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'},
33     #
34   };
35
36   my $error = $agent->insert;
37   
38   return { 'error' => $error } if $error;
39
40   agent_login({ 'username' => $p->{'username'},
41                 'password' => $p->{'password'},
42              });
43 }
44
45 sub agent_login {
46   my $p = shift;
47
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'});
51
52   my $agent = qsearchs( 'agent', {
53     'username'  => $p->{'username'},
54     '_password' => $p->{'password'},
55   } );
56
57   unless ( $agent ) { return { error => 'Incorrect password.' } }
58
59   my $session = { 
60     'agentnum' => $agent->agentnum,
61     'agent'    => $agent->agent,
62   };
63
64   my $session_id;
65   do {
66     $session_id = md5_hex(md5_hex(time(). {}. rand(). $$))
67   } until ( ! defined _cache->get($session_id) ); #just in case
68
69   _cache->set( $session_id, $session, '1 hour' );
70
71   { 'error'      => '',
72     'session_id' => $session_id,
73   };
74 }
75
76 sub agent_logout {
77   my $p = shift;
78   if ( $p->{'session_id'} ) {
79     _cache->remove($p->{'session_id'});
80     return { 'error' => '' };
81   } else {
82     return { 'error' => "Can't resume session" }; #better error message
83   }
84 }
85
86 sub agent_info {
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   { 'error'        => '',
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,
106     #%return,
107   };
108
109 }
110
111 sub agent_list_customers {
112   my $p = shift;
113
114   my $session = _cache->get($p->{'session_id'})
115     or return { 'error' => "Can't resume session" }; #better error message
116
117   #my %return;
118
119   my $agentnum = $session->{'agentnum'};
120
121   my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } )
122     or return { 'error' => "unknown agentnum $agentnum" };
123
124   my @cust_main = smart_search( 'search'   => $p->{'search'},
125                                 'agentnum' => $agentnum,
126                               );
127
128   #aggregate searches
129   push @cust_main,
130     map $agent->$_(), map $_.'_cust_main',
131       grep $p->{$_}, qw( prospect active susp cancel );
132
133   #eliminate dups?
134   my %saw = ();
135   @cust_main = grep { !$saw{$_->custnum}++ } @cust_main;
136
137   { customers => [ map {
138                          my $cust_main = $_;
139                          my $hashref = $cust_main->hashref;
140                          $hashref->{$_} = $cust_main->$_()
141                            foreach qw(name status statuscolor);
142                          delete $hashref->{$_} foreach qw( payinfo paycvv );
143                          $hashref;
144                    } @cust_main
145                  ],
146   }
147
148 }
149
150 1;