Merge branch 'master' of git.freeside.biz:/home/git/freeside
authorIvan Kohler <ivan@freeside.biz>
Thu, 17 May 2018 01:00:33 +0000 (18:00 -0700)
committerIvan Kohler <ivan@freeside.biz>
Thu, 17 May 2018 01:00:33 +0000 (18:00 -0700)
FS/FS/cust_main/Billing.pm
FS/FS/cust_pay.pm
FS/FS/part_pkg/flat.pm
FS/FS/pay_batch/RBC.pm
httemplate/elements/tr-amount_fee.html
httemplate/elements/tr-select-payment_options.html
httemplate/misc/payment.cgi

index a5a38fd..51b49e4 100644 (file)
@@ -1027,10 +1027,10 @@ sub _make_lines {
              || $cust_pkg->expire > $cmp_time )
      )
   {
-
+    
     warn "    bill setup\n" if $DEBUG > 1;
 
-    unless ($cust_pkg->waive_setup) {
+    unless ( $cust_pkg->waive_setup ) {
         $lineitems++;
 
         $setup = eval { $cust_pkg->calc_setup( $time, \@details, \%setup_param ) };
index 5031793..4c82d10 100644 (file)
@@ -662,53 +662,75 @@ sub send_receipt {
        || ! $cust_bill
      )
   {
-    my $msgnum = $conf->config('payment_receipt_msgnum', $cust_main->agentnum);
-    if ( $msgnum ) {
-
-      my %substitutions = ();
-      $substitutions{invnum} = $opt->{cust_bill}->invnum if $opt->{cust_bill};
-
-      my $msg_template = qsearchs('msg_template',{ msgnum => $msgnum});
-      unless ($msg_template) {
-        warn "send_receipt could not load msg_template";
-        return;
-      }
-
-      my $cust_msg = $msg_template->prepare(
-          'cust_main'     => $cust_main,
-          'object'        => $self,
-          'from_config'   => 'payment_receipt_from',
-          'substitutions' => \%substitutions,
-          'msgtype'       => 'receipt',
+      $error = $self->send_message_receipt(
+        'cust_main' => $cust_main,
+        'cust_bill' => $opt->{cust_bill},
+        'msgnum'    => $conf->config('payment_receipt_msgnum', $cust_main->agentnum)
       );
-      $error = $cust_msg ? $cust_msg->insert : 'error preparing msg_template';
-      if ($error) {
-        warn "send_receipt: $error";
-        return;
-      }
+  #not manual and no noemail flag (here or on the customer)
+  } elsif ( ! $opt->{'noemail'} && ! $cust_main->invoice_noemail ) {
 
+    # check to see if they want to send specific message template as receipt for auto payments
+    if ( $conf->config('payment_receipt_msgnum_auto', $cust_main->agentnum) ) {
+      $error = $self->send_message_receipt(
+        'cust_main' => $cust_main,
+        'cust_bill' => $opt->{cust_bill},
+        'msgnum'    => $conf->config('payment_receipt_msgnum_auto', $cust_main->agentnum),
+      );
+    }
+    else {
       my $queue = new FS::queue {
-        'job'     => 'FS::cust_msg::process_send',
+        'job'     => 'FS::cust_bill::queueable_email',
         'paynum'  => $self->paynum,
         'custnum' => $cust_main->custnum,
       };
-      $error = $queue->insert( $cust_msg->custmsgnum );
 
-    } else {
+      my %opt = (
+        'invnum'      => $cust_bill->invnum,
+        'no_coupon'   => 1,
+      );
 
-      warn "payment_receipt is on, but no payment_receipt_msgnum\n";
+      if ( my $mode = $conf->config('payment_receipt_statement_mode') ) {
+        $opt{'mode'} = $mode;
+      } else {
+        # backward compatibility, no good fix for this yet as some people may
+        # still have "invoice_latex_statement" and such options
+        $opt{'template'} = 'statement';
+        $opt{'notice_name'} = 'Statement';
+      }
 
+      $error = $queue->insert(%opt);
     }
 
-  #not manual and no noemail flag (here or on the customer)
-  } elsif ( ! $opt->{'noemail'} && ! $cust_main->invoice_noemail ) {
 
-    # check to see if they want to send specific message template as receipt for auto payments
-    my $msgnum = $conf->config('payment_receipt_msgnum_auto', $cust_main->agentnum);
+
+  }
+
+  warn "send_receipt: $error\n" if $error;
+}
+
+=item send_message_receipt
+
+sends out a message receipt.
+$error = $self->send_message_receipt(
+        'cust_main' => $cust_main,
+        'cust_bill' => $opt->{cust_bill},
+        'msgnum'    => $conf->config('payment_receipt_msgnum', $cust_main->agentnum)
+      );
+
+=cut
+
+sub send_message_receipt {
+  my ($self, %opt) = @_;
+  my $cust_main = $opt{'cust_main'};
+  my $cust_bill = $opt{'cust_bill'};
+  my $msgnum = $opt{'msgnum'};
+  my $error = '';
+
     if ( $msgnum ) {
 
       my %substitutions = ();
-      $substitutions{invnum} = $opt->{cust_bill}->invnum if $opt->{cust_bill};
+      $substitutions{invnum} = $cust_bill->invnum if $cust_bill;
 
       my $msg_template = qsearchs('msg_template',{ msgnum => $msgnum});
       unless ($msg_template) {
@@ -726,7 +748,7 @@ sub send_receipt {
       $error = $cust_msg ? $cust_msg->insert : 'error preparing msg_template';
       if ($error) {
         warn "send_receipt: $error";
-        return;
+        return $error;
       }
 
       my $queue = new FS::queue {
@@ -736,36 +758,12 @@ sub send_receipt {
       };
       $error = $queue->insert( $cust_msg->custmsgnum );
 
-    }
-    else {
-      my $queue = new FS::queue {
-        'job'     => 'FS::cust_bill::queueable_email',
-        'paynum'  => $self->paynum,
-        'custnum' => $cust_main->custnum,
-      };
-
-      my %opt = (
-        'invnum'      => $cust_bill->invnum,
-        'no_coupon'   => 1,
-      );
-
-      if ( my $mode = $conf->config('payment_receipt_statement_mode') ) {
-        $opt{'mode'} = $mode;
-      } else {
-        # backward compatibility, no good fix for this yet as some people may
-        # still have "invoice_latex_statement" and such options
-        $opt{'template'} = 'statement';
-        $opt{'notice_name'} = 'Statement';
-      }
-
-      $error = $queue->insert(%opt);
+    } else {
+      warn "payment_receipt is on, but no payment_receipt_msgnum\n";
+      $error = "payment_receipt is on, but no payment_receipt_msgnum";
     }
 
-
-
-  }
-  
-  warn "send_receipt: $error\n" if $error;
+  return $error;
 }
 
 =item cust_bill_pay
index cfee584..6fd9c7d 100644 (file)
@@ -128,13 +128,12 @@ sub calc_setup {
 
   my $discount = 0;
   if ( $charge > 0 ) {
-    $param->{'setup_charge'} = $charge;
-    $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param);
-    delete $param->{'setup_charge'};
+      $param->{'setup_charge'} = $charge;
+      $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param);
+      delete $param->{'setup_charge'};
   }
 
   sprintf( '%.2f', ($cust_pkg->quantity || 1) * ($charge - $discount) );
-
 }
 
 sub base_setup {
index 21dae42..1577a7f 100644 (file)
@@ -174,6 +174,11 @@ $name = 'RBC';
       die "invalid branch/routing number '$aba'\n";
     }
 
+    ## set custname to business name if business checking or savings account is used otherwise leave as first and last name.
+    my $custname = $cust_pay_batch->cust_main->first . ' ' . $cust_pay_batch->cust_main->last;
+    $custname = $cust_pay_batch->cust_main->company
+      if (($cust_pay_batch->{Hash}->{paytype} eq "Business checking" || $cust_pay_batch->{Hash}->{paytype} eq "Business savings") && $cust_pay_batch->cust_main->company);
+
     $i++;
 
     ## set to D for debit by default, then override to what cust_pay_batch has as payments may not have paycode.
@@ -194,8 +199,7 @@ $name = 'RBC';
     sprintf("%010.0f",$cust_pay_batch->amount*100).
     '      '.
     time2str("%Y%j", time + 86400).
-    sprintf("%-30.30s", encode('utf8', $cust_pay_batch->cust_main->first . ' ' .
-                     $cust_pay_batch->cust_main->last)).
+    sprintf("%-30.30s", encode('utf8', $custname)).
     'E'. # English
     ' '.
     sprintf("%-15s", $shortname).
index 9e6d9e9..1c78d7e 100644 (file)
@@ -8,7 +8,7 @@
                                 VALUE    = "<% $amount %>"
                                 SIZE     = 8
                                 STYLE    = "text-align:right;"
-%                               if ( $fee ) {
+%                               if ( $fee || $surcharge ) {
                                   onChange   = "amount_changed(this)"
                                   onKeyDown  = "amount_changed(this)"
                                   onKeyUp    = "amount_changed(this)"
            <FONT SIZE="+1"><% length($amount) ? $money_char. sprintf('%.2f', ($fee_display eq 'add') ? $amount + $fee : $amount - $fee ) : '' %> <% $fee_display eq 'add' ? 'TOTAL' : 'AVAILABLE' %></FONT>
   
 %        }
+%        if ( $surcharge ) {
+           <INPUT TYPE="hidden" NAME="surcharge_percentage" ID="surcharge_percentage" VALUE="<% $surcharge_percentage %>">
+           <INPUT TYPE="hidden" NAME="surcharge_flatfee" ID="surcharge_flatfee" VALUE="<% $surcharge_flatfee %>">
+      </TD><TD ID="ajax_surcharge_cell" BGCOLOR="#dddddd" STYLE="border:1px solid blue">
+           <FONT SIZE="+1">A credit card surcharge of <% $money_char. sprintf('%.2f', $surcharge) %> is included in this payment</FONT>
+%        }
       </TD></TR></TABLE>
     </TD>
   </TR>
 
-% if ( $fee ) {
+% if ($fee || $surcharge) {
 
     <SCRIPT TYPE="text/javascript">
 
       function amount_changed(what) {
 
-
+% if ( $fee ) {
         var total = '';
         if ( what.value.length ) {
           total = parseFloat(what.value) <% $fee_op %> <% $fee %>;
 
         var total_cell = document.getElementById('ajax_total_cell');
         total_cell.innerHTML = '<FONT SIZE="+1">' + total + ' <% $fee_display eq 'add' ? 'TOTAL' : 'AVAILABLE' %></FONT>';
+% }
+
+% if ( $surcharge ) {
+        var surcharge_cell = document.getElementById('ajax_surcharge_cell');
+        var surcharge = ((what.value - <% $surcharge_flatfee %>) * <% $surcharge_percentage %>) + <% $surcharge_flatfee %>;
+        surcharge_cell.innerHTML = '<FONT SIZE="+1">A credit card surcharge of ' + surcharge.toFixed(2) + ' is included in this payment</FONT>';
+% }
 
       }
 
@@ -66,6 +79,9 @@ my $fee = '';
 my $fee_pkg = '';
 my $fee_display = '';
 my $fee_op = '';
+my $surcharge = '';
+my $surcharge_percentage = 0;
+my $surcharge_flatfee = 0;
 
 if ( $opt{'process-pkgpart'}
      and ! $opt{'process-skip_first'} || $opt{'num_payments'}
@@ -91,11 +107,13 @@ if ( $amount > 0 ) {
     if $fee && $fee_display eq 'subtract';
 
   #&{ $opt{post_fee_callback} }( \$amount ) if $opt{post_fee_callback};
-  $amount += $amount * $opt{'surcharge_percentage'}/100
-    if $opt{'surcharge_percentage'} > 0;
 
-  $amount += $opt{'surcharge_flatfee'}
-    if $opt{'surcharge_flatfee'} > 0;
+  $surcharge_percentage = $opt{'surcharge_percentage'}/100 if $opt{'surcharge_percentage'} > 0;
+  $surcharge_flatfee = $opt{'surcharge_flatfee'} if $opt{'surcharge_flatfee'} > 0;
+  $surcharge = $amount * $surcharge_percentage if $surcharge_percentage > 0;
+  $surcharge += $surcharge_flatfee if $surcharge_flatfee > 0;
+
+  $amount += $surcharge;
 
   $amount = sprintf("%.2f", $amount);
 }
index 8859b9b..a59963a 100644 (file)
@@ -38,7 +38,7 @@ Example:
                <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>
+      <OPTION VALUE="specific">Pay specific amount</OPTION>
        </SELECT>       
     </TD>
   </TR>
@@ -57,6 +57,14 @@ Example:
 
       function <% $opt{prefix} %>payment_option_changed(what) {
 
+        var surcharge;
+        if (document.getElementById('surcharge_percentage') || document.getElementById('surcharge_percentage')) {
+          surcharge = (+what.value * +document.getElementById('surcharge_percentage').value) + +document.getElementById('surcharge_flatfee').value;
+        }
+        else { surcharge = 0; }
+        var amount = +what.value + +surcharge;
+        document.getElementById('amount').disabled = true;
+
         if ( what.value == 'select' ) {
                document.getElementById('payment_amount_row').style.display = 'none';
                document.getElementById('invoice_row').style.display = 'none';
@@ -68,24 +76,50 @@ Example:
                document.getElementById('invoice_row').style.display = 'block';
                document.getElementById('amount').value = '';
         }
+        else if ( what.value == 'specific' ) {
+          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 = '0.00';
+          document.getElementById('amount').disabled = false;
+          if (document.getElementById('ajax_surcharge_cell')) {
+            document.getElementById('ajax_surcharge_cell').innerHTML = '<FONT SIZE="+1">A credit card surcharge of <% $money_char %>0.00 is included in this payment</FONT>';
+          }
+        }
         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;
+          document.getElementById('amount').value = amount.toFixed(2);
+          document.getElementById('amount').disabled = false;
+          if (document.getElementById('ajax_surcharge_cell')) {
+            document.getElementById('ajax_surcharge_cell').innerHTML = '<FONT SIZE="+1">A credit card surcharge of <% $money_char %>' + surcharge.toFixed(2) + ' is included in this payment</FONT>';
+          }
         }
 
       }
 
       function <% $opt{prefix} %>invoice_select_changed(what) {
 
+        var surcharge;
+        if (document.getElementById('surcharge_percentage') || document.getElementById('surcharge_percentage')) {
+          surcharge = (+what.value * +document.getElementById('surcharge_percentage').value) + +document.getElementById('surcharge_flatfee').value;
+        }
+        else { surcharge = 0; }
+        var amount = +what.value + +surcharge;
+
         if ( what.value == 'select' ) {
+          alert("we have 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;
+          document.getElementById('amount').value = amount.toFixed(2);
+          document.getElementById('amount').disabled = false;
+          if (document.getElementById('ajax_surcharge_cell')) {
+            document.getElementById('ajax_surcharge_cell').innerHTML = '<FONT SIZE="+1">A credit card surcharge of <% $money_char %>' + surcharge.toFixed(2) + ' is included in this payment</FONT>';
+          }
         }
 
       }
@@ -96,4 +130,7 @@ Example:
 
 my %opt = @_;
 
+my $conf = new FS::Conf;
+my $money_char = $conf->config('money_char') || '$';
+
 </%init>
\ No newline at end of file
index de060b0..4f6f7ef 100644 (file)
@@ -25,7 +25,7 @@
              ? scalar($conf->config('credit-card-surcharge-percentage', $cust_main->agentnum))
              : 0
          ),
-       'surcharge_flatfee:Q' =>
+       'surcharge_flatfee' =>
          ( $payby eq 'CARD'
              ? scalar($conf->config('credit-card-surcharge-flatfee', $cust_main->agentnum))
              : 0