diff options
| author | ivan <ivan> | 2007-10-27 04:46:21 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2007-10-27 04:46:21 +0000 | 
| commit | a97d99dbd4e56f1b0bf1b0de3ed17e56430add96 (patch) | |
| tree | 53ed54b80f7614815b3f3bee675f530175ff6e08 | |
| parent | 2de7369e9d05cb8009d8a8bb9d489a2d315db1d6 (diff) | |
simple payment receipts in web interface, sorry arnie, RT#2738
| -rw-r--r-- | FS/FS/cust_main.pm | 12 | ||||
| -rw-r--r-- | FS/FS/cust_pay.pm | 69 | ||||
| -rw-r--r-- | httemplate/misc/process/payment.cgi | 37 | ||||
| -rwxr-xr-x | httemplate/search/cust_pay.cgi | 12 | ||||
| -rw-r--r-- | httemplate/view/cust_main/payment_history.html | 6 | ||||
| -rw-r--r-- | httemplate/view/cust_pay.html | 126 | 
6 files changed, 240 insertions, 22 deletions
| diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 9dd1472c8..1a67c03cb 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -2437,7 +2437,7 @@ L<http://420.am/business-onlinepayment> for supported gateways.  Available methods are: I<CC>, I<ECHECK> and I<LEC> -Available options are: I<description>, I<invnum>, I<quiet> +Available options are: I<description>, I<invnum>, I<quiet>, I<paynum_ref>  The additional options I<payname>, I<address1>, I<address2>, I<city>, I<state>,  I<zip>, I<payinfo> and I<paydate> are also available.  Any of these options, @@ -2452,6 +2452,9 @@ call the B<apply_payments> method.  I<quiet> can be set true to surpress email decline notices. +I<paynum_ref> can be set to a scalar reference.  It will be filled in with the +resulting paynum, if any. +  (moved from cust_bill) (probably should get realtime_{card,ach,lec} here too)  =back @@ -2801,6 +2804,11 @@ sub realtime_bop {          return $e;        }      } + +    if ( $options{'paynum_ref'} ) { +      ${ $options{'paynum_ref'} } = $cust_pay->paynum; +    } +      return ''; #no error    } else { @@ -2889,7 +2897,7 @@ sub default_payment_gateway {    #load up config    my $bop_config = 'business-onlinepayment';    $bop_config .= '-ach' -    if $method eq 'ECHECK' && $conf->exists($bop_config. '-ach'); +    if $method =~ /^(ECHECK|CHEK)$/ && $conf->exists($bop_config. '-ach');    my ( $processor, $login, $password, $action, @bop_options ) =      $conf->config($bop_config);    $action ||= 'normal authorization'; diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm index 23bcdd93a..a98a40959 100644 --- a/FS/FS/cust_pay.pm +++ b/FS/FS/cust_pay.pm @@ -7,6 +7,7 @@ use Business::CreditCard;  use Text::Template;  use FS::Misc qw(send_email);  use FS::Record qw( dbh qsearch qsearchs ); +use FS::payby;  use FS::cust_main_Mixin;  use FS::payinfo_Mixin;  use FS::cust_bill; @@ -548,6 +549,74 @@ sub cust_main {    qsearchs( 'cust_main', { 'custnum' => $self->custnum } );  } +=item payby_name + +Returns a name for the payby field. + +=cut + +sub payby_name { +  my $self = shift; +  FS::payby->shortname( $self->payby ); +} + +=item gatewaynum + +Returns a gatewaynum for the processing gateway. + +=item processor + +Returns a name for the processing gateway. + +=item authorization + +Returns a name for the processing gateway. + +=item order_number + +Returns a name for the processing gateway. + +=cut + +sub gatewaynum    { shift->_parse_paybatch->{'gatewaynum'}; } +sub processor     { shift->_parse_paybatch->{'processor'}; } +sub authorization { shift->_parse_paybatch->{'authorization'}; } +sub order_number  { shift->_parse_paybatch->{'order_number'}; } + +#sucks that this stuff is in paybatch like this in the first place, +#but at least other code can start to use new field names +#(code nicked from FS::cust_main::realtime_refund_bop) +sub _parse_paybatch { +  my $self = shift; + +  $self->paybatch =~ /^((\d+)\-)?(\w+):\s*([\w\-\/ ]*)(:([\w\-]+))?$/ +    or return {}; +              #"Can't parse paybatch for paynum $options{'paynum'}: ". +              #  $cust_pay->paybatch; + +  my( $gatewaynum, $processor, $auth, $order_number ) = ( $2, $3, $4, $6 ); + +  if ( $gatewaynum ) { #gateway for the payment to be refunded + +    my $payment_gateway = +      qsearchs('payment_gateway', { 'gatewaynum' => $gatewaynum } ); + +    die "payment gateway $gatewaynum not found" #? +      unless $payment_gateway; + +    $processor = $payment_gateway->gateway_module; + +  } + +  { +    'gatewaynum'    => $gatewaynum, +    'processor'     => $processor, +    'authorization' => $auth, +    'order_number'  => $order_number, +  }; + +} +  =back  =head1 BUGS diff --git a/httemplate/misc/process/payment.cgi b/httemplate/misc/process/payment.cgi index 6377b13e8..71a4891cf 100644 --- a/httemplate/misc/process/payment.cgi +++ b/httemplate/misc/process/payment.cgi @@ -1,11 +1,18 @@ -<% include( '/elements/header.html', ucfirst($type{$payby}). ' processing successful', -             include('/elements/menubar.html'), +% if ( $cgi->param('batch') ) { -    ) -%> -<% include( '/elements/small_custview.html', $cust_main, '', '', popurl(3). "view/cust_main.cgi" ) %> +  <% include( '/elements/header.html', ucfirst($type{$payby}). ' processing successful', +                 include('/elements/menubar.html'), -<% include('/elements/footer.html') %> +            ) +  %> + +  <% include( '/elements/small_custview.html', $cust_main, '', '', popurl(3). "view/cust_main.cgi" ) %> + +  <% include('/elements/footer.html') %> + +% } else { +<% $cgi->redirect(popurl(3). "view/cust_pay.html?paynum=$paynum" ) %> +% }  <%init>  #some false laziness w/MyAccount::process_payment @@ -99,6 +106,7 @@ if ( $payby eq 'CHEK' ) {  }  my $error = ''; +my $paynum = '';  if ( $cgi->param('batch') ) {    $error = $cust_main->batch_card( @@ -110,18 +118,19 @@ if ( $cgi->param('batch') ) {                                     map { $_ => $cgi->param($_) }                                        @{$payby2fields{$payby}}                                   ); -  errotpage($error) if $error; +  errorpage($error) if $error;  } else {    $error = $cust_main->realtime_bop( $FS::payby::payby2bop{$payby}, $amount, -    'quiet'     => 1, -    'manual'    => 1, -    'payinfo'   => $payinfo, -    'paydate'   => "$year-$month-01", -    'payname'   => $payname, -    'payunique' => $payunique, -    'paycvv'    => $paycvv, +    'quiet'      => 1, +    'manual'     => 1, +    'payinfo'    => $payinfo, +    'paydate'    => "$year-$month-01", +    'payname'    => $payname, +    'payunique'  => $payunique, +    'paycvv'     => $paycvv, +    'paynum_ref' => \$paynum,      map { $_ => $cgi->param($_) } @{$payby2fields{$payby}}    );    errorpage($error) if $error; diff --git a/httemplate/search/cust_pay.cgi b/httemplate/search/cust_pay.cgi index 0eefd2b50..2166eb16d 100755 --- a/httemplate/search/cust_pay.cgi +++ b/httemplate/search/cust_pay.cgi @@ -37,10 +37,10 @@                   #'align' => 'lrrrll',                   'align' => 'rrr'.FS::UI::Web::cust_aligns(),                   'links' => [ -                   '', -                   '', -                   '', -                   ( map { $_ ne 'Cust. Status' ? $link : '' } +                   $link, +                   $link, +                   $link, +                   ( map { $_ ne 'Cust. Status' ? $cust_link : '' }                           FS::UI::Web::cust_header()                     ),                   ], @@ -226,7 +226,9 @@ if ( $cgi->param('magic') ) {  } -my $link = sub { +my $link = [ "${p}view/cust_pay.html?paynum=", 'paynum' ]; + +my $cust_link = sub {    my $cust_pay = shift;    $cust_pay->cust_main_custnum      ? [ "${p}view/cust_main.cgi?", 'custnum' ]  diff --git a/httemplate/view/cust_main/payment_history.html b/httemplate/view/cust_main/payment_history.html index b2d98cc55..81ccc6d9c 100644 --- a/httemplate/view/cust_main/payment_history.html +++ b/httemplate/view/cust_main/payment_history.html @@ -161,6 +161,10 @@  %    }  %  }  % +%  my $view = qq! (<A HREF="javascript:void(0);" onClick="overlib( OLiframeContent('${p}view/cust_pay.html?link=popup;paynum=!. +%             $cust_pay->paynum. +%             qq!', 540, 336, 'view_cust_pay_popup' ), CAPTION, 'Payment Receipt', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, DRAGGABLE, CLOSECLICK ); return false;">view receipt</A>)!; +%  %  my $refund = '';  %  my $refund_days = $conf->config('card_refund-days') || 120;  %  if (    $cust_pay->closed !~ /^Y/i @@ -229,7 +233,7 @@  %  push @history, {  %    'date'    => $cust_pay->_date,  %    'desc'    => $pre. "Payment$post$info$desc". -%                 "$apply$refund$void$delete$unapply", +%                 "$view$apply$refund$void$delete$unapply",  %    'payment' => $cust_pay->paid,  %    'target'  => $target,  %  }; diff --git a/httemplate/view/cust_pay.html b/httemplate/view/cust_pay.html new file mode 100644 index 000000000..2d1a22b07 --- /dev/null +++ b/httemplate/view/cust_pay.html @@ -0,0 +1,126 @@ +% if ( $link eq 'popup' ) {  + +  <% include('/elements/header-popup.html', "Payment Receipt" ) %> + +  <CENTER><A HREF="javascript:self.parent.location = '<% $pr_link %>'">Print</A></CENTER><BR> + +% } elsif ( $link eq 'print' ) {  + +  <% include('/elements/header-popup.html', "Payment Receipt" ) %> + +% } else {  + +  <% include('/elements/header.html', "Payment Receipt", menubar( +       "View this customer (#$custnum)" => "${p}view/cust_main.cgi?$custnum", +       'Print receipt' => $pr_link, +     )) +  %> + +% } + +% unless ($link eq 'popup' ) { +  <% include('/elements/small_custview.html', +               $custnum, +               scalar($conf->config('countrydefault')), +               1, #no balance +            ) +  %> +  <BR><BR> +% }  + +<% ntable("#cccccc", 2) %> + +<TR> +  <TD ALIGN="right">Payment#</TD> +  <TD BGCOLOR="#FFFFFF"><B><% $cust_pay->paynum %></B></TD> +</TR> + +<TR> +  <TD ALIGN="right">Date</TD> +  <TD BGCOLOR="#FFFFFF"><B><% time2str"%a %b %o, %Y %r", $cust_pay->_date %></B></TD> +</TR> + +<TR> +  <TD ALIGN="right">Amount</TD> +  <TD BGCOLOR="#FFFFFF"><B><% $money_char. $cust_pay->paid %></B></TD> +</TR> + +<TR> +  <TD ALIGN="right">Payment method</TD> +  <TD BGCOLOR="#FFFFFF"><B><% $cust_pay->payby_name %> #<% $cust_pay->paymask %></B></TD> +</TR> + +% if ( $cust_pay->payby =~ /^(CARD|CHEK|LECB)$/ && $cust_pay->paybatch ) {  + +    <TR> +      <TD ALIGN="right">Processor</TD> +      <TD BGCOLOR="#FFFFFF"><B><% $cust_pay->processor %></B></TD> +    </TR> + +    <TR> +      <TD ALIGN="right">Authorization#</TD> +      <TD BGCOLOR="#FFFFFF"><B><% $cust_pay->authorization %></B></TD> +    </TR> + +%   if ( $cust_pay->order_number ) { +      <TR> +        <TD ALIGN="right">Order#</TD> +        <TD BGCOLOR="#FFFFFF"><B><% $cust_pay->order_number %></B></TD> +      </TR> +%   } + +% } + +</TABLE> + +% if ( $link eq 'print' ) { + +  <SCRIPT TYPE="text/javascript"> +    window.print(); +  </SCRIPT> + +% } + +% if ( $link =~ /^(popup|print)$/ ) {  +    </BODY> +  </HTML> +% } else { +  <% include('/elements/footer.html') %> +% } + +<%init> + +my $curuser = $FS::CurrentUser::CurrentUser; + +die "access denied" +  unless $curuser->access_right('View invoices') #remove this in 1.9 +      || $curuser->access_right('View customer payments'); + +$cgi->param('paynum') =~ /^(\d+)$/ or die "no paynum"; +my $paynum = $1; + +my $link = ''; +if ( $cgi->param('link') =~ /^(\w+)$/ ) { +  $link = $1; +} + +my $cust_pay = qsearchs({ +  'select'    => 'cust_pay.*', +  'table'     => 'cust_pay', +  'addl_from' => 'LEFT JOIN cust_main USING ( custnum )', +  'hashref'   => { 'paynum' => $paynum }, +  'extra_sql' => ' AND '. $FS::CurrentUser::CurrentUser->agentnums_sql, +}); +die "Payment #$paynum not found!" unless $cust_pay; + +my $pr_link = "${p}view/cust_pay.html?link=print;paynum=$paynum"; + +my $custnum = $cust_pay->custnum; + +my $conf = new FS::Conf; + +my $money_char = $conf->config('money_char') || '$'; + +tie my %payby, 'Tie::IxHash', FS::payby->payby2longname; + +</%init> | 
