9983b5d262ffe24da331876bb29477df2fedc646
[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   'MyAccount/cancel'        => \&cancel,
22 );
23
24 #store in db?
25 my $cache = new Cache::SharedMemoryCache();
26
27 #false laziness w/FS::ClientAPI::passwd::passwd (needs to handle encrypted pw)
28 sub login {
29   my $p = shift;
30
31   my $svc_domain = qsearchs('svc_domain', { 'domain' => $p->{'domain'} } )
32     or return { error => "Domain not found" };
33
34   my $svc_acct =
35     ( length($p->{'password'}) < 13
36       && qsearchs( 'svc_acct', { 'username'  => $p->{'username'},
37                                  'domsvc'    => $svc_domain->svcnum,
38                                  '_password' => $p->{'password'}     } )
39     )
40     || qsearchs( 'svc_acct', { 'username'  => $p->{'username'},
41                                'domsvc'    => $svc_domain->svcnum,
42                                '_password' => $p->{'password'}     } );
43
44   unless ( $svc_acct ) { return { error => 'Incorrect password.' } }
45
46   my $session = {
47     'svcnum' => $svc_acct->svcnum,
48   };
49
50   my $cust_pkg = $svc_acct->cust_svc->cust_pkg;
51   if ( $cust_pkg ) {
52     my $cust_main = $cust_pkg->cust_main;
53     $session->{'custnum'} = $cust_main->custnum;
54   }
55
56   my $session_id;
57   do {
58     $session_id = md5_hex(md5_hex(time(). {}. rand(). $$))
59   } until ( ! defined $cache->get($session_id) ); #just in case
60
61   $cache->set( $session_id, $session, '1 hour' );
62
63   return { 'error'      => '',
64            'session_id' => $session_id,
65          };
66 }
67
68 sub customer_info {
69   my $p = shift;
70   my $session = $cache->get($p->{'session_id'})
71     or return { 'error' => "Can't resume session" }; #better error message
72
73   my %return;
74
75   my $custnum = $session->{'custnum'};
76
77   if ( $custnum ) { #customer record
78
79     my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
80       or return { 'error' => "unknown custnum $custnum" };
81
82     $return{balance} = $cust_main->balance;
83
84     my @open = map {
85                      {
86                        invnum => $_->invnum,
87                        date   => time2str("%b %o, %Y", $_->_date),
88                        owed   => $_->owed,
89                      };
90                    } $cust_main->open_cust_bill;
91     $return{open_invoices} = \@open;
92
93     my $conf = new FS::Conf;
94     $return{small_custview} =
95       small_custview( $cust_main, $conf->config('defaultcountry') );
96
97     $return{name} = $cust_main->first. ' '. $cust_main->get('last');
98
99   } else { #no customer record
100
101     my $svc_acct = qsearchs('svc_acct', { 'svcnum' => $session->{'svcnum'} } )
102       or die "unknown svcnum";
103     $return{name} = $svc_acct->email;
104
105   }
106
107
108   return { 'error'          => '',
109            'custnum'        => $custnum,
110            %return,
111          };
112
113 }
114
115 sub invoice {
116   my $p = shift;
117   my $session = $cache->get($p->{'session_id'})
118     or return { 'error' => "Can't resume session" }; #better error message
119
120   my $custnum = $session->{'custnum'};
121
122   my $invnum = $p->{'invnum'};
123
124   my $cust_bill = qsearchs('cust_bill', { 'invnum'  => $invnum,
125                                           'custnum' => $custnum } )
126     or return { 'error' => "Can't find invnum" };
127
128   #my %return;
129
130   return { 'error'        => '',
131            'invnum'       => $invnum,
132            'invoice_text' => join('', $cust_bill->print_text ),
133          };
134
135 }
136
137 sub cancel {
138   my $p = shift;
139   my $session = $cache->get($p->{'session_id'})
140     or return { 'error' => "Can't resume session" }; #better error message
141
142   my $custnum = $session->{'custnum'};
143
144   my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
145     or return { 'error' => "unknown custnum $custnum" };
146
147   my @errors = $cust_main->cancel;
148
149   my $error = scalar(@errors) ? join(' / ', @errors) : '';
150
151   return { 'error' => $error };
152
153 }
154
155 1;
156