From 4fd1280540e2c9b90fa59c0c32d691f5222f65d4 Mon Sep 17 00:00:00 2001 From: Christopher Burger Date: Mon, 24 Jun 2019 13:27:17 -0400 Subject: [PATCH 1/1] RT# 82137 - Added ability for processing fee to be pain on seperate invoice. --- FS/FS/Conf.pm | 16 ++++++ FS/FS/cust_main/Billing_Realtime.pm | 67 +++++++++++++++++----- FS/FS/cust_pay.pm | 4 ++ httemplate/config/config-process.cgi | 6 +- httemplate/elements/tr-amount_fee.html | 2 +- httemplate/elements/tr-select-payment_options.html | 2 +- 6 files changed, 79 insertions(+), 18 deletions(-) diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 0f774d16c..9e68ffc67 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -2683,6 +2683,17 @@ and customer address. Include units.', }, { + 'key' => 'processing-fee_on_separate_invoice', + 'section' => 'payments', + 'description' => 'Places the processing fee on a separate invoice by itself. Only works with real time processing.', + 'type' => 'checkbox', + 'validate' => sub { + my $conf = new FS::Conf; + !$conf->config('batch-enable_payby') ? '' : 'You can not set this option while batch processing is enabled.'; + }, + }, + + { 'key' => 'banned_pay-pad', 'section' => 'credit_cards', 'description' => 'Padding for encrypted storage of banned credit card hashes. If you already have new-style SHA512 entries in the banned_pay table, do not change as this will invalidate the old entries.', @@ -3840,6 +3851,11 @@ and customer address. Include units.', 'description' => 'Enable batch processing for the specified payment types.', 'type' => 'selectmultiple', 'select_enum' => [qw( CARD CHEK )], + 'validate' => sub { + ## can not create a new invoice and pay it silently with batch processing, only realtime processing. + my $conf = new FS::Conf; + !$conf->exists('processing-fee_on_separate_invoice') ? '' : 'You can not enable batch processing while processing-fee_on_separate_invoice option is enabled.'; + }, }, { diff --git a/FS/FS/cust_main/Billing_Realtime.pm b/FS/FS/cust_main/Billing_Realtime.pm index 89d63dd26..b65860e9b 100644 --- a/FS/FS/cust_main/Billing_Realtime.pm +++ b/FS/FS/cust_main/Billing_Realtime.pm @@ -985,17 +985,20 @@ sub _realtime_bop_result { savepoint_create( $savepoint_label ); #start a transaction, insert the cust_pay and set cust_pay_pending.status to done in a single transction - - my $error = $cust_pay->insert($options{'manual'} ? ( 'manual' => 1 ) : () ); + my $error = $cust_pay->insert( + $options{'manual'} ? ( 'manual' => 1 ) : (), + $options{'processing-fee'} > 0 ? ( 'processing-fee' => $options{'processing-fee'} ) : (), + ); if ( $error ) { savepoint_rollback( $savepoint_label ); $cust_pay->invnum(''); #try again with no specific invnum $cust_pay->paynum(''); - my $error2 = $cust_pay->insert( $options{'manual'} ? - ( 'manual' => 1 ) : () - ); + my $error2 = $cust_pay->insert( + $options{'manual'} ? ( 'manual' => 1 ) : (), + $options{'processing-fee'} > 0 ? ( 'processing-fee' => $options{'processing-fee'} ) : (), + ); if ( $error2 ) { # gah. but at least we have a record of the state we had to abort in # from cust_pay_pending now. @@ -1137,11 +1140,23 @@ sub _realtime_bop_result { if ($options{'processing-fee'} > 0) { my $pf_cust_pkg; my $processing_fee_text = 'Payment Processing Fee'; + + my $conf = new FS::Conf; + + my $pf_seperate_bill; + my $pf_bill_now; + if ($conf->exists('processing-fee_on_separate_invoice')) { + $pf_seperate_bill = 'Y'; + $pf_bill_now = '1'; + } + my $pf_change_error = $self->charge({ 'amount' => $options{'processing-fee'}, 'pkg' => $processing_fee_text, 'setuptax' => 'Y', 'cust_pkg_ref' => \$pf_cust_pkg, + 'separate_bill' => $pf_seperate_bill, + 'bill_now' => $pf_bill_now, }); if($pf_change_error) { @@ -1156,17 +1171,41 @@ sub _realtime_bop_result { # but keep going... } - my $cust_bill = qsearchs('cust_bill', { 'invnum' => $invnum }); - unless ( $cust_bill ) { - warn "race condition + invoice deletion just happened"; - return ''; - } + if ($conf->exists('processing-fee_on_separate_invoice')) { + my $cust_bill_pkg = qsearchs( 'cust_bill_pkg', { 'pkgnum' => $pf_cust_pkg->pkgnum } ); + + my $pf_cust_bill = qsearchs('cust_bill', { 'invnum' => $cust_bill_pkg->invnum }); + unless ( $pf_cust_bill ) { + warn "no processing fee inv found!"; + return ''; + } + + my $pf_apply_error = $pf_cust_bill->apply_payments_and_credits; + + my $cust_bill = qsearchs('cust_bill', { 'invnum' => $invnum }); + unless ( $cust_bill ) { + warn "race condition + invoice deletion just happened"; + return ''; + } + + my $grand_pf_error = $cust_bill->apply_payments_and_credits; + + warn "cannot apply Processing fee to invoice #$invnum: $grand_pf_error - $pf_apply_error" + if $grand_pf_error || $pf_apply_error; + } ## processing-fee_on_separate_invoice + else { + my $cust_bill = qsearchs('cust_bill', { 'invnum' => $invnum }); + unless ( $cust_bill ) { + warn "race condition + invoice deletion just happened"; + return ''; + } - my $grand_pf_error = - $cust_bill->add_cc_surcharge($pf_cust_pkg->pkgnum,$options{'processing-fee'}); + my $grand_pf_error = + $cust_bill->add_cc_surcharge($pf_cust_pkg->pkgnum,$options{'processing-fee'}); - warn "cannot add Processing fee to invoice #$invnum: $grand_pf_error" - if $grand_pf_error; + warn "cannot add Processing fee to invoice #$invnum: $grand_pf_error" + if $grand_pf_error; + } ## no processing-fee_on_separate_invoice } #end if $options{'processing-fee'} } #end if ( $options{'cc_surcharge'} > 0 || $options{'processing-fee'} > 0) diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm index 915cb3303..c0a254119 100644 --- a/FS/FS/cust_pay.pm +++ b/FS/FS/cust_pay.pm @@ -395,6 +395,8 @@ sub insert { $dbh->commit or die $dbh->errstr if $oldAutoCommit; + $self->{'processing_fee'} = $options{'processing-fee'}; + #payment receipt my $trigger = $conf->config('payment_receipt-trigger', $self->cust_main->agentnum) || 'cust_pay'; @@ -735,6 +737,8 @@ sub send_message_receipt { my %substitutions = (); $substitutions{invnum} = $cust_bill->invnum if $cust_bill; + $substitutions{'processing_fee'} = $self->{'processing_fee'}; + my $msg_template = qsearchs('msg_template',{ msgnum => $msgnum}); unless ($msg_template) { diff --git a/httemplate/config/config-process.cgi b/httemplate/config/config-process.cgi index d84edce00..6af7d2322 100644 --- a/httemplate/config/config-process.cgi +++ b/httemplate/config/config-process.cgi @@ -155,7 +155,9 @@ foreach my $type ( ref($i->type) ? @{$i->type} : $i->type ) { } } elsif ( $type eq 'checkbox' ) { if ( defined $cgi->param($i->key.$n) ) { - push @touch, $i->key; + my $error = &{$i->validate}('', $n) if $i->validate; + push @error, $error if $error; + push @touch, $i->key if !$error; } else { push @delete, $i->key; } @@ -167,7 +169,7 @@ foreach my $type ( ref($i->type) ? @{$i->type} : $i->type ) { if ( scalar(@{[ $cgi->param($i->key.$n) ]}) && $cgi->param($i->key.$n) ne '' ) { my $error = &{$i->validate}([ $cgi->param($i->key.$n) ], $n) if $i->validate; push @error, $error if $error; - $conf->set($i->key, join("\n", @{[ $cgi->param($i->key.$n) ]} ), $agentnum); + $conf->set($i->key, join("\n", @{[ $cgi->param($i->key.$n) ]} ), $agentnum) if !$error; } else { $conf->delete($i->key, $agentnum); } diff --git a/httemplate/elements/tr-amount_fee.html b/httemplate/elements/tr-amount_fee.html index 94795de37..0ae6a0f74 100644 --- a/httemplate/elements/tr-amount_fee.html +++ b/httemplate/elements/tr-amount_fee.html @@ -44,7 +44,7 @@
- + A processing fee of <% $processing_fee %> is being applied to this transaction. diff --git a/httemplate/elements/tr-select-payment_options.html b/httemplate/elements/tr-select-payment_options.html index c5b84e756..27df9622e 100644 --- a/httemplate/elements/tr-select-payment_options.html +++ b/httemplate/elements/tr-select-payment_options.html @@ -60,7 +60,7 @@ Example: $('#payment_option_row').<% $payment_option_row %>(); $('#payment_amount_row').<% $payment_amount_row %>(); - $('#ajax_processingfee_cell').hide(); + $('#ajax_processingfee_cell').show(); if($('#payment_amount_row').is(':visible')) { var surcharge; -- 2.11.0