diff options
| author | Ivan Kohler <ivan@freeside.biz> | 2018-05-30 12:32:48 -0700 |
|---|---|---|
| committer | Ivan Kohler <ivan@freeside.biz> | 2018-05-30 12:32:48 -0700 |
| commit | ec61d63e707e874ae5ba606accb192dfb6b5ef82 (patch) | |
| tree | eafaf790c9735eb4eee878ab5bb8159ff80159d7 | |
| parent | efdfd4f1dc1ad957c9aa9d4aca0d8d0f2f49806d (diff) | |
| parent | a7f520e2c78a791d32f62eacfbfef025ba7f1bc4 (diff) | |
Merge branch 'FREESIDE_3_BRANCH' of git.freeside.biz:/home/git/freeside into FREESIDE_3_BRANCH
| -rw-r--r-- | FS/FS/ClientAPI/MasonComponent.pm | 1 | ||||
| -rw-r--r-- | FS/FS/ClientAPI/MyAccount.pm | 1 | ||||
| -rw-r--r-- | FS/FS/Conf.pm | 8 | ||||
| -rw-r--r-- | FS/FS/UI/Web.pm | 4 | ||||
| -rw-r--r-- | FS/FS/cust_main/Billing.pm | 3 | ||||
| -rw-r--r-- | FS/FS/cust_main/Billing_Realtime.pm | 20 | ||||
| -rw-r--r-- | FS/FS/part_pkg.pm | 17 | ||||
| -rw-r--r-- | FS/FS/part_pkg/voip_cdr.pm | 8 | ||||
| -rw-r--r-- | FS/FS/pay_batch/RBC.pm | 8 | ||||
| -rwxr-xr-x | FS/FS/svc_broadband.pm | 2 | ||||
| -rw-r--r-- | httemplate/elements/select-tiered.html | 1 | ||||
| -rw-r--r-- | httemplate/elements/tr-amount_fee.html | 3 | ||||
| -rw-r--r-- | httemplate/elements/tr-select-payment_options.html | 99 | ||||
| -rw-r--r-- | httemplate/misc/payment.cgi | 5 |
14 files changed, 162 insertions, 18 deletions
diff --git a/FS/FS/ClientAPI/MasonComponent.pm b/FS/FS/ClientAPI/MasonComponent.pm index 3a4bfe133..d615c271c 100644 --- a/FS/FS/ClientAPI/MasonComponent.pm +++ b/FS/FS/ClientAPI/MasonComponent.pm @@ -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 ); diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index d604491af..476ef0789 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -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, diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index c58ca33f4..8b18a3c3c 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -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%', diff --git a/FS/FS/UI/Web.pm b/FS/FS/UI/Web.pm index 6d6f7fbb6..43a387227 100644 --- a/FS/FS/UI/Web.pm +++ b/FS/FS/UI/Web.pm @@ -739,7 +739,8 @@ use vars qw($DEBUG); use Carp; use Storable qw(nfreeze); use MIME::Base64; -use JSON::XS; +#use JSON::XS; ! maintainers deployed app breaking changes +use Cpanel::JSON::XS; # safe, compatible drop-in replacement use FS::UID qw(getotaker); use FS::Record qw(qsearchs); use FS::queue; @@ -893,4 +894,3 @@ sub job_status { } 1; - diff --git a/FS/FS/cust_main/Billing.pm b/FS/FS/cust_main/Billing.pm index debff8a53..79a0c9ed1 100644 --- a/FS/FS/cust_main/Billing.pm +++ b/FS/FS/cust_main/Billing.pm @@ -1253,6 +1253,9 @@ sub _make_lines { } } + $lineitems++ + if $cust_pkg->waive_setup && $part_pkg->can('prorate_setup') && $part_pkg->prorate_setup($cust_pkg, $time); + $cust_pkg->setfield('setup', $time) unless $cust_pkg->setup; #do need it, but it won't get written to the db diff --git a/FS/FS/cust_main/Billing_Realtime.pm b/FS/FS/cust_main/Billing_Realtime.pm index 63ae777e6..ae41c70c4 100644 --- a/FS/FS/cust_main/Billing_Realtime.pm +++ b/FS/FS/cust_main/Billing_Realtime.pm @@ -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; diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 5f7c831bc..cad761498 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -671,11 +671,17 @@ sub check { =item check_options -For a passed I<$options> hashref, validates any options that -have 'validate' subroutines defined in the info hash, -then validates the entire hashref if the price plan has -its own 'validate' subroutine defined in the info hash -(I<$options> values might be altered.) +Pass an I<$options> hashref that contains the values to be +inserted or updated for any FS::part_pkg::MODULE.pm. + +For each key in I<$options>, validates the value by calling +the 'validate' subroutine defined for that option e.g. +FS::part_pkg::MODULE::plan_info()->{$KEY}->{validate}. The +option validation function is only called when the hashkey for +that option exists in I<$options>. + +Then the module validation function is called, from +FS::part_pkg::MODULE::plan_info()->{validate} Returns error message, or empty string if valid. @@ -2201,4 +2207,3 @@ schema.html from the base documentation. =cut 1; - diff --git a/FS/FS/part_pkg/voip_cdr.pm b/FS/FS/part_pkg/voip_cdr.pm index 2d8c359cf..7947a143d 100644 --- a/FS/FS/part_pkg/voip_cdr.pm +++ b/FS/FS/part_pkg/voip_cdr.pm @@ -371,6 +371,13 @@ tie my %accountcode_tollfree_field, 'Tie::IxHash', ) ], 'weight' => 41, + 'validate' => sub { + # Validation function for FS::part_pkg::check_options() + my $options = shift; + return "Please choose a Rate Plan for use with selected Rating Method" + if $options->{rating_method} eq 'prefix' && !$options->{ratenum}; + return; + }, ); sub price_info { @@ -754,4 +761,3 @@ sub hide_svc_detail { 1; - diff --git a/FS/FS/pay_batch/RBC.pm b/FS/FS/pay_batch/RBC.pm index b0136786b..142c50b79 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->cust_main->paytype eq "Business checking" || $cust_pay_batch->cust_main->paytype eq "Business savings") && $cust_pay_batch->cust_main->company); + $i++; sprintf("%06u", $i). 'D'. @@ -189,8 +194,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/FS/FS/svc_broadband.pm b/FS/FS/svc_broadband.pm index 2cdc284d7..b94fc69e0 100755 --- a/FS/FS/svc_broadband.pm +++ b/FS/FS/svc_broadband.pm @@ -134,6 +134,7 @@ sub table_info { #select_table => 'radius_group', #select_key => 'groupnum', #select_label => 'groupname', + disable_select => 1, disable_inventory => 1, multiple => 1, }, @@ -523,4 +524,3 @@ FS::part_svc, schema.html from the base documentation. =cut 1; - diff --git a/httemplate/elements/select-tiered.html b/httemplate/elements/select-tiered.html index 48469dc04..9c7dfcf82 100644 --- a/httemplate/elements/select-tiered.html +++ b/httemplate/elements/select-tiered.html @@ -126,6 +126,7 @@ my $tiers = $opt{tiers} or die "no tiers defined"; my $json = JSON::XS->new(); $json->canonical; +$json->allow_nonref(1); my $i; for( $i = 0; $i < @$tiers; $i++ ) { diff --git a/httemplate/elements/tr-amount_fee.html b/httemplate/elements/tr-amount_fee.html index 12488521a..e3b8d7800 100644 --- a/httemplate/elements/tr-amount_fee.html +++ b/httemplate/elements/tr-amount_fee.html @@ -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 index 000000000..8859b9b36 --- /dev/null +++ b/httemplate/elements/tr-select-payment_options.html @@ -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 diff --git a/httemplate/misc/payment.cgi b/httemplate/misc/payment.cgi index 4fa3df773..44904fba6 100644 --- a/httemplate/misc/payment.cgi +++ b/httemplate/misc/payment.cgi @@ -22,6 +22,11 @@ ? 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 + ), &> % if ( $conf->exists('part_pkg-term_discounts') ) { |
