4 use vars qw($DEBUG $cgi $session_id $form_max $template_dir);
5 use subs qw(do_template);
7 use CGI::Carp qw(fatalsToBrowser);
12 use Date::Parse 'str2time';
13 use Number::Format 1.50;
14 use FS::SelfService qw(
15 access_info login_info login customer_info edit_info invoice
16 payment_info process_payment realtime_collect process_prepay
17 list_pkgs order_pkg signup_info order_recharge
18 part_svc_info provision_acct provision_external provision_phone
19 unprovision_svc change_pkg suspend_pkg domainselector
20 list_svcs list_svc_usage list_cdr_usage list_support_usage
21 myaccount_passwd list_invoices create_ticket get_ticket did_report
22 adjust_ticket_priority
24 start_thirdparty finish_thirdparty
34 my %cookies = CGI::Cookie->fetch;
38 if ( exists($cookies{'session'}) ) {
40 $session_id = $cookies{'session'}->value;
42 if ( $session_id eq 'login' ) {
43 # then we've just come back from the login page
45 $cgi->param('username') =~ /^\s*([a-z0-9_\-\.\&]{0,$form_max})\s*$/i;
48 $cgi->param('domain') =~ /^\s*([\w\-\.]{0,$form_max})\s*$/;
51 $cgi->param('password') =~ /^(.{0,$form_max})$/;
54 if ( $username and $domain and $password ) {
58 'username' => $username,
60 'password' => $password,
62 $session_id = $login_rv->{'session_id'};
64 } elsif ( $username or $domain or $password ) {
66 my $error = 'Illegal '; #XXX localization...
73 $error .= ', ' if $count;
78 $error .= ', ' if $count;
79 $error .= 'and ' if $count > 1;
85 'username' => $username,
87 'password' => $password,
90 $session_id = undef; # attempt login again
92 } # else there was no input, so show no error message
93 } # else session_id ne 'login'
96 # there is no session cookie
100 if ( !$session_id ) {
101 # XXX why are we getting agentnum from a CGI param? surely it should
102 # be some kind of configuration option.
104 # show the login page
105 $session_id = 'login'; # set state
106 my $login_info = login_info( 'agentnum' => scalar($cgi->param('agentnum')) );
108 do_template('login', { %$login_rv, %$login_info });
112 # at this point $session_id is a real session
114 #order|pw_list XXX ???
126 make_thirdparty_payment
127 post_thirdparty_payment
128 finish_thirdparty_payment
129 cancel_thirdparty_payment
145 process_order_recharge
159 process_change_password
164 my $action = 'myaccount'; # sensible default
165 if ( $cgi->param('action') =~ /^(\w+)$/ ) {
166 if (grep {$_ eq $1} @actions) {
169 warn "WARNING: unrecognized action '$1'\n";
173 warn "calling $action sub\n"
175 $FS::SelfService::DEBUG = $DEBUG;
176 my $result = eval "&$action();";
179 warn Dumper($result) if $DEBUG;
181 if ( $result->{error} && ( $result->{error} eq "Can't resume session"
182 || $result->{error} eq "Expired session") ) { #ick
184 $session_id = 'login';
185 my $login_info = login_info();
186 do_template('login', $login_info);
190 #warn $result->{'open_invoices'};
191 #warn scalar(@{$result->{'open_invoices'}});
193 warn "processing template $action\n"
195 do_template($action, {
196 'session_id' => $session_id,
197 'action' => $action, #so the menu knows what tab we're on...
198 #%{ payment_info( 'session_id' => $session_id ) }, # cust_paybys for the menu
206 customer_info( 'session_id' => $session_id );
209 sub change_bill { my $payment_info =
210 payment_info( 'session_id' => $session_id );
211 return $payment_info if ( $payment_info->{'error'} );
213 customer_info( 'session_id' => $session_id );
219 sub change_ship { change_bill(@_); }
220 sub change_pay { change_bill(@_); }
222 sub _process_change_info {
223 my ($erroraction, @fields) = @_;
227 $results ||= edit_info (
228 'session_id' => $session_id,
229 map { ($_ => $cgi->param($_)) } grep { defined($cgi->param($_)) } @fields,
233 if ( $results->{'error'} ) {
235 $action = $erroraction;
239 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
246 sub process_change_bill {
247 _process_change_info( 'change_bill',
248 qw( first last company address1 address2 city state
249 county zip country daytime night fax )
253 sub process_change_ship {
254 my @list = map { "ship_$_" }
255 qw( first last company address1 address2 city state
256 county zip country daytime night fax
258 if ($cgi->param('same') eq 'Y') {
259 foreach (@list) { $cgi->param($_, '') }
262 _process_change_info( 'change_ship', @list );
265 sub process_change_pay {
266 my $postal = $cgi->param( 'postal_invoicing' );
267 my $payby = $cgi->param( 'payby' );
269 qw( payby payinfo payinfo1 payinfo2 month year payname
270 address1 address2 city county state zip country auto paytype
271 paystate ss stateid stateid_state invoicing_list
273 push @list, 'postal_invoicing' if $postal;
274 unless ( $payby ne 'BILL'
276 || $cgi->param( 'invoicing_list' )
279 $action = 'change_pay';
283 'error' => '<FONT COLOR="#FF0000">Postal or email required.</FONT>',
286 _process_change_info( 'change_pay', @list );
291 $cgi->param('invnum') =~ /^(\d+)$/ or die "illegal invnum";
294 invoice( 'session_id' => $session_id,
301 list_invoices( 'session_id' => $session_id, );
305 my $customer_info = customer_info( 'session_id' => $session_id );
306 return $customer_info if ( $customer_info->{'error'} );
309 if ( $customer_info->{'invoicing_list'} ) {
310 my @requestor = split( /\s*\,\s*/, $customer_info->{'invoicing_list'} );
311 $requestor = $requestor[0] if scalar(@requestor);
314 return { 'requestor' => $requestor }
315 unless ($cgi->param('subject') && $cgi->param('message') &&
316 length($cgi->param('subject')) && length($cgi->param('message')));
318 create_ticket( 'session_id' => $session_id,
319 'subject' => $cgi->param('subject'),
320 'message' => $cgi->param('message'),
321 'requestor' => $requestor,
326 get_ticket( 'session_id' => $session_id,
327 'ticket_id' => ($cgi->param('ticket_id') || ''),
328 'subject' => ($cgi->param('subject') || ''),
329 'reply' => ($cgi->param('reply') || ''),
333 sub ticket_priority {
335 foreach ( $cgi->param ) {
336 if ( /^ticket(\d+)$/ ) {
337 # a 'ticket1001' param implies the existence of a 'priority1001' param
338 # but if that's empty, we need to send it as empty rather than forget
340 $values{$1} = $cgi->param("priority$1") || '';
343 $action = 'myaccount';
344 # this returns an updated customer_info for myaccount
345 adjust_ticket_priority( 'session_id' => $session_id,
346 'values' => \%values );
349 sub customer_order_pkg {
350 my $init_data = signup_info( 'customer_session_id' => $session_id );
351 return $init_data if ( $init_data->{'error'} );
353 my $customer_info = customer_info( 'session_id' => $session_id );
354 return $customer_info if ( $customer_info->{'error'} );
356 my $pkgselect = mason_comp(
357 'session_id' => $session_id,
358 'comp' => '/edit/cust_main/first_pkg/select-part_pkg.html',
359 'args' => [ 'password_verify' => 1,
360 'onchange' => 'enable_order_pkg()',
362 'empty_label' => 'Select package',
366 $pkgselect = $pkgselect->{'error'} || $pkgselect->{'output'};
369 ( map { $_ => $init_data->{$_} }
370 qw( part_pkg security_phrase svc_acct_pop ),
373 'pkg_selector' => $pkgselect,
377 sub customer_change_pkg {
378 my $init_data = signup_info( 'customer_session_id' => $session_id );
379 return $init_data if ( $init_data->{'error'} );
381 my $customer_info = customer_info( 'session_id' => $session_id );
382 return $customer_info if ( $customer_info->{'error'} );
385 ( map { $_ => $init_data->{$_} }
386 qw( part_pkg security_phrase svc_acct_pop ),
388 ( map { $_ => $cgi->param($_) }
395 sub process_order_pkg {
399 my @params = (qw( custnum pkgpart ));
401 if ( $cgi->param('pkgpart_svcpart') =~ /^(\d+)_(\d+)$/ ) {
402 $cgi->param('pkgpart', $1);
403 $cgi->param('svcpart', $2);
404 push @params, 'svcpart';
405 $svcdb = $cgi->param('svcdb');
406 push @params, 'domsvc' if $svcdb eq 'svc_acct';
411 if ( $svcdb eq 'svc_acct' ) {
413 push @params, qw( username _password _password2 sec_phrase popnum );
415 unless ( length($cgi->param('_password')) ) {
416 my $init_data = signup_info( 'customer_session_id' => $session_id );
417 $results = { 'error' => $init_data->{msgcat}{empty_password} };
418 $results = { 'error' => $init_data->{error} } if($init_data->{error});
420 if ( $cgi->param('_password') ne $cgi->param('_password2') ) {
421 my $init_data = signup_info( 'customer_session_id' => $session_id );
422 $results = { 'error' => $init_data->{msgcat}{passwords_dont_match} };
423 $results = { 'error' => $init_data->{error} } if($init_data->{error});
424 $cgi->param('_password', '');
425 $cgi->param('_password2', '');
428 } elsif ( $svcdb eq 'svc_phone' ) {
430 push @params, qw( phonenum sip_password pin phone_name );
433 die "$svcdb not handled on process_order_pkg yet";
436 $results ||= order_pkg (
437 'session_id' => $session_id,
438 map { $_ => $cgi->param($_) } @params
442 if ( $results->{'error'} ) {
443 $action = 'customer_order_pkg';
446 %{customer_order_pkg()},
447 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
455 sub process_change_pkg {
459 $results ||= change_pkg (
460 'session_id' => $session_id,
461 map { $_ => $cgi->param($_) }
466 if ( $results->{'error'} ) {
467 $action = 'customer_change_pkg';
470 %{customer_change_pkg()},
471 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
479 sub process_suspend_pkg {
481 $results = suspend_pkg (
482 'session_id' => $session_id,
483 map { $_ => $cgi->param($_) }
486 if ( $results->{'error'} ) {
487 $action = 'provision';
489 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
497 sub process_order_recharge {
501 $results ||= order_recharge (
502 'session_id' => $session_id,
503 map { $_ => $cgi->param($_) }
508 if ( $results->{'error'} ) {
509 $action = 'view_usage';
510 if ($results->{'error'} eq '_decline') {
511 $results->{'error'} = "There has been an error processing your account. Please contact customer support."
516 'error' => '<FONT COLOR="#FF0000">'. $results->{'error'}. '</FONT>',
526 my $payment_info = payment_info( 'session_id' => $session_id );
528 my $tr_amount_fee = mason_comp(
529 'session_id' => $session_id,
530 'comp' => '/elements/tr-amount_fee.html',
531 'args' => [ 'amount' => $payment_info->{'balance'},
535 $tr_amount_fee = $tr_amount_fee->{'error'} || $tr_amount_fee->{'output'};
537 $payment_info->{'tr_amount_fee'} = $tr_amount_fee;
542 sub payment_results {
544 use Business::CreditCard 0.30;
546 #we should only do basic checking here for DoS attacks and things
547 #that couldn't be constructed by the web form... let process_payment() do
548 #the rest, it gives better error messages
550 $cgi->param('amount') =~ /^\s*(\d+(\.\d{2})?)\s*$/
551 or die "Illegal amount: ". $cgi->param('amount'); #!!!
554 my $payinfo = $cgi->param('payinfo');
555 $payinfo =~ s/[^\dx]//g;
556 $payinfo =~ /^([\dx]{13,16}|[\dx]{8,9})$/
557 #or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo;
558 or die "illegal card"; #!!!
560 unless ( $payinfo =~ /x/ ) {
562 #or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo;
563 or die "invalid card"; #!!!
566 if ( $cgi->param('card_type') ) {
567 cardtype($payinfo) eq $cgi->param('card_type')
568 #or $error ||= $init_data->{msgcat}{not_a}. $cgi->param('CARD_type');
569 or die "not a ". $cgi->param('card_type');
572 $cgi->param('paycvv') =~ /^\s*(.{0,4})\s*$/ or die "illegal CVV2";
575 $cgi->param('month') =~ /^(\d{2})$/ or die "illegal month";
577 $cgi->param('year') =~ /^(\d{4})$/ or die "illegal year";
580 $cgi->param('payname') =~ /^(.{0,80})$/ or die "illegal payname";
583 $cgi->param('address1') =~ /^(.{0,80})$/ or die "illegal address1";
586 $cgi->param('address2') =~ /^(.{0,80})$/ or die "illegal address2";
589 $cgi->param('city') =~ /^(.{0,80})$/ or die "illegal city";
592 $cgi->param('state') =~ /^(.{0,80})$/ or die "illegal state";
595 $cgi->param('zip') =~ /^(.{0,10})$/ or die "illegal zip";
598 $cgi->param('country') =~ /^(.{0,2})$/ or die "illegal country";
602 $save = 1 if $cgi->param('save');
605 $auto = 1 if $cgi->param('auto');
607 $cgi->param('paybatch') =~ /^([\w\-\.]+)$/ or die "illegal paybatch";
610 $cgi->param('discount_term') =~ /^(\d*)$/ or die "illegal discount_term";
611 my $discount_term = $1;
615 'session_id' => $session_id,
618 'payinfo' => $payinfo,
622 'payname' => $payname,
623 'address1' => $address1,
624 'address2' => $address2,
628 'country' => $country,
631 'paybatch' => $paybatch,
632 'discount_term' => $discount_term,
637 sub make_ach_payment {
638 payment_info( 'session_id' => $session_id );
641 sub ach_payment_results {
643 #we should only do basic checking here for DoS attacks and things
644 #that couldn't be constructed by the web form... let process_payment() do
645 #the rest, it gives better error messages
647 $cgi->param('amount') =~ /^\s*(\d+(\.\d{2})?)\s*$/
648 or die "illegal amount"; #!!!
651 my $payinfo1 = $cgi->param('payinfo1');
652 $payinfo1 =~ s/[^\dx]//g;
653 $payinfo1 =~ /^([\dx]+)$/
654 or die "illegal account"; #!!!
657 my $payinfo2 = $cgi->param('payinfo2');
658 $payinfo2 =~ s/[^\dx]//g;
659 $payinfo2 =~ /^([\dx]+)$/
660 or die "illegal ABA/routing code"; #!!!
663 $cgi->param('payname') =~ /^(.{0,80})$/ or die "illegal payname";
666 $cgi->param('paystate') =~ /^(.{0,2})$/ or die "illegal paystate";
669 $cgi->param('paytype') =~ /^(.{0,80})$/ or die "illegal paytype";
672 $cgi->param('ss') =~ /^(.{0,80})$/ or die "illegal ss";
675 $cgi->param('stateid') =~ /^(.{0,80})$/ or die "illegal stateid";
678 $cgi->param('stateid_state') =~ /^(.{0,2})$/ or die "illegal stateid_state";
679 my $stateid_state = $1;
682 $save = 1 if $cgi->param('save');
685 $auto = 1 if $cgi->param('auto');
687 $cgi->param('paybatch') =~ /^([\w\-\.]+)$/ or die "illegal paybatch";
691 'session_id' => $session_id,
694 'payinfo1' => $payinfo1,
695 'payinfo2' => $payinfo2,
698 'payname' => $payname,
699 'paytype' => $paytype,
700 'paystate' => $paystate,
702 'stateid' => $stateid,
703 'stateid_state' => $stateid_state,
706 'paybatch' => $paybatch,
711 sub make_thirdparty_payment {
712 my $payment_info = payment_info('session_id' => $session_id);
713 $cgi->param('payby_method') =~ /^(CC|ECHECK|PAYPAL)$/
714 or die "illegal payby method";
715 $payment_info->{'payby_method'} = $1;
716 $payment_info->{'error'} = $cgi->param('error');
721 sub post_thirdparty_payment {
722 $cgi->param('payby_method') =~ /^(CC|ECHECK|PAYPAL)$/
723 or die "illegal payby method";
725 $cgi->param('amount') =~ /^(\d+(\.\d*)?)$/
726 or die "illegal amount";
728 my $result = start_thirdparty(
729 'session_id' => $session_id,
733 if ( $result->{error} ) {
734 $cgi->param('action', 'make_thirdparty_payment');
735 $cgi->param('error', $result->{error});
736 print $cgi->redirect( $cgi->self_url );
743 sub finish_thirdparty_payment {
744 my %param = $cgi->Vars;
745 finish_thirdparty( 'session_id' => $session_id, %param );
746 # result contains either 'error' => error message, or the payment details
749 sub cancel_thirdparty_payment {
750 $action = 'make_thirdparty_payment';
751 finish_thirdparty( 'session_id' => $session_id, '_cancel' => 1 );
754 sub make_term_payment {
755 $cgi->param('amount') =~ /^(\d+\.\d{2})$/
756 or die "illegal payment amount";
758 $cgi->param('discount_term') =~ /^(\d+)$/
759 or die "illegal discount term";
760 my $discount_term = $1;
761 $action = 'make_payment';
762 ({ %{payment_info( 'session_id' => $session_id )},
763 'balance' => $balance,
764 'discount_term' => $discount_term,
768 sub recharge_prepay {
769 customer_info( 'session_id' => $session_id );
772 sub recharge_results {
774 my $prepaid_cardnum = $cgi->param('prepaid_cardnum');
775 $prepaid_cardnum =~ s/\W//g;
776 $prepaid_cardnum =~ /^(\w*)$/ or die "illegal prepaid card number";
777 $prepaid_cardnum = $1;
779 process_prepay ( 'session_id' => $session_id,
780 'prepaid_cardnum' => $prepaid_cardnum,
785 FS::SelfService::logout( 'session_id' => $session_id );
789 my $result = did_report( 'session_id' => $session_id,
790 'format' => $cgi->param('type'),
791 'recentonly' => $cgi->param('recentonly'),
793 die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
798 my $result = list_pkgs( 'session_id' => $session_id );
799 die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
800 $result->{'pkgpart'} = $cgi->param('pkgpart') if $cgi->param('pkgpart');
801 $result->{'filter'} = $cgi->param('filter') if $cgi->param('filter');
807 my $result = part_svc_info(
808 'session_id' => $session_id,
809 map { $_ => $cgi->param($_) } qw( pkgnum svcpart svcnum ),
811 die $result->{'error'} if exists $result->{'error'} && $result->{'error'};
813 $result->{'svcdb'} =~ /^svc_(.*)$/
814 #or return { 'error' => 'Unknown svcdb '. $result->{'svcdb'} };
815 or die 'Unknown svcdb '. $result->{'svcdb'};
818 $result->{'numavail'} = $cgi->param('numavail');
819 $result->{'lnp'} = $cgi->param('lnp');
824 sub process_svc_phone {
825 my @bulkdid = $cgi->param('bulkdid');
826 my $phonenum = $cgi->param('phonenum');
827 my $lnp = $cgi->param('lnp');
831 $result = provision_phone (
832 'session_id' => $session_id,
833 'countrycode' => '1',
834 map { $_ => $cgi->param($_) } qw( pkgnum svcpart phonenum
835 lnp_desired_due_date lnp_other_provider
836 lnp_other_provider_account )
839 $result = provision_phone (
840 'session_id' => $session_id,
841 'bulkdid' => [ @bulkdid ],
842 'countrycode' => '1',
843 map { $_ => $cgi->param($_) } qw( pkgnum svcpart phonenum svcnum email forwarddst )
847 if ( exists $result->{'error'} && $result->{'error'} ) {
848 $action = 'provision_svc_phone';
851 %{ part_svc_info( 'session_id' => $session_id,
852 map { $_ => $cgi->param($_) } qw( pkgnum svcpart svcnum )
855 'error' => $result->{'error'},
862 sub process_svc_acct {
864 my $result = provision_acct (
865 'session_id' => $session_id,
866 map { $_ => $cgi->param($_) } qw(
867 pkgnum svcpart username domsvc _password _password2 sec_phrase popnum )
870 if ( exists $result->{'error'} && $result->{'error'} ) {
871 #warn "$result $result->{'error'}";
872 $action = 'provision_svc_acct';
875 %{ part_svc_info( 'session_id' => $session_id,
876 map { $_ => $cgi->param($_) } qw( pkgnum svcpart )
879 'error' => $result->{'error'},
882 #warn "$result $result->{'error'}";
888 sub process_svc_external {
890 'session_id' => $session_id,
891 map { $_ => $cgi->param($_) } qw( pkgnum svcpart )
897 'session_id' => $session_id,
898 'svcnum' => $cgi->param('svcnum'),
904 'session_id' => $session_id,
905 'svcdb' => [ 'svc_acct', 'svc_phone', 'svc_port', ],
910 sub real_port_graph {
911 my $svcnum = $cgi->param('svcnum');
912 my $res = port_graph(
913 'session_id' => $session_id,
915 'beginning' => str2time($cgi->param('start')." 00:00:00"),
916 'ending' => str2time($cgi->param('end') ." 23:59:59"),
918 my @usage = @{$res->{'usage'}};
919 my $png = $usage[0]->{'png'};
920 { 'content' => $png, 'format' => 'png' };
923 sub view_port_graph {
924 my $svcnum = $cgi->param('svcnum');
925 { 'svcnum' => $svcnum,
926 'start' => $cgi->param($svcnum.'_start'),
927 'end' => $cgi->param($svcnum.'_end'),
931 sub view_usage_details {
933 'session_id' => $session_id,
934 'svcnum' => $cgi->param('svcnum'),
935 'beginning' => $cgi->param('beginning') || '',
936 'ending' => $cgi->param('ending') || '',
940 sub view_cdr_details {
942 'session_id' => $session_id,
943 'svcnum' => $cgi->param('svcnum'),
944 'beginning' => $cgi->param('beginning') || '',
945 'ending' => $cgi->param('ending') || '',
946 'inbound' => $cgi->param('inbound') || 0,
950 sub view_support_details {
952 'session_id' => $session_id,
953 'svcnum' => $cgi->param('svcnum'),
954 'beginning' => $cgi->param('beginning') || '',
955 'ending' => $cgi->param('ending') || '',
959 sub change_password {
961 'session_id' => $session_id,
962 'svcdb' => 'svc_acct',
966 sub process_change_password {
968 my $result = myaccount_passwd(
969 'session_id' => $session_id,
970 map { $_ => $cgi->param($_) } qw( svcnum new_password new_password2 )
973 if ( exists $result->{'error'} && $result->{'error'} ) {
975 $action = 'change_password';
978 %{ list_svcs( 'session_id' => $session_id,
979 'svcdb' => 'svc_acct',
982 #'svcnum' => $cgi->param('svcnum'),
983 'error' => $result->{'error'}
1001 $fill_in->{'selfurl'} = $cgi->self_url;
1002 $fill_in->{'cgi'} = \$cgi;
1003 $fill_in->{'error'} = $cgi->param('error') if $cgi->param('error');
1005 my $access_info = ($session_id and $session_id ne 'login')
1006 ? access_info( 'session_id' => $session_id )
1008 $fill_in->{$_} = $access_info->{$_} foreach keys %$access_info;
1010 # update the user's authentication
1011 my $timeout = $access_info->{'timeout'} || '60';
1012 my $cookie = CGI::Cookie->new('-name' => 'session',
1013 '-value' => $session_id,
1014 '-expires' => '+'.$timeout,
1015 #'-secure' => 1, # would be a good idea...
1017 if ( $name eq 'logout' ) {
1018 $cookie->expires(0);
1021 if ( $fill_in->{'format'} ) {
1022 # then override content-type, and return $fill_in->{'content'} instead
1023 # of filling in a template
1024 if ( $fill_in->{'format'} eq 'csv') {
1025 print $cgi->header('-expires' => 'now',
1026 '-Content-Type' => 'text/csv',
1027 '-Content-Disposition' => "attachment;filename=output.csv",
1029 } elsif ( $fill_in->{'format'} eq 'xls' ) {
1030 print $cgi->header('-expires' => 'now',
1031 '-Content-Type' => 'application/vnd.ms-excel',
1032 '-Content-Disposition' => "attachment;filename=output.xls",
1033 '-Content-Length' => length($fill_in->{'content'}),
1035 } elsif ( $fill_in->{'format'} eq 'png' ) {
1036 print $cgi->header('-expires' => 'now',
1037 '-Content-Type' => 'image/png',
1040 print $fill_in->{'content'};
1041 } else { # the usual case
1042 my $source = "$template_dir/$name.html";
1043 my $template = new Text::Template(
1046 DELIMITERS => [ '<%=', '%>' ],
1049 or die $Text::Template::ERROR;
1051 my $data = $template->fill_in(
1052 PACKAGE => 'FS::SelfService::_selfservicecgi',
1054 ) || "Error processing template $source"; # at least print _something_
1055 print $cgi->header( '-cookie' => $cookie,
1056 '-expires' => 'now' );
1061 #*FS::SelfService::_selfservicecgi::include = \&Text::Template::fill_in_file;
1063 package FS::SelfService::_selfservicecgi;
1066 use FS::SelfService qw(
1067 regionselector popselector domainselector location_form didselector
1070 #false laziness w/agent.cgi
1071 use vars qw(@INCLUDE_ARGS);
1077 my $template = new Text::Template( TYPE => 'FILE',
1078 SOURCE => "$main::template_dir/$name.html",
1079 DELIMITERS => [ '<%=', '%>' ],
1082 or die $Text::Template::ERROR;
1084 $template->fill_in( PACKAGE => 'FS::SelfService::_selfservicecgi',