ClientAPI
[freeside.git] / FS / FS / ClientAPI / MyAccount.pm
1 package FS::ClientAPI::MyAccount;
2
3 use strict;
4 use vars qw($cache);
5 use Digest::MD5 qw(md5_hex);
6 use Date::Format;
7 use Cache::SharedMemoryCache; #store in db?
8 use FS::CGI qw(small_custview); #doh
9 use FS::Conf;
10 use FS::Record qw(qsearchs);
11 use FS::svc_acct;
12 use FS::svc_domain;
13 use FS::cust_main;
14 use FS::cust_bill;
15
16 use FS::ClientAPI; #hmm
17 FS::ClientAPI->register_handlers(
18   'MyAccount/login'         => \&login,
19   'MyAccount/customer_info' => \&customer_info,
20   'MyAccount/invoice'       => \&invoice,
21 );
22
23 #store in db?
24 my $cache = new Cache::SharedMemoryCache();
25
26 #false laziness w/FS::ClientAPI::passwd::passwd (needs to handle encrypted pw)
27 sub login {
28   my $p = shift;
29
30   my $svc_domain = qsearchs('svc_domain', { 'domain' => $p->{'domain'} } )
31     or return { error => "Domain not found" };
32
33   my $svc_acct =
34     ( length($p->{'password'}) < 13
35       && qsearchs( 'svc_acct', { 'username'  => $p->{'username'},
36                                  'domsvc'    => $svc_domain->svcnum,
37                                  '_password' => $p->{'password'}     } )
38     )
39     || qsearchs( 'svc_acct', { 'username'  => $p->{'username'},
40                                'domsvc'    => $svc_domain->svcnum,
41                                '_password' => $p->{'password'}     } );
42
43   unless ( $svc_acct ) { return { error => 'Incorrect password.' } }
44
45   my $session = {
46     'svcnum' => $svc_acct->svcnum,
47   };
48
49   my $cust_pkg = $svc_acct->cust_svc->cust_pkg;
50   if ( $cust_pkg ) {
51     my $cust_main = $cust_pkg->cust_main;
52     $session->{'custnum'} = $cust_main->custnum;
53   }
54
55   my $session_id;
56   do {
57     $session_id = md5_hex(md5_hex(time(). {}. rand(). $$))
58   } until ( ! defined $cache->get($session_id) ); #just in case
59
60   $cache->set( $session_id, $session, '1 hour' );
61
62   return { 'error'      => '',
63            'session_id' => $session_id,
64          };
65 }
66
67 sub customer_info {
68   my $p = shift;
69   my $session = $cache->get($p->{'session_id'})
70     or return { 'error' => "Can't resume session" }; #better error message
71
72   my %return;
73
74   my $custnum = $session->{'custnum'};
75
76   if ( $custnum ) { #customer record
77
78     my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
79       or return { 'error' => "unknown custnum $custnum" };
80
81     $return{balance} = $cust_main->balance;
82
83     my @open = map {
84                      {
85                        invnum => $_->invnum,
86                        date   => time2str("%b %o, %Y", $_->_date),
87                        owed   => $_->owed,
88                      };
89                    } $cust_main->open_cust_bill;
90     $return{open_invoices} = \@open;
91
92     my $conf = new FS::Conf;
93     $return{small_custview} =
94       small_custview( $cust_main, $conf->config('defaultcountry') );
95
96     $return{name} = $cust_main->first. ' '. $cust_main->get('last');
97
98   } else { #no customer record
99
100     my $svc_acct = qsearchs('svc_acct', { 'svcnum' => $session->{'svcnum'} } )
101       or die "unknown svcnum";
102     $return{name} = $svc_acct->email;
103
104   }
105
106
107   return { 'error'          => '',
108            'custnum'        => $custnum,
109            %return,
110          };
111
112 }
113
114 sub invoice {
115   my $p = shift;
116   my $session = $cache->get($p->{'session_id'})
117     or return { 'error' => "Can't resume session" }; #better error message
118
119   my $custnum = $session->{'custnum'};
120
121   my $invnum = $p->{'invnum'};
122
123   my $cust_bill = qsearchs('cust_bill', { 'invnum'  => $invnum,
124                                           'custnum' => $custnum } )
125     or return { 'error' => "Can't find invnum" };
126
127   #my %return;
128
129   return { 'error'        => '',
130            'invnum'       => $invnum,
131            'invoice_text' => join('', $cust_bill->print_text ),
132          };
133
134 }
135
136