[freeside-commits] branch master updated. 3cdd4af468c2c93e1fe4ab6a0ac95537aca5068e

Mark Wells mark at 420.am
Fri Jan 22 16:25:04 PST 2016


The branch, master has been updated
       via  3cdd4af468c2c93e1fe4ab6a0ac95537aca5068e (commit)
       via  19ecc46addd9225704aa524126169ec30d353822 (commit)
       via  f75e09ff051137a6b298801b1faae9443c6343a5 (commit)
      from  cae584bf375249ab6c1143f5c7cce2776e849e05 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 3cdd4af468c2c93e1fe4ab6a0ac95537aca5068e
Author: Mark Wells <mark at freeside.biz>
Date:   Fri Jan 22 16:22:30 2016 -0800

    optionally round tax to the nearest cent for each line item, #39487

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 1bb6dcc..fda199e 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -5165,6 +5165,13 @@ and customer address. Include units.',
   },
 
   {
+    'key'         => 'tax-round_per_line_item',
+    'section'     => 'billing',
+    'description' => 'Calculate tax and round to the nearest cent for each line item, rather than for the whole invoice.',
+    'type'        => 'checkbox',
+  },
+
+  {
     'key'         => 'cust_main-default_view',
     'section'     => 'UI',
     'description' => 'Default customer view, for users who have not selected a default view in their preferences.',
diff --git a/FS/FS/TaxEngine/internal.pm b/FS/FS/TaxEngine/internal.pm
index f45bc08..d2a5d7f 100644
--- a/FS/FS/TaxEngine/internal.pm
+++ b/FS/FS/TaxEngine/internal.pm
@@ -3,6 +3,12 @@ package FS::TaxEngine::internal;
 use strict;
 use base 'FS::TaxEngine';
 use FS::Record qw(dbh qsearch qsearchs);
+use FS::Conf;
+use vars qw( $conf );
+
+FS::UID->install_callback(sub {
+    $conf = FS::Conf->new;
+});
 
 =head1 SUMMARY
 
@@ -63,6 +69,8 @@ sub taxline {
   my $taxable_cents = 0;
   my $tax_cents = 0;
 
+  my $round_per_line_item = $conf->exists('tax-round_per_line_item');
+
   my $cust_main = $self->{cust_main};
   my $custnum   = $cust_main->custnum;
   my $invoice_time = $self->{invoice_time};
@@ -258,7 +266,16 @@ sub taxline {
     $taxable_charged = sprintf( "%.2f", $taxable_charged);
     next if $taxable_charged == 0;
 
-    my $this_tax_cents = int($taxable_charged * $tax_object->tax);
+    my $this_tax_cents = $taxable_charged * $self->tax;
+    if ( $round_per_line_item ) {
+      # Round the tax to the nearest cent for each line item, instead of
+      # across the whole invoice.
+      $this_tax_cents = sprintf('%.0f', $this_tax_cents);
+    } else {
+      # Otherwise truncate it so that rounding error is always positive.
+      $this_tax_cents = int($this_tax_cents);
+    }
+
     my $location = FS::cust_bill_pkg_tax_location->new({
         'taxnum'      => $tax_object->taxnum,
         'taxtype'     => ref($tax_object),
@@ -273,11 +290,18 @@ sub taxline {
     $tax_cents += $this_tax_cents;
   } #foreach $cust_bill_pkg
 
-  # now round and distribute
+  # calculate tax and rounding error for the whole group
   my $extra_cents = sprintf('%.2f', $taxable_cents * $tax_object->tax / 100)
                             * 100 - $tax_cents;
   # make sure we have an integer
   $extra_cents = sprintf('%.0f', $extra_cents);
+
+  # if we're rounding per item, then ignore that and don't distribute any
+  # extra cents.
+  if ( $round_per_line_item ) {
+    $extra_cents = 0;
+  }
+
   if ( $extra_cents < 0 ) {
     die "nonsense extra_cents value $extra_cents";
   }

commit 19ecc46addd9225704aa524126169ec30d353822
Merge: f75e09f cae584b
Author: Mark Wells <mark at freeside.biz>
Date:   Fri Jan 22 16:15:50 2016 -0800

    Merge branch 'master' of git.freeside.biz:/home/git/freeside


commit f75e09ff051137a6b298801b1faae9443c6343a5
Author: Mark Wells <mark at freeside.biz>
Date:   Mon Jan 18 14:32:15 2016 -0800

    spelling

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 0f94f8f..1bb6dcc 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -2617,7 +2617,7 @@ and customer address. Include units.',
     'type'        => 'select',
     'select_hash' => [
                        'actual_oncard' => 'Default/classic behavior: set the flag if a customer has actual previous charges on the card.',
-		       'transaction_is_recur' => 'Set the flag if the transaction itself is recurring, irregardless of previous charges on the card.',
+		       'transaction_is_recur' => 'Set the flag if the transaction itself is recurring, regardless of previous charges on the card.',
                      ],
   },
 

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/Conf.pm               |    9 ++++++++-
 FS/FS/TaxEngine/internal.pm |   28 ++++++++++++++++++++++++++--
 2 files changed, 34 insertions(+), 3 deletions(-)




More information about the freeside-commits mailing list