[freeside-commits] branch master updated. 15c1f19f13159664062bfd0cde07f9f117a5fca6

Mark Wells mark at 420.am
Tue Aug 26 21:38:25 PDT 2014


The branch, master has been updated
       via  15c1f19f13159664062bfd0cde07f9f117a5fca6 (commit)
      from  1e2578864400dd47c3b39d0d7e93e3e7f7e74276 (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 15c1f19f13159664062bfd0cde07f9f117a5fca6
Author: Mark Wells <mark at freeside.biz>
Date:   Tue Aug 26 23:38:13 2014 -0500

    3.x upgrade vs. tax-pkg_address, #30413

diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm
index 150f965..689d6c6 100644
--- a/FS/FS/cust_bill_pkg.pm
+++ b/FS/FS/cust_bill_pkg.pm
@@ -1139,6 +1139,7 @@ sub upgrade_tax_location {
   my $conf = FS::Conf->new; # h_conf?
   return if $conf->exists('enable_taxproducts'); #don't touch this case
   my $use_ship = $conf->exists('tax-ship_address');
+  my $use_pkgloc = $conf->exists('tax-pkg_address');
 
   my $date_where = '';
   if ($opt{s}) {
@@ -1216,13 +1217,14 @@ sub upgrade_tax_location {
     # This is a historical customer record, so it has a historical address.
     # If there's no cust_location matching this custnum and address (there 
     # probably isn't), create one.
-    my $tax_loc;
+    my %tax_loc; # keys are pkgnums, values are cust_location objects
+    my $default_tax_loc;
     if ( $h_cust_main->bill_locationnum ) {
       # the location has already been upgraded
       if ($use_ship) {
-        $tax_loc = $h_cust_main->ship_location;
+        $default_tax_loc = $h_cust_main->ship_location;
       } else {
-        $tax_loc = $h_cust_main->bill_location;
+        $default_tax_loc = $h_cust_main->bill_location;
       }
     } else {
       $pre = 'ship_' if $use_ship and length($h_cust_main->get('ship_last'));
@@ -1232,8 +1234,8 @@ sub upgrade_tax_location {
       delete @hash{qw(censustract censusyear latitude longitude coord_auto)};
 
       $hash{custnum} = $h_cust_main->custnum;
-      $tax_loc = FS::cust_location->new(\%hash);
-      my $error = $tax_loc->find_or_insert || $tax_loc->disable_if_unused;
+      $default_tax_loc = FS::cust_location->new(\%hash);
+      my $error = $default_tax_loc->find_or_insert || $default_tax_loc->disable_if_unused;
       if ( $error ) {
         warn "couldn't create historical location record for cust#".
         $h_cust_main->custnum.": $error\n";
@@ -1263,6 +1265,15 @@ sub upgrade_tax_location {
         }
         my $pkgpart = $h_cust_pkg->pkgpart;
 
+        if ( $use_pkgloc and $h_cust_pkg->locationnum ) {
+          # then this package already had a locationnum assigned, and that's 
+          # the one to use for tax calculation
+          $tax_loc{$pkgnum} = FS::cust_location->by_key($h_cust_pkg->locationnum);
+        } else {
+          # use the customer's bill or ship loc, which was inserted earlier
+          $tax_loc{$pkgnum} = $default_tax_loc;
+        }
+
         if (!exists $pkgpart_taxclass{$pkgpart}) {
           my $h_part_pkg = qsearchs('h_part_pkg', { pkgpart => $pkgpart },
             FS::h_part_pkg->sql_h_searchs($date)
@@ -1313,33 +1324,31 @@ sub upgrade_tax_location {
     # FS::cust_main::Billing::_handle_taxes to identify taxes that apply 
     # to this bill.
     my @loc_keys = qw( district city county state country );
-    my %taxhash = map { $_ => $tax_loc->get($pre.$_) } @loc_keys;
     my %taxdef_by_name; # by name, and then by taxclass
     my %est_tax; # by name, and then by taxclass
     my %taxable_items; # by taxnum, and then an array
 
     foreach my $taxclass (keys %nontax_items) {
-      my %myhash = %taxhash;
-      my @elim = qw( district city county state );
-      my @taxdefs; # because there may be several with different taxnames
-      do {
-        $myhash{taxclass} = $taxclass;
-        @taxdefs = qsearch('cust_main_county', \%myhash);
-        if ( !@taxdefs ) {
-          $myhash{taxclass} = '';
+      foreach my $orig_item (@{ $nontax_items{$taxclass} }) {
+        my $my_tax_loc = $tax_loc{ $orig_item->pkgnum };
+        my %myhash = map { $_ => $my_tax_loc->get($pre.$_) } @loc_keys;
+        my @elim = qw( district city county state );
+        my @taxdefs; # because there may be several with different taxnames
+        do {
+          $myhash{taxclass} = $taxclass;
           @taxdefs = qsearch('cust_main_county', \%myhash);
-        }
-        $myhash{ shift @elim } = '';
-      } while scalar(@elim) and !@taxdefs;
+          if ( !@taxdefs ) {
+            $myhash{taxclass} = '';
+            @taxdefs = qsearch('cust_main_county', \%myhash);
+          }
+          $myhash{ shift @elim } = '';
+        } while scalar(@elim) and !@taxdefs;
 
-      print "Class '$taxclass': ". scalar(@{ $nontax_items{$taxclass} }).
-            " items, ". scalar(@taxdefs)." tax defs found.\n";
-      foreach my $taxdef (@taxdefs) {
-        next if $taxdef->tax == 0;
-        $taxdef_by_name{$taxdef->taxname}{$taxdef->taxclass} = $taxdef;
+        foreach my $taxdef (@taxdefs) {
+          next if $taxdef->tax == 0;
+          $taxdef_by_name{$taxdef->taxname}{$taxdef->taxclass} = $taxdef;
 
-        $taxable_items{$taxdef->taxnum} ||= [];
-        foreach my $orig_item (@{ $nontax_items{$taxclass} }) {
+          $taxable_items{$taxdef->taxnum} ||= [];
           # clone the item so that taxdef-dependent changes don't
           # change it for other taxdefs
           my $item = FS::cust_bill_pkg->new({ $orig_item->hash });
@@ -1419,8 +1428,8 @@ sub upgrade_tax_location {
               next INVOICE;
             }
           } #foreach @new_exempt
-        } #foreach $item
-      } #foreach $taxdef
+        } #foreach $taxdef
+      } #foreach $item
     } #foreach $taxclass
 
     # Now go through the billed taxes and match them up with the line items.
@@ -1466,6 +1475,7 @@ sub upgrade_tax_location {
         printf("\t$taxclass: %.2f\n", $this_est_tax->{$taxclass}/$est_total);
 
         foreach my $nontax (@items) {
+          my $my_tax_loc = $tax_loc{ $nontax->pkgnum };
           my $part = int($real_tax
                             # class allocation
                          * ($this_est_tax->{$taxclass}/$est_total) 
@@ -1478,6 +1488,7 @@ sub upgrade_tax_location {
           push @tax_links, {
             taxnum      => $taxdef->taxnum,
             pkgnum      => $nontax->pkgnum,
+            locationnum => $my_tax_loc->locationnum,
             billpkgnum  => $nontax->billpkgnum,
             cents       => $part,
           };
@@ -1520,7 +1531,7 @@ sub upgrade_tax_location {
         my $link = FS::cust_bill_pkg_tax_location->new({
             billpkgnum  => $tax_item->billpkgnum,
             taxtype     => 'FS::cust_main_county',
-            locationnum => $tax_loc->locationnum,
+            locationnum => $_->{locationnum},
             taxnum      => $_->{taxnum},
             pkgnum      => $_->{pkgnum},
             amount      => sprintf('%.2f', $_->{cents} / 100),

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

Summary of changes:
 FS/FS/cust_bill_pkg.pm |   65 ++++++++++++++++++++++++++++--------------------
 1 file changed, 38 insertions(+), 27 deletions(-)




More information about the freeside-commits mailing list