3 #some false laziness w/selfservice.cgi
6 use vars qw($DEBUG $me $cgi $session_id $form_max $template_dir);
7 use subs qw(do_template);
9 use CGI::Carp qw(fatalsToBrowser);
10 use Business::CreditCard;
13 use FS::SelfService qw( agent_login agent_logout agent_info
15 signup_info new_customer
16 customer_info list_pkgs order_pkg
17 part_svc_info provision_acct provision_external
28 warn "$me starting\n" if $DEBUG;
30 warn "$me initializing CGI\n" if $DEBUG;
33 unless ( defined $cgi->param('session') ) {
34 warn "$me no session defined, sending login page\n" if $DEBUG;
35 do_template('agent_login',{});
39 if ( $cgi->param('session') eq 'login' ) {
41 warn "$me processing login\n" if $DEBUG;
43 $cgi->param('username') =~ /^\s*([a-z0-9_\-\.\&]{0,$form_max})\s*$/i
44 or die "illegal username";
47 $cgi->param('password') =~ /^(.{0,$form_max})$/
48 or die "illegal password";
52 'username' => $username,
53 'password' => $password,
56 do_template('agent_login', {
57 'error' => $rv->{error},
58 'username' => $username,
62 $cgi->param('session' => $rv->{session_id} );
63 $cgi->param('action' => 'agent_main' );
67 $session_id = $cgi->param('session');
69 warn "$me checking action\n" if $DEBUG;
70 $cgi->param('action') =~
71 /^(agent_main|signup|process_signup|list_customers|view_customer|agent_provision|provision_svc|process_svc_acct|process_svc_external|delete_svc|agent_order_pkg|process_order_pkg|logout)$/
72 or die "unknown action ". $cgi->param('action');
75 warn "$me running $action\n" if $DEBUG;
76 my $result = eval "&$action();";
79 if ( $result->{error} eq "Can't resume session" ) { #ick
80 do_template('agent_login',{});
84 warn "$me processing template $action\n" if $DEBUG;
85 do_template($action, {
86 'session_id' => $session_id,
89 warn "$me done processing template $action\n" if $DEBUG;
94 $action = 'agent_logout';
95 agent_logout( 'session_id' => $session_id );
98 sub agent_main { agent_info( 'session_id' => $session_id ); }
100 sub signup { signup_info( 'session_id' => $session_id ); }
104 my $init_data = signup_info( 'session_id' => $session_id );
105 if ( $init_data->{'error'} ) {
106 if ( $init_data->{'error'} eq "Can't resume session" ) { #ick
107 do_template('agent_login',{});
110 die $init_data->{'error'};
116 #false laziness w/signup.cgi, identical except for agentnum vs session_id
117 my $payby = $cgi->param('payby');
118 if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) {
119 #$payinfo = join('@', map { $cgi->param( $payby. "_payinfo$_" ) } (1,2) );
120 $cgi->param('payinfo' => $cgi->param($payby. '_payinfo1'). '@'.
121 $cgi->param($payby. '_payinfo2')
124 $cgi->param('payinfo' => $cgi->param( $payby. '_payinfo' ) );
126 $cgi->param('paydate' => $cgi->param( $payby. '_month' ). '-'.
127 $cgi->param( $payby. '_year' )
129 $cgi->param('payname' => $cgi->param( $payby. '_payname' ) );
130 $cgi->param('paycvv' => defined $cgi->param( $payby. '_paycvv' )
131 ? $cgi->param( $payby. '_paycvv' )
135 if ( $cgi->param('invoicing_list') ) {
136 $cgi->param('invoicing_list' => $cgi->param('invoicing_list'). ', POST')
137 if $cgi->param('invoicing_list_POST');
139 $cgi->param('invoicing_list' => 'POST' );
142 if ( $cgi->param('_password') ne $cgi->param('_password2') ) {
143 $error = $init_data->{msgcat}{passwords_dont_match}; #msgcat
144 $cgi->param('_password', '');
145 $cgi->param('_password2', '');
148 if ( $payby =~ /^(CARD|DCRD)$/ && $cgi->param('CARD_type') ) {
149 my $payinfo = $cgi->param('payinfo');
152 $payinfo =~ /^(\d{13,16})$/
153 or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo;
156 or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo;
157 cardtype($payinfo) eq $cgi->param('CARD_type')
158 or $error ||= $init_data->{msgcat}{not_a}. $cgi->param('CARD_type');
162 my $rv = new_customer ( {
163 'session_id' => $session_id,
164 map { $_ => scalar($cgi->param($_)) }
165 qw( last first ss company
166 address1 address2 city county state zip country
169 ship_last ship_first ship_company
170 ship_address1 ship_address2 ship_city ship_county ship_state
171 ship_zip ship_country
172 ship_daytime ship_night ship_fax
174 payby payinfo paycvv paydate payname invoicing_list
175 referral_custnum promo_code reg_code
176 pkgpart username sec_phrase _password popnum refnum
178 grep { /^snarf_/ } $cgi->param
180 $error = $rv->{'error'};
191 #warn join('\n', map "$_ => $r->{$_}", keys %$r )."\n";
194 $action = 'agent_main';
195 my $agent_info = agent_info( 'session_id' => $session_id );
196 $agent_info->{'message'} = 'Signup sucessful';
205 agent_list_customers( 'session_id' => $session_id,
206 map { $_ => $cgi->param($_) }
207 grep defined($cgi->param($_)),
208 qw(prospect active susp cancel),
212 if ( scalar( @{$results->{'customers'}} ) == 1 ) {
213 $action = 'view_customer';
215 'agent_session_id' => $session_id,
216 'custnum' => $results->{'customers'}[0]{'custnum'},
226 #my $init_data = signup_info( 'session_id' => $session_id );
227 #if ( $init_data->{'error'} ) {
228 # if ( $init_data->{'error'} eq "Can't resume session" ) { #ick
229 # do_template('agent_login',{});
232 # die $init_data->{'error'};
238 'agent_session_id' => $session_id,
239 'custnum' => $cgi->param('custnum'),
243 # ( map { $_ => $init_data->{$_} }
244 # qw( part_pkg security_phrase svc_acct_pop ),
250 sub agent_order_pkg {
252 my $init_data = signup_info( 'session_id' => $session_id );
253 if ( $init_data->{'error'} ) {
254 if ( $init_data->{'error'} eq "Can't resume session" ) { #ick
255 do_template('agent_login',{});
258 die $init_data->{'error'};
262 my $customer_info = customer_info (
263 'agent_session_id' => $session_id,
264 'custnum' => $cgi->param('custnum'),
268 ( map { $_ => $init_data->{$_} }
269 qw( part_pkg security_phrase svc_acct_pop ),
276 sub agent_provision {
277 my $result = list_pkgs(
278 'agent_session_id' => $session_id,
279 'custnum' => $cgi->param('custnum'),
281 die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
287 my $result = part_svc_info(
288 'agent_session_id' => $session_id,
289 map { $_ => $cgi->param($_) } qw( pkgnum svcpart custnum ),
291 die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
293 $result->{'svcdb'} =~ /^svc_(.*)$/
294 #or return { 'error' => 'Unknown svcdb '. $result->{'svcdb'} };
295 or die 'Unknown svcdb '. $result->{'svcdb'};
297 $action = "agent_$action";
302 sub process_svc_acct {
304 my $result = provision_acct (
305 'agent_session_id' => $session_id,
306 map { $_ => $cgi->param($_) } qw(
307 custnum pkgnum svcpart username _password _password2 sec_phrase popnum )
310 if ( exists $result->{'error'} && $result->{'error'} ) {
311 #warn "$result $result->{'error'}";
312 $action = 'provision_svc_acct';
313 $action = "agent_$action";
316 %{ part_svc_info( 'agent_session_id' => $session_id,
317 map { $_ => $cgi->param($_) } qw(pkgnum svcpart custnum)
320 'error' => $result->{'error'},
323 #warn "$result $result->{'error'}";
324 $action = 'agent_provision';
326 %{agent_provision()},
327 'message' => $result->{'svc'}. ' setup sucessfully.',
333 sub process_svc_external {
335 my $result = provision_external (
336 'agent_session_id' => $session_id,
337 map { $_ => $cgi->param($_) } qw( custnum pkgnum svcpart )
340 #warn "$result $result->{'error'}";
341 $action = 'agent_provision';
343 %{agent_provision()},
344 'message' => $result->{'error'}
345 ? '<FONT COLOR="#FF0000">'. $result->{'error'}. '</FONT>'
346 : $result->{'svc'}. ' setup sucessfully'.
348 sprintf('%010d', $result->{'id'}). '-'. $result->{'title'}
354 my $result = unprovision_svc(
355 'agent_session_id' => $session_id,
356 'custnum' => $cgi->param('custnum'),
357 'svcnum' => $cgi->param('svcnum'),
360 $action = 'agent_provision';
363 %{agent_provision()},
364 'message' => $result->{'error'}
365 ? '<FONT COLOR="#FF0000">'. $result->{'error'}. '</FONT>'
366 : $result->{'svc'}. ' removed.'
371 sub process_order_pkg {
375 unless ( length($cgi->param('_password')) ) {
376 my $init_data = signup_info( 'session_id' => $session_id );
377 #die $init_data->{'error'} if $init_data->{'error'};
378 $results = { 'error' => $init_data->{msgcat}{empty_password} };
380 if ( $cgi->param('_password') ne $cgi->param('_password2') ) {
381 my $init_data = signup_info( 'session_id' => $session_id );
382 $results = { 'error' => $init_data->{msgcat}{passwords_dont_match} };
383 $cgi->param('_password', '');
384 $cgi->param('_password2', '');
387 $results ||= order_pkg (
388 'agent_session_id' => $session_id,
389 map { $_ => $cgi->param($_) }
390 qw( custnum pkgpart username _password _password2 sec_phrase popnum )
393 if ( $results->{'error'} ) {
394 $action = 'agent_order_pkg';
397 %{agent_order_pkg()},
398 #'message' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
399 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
402 $action = 'view_customer';
403 #$cgi->delete( grep { $_ ne 'custnum' } $cgi->param );
406 'message' => 'Package order sucessful.',
417 #warn join(' / ', map { "$_=>".$fill_in->{$_} } keys %$fill_in). "\n";
420 $fill_in->{'selfurl'} = $cgi->self_url; #OLD
421 $fill_in->{'self_url'} = $cgi->self_url;
422 $fill_in->{'cgi'} = \$cgi;
424 my $template = new Text::Template( TYPE => 'FILE',
425 SOURCE => "$template_dir/$name.html",
426 DELIMITERS => [ '<%=', '%>' ],
428 or die $Text::Template::ERROR;
431 print $cgi->header( '-expires' => 'now' ),
432 $template->fill_in( PACKAGE => 'FS::SelfService::_agentcgi',
437 package FS::SelfService::_agentcgi;
440 use FS::SelfService qw(regionselector expselect popselector);
442 #false laziness w/selfservice.cgi
445 my $template = new Text::Template( TYPE => 'FILE',
446 SOURCE => "$main::template_dir/$name.html",
447 DELIMITERS => [ '<%=', '%>' ],
450 or die $Text::Template::ERROR;
452 $template->fill_in( PACKAGE => 'FS::SelfService::_agentcgi',