summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2012-07-13 00:49:12 -0700
committerIvan Kohler <ivan@freeside.biz>2012-07-13 00:49:12 -0700
commit26004f55ce70242d07fc8de51e24439e783e9e49 (patch)
tree0a0ef784d27f57a905b2ad3a5c955b0be3b3edb0
parent37eaedf1acb77298a1c5b6ca0eecf372633dc4cc (diff)
abstract out the amount + fee + input, javascript, display so it can be reused by self-service without code duplication
-rw-r--r--FS/FS/Conf.pm52
-rw-r--r--httemplate/elements/tr-amount_fee.html98
-rw-r--r--httemplate/misc/payment.cgi115
3 files changed, 172 insertions, 93 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 7e64130..e3f8a5a 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 0000000..a1a9e34
--- /dev/null
+++ b/httemplate/elements/tr-amount_fee.html
@@ -0,0 +1,98 @@
+ <TR>
+ <TH ALIGN="right"><% mt('Payment amount') |h %></TH>
+ <TD COLSPAN=7>
+ <TABLE><TR><TD BGCOLOR="#ffffff">
+ <% $money_char %><INPUT NAME = "amount"
+ ID = "amount"
+ TYPE = "text"
+ VALUE = "<% $amount %>"
+ SIZE = 8
+ STYLE = "text-align:right;"
+% if ( $fee ) {
+ onChange = "amount_changed(this)"
+ onKeyDown = "amount_changed(this)"
+ onKeyUp = "amount_changed(this)"
+ onKeyPress = "amount_changed(this)"
+% }
+ >
+ </TD><TD BGCOLOR="#cccccc">
+% if ( $fee ) {
+ <INPUT TYPE="hidden" NAME="fee_pkgpart" VALUE="<% $fee_pkg->pkgpart %>">
+ <INPUT TYPE="hidden" NAME="fee" VALUE="<% $fee_display eq 'add' ? $fee : '' %>">
+ <B><FONT SIZE='+1'><% $fee_op %></FONT>
+ <% $money_char . $fee %>
+ </B>
+ <% $fee_pkg->pkg |h %>
+ <B><FONT SIZE='+1'>=</FONT></B>
+ </TD><TD ID="ajax_total_cell" BGCOLOR="#dddddd" STYLE="border:1px solid blue">
+ <FONT SIZE="+1"><% length($amount) ? $money_char. sprintf('%.2f', ($fee_display eq 'add') ? $amount + $fee : $amount - $fee ) : '' %> <% $fee_display eq 'add' ? 'TOTAL' : 'AVAILABLE' %></FONT>
+
+% }
+ </TD></TR></TABLE>
+ </TD>
+ </TR>
+
+% if ( $fee ) {
+
+ <SCRIPT TYPE="text/javascript">
+
+ function amount_changed(what) {
+
+
+ var total = '';
+ if ( what.value.length ) {
+ total = parseFloat(what.value) <% $fee_op %> <% $fee %>;
+ /* total = Math.round(total*100)/100; */
+ total = '<% $money_char %>' + total.toFixed(2);
+ }
+
+ var total_cell = document.getElementById('ajax_total_cell');
+ total_cell.innerHTML = '<FONT SIZE="+1">' + total + ' <% $fee_display eq 'add' ? 'TOTAL' : 'AVAILABLE' %></FONT>';
+
+ }
+
+ </SCRIPT>
+
+% }
+
+<%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);
+}
+
+</%init>
diff --git a/httemplate/misc/payment.cgi b/httemplate/misc/payment.cgi
index 093494a..1ae15b9 100644
--- a/httemplate/misc/payment.cgi
+++ b/httemplate/misc/payment.cgi
@@ -9,67 +9,20 @@
<& /elements/init_overlib.html &>
<% ntable('#cccccc') %>
- <TR>
- <TH ALIGN="right"><% mt('Payment amount') |h %></TH>
- <TD COLSPAN=7>
- <TABLE><TR><TD BGCOLOR="#ffffff">
- <% $money_char %><INPUT NAME = "amount"
- ID = "amount"
- TYPE = "text"
- VALUE = "<% $amount %>"
- SIZE = 8
- STYLE = "text-align:right;"
-% if ( $fee ) {
- onChange = "amount_changed(this)"
- onKeyDown = "amount_changed(this)"
- onKeyUp = "amount_changed(this)"
- onKeyPress = "amount_changed(this)"
-% }
- >
- </TD><TD BGCOLOR="#cccccc">
-% if ( $fee ) {
- <INPUT TYPE="hidden" NAME="fee_pkgpart" VALUE="<% $fee_pkg->pkgpart %>">
- <INPUT TYPE="hidden" NAME="fee" VALUE="<% $fee_display eq 'add' ? $fee : '' %>">
- <B><FONT SIZE='+1'><% $fee_op %></FONT>
- <% $money_char . $fee %>
- </B>
- <% $fee_pkg->pkg |h %>
- <B><FONT SIZE='+1'>=</FONT></B>
- </TD><TD ID="ajax_total_cell" BGCOLOR="#dddddd" STYLE="border:1px solid blue">
- <FONT SIZE="+1"><% length($amount) ? $money_char. sprintf('%.2f', ($fee_display eq 'add') ? $amount + $fee : $amount - $fee ) : '' %> <% $fee_display eq 'add' ? 'TOTAL' : 'AVAILABLE' %></FONT>
-
-% }
- </TD></TR></TABLE>
- </TD>
- </TR>
-
-% if ( $fee ) {
-
- <SCRIPT TYPE="text/javascript">
-
- function amount_changed(what) {
-
-
- var total = '';
- if ( what.value.length ) {
- total = parseFloat(what.value) <% $fee_op %> <% $fee %>;
- /* total = Math.round(total*100)/100; */
- total = '<% $money_char %>' + total.toFixed(2);
- }
-
- var total_cell = document.getElementById('ajax_total_cell');
- total_cell.innerHTML = '<FONT SIZE="+1">' + total + ' <% $fee_display eq 'add' ? 'TOTAL' : 'AVAILABLE' %></FONT>';
-
- }
-
- </SCRIPT>
-% }
+ <& /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;