From: Christopher Burger Date: Mon, 9 Jul 2018 12:27:53 +0000 (-0400) Subject: RT# 74435 - Fixed error with refund link on payment history page not allowing batch... X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=a90d069b1f1d814a91bf7cb3eb0d7ac9fdec7e08 RT# 74435 - Fixed error with refund link on payment history page not allowing batch refund when batch payment was made. Conflicts: FS/FS/cust_main/Billing_Realtime.pm httemplate/view/cust_main/menu.html --- diff --git a/FS/FS/cust_main/Billing_Realtime.pm b/FS/FS/cust_main/Billing_Realtime.pm index ae41c70c4..c503b45e6 100644 --- a/FS/FS/cust_main/Billing_Realtime.pm +++ b/FS/FS/cust_main/Billing_Realtime.pm @@ -1479,7 +1479,7 @@ sub realtime_refund_bop { $self->agent->payment_gateway( 'method' => $options{method}, #'payinfo' => $payinfo, ); - my( $processor, $login, $password, $namespace ) = + ( $processor, $login, $password, $namespace ) = map { my $method = "gateway_$_"; $payment_gateway->$method } qw( module username password namespace ); diff --git a/httemplate/edit/cust_refund.cgi b/httemplate/edit/cust_refund.cgi index 473648f42..55f06642b 100755 --- a/httemplate/edit/cust_refund.cgi +++ b/httemplate/edit/cust_refund.cgi @@ -104,63 +104,25 @@ % } -% elsif ($payby eq 'CHEK') { -% - -% my @cust_payby = (); -% if ( $payby eq 'CARD' ) { -% @cust_payby = $cust_main->cust_payby('CARD','DCRD'); -% } elsif ( $payby eq 'CHEK' ) { -% @cust_payby = $cust_main->cust_payby('CHEK','DCHK'); -% } else { -% die "unknown payby $payby"; -% } -% -% my $custpaybynum = length(scalar($cgi->param('custpaybynum'))) -% ? scalar($cgi->param('custpaybynum')) -% : scalar(@cust_payby) && $cust_payby[0]->custpaybynum; -<& /elements/tr-select-cust_payby.html, - 'cust_payby' => \@cust_payby, - 'curr_value' => $custpaybynum, - 'onchange' => 'cust_payby_changed(this)', -&> - - -

-

-> - - -<& /elements/cust_payby_new.html, - 'cust_payby' => \@cust_payby, - 'curr_value' => $custpaybynum, -&> - -
-
+% elsif ($payby eq 'CHEK' || $payby eq 'CARD') { + +% if ( $conf->exists("batch-enable") +% || grep $payby eq $_, $conf->config('batch-enable_payby') +% ) { +% if ( grep $payby eq $_, $conf->config('realtime-disable_payby') ) { + +% } else { + + > +    <% mt('Add to current batch') |h %> + +% } +% } -% } else { +% } else { - % } -

