abstract out the amount + fee + input, javascript, display so it can be reused by...
authorIvan Kohler <ivan@freeside.biz>
Fri, 13 Jul 2012 07:49:12 +0000 (00:49 -0700)
committerIvan Kohler <ivan@freeside.biz>
Fri, 13 Jul 2012 07:49:12 +0000 (00:49 -0700)
FS/FS/Conf.pm
httemplate/elements/tr-amount_fee.html [new file with mode: 0644]
httemplate/misc/payment.cgi

index 7e64130..e3f8a5a 100644 (file)
@@ -2538,7 +2538,7 @@ and customer address. Include units.',
   {
     'key'         => 'manual_process-pkgpart',
     'section'     => 'billing',
   {
     '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',
   },
 
     '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.',
     '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 (file)
index 0000000..a1a9e34
--- /dev/null
@@ -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>
index 093494a..1ae15b9 100644 (file)
@@ -9,67 +9,20 @@
 <& /elements/init_overlib.html &>
 
 <% ntable('#cccccc') %>
 <& /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' ) {
 %
 
 % if ( $payby eq 'CARD' ) {
 %
@@ -304,8 +257,6 @@ my $payinfo = '';
 
 my $conf = new FS::Conf;
 
 
 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', {
 #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 @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;
 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');
 
   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;
 
 
 my $payunique = "webui-payment-". time. "-$$-". rand() * 2**32;