RT# 79737 - Added ability to us a cc surcharge of a flat fee.
authorChristopher Burger <burgerc@freeside.biz>
Fri, 11 May 2018 15:29:36 +0000 (11:29 -0400)
committerChristopher Burger <burgerc@freeside.biz>
Thu, 24 May 2018 13:16:10 +0000 (09:16 -0400)
Conflicts:
FS/FS/cust_main/Billing_Realtime.pm
httemplate/elements/tr-select-payment_options.html

FS/FS/ClientAPI/MasonComponent.pm
FS/FS/ClientAPI/MyAccount.pm
FS/FS/Conf.pm
FS/FS/cust_main/Billing_Realtime.pm
httemplate/elements/tr-amount_fee.html
httemplate/elements/tr-select-payment_options.html [new file with mode: 0644]
httemplate/misc/payment.cgi

index 3a4bfe1..d615c27 100644 (file)
@@ -63,6 +63,7 @@ my %session_callbacks = (
       'process-skip_first' => $conf->exists('selfservice_process-skip_first'),
       'num_payments'       => scalar($cust_main->cust_pay), 
       'surcharge_percentage' => scalar($conf->config('credit-card-surcharge-percentage', $cust_main->agentnum)),
+      'surcharge_flatfee'  => scalar($conf->config('credit-card-surcharge-flatfee', $cust_main->agentnum)),
     );
     @$argsref = ( %args );
 
