From 26004f55ce70242d07fc8de51e24439e783e9e49 Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Fri, 13 Jul 2012 00:49:12 -0700 Subject: [PATCH] abstract out the amount + fee + input, javascript, display so it can be reused by self-service without code duplication --- FS/FS/Conf.pm | 52 ++++++++++++++- httemplate/elements/tr-amount_fee.html | 98 ++++++++++++++++++++++++++++ httemplate/misc/payment.cgi | 115 +++++++-------------------------- 3 files changed, 172 insertions(+), 93 deletions(-) create mode 100644 httemplate/elements/tr-amount_fee.html diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 7e641308b..e3f8a5a15 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -2538,7 +2538,7 @@ and customer address. Include units.', { 'key' => 'manual_process-pkgpart', 'section' => 'billing', - 'description' => 'Package to add to each manual credit card and ACH payments entered from the backend. Enabling this option may be in violation of your merchant agreement(s), so please check them carefully before enabling this option.', + 'description' => 'Package to add to each manual credit card and ACH payment entered by employees from the backend. Enabling this option may be in violation of your merchant agreement(s), so please check it(/them) carefully before enabling this option.', 'type' => 'select-part_pkg', }, @@ -2561,6 +2561,56 @@ and customer address. Include units.', }, { + 'key' => 'selfservice_process-pkgpart', + 'section' => 'billing', + 'description' => 'Package to add to each manual credit card and ACH payment entered by the customer themselves in the self-service interface. Enabling this option may be in violation of your merchant agreement(s), so please check it(/them) carefully before enabling this option.', + 'type' => 'select-part_pkg', + }, + + { + 'key' => 'selfservice_process-display', + 'section' => 'billing', + 'description' => 'When using selfservice_process-pkgpart, add the fee to the amount entered (default), or subtract the fee from the amount entered.', + 'type' => 'select', + 'select_hash' => [ + 'add' => 'Add fee to amount entered', + 'subtract' => 'Subtract fee from amount entered', + ], + }, + + { + 'key' => 'selfservice_process-skip_first', + 'section' => 'billing', + 'description' => "When using selfservice_process-pkgpart, omit the fee if it is the customer's first payment.", + 'type' => 'checkbox', + }, + + { + 'key' => 'suto_process-pkgpart', + 'section' => 'billing', + 'description' => 'Package to add to each automatic credit card and ACH payment processed by billing events. Enabling this option may be in violation of your merchant agreement(s), so please check them carefully before enabling this option.', + 'type' => 'select-part_pkg', + }, + +# { +# 'key' => 'auto_process-display', +# 'section' => 'billing', +# 'description' => 'When using auto_process-pkgpart, add the fee to the amount entered (default), or subtract the fee from the amount entered.', +# 'type' => 'select', +# 'select_hash' => [ +# 'add' => 'Add fee to amount entered', +# 'subtract' => 'Subtract fee from amount entered', +# ], +# }, + + { + 'key' => 'auto_process-skip_first', + 'section' => 'billing', + 'description' => "When using auto_process-pkgpart, omit the fee if it is the customer's first payment.", + 'type' => 'checkbox', + }, + + { 'key' => 'allow_negative_charges', 'section' => 'billing', 'description' => 'Allow negative charges. Normally not used unless importing data from a legacy system that requires this.', diff --git a/httemplate/elements/tr-amount_fee.html b/httemplate/elements/tr-amount_fee.html new file mode 100644 index 000000000..a1a9e3433 --- /dev/null +++ b/httemplate/elements/tr-amount_fee.html @@ -0,0 +1,98 @@ + + <% mt('Payment amount') |h %> + +
+ <% $money_char %> + +% if ( $fee ) { + + + <% $fee_op %> + <% $money_char . $fee %> + + <% $fee_pkg->pkg |h %> + = + + <% length($amount) ? $money_char. sprintf('%.2f', ($fee_display eq 'add') ? $amount + $fee : $amount - $fee ) : '' %> <% $fee_display eq 'add' ? 'TOTAL' : 'AVAILABLE' %> + +% } +
+ + + +% if ( $fee ) { + + + +% } + +<%init> + +my %opt = @_; + +my $conf = new FS::Conf; +my $money_char = $conf->config('money_char') || '$'; + +my $fee = ''; +my $fee_pkg = ''; +my $fee_display = ''; +my $fee_op = ''; + +if ( $opt{'process-pkgpart'} + and ! $opt{'process-skip_first'} || $opt{'num_payments'} + ) +{ + + $fee_display = $opt{'process-display'} || 'add'; + $fee_op = $fee_display eq 'add' ? '+' : '-'; + + $fee_pkg = + qsearchs('part_pkg', { pkgpart=>$opt{'process-pkgpart'} } ); + + #well ->unit_setup or ->calc_setup both call for a $cust_pkg + # (though ->unit_setup doesn't use it...) + $fee = $fee_pkg->option('setup_fee') + if $fee_pkg; #in case.. better than dying with a perl traceback + +} + +my $amount = $opt{'amount'}; +if ( $amount > 0 ) { + $amount += $fee + if $fee && $fee_display eq 'subtract'; + + &{ $opt{post_fee_callback} }( \$amount ) if $opt{post_fee_callback}; + + $amount = sprintf("%.2f", $amount); +} + + diff --git a/httemplate/misc/payment.cgi b/httemplate/misc/payment.cgi index 093494a06..1ae15b930 100644 --- a/httemplate/misc/payment.cgi +++ b/httemplate/misc/payment.cgi @@ -9,67 +9,20 @@ <& /elements/init_overlib.html &> <% ntable('#cccccc') %> - - <% mt('Payment amount') |h %> - -
- <% $money_char %> - -% if ( $fee ) { - - - <% $fee_op %> - <% $money_char . $fee %> - - <% $fee_pkg->pkg |h %> - = - - <% length($amount) ? $money_char. sprintf('%.2f', ($fee_display eq 'add') ? $amount + $fee : $amount - $fee ) : '' %> <% $fee_display eq 'add' ? 'TOTAL' : 'AVAILABLE' %> - -% } -
- - - -% if ( $fee ) { - - -% } + <& /elements/tr-amount_fee.html, + 'amount' => $amount, + 'process-pkgpart' => scalar($conf->config('manual_process-pkgpart')), + 'process-display' => scalar($conf->config('manual_process-display')), + 'process-skip-first' => $conf->exists('manual_process-skip_first'), + 'num_payments' => scalar($cust_main->cust_pay), + 'post_fee_callback' => $post_fee_callback, + &> -<& /elements/tr-select-discount_term.html, - 'custnum' => $custnum, - 'amount_id' => 'amount', -&> + <& /elements/tr-select-discount_term.html, + 'custnum' => $custnum, + 'amount_id' => 'amount', + &> % if ( $payby eq 'CARD' ) { % @@ -304,8 +257,6 @@ my $payinfo = ''; my $conf = new FS::Conf; -my $money_char = $conf->config('money_char') || '$'; - #false laziness w/selfservice make_payment.html shortcut for one-country my %states = map { $_->state => 1 } qsearch('cust_main_county', { @@ -313,43 +264,23 @@ my %states = map { $_->state => 1 } } ); my @states = sort { $a cmp $b } keys %states; -my $fee = ''; -my $fee_pkg = ''; -my $fee_display = ''; -my $fee_op = ''; -my $num_payments = scalar($cust_main->cust_pay); -#handle old cust_main.pm (remove...) -$num_payments = scalar( @{ [ $cust_main->cust_pay ] } ) - unless defined $num_payments; -if ( $conf->config('manual_process-pkgpart') - and ! $conf->exists('manual_process-skip_first') || $num_payments - ) -{ - - $fee_display = $conf->config('manual_process-display') || 'add'; - $fee_op = $fee_display eq 'add' ? '+' : '-'; - - $fee_pkg = - qsearchs('part_pkg', { pkgpart=>$conf->config('manual_process-pkgpart') } ); - - #well ->unit_setup or ->calc_setup both call for a $cust_pkg - # (though ->unit_setup doesn't use it...) - $fee = $fee_pkg->option('setup_fee') - if $fee_pkg; #in case.. better than dying with a perl traceback - -} - my $amount = ''; if ( $balance > 0 ) { $amount = $balance; - $amount += $fee - if $fee && $fee_display eq 'subtract'; +} + +my $post_fee_callback = sub { + my( $amountref ) = @_; + + return unless $$amountref > 0; + + my $conf = new FS::Conf; my $cc_surcharge_pct = $conf->config('credit-card-surcharge-percentage'); - $amount += $amount * $cc_surcharge_pct/100 if $cc_surcharge_pct > 0; + $$amountref += $$amountref * $cc_surcharge_pct/100 if $cc_surcharge_pct > 0; - $amount = sprintf("%.2f", $amount); -} + $$amountref = sprintf("%.2f", $$amountref); +}; my $payunique = "webui-payment-". time. "-$$-". rand() * 2**32; -- 2.11.0