[freeside-commits] branch master updated. 26004f55ce70242d07fc8de51e24439e783e9e49

Ivan ivan at 420.am
Fri Jul 13 00:49:18 PDT 2012


The branch, master has been updated
       via  26004f55ce70242d07fc8de51e24439e783e9e49 (commit)
      from  37eaedf1acb77298a1c5b6ca0eecf372633dc4cc (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 26004f55ce70242d07fc8de51e24439e783e9e49
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Fri Jul 13 00:49:12 2012 -0700

    abstract out the amount + fee + input, javascript, display so it can be reused by self-service without code duplication

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;
 

-----------------------------------------------------------------------

Summary of changes:
 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




More information about the freeside-commits mailing list