index d604491..476ef07 100644 (file)
@@ -935,6 +935,7 @@ sub payment_info {
   $return{paybatch} = $return{payunique};  #back compat
 
   $return{credit_card_surcharge_percentage} = $conf->config('credit-card-surcharge-percentage', $cust_main->agentnum);
+  $return{credit_card_surcharge_flatfee} = $conf->config('credit-card-surcharge-flatfee', $cust_main->agentnum);
 
   return { 'error' => '',
            %return,
index c58ca33..8b18a3c 100644 (file)
@@ -887,6 +887,14 @@ my $validate_email = sub { $_[0] =~
   },
 
   {
+    'key'         => 'credit-card-surcharge-flatfee',
+    'section'     => 'credit_cards',
+    'description' => 'Add a credit card surcharge to invoices, as a flat fee.',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
     'key'         => 'discount-show-always',
     'section'     => 'billing',
     'description' => 'Generate a line item on an invoice even when a package is discounted 100%',
index 63ae777..ae41c70 100644 (file)
@@ -358,16 +358,24 @@ sub realtime_bop {
     if $conf->config('credit-card-surcharge-percentage', $self->agentnum)
     && $options{method} eq 'CC';
 
+  my $cc_surcharge_flat = 0;
+  $cc_surcharge_flat = $conf->config('credit-card-surcharge-flatfee', $self->agentnum)
+    if $conf->config('credit-card-surcharge-flatfee', $self->agentnum)
+    && $options{method} eq 'CC';
+
   # always add cc surcharge if called from event 
-  if($options{'cc_surcharge_from_event'} && $cc_surcharge_pct > 0) {
-      $cc_surcharge = $options{'amount'} * $cc_surcharge_pct / 100;
+  if($options{'cc_surcharge_from_event'} && ($cc_surcharge_pct > 0 || $cc_surcharge_flat > 0)) {
+    if ($options{'amount'} > 0) {
+      $cc_surcharge = ($options{'amount'} * ($cc_surcharge_pct / 100)) + $cc_surcharge_flat;
       $options{'amount'} += $cc_surcharge;
       $options{'amount'} = sprintf("%.2f", $options{'amount'}); # round (again)?
+    }
   }
-  elsif($cc_surcharge_pct > 0) { # we're called not from event (i.e. from a 
-                                 # payment screen), so consider the given 
-                                # amount as post-surcharge
-    $cc_surcharge = $options{'amount'} - ($options{'amount'} / ( 1 + $cc_surcharge_pct/100 ));
+  elsif($cc_surcharge_pct > 0 || $cc_surcharge_flat > 0) {
+    # we're called not from event (i.e. from a
+    # payment screen), so consider the given
+               # amount as post-surcharge
+    $cc_surcharge = $options{'amount'} - (($options{'amount'} - $cc_surcharge_flat) / ( 1 + $cc_surcharge_pct/100 )) if $options{'amount'} > 0;
   }
   
   $cc_surcharge = sprintf("%.2f",$cc_surcharge) if $cc_surcharge > 0;
index 1248852..e3b8d78 100644 (file)
@@ -94,6 +94,9 @@ if ( $amount > 0 ) {
   $amount += $amount * $opt{'surcharge_percentage'}/100
     if $opt{'surcharge_percentage'} > 0;
 
+  $amount += $opt{'surcharge_flatfee'}
+    if $opt{'surcharge_flatfee'} > 0;
+
   $amount = sprintf("%.2f", $amount);
 }
 
diff --git a/httemplate/elements/tr-select-payment_options.html b/httemplate/elements/tr-select-payment_options.html
new file mode 100644 (file)
index 0000000..8859b9b
--- /dev/null
@@ -0,0 +1,99 @@
+<%doc>
+
+Example:
+
+  include( '/elements/tr-select-payment_options.html',
+
+    #opt - most get used in /elements/tr-amount-fee
+    'custnum'              => 4,     # customer number needed for selecting invoices
+    'prefix'               => 'pre', # prefix to fields and row ID's
+    'amount'               => 1,     # payment amount
+    'process-pkgpart'      => scalar($conf->config('manual_process-pkgpart', $cust_main->agentnum)),
+    'process-display'      => scalar($conf->config('manual_process-display')),
+    'process-skip_first'   => $conf->exists('manual_process-skip_first'),
+    'num_payments'         => scalar($cust_main->cust_pay),
+    'surcharge_percentage' =>
+      ( $payby eq 'CARD'
+          ? scalar($conf->config('credit-card-surcharge-percentage', $cust_main->agentnum))
+          : 0
+      ),
+    'surcharge_flatfee' =>
+      ( $payby eq 'CARD'
+          ? scalar($conf->config('credit-card-surcharge-flatfee', $cust_main->agentnum))
+          : 0
+      ),
+  )
+
+</%doc>
+
+  <TR STYLE="display:block">
+    <TH ALIGN="right"><% mt('Payment options') |h %></TH>
+    <TD COLSPAN=7>
+     <SELECT
+         ID       = "<% $opt{prefix} %>payment_option"
+         NAME     = "<% $opt{prefix} %>payment_option"
+         onChange = "<% $opt{prefix} %>payment_option_changed(this)"
+         <% $opt{disabled} %>
+       >
+               <OPTION VALUE="select">Select payment option</OPTION>
+               <OPTION VALUE="<% $opt{amount} %>">Pay full balance</OPTION>
+               <OPTION VALUE="invoice">Pay specific invoice</OPTION>
+               <OPTION VALUE="">Pay specific amount</OPTION>
+       </SELECT>       
+    </TD>
+  </TR>
+
+  <& /elements/tr-select-invoice.html,
+       'custnum' => $opt{custnum},
+       'prefix'  => $opt{prefix},
+  &>
+
+  <& /elements/tr-amount_fee.html,
+       'row_style'  => 'STYLE="display:none;"',
+       %opt
+  &>
+
+  <SCRIPT TYPE="text/javascript">
+
+      function <% $opt{prefix} %>payment_option_changed(what) {
+
+        if ( what.value == 'select' ) {
+               document.getElementById('payment_amount_row').style.display = 'none';
+               document.getElementById('invoice_row').style.display = 'none';
+          document.getElementById('<% $opt{prefix} %>invoice').value = 'select';
+               document.getElementById('amount').value = '';
+        }
+        else if ( what.value == 'invoice' ) {
+               document.getElementById('payment_amount_row').style.display = 'none';
+               document.getElementById('invoice_row').style.display = 'block';
+               document.getElementById('amount').value = '';
+        }
+        else {
+               document.getElementById('payment_amount_row').style.display = 'block';
+               document.getElementById('invoice_row').style.display = 'none';
+          document.getElementById('<% $opt{prefix} %>invoice').value = 'select';
+               document.getElementById('amount').value = what.value;
+        }
+
+      }
+
+      function <% $opt{prefix} %>invoice_select_changed(what) {
+
+        if ( what.value == 'select' ) {
+               document.getElementById('payment_amount_row').style.display = 'none';
+               document.getElementById('amount').value = '';
+        }
+        else {
+               document.getElementById('payment_amount_row').style.display = 'block';
+               document.getElementById('amount').value = what.value;
+        }
+
+      }
+
+</SCRIPT>
+
+<%init>
+
+my %opt = @_;
+
+</%init>
\ No newline at end of file
index 4fa3df7..36ae77b 100644 (file)
              ? scalar($conf->config('credit-card-surcharge-percentage', $cust_main->agentnum))
              : 0
          ),
+       'surcharge_flatfee:Q' =>
+         ( $payby eq 'CARD'
+             ? scalar($conf->config('credit-card-surcharge-flatfee', $cust_main->agentnum))
+             : 0
+         ),
   &>
 
 % if ( $conf->exists('part_pkg-term_discounts') ) {