- <& /elements/tr-select-reason.html, 'field' => 'reasonnum', 'reason_class' => 'F', @@ -193,16 +155,18 @@ my $payby = $cgi->param('payby'); my $payinfo = $cgi->param('payinfo'); my $reason = $cgi->param('reason'); my $link = $cgi->param('popup') ? 'popup' : ''; +my $batch = $cgi->param('batch'); die "access denied" unless $FS::CurrentUser::CurrentUser->refund_access_right($payby); -my( $paynum, $cust_pay ) = ( '', '' ); +my( $paynum, $cust_pay, $batchnum ) = ( '', '', '' ); if ( $cgi->param('paynum') =~ /^(\d+)$/ ) { $paynum = $1; $cust_pay = qsearchs('cust_pay', { paynum=>$paynum } ) or die "unknown payment # $paynum"; $refund ||= $cust_pay->unrefunded; + $batchnum = $cust_pay->batchnum; if ( $custnum ) { die "payment # $paynum is not for specified customer # $custnum" unless $custnum == $cust_pay->custnum; diff --git a/httemplate/edit/process/cust_refund.cgi b/httemplate/edit/process/cust_refund.cgi index 8dbe4fc63..49aedf3fe 100755 --- a/httemplate/edit/process/cust_refund.cgi +++ b/httemplate/edit/process/cust_refund.cgi @@ -53,137 +53,6 @@ if ( $error ) { 'CHEK' => 'electronic check (ACH)', ); -my( $cust_payby, $payinfo, $paycvv, $month, $year, $payname ); -my $paymask = ''; -if ( (my $custpaybynum = scalar($cgi->param('custpaybynum'))) > 0 ) { - - ## - # use stored cust_payby info - ## - - $cust_payby = qsearchs('cust_payby', { custnum => $custnum, - custpaybynum => $custpaybynum, } ) - or die "unknown custpaybynum $custpaybynum"; - - # not needed for realtime_bop, but still needed for batch_card - $payinfo = $cust_payby->payinfo; - $paymask = $cust_payby->paymask; - $paycvv = $cust_payby->paycvv; # pass it if we got it, running a transaction will clear it - ( $month, $year ) = $cust_payby->paydate_mon_year; - $payname = $cust_payby->payname; - $cgi->param(-name=>"paytype", -value=>$cust_payby->paytype) unless $cgi->param("paytype"); - -} else { - - ## - # use new info - ## - - $cgi->param('year') =~ /^(\d+)$/ - or errorpage("illegal year ". $cgi->param('year')); - $year = $1; - - $cgi->param('month') =~ /^(\d+)$/ - or errorpage("illegal month ". $cgi->param('month')); - $month = $1; - - $cgi->param('payname') =~ /^([\w \,\.\-\']+)$/ - or errorpage(gettext('illegal_name'). " payname: ". $cgi->param('payname')); - $payname = $1; - - if ( $payby eq 'CHEK' ) { - - $cgi->param('payinfo1') =~ /^(\d+)$/ - or errorpage("Illegal account number ". $cgi->param('payinfo1')); - my $payinfo1 = $1; - $cgi->param('payinfo2') =~ /^(\d+)$/ - or errorpage("Illegal ABA/routing number ". $cgi->param('payinfo2')); - my $payinfo2 = $1; - if ( $conf->config('echeck-country') eq 'CA' ) { - $cgi->param('payinfo3') =~ /^(\d{5})$/ - or errorpage("Illegal branch number ". $cgi->param('payinfo2')); - $payinfo2 = "$1.$payinfo2"; - } - $payinfo = $payinfo1 . '@'. $payinfo2; - - } elsif ( $payby eq 'CARD' ) { - - $payinfo = $cgi->param('payinfo'); - - $payinfo =~ s/\D//g; - $payinfo =~ /^(\d{13,19}|\d{8,9})$/ - or errorpage(gettext('invalid_card')); - $payinfo = $1; - validate($payinfo) - or errorpage(gettext('invalid_card')); - - unless ( $cust_main->tokenized($payinfo) ) { #token - - my $cardtype = cardtype($payinfo); - - errorpage(gettext('unknown_card_type')) - if $cardtype eq "Unknown"; - - my %bop_card_types = map { $_=>1 } values %{ card_types() }; - errorpage("$cardtype not accepted") unless $bop_card_types{$cardtype}; - - } - - if ( length($cgi->param('paycvv') ) ) { - if ( cardtype($payinfo) eq 'American Express card' ) { - $cgi->param('paycvv') =~ /^(\d{4})$/ - or errorpage("CVV2 (CID) for American Express cards is four digits."); - $paycvv = $1; - } else { - $cgi->param('paycvv') =~ /^(\d{3})$/ - or errorpage("CVV2 (CVC2/CID) is three digits."); - $paycvv = $1; - } - } elsif ( $conf->exists('backoffice-require_cvv') ){ - errorpage("CVV2 is required"); - } - - } else { - die "unknown payby $payby"; - } - - # save first, for proper tokenization - if ( $cgi->param('save') ) { - - my %saveopt; - if ( $payby eq 'CARD' ) { - my $bill_location = FS::cust_location->new; - $bill_location->set( $_ => scalar($cgi->param($_)) ) - foreach @{$payby2fields{$payby}}; - $saveopt{'bill_location'} = $bill_location; - $saveopt{'paycvv'} = $paycvv; # save_cust_payby contains conf logic for when to use this - $saveopt{'paydate'} = "$year-$month-01"; - } else { - # ss/stateid/stateid_state won't be saved, but should be harmless to pass - %saveopt = map { $_ => scalar($cgi->param($_)) } @{$payby2fields{$payby}}; - } - - my $error = $cust_main->save_cust_payby( - 'saved_cust_payby' => \$cust_payby, - 'payment_payby' => $payby, - 'auto' => scalar($cgi->param('auto')), - 'weight' => scalar($cgi->param('weight')), - 'payinfo' => $payinfo, - 'payname' => $payname, - %saveopt - ); - - errorpage("error saving info, payment not processed: $error") - if $error; - - } elsif ( $payby eq 'CARD' ) { # not saving - - $paymask = FS::payinfo_Mixin->mask_payinfo('CARD',$payinfo); # for untokenized but tokenizable payinfo - - } - -} - ## # now run the refund ## @@ -193,46 +62,45 @@ if ( (my $custpaybynum = scalar($cgi->param('custpaybynum'))) > 0 ) { my $refund = "$1$2"; $cgi->param('paynum') =~ /^(\d*)$/ or die "Illegal paynum!"; my $paynum = $1; - my $paydate; - if ($cust_payby->paydate) { $paydate = "$year-$month-01"; } - else { $paydate = "2037-12-01"; } + #my $paydate; + my $paydate = $cgi->param('exp_year'). '-'. $cgi->param('exp_month'). '-01'; + #unless ($paynum) { + # if ($cust_payby->paydate) { $paydate = "$year-$month-01"; } + # else { $paydate = "2037-12-01"; } + #} if ( $cgi->param('batch') ) { - + $paydate = "2037-12-01" unless $paydate; $error ||= $cust_main->batch_card( 'payby' => $payby, 'amount' => $refund, - 'payinfo' => $payinfo, - 'paydate' => $paydate, - 'payname' => $payname, + #'payinfo' => $payinfo, + #'paydate' => $paydate, + #'payname' => $payname, 'paycode' => 'C', map { $_ => scalar($cgi->param($_)) } @{$payby2fields{$payby}} ); errorpage($error) if $error; -#### post refund ##### my %hash = map { $_, scalar($cgi->param($_)) } fields('cust_refund'); - $paynum = $cgi->param('paynum'); - $paynum =~ /^(\d*)$/ or die "Illegal paynum!"; - if ($paynum) { - my $cust_pay = qsearchs('cust_pay',{ 'paynum' => $paynum }); - die "Could not find paynum $paynum" unless $cust_pay; - $error = $cust_pay->refund(\%hash); - } else { - my $new = new FS::cust_refund ( \%hash ); - $error = $new->insert; - } - # if not a batch refund run realtime. + + my $new = new FS::cust_refund ( { 'paynum' => $paynum, + %hash, + } ); + $error = $new->insert; + + # if not a batch refund run realtime. } else { + $options{'paydate'} = $paydate if $paydate =~ /^\d{2,4}-\d{1,2}-01$/; $error = $cust_main->realtime_refund_bop( $bop, 'amount' => $refund, 'paynum' => $paynum, 'reasonnum' => $reasonnum, %options ); } -} else { +} else { # run cash refund. my %hash = map { $_, scalar($cgi->param($_)) } fields('cust_refund');