This commit was generated by cvs2svn to compensate for changes in r3883,
[freeside.git] / fs_selfservice / FS-SelfService / cgi / selfservice.cgi
1 #!/usr/bin/perl -Tw
2
3 use strict;
4 use vars qw($cgi $session_id $form_max $template_dir);
5 use subs qw(do_template);
6 use CGI;
7 use CGI::Carp qw(fatalsToBrowser);
8 use Text::Template;
9 use HTML::Entities;
10 use FS::SelfService qw( login customer_info invoice
11                         payment_info process_payment 
12                         list_pkgs
13                         part_svc_info provision_acct provision_external
14                         unprovision_svc
15                       );
16
17 $template_dir = '.';
18
19 $form_max = 255;
20
21 $cgi = new CGI;
22
23 unless ( defined $cgi->param('session') ) {
24   do_template('login',{});
25   exit;
26 }
27
28 if ( $cgi->param('session') eq 'login' ) {
29
30   $cgi->param('username') =~ /^\s*([a-z0-9_\-\.\&]{0,$form_max})\s*$/i
31     or die "illegal username";
32   my $username = $1;
33
34   $cgi->param('domain') =~ /^\s*([\w\-\.]{0,$form_max})\s*$/
35     or die "illegal domain";
36   my $domain = $1;
37
38   $cgi->param('password') =~ /^(.{0,$form_max})$/
39     or die "illegal password";
40   my $password = $1;
41
42   my $rv = login(
43     'username' => $username,
44     'domain'   => $domain,
45     'password' => $password,
46   );
47   if ( $rv->{error} ) {
48     do_template('login', {
49       'error'    => $rv->{error},
50       'username' => $username,
51       'domain'   => $domain,
52     } );
53     exit;
54   } else {
55     $cgi->param('session' => $rv->{session_id} );
56     $cgi->param('action'  => 'myaccount' );
57   }
58 }
59
60 $session_id = $cgi->param('session');
61
62 #order|pw_list XXX ???
63 $cgi->param('action') =~
64     /^(myaccount|view_invoice|make_payment|payment_results|logout|change_bill|change_ship|provision|provision_svc|process_svc_acct|process_svc_external|delete_svc)$/
65   or die "unknown action ". $cgi->param('action');
66 my $action = $1;
67
68 my $result = eval "&$action();";
69 die $@ if $@;
70
71 if ( $result->{error} eq "Can't resume session" ) { #ick
72   do_template('login',{});
73   exit;
74 }
75
76 #warn $result->{'open_invoices'};
77 #warn scalar(@{$result->{'open_invoices'}});
78
79 warn "processing template $action\n";
80 do_template($action, {
81   'session_id' => $session_id,
82   %{$result}
83 });
84
85 #--
86
87 sub myaccount { customer_info( 'session_id' => $session_id ); }
88
89 sub view_invoice {
90
91   $cgi->param('invnum') =~ /^(\d+)$/ or die "illegal invnum";
92   my $invnum = $1;
93
94   invoice( 'session_id' => $session_id,
95            'invnum'     => $invnum,
96          );
97
98 }
99
100 sub make_payment {
101   payment_info( 'session_id' => $session_id );
102 }
103
104 sub payment_results {
105
106   use Business::CreditCard;
107
108   $cgi->param('amount') =~ /^\s*(\d+(\.\d{2})?)\s*$/
109     or die "illegal amount"; #!!!
110   my $amount = $1;
111
112   my $payinfo = $cgi->param('payinfo');
113   $payinfo =~ s/\D//g;
114   $payinfo =~ /^(\d{13,16})$/
115     #or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo;
116     or die "illegal card"; #!!!
117   $payinfo = $1;
118   validate($payinfo)
119     #or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo;
120     or die "invalid card"; #!!!
121   cardtype($payinfo) eq $cgi->param('card_type')
122     #or $error ||= $init_data->{msgcat}{not_a}. $cgi->param('CARD_type');
123     or die "not a ". $cgi->param('card_type');
124
125   $cgi->param('month') =~ /^(\d{2})$/ or die "illegal month";
126   my $month = $1;
127   $cgi->param('year') =~ /^(\d{4})$/ or die "illegal year";
128   my $year = $1;
129
130   $cgi->param('payname') =~ /^(.{0,80})$/ or die "illegal payname";
131   my $payname = $1;
132
133   $cgi->param('address1') =~ /^(.{0,80})$/ or die "illegal address1";
134   my $address1 = $1;
135
136   $cgi->param('address2') =~ /^(.{0,80})$/ or die "illegal address2";
137   my $address2 = $1;
138
139   $cgi->param('city') =~ /^(.{0,80})$/ or die "illegal city";
140   my $city = $1;
141
142   $cgi->param('state') =~ /^(.{2})$/ or die "illegal state";
143   my $state = $1;
144
145   $cgi->param('zip') =~ /^(.{0,10})$/ or die "illegal zip";
146   my $zip = $1;
147
148   my $save = 0;
149   $save = 1 if $cgi->param('save');
150
151   my $auto = 0;
152   $auto = 1 if $cgi->param('auto');
153
154   $cgi->param('paybatch') =~ /^([\w\-\.]+)$/ or die "illegal paybatch";
155   my $paybatch = $1;
156
157   process_payment(
158     'session_id' => $session_id,
159     'amount'     => $amount,
160     'payinfo'    => $payinfo,
161     'month'      => $month,
162     'year'       => $year,
163     'payname'    => $payname,
164     'address1'   => $address1,
165     'address2'   => $address2,
166     'city'       => $city,
167     'state'      => $state,
168     'zip'        => $zip,
169     'save'       => $save,
170     'auto'       => $auto,
171     'paybatch'   => $paybatch,
172   );
173
174 }
175
176 sub logout {
177   FS::SelfService::logout( 'session_id' => $session_id );
178 }
179
180 sub provision {
181   my $result = list_pkgs( 'session_id' => $session_id );
182   die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
183   $result;
184 }
185
186 sub provision_svc {
187
188   my $result = part_svc_info(
189     'session_id' => $session_id,
190     map { $_ => $cgi->param($_) } qw( pkgnum svcpart ),
191   );
192   die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
193
194   $result->{'svcdb'} =~ /^svc_(.*)$/
195     #or return { 'error' => 'Unknown svcdb '. $result->{'svcdb'} };
196     or die 'Unknown svcdb '. $result->{'svcdb'};
197   $action .= "_$1";
198
199   $result;
200 }
201
202 sub process_svc_acct {
203
204   my $result = provision_acct (
205     'session_id' => $session_id,
206     map { $_ => $cgi->param($_) } qw(
207       pkgnum svcpart username _password _password2 sec_phrase popnum )
208   );
209
210   if ( exists $result->{'error'} && $result->{'error'} ) { 
211     #warn "$result $result->{'error'}"; 
212     $action = 'provision_svc_acct';
213     return {
214       $cgi->Vars,
215       %{ part_svc_info( 'session_id' => $session_id,
216                         map { $_ => $cgi->param($_) } qw( pkgnum svcpart )
217                       )
218       },
219       'error' => $result->{'error'},
220     };
221   } else {
222     #warn "$result $result->{'error'}"; 
223     return $result;
224   }
225
226 }
227
228 sub process_svc_external {
229   provision_external (
230     'session_id' => $session_id,
231     map { $_ => $cgi->param($_) } qw( pkgnum svcpart )
232   );
233 }
234
235 sub delete_svc {
236   unprovision_svc(
237     'session_id' => $session_id,
238     'svcnum'     => $cgi->param('svcnum'),
239   );
240 }
241
242 #--
243
244 sub do_template {
245   my $name = shift;
246   my $fill_in = shift;
247
248   $cgi->delete_all();
249   $fill_in->{'selfurl'} = $cgi->self_url;
250   $fill_in->{'cgi'} = \$cgi;
251
252   my $template = new Text::Template( TYPE    => 'FILE',
253                                      SOURCE  => "$template_dir/$name.html",
254                                      DELIMITERS => [ '<%=', '%>' ],
255                                      UNTAINT => 1,                    )
256     or die $Text::Template::ERROR;
257
258   print $cgi->header( '-expires' => 'now' ),
259         $template->fill_in( PACKAGE => 'FS::SelfService::_selfservicecgi',
260                             HASH    => $fill_in
261                           );
262 }
263
264 #*FS::SelfService::_selfservicecgi::include = \&Text::Template::fill_in_file;
265
266 package FS::SelfService::_selfservicecgi;
267
268 #use FS::SelfService qw(regionselector expselect popselector);
269 use HTML::Entities;
270 use FS::SelfService qw(popselector);
271
272 #false laziness w/agent.cgi
273 sub include {
274   my $name = shift;
275   my $template = new Text::Template( TYPE   => 'FILE',
276                                      SOURCE => "$main::template_dir/$name.html",
277                                      DELIMITERS => [ '<%=', '%>' ],
278                                      UNTAINT => 1,                   
279                                    )
280     or die $Text::Template::ERROR;
281
282   $template->fill_in( PACKAGE => 'FS::SelfService::_selfservicecgi',
283                       #HASH    => $fill_in
284                     );
285
286 }
287