summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2018-05-16 18:00:33 -0700
committerIvan Kohler <ivan@freeside.biz>2018-05-16 18:00:33 -0700
commita8d1e0ab1d47170d29f847bcbb790a58c6eb435d (patch)
tree7772e08930466368bacd176a5910cf613f39f189
parent483e8f097bff5067a62873e750070993b68163b0 (diff)
parent827c717245d3374f4dacba7308002ecf64a88304 (diff)
Merge branch 'master' of git.freeside.biz:/home/git/freeside
-rw-r--r--FS/FS/cust_main/Billing.pm4
-rw-r--r--FS/FS/cust_pay.pm120
-rw-r--r--FS/FS/part_pkg/flat.pm7
-rw-r--r--FS/FS/pay_batch/RBC.pm8
-rw-r--r--httemplate/elements/tr-amount_fee.html32
-rw-r--r--httemplate/elements/tr-select-payment_options.html43
-rw-r--r--httemplate/misc/payment.cgi2
7 files changed, 136 insertions, 80 deletions
diff --git a/FS/FS/cust_main/Billing.pm b/FS/FS/cust_main/Billing.pm
index a5a38fdc2..51b49e4f0 100644
--- a/FS/FS/cust_main/Billing.pm
+++ b/FS/FS/cust_main/Billing.pm
@@ -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 ) };
diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm
index 5031793ff..4c82d106e 100644
--- a/FS/FS/cust_pay.pm
+++ b/FS/FS/cust_pay.pm
@@ -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
diff --git a/FS/FS/part_pkg/flat.pm b/FS/FS/part_pkg/flat.pm
index cfee58465..6fd9c7d08 100644
--- a/FS/FS/part_pkg/flat.pm
+++ b/FS/FS/part_pkg/flat.pm
@@ -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 {
diff --git a/FS/FS/pay_batch/RBC.pm b/FS/FS/pay_batch/RBC.pm
index 21dae4256..1577a7f85 100644
--- a/FS/FS/pay_batch/RBC.pm
+++ b/FS/FS/pay_batch/RBC.pm
@@ -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).
diff --git a/httemplate/elements/tr-amount_fee.html b/httemplate/elements/tr-amount_fee.html
index 9e6d9e96d..1c78d7ec1 100644
--- a/httemplate/elements/tr-amount_fee.html
+++ b/httemplate/elements/tr-amount_fee.html
@@ -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)"
@@ -28,17 +28,23 @@
<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 %>;
@@ -48,6 +54,13 @@
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);
}
diff --git a/httemplate/elements/tr-select-payment_options.html b/httemplate/elements/tr-select-payment_options.html
index 8859b9b36..a59963a91 100644
--- a/httemplate/elements/tr-select-payment_options.html
+++ b/httemplate/elements/tr-select-payment_options.html
@@ -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
diff --git a/httemplate/misc/payment.cgi b/httemplate/misc/payment.cgi
index de060b010..4f6f7ef75 100644
--- a/httemplate/misc/payment.cgi
+++ b/httemplate/misc/payment.cgi
@@ -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