From 7badb86e945f91ea4e18c8f52054d30404a43f86 Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Wed, 1 Apr 2015 13:07:01 -0500 Subject: [PATCH] fix post-consolidation linking of tax on tax records, should be the last piece of #34223 --- FS/FS/TaxEngine.pm | 34 ++++++++++++++++++++++++++-------- FS/FS/cust_bill_pkg.pm | 7 ++++--- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/FS/FS/TaxEngine.pm b/FS/FS/TaxEngine.pm index 0972fb74d..54e305f23 100644 --- a/FS/FS/TaxEngine.pm +++ b/FS/FS/TaxEngine.pm @@ -160,19 +160,27 @@ sub consolidate_taxlines { my %tax_amount; my $link_table = $self->info->{link_table}; + + # Preconstruct cust_bill_pkg objects that will become the "final" + # taxlines for each name, so that we can reference them. + # (keys are taxnames) + my %real_taxline_named = map { + $_ => FS::cust_bill_pkg->new({ + 'pkgnum' => 0, + 'recur' => 0, + 'sdate' => '', + 'edate' => '', + 'itemdesc' => $_ + }) + } keys %taxname; + # For each distinct tax name (the values set as $taxline->itemdesc), # create a consolidated tax item with the total amount and all the links # of all tax items that share that name. foreach my $taxname ( keys %taxname ) { my @tax_links; - my $tax_cust_bill_pkg = FS::cust_bill_pkg->new({ - 'pkgnum' => 0, - 'recur' => 0, - 'sdate' => '', - 'edate' => '', - 'itemdesc' => $taxname, - $link_table => \@tax_links, - }); + my $tax_cust_bill_pkg = $real_taxline_named{$taxname}; + $tax_cust_bill_pkg->set( $link_table => \@tax_links ); my $tax_total = 0; warn "adding $taxname\n" if $DEBUG > 1; @@ -183,6 +191,16 @@ sub consolidate_taxlines { $tax_total += $taxitem->setup; foreach my $link ( @{ $taxitem->get($link_table) } ) { $link->set('tax_cust_bill_pkg', $tax_cust_bill_pkg); + + # if the link represents tax on tax, also fix its taxable pointer + # to point to the "final" taxline + my $taxable_cust_bill_pkg = $link->get('taxable_cust_bill_pkg'); + if (my $other_taxname = $taxable_cust_bill_pkg->itemdesc) { + $link->set('taxable_cust_bill_pkg', + $real_taxline_named{$other_taxname} + ); + } + push @tax_links, $link; } } # foreach $taxitem diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm index 156ab5bf0..d0cec90dc 100644 --- a/FS/FS/cust_bill_pkg.pm +++ b/FS/FS/cust_bill_pkg.pm @@ -207,6 +207,7 @@ sub insert { { my $tax_location = $self->get($tax_link_table) || []; foreach my $link ( @$tax_location ) { + $DB::single=1; #XXX my $pkey = $link->primary_key; next if $link->get($pkey); # don't try to double-insert # This cust_bill_pkg can be linked on either side (i.e. it can be the @@ -238,12 +239,12 @@ sub insert { return "error inserting cust_bill_pkg_tax_location: $error"; } } else { # handoff - my $other; + my $other; # the as yet uninserted cust_bill_pkg $other = $link->billpkgnum ? $link->get('taxable_cust_bill_pkg') : $link->get('tax_cust_bill_pkg'); - my $link_array = $other->get('cust_bill_pkg_tax_location') || []; + my $link_array = $other->get( $tax_link_table ) || []; push @$link_array, $link; - $other->set('cust_bill_pkg_tax_location' => $link_array); + $other->set( $tax_link_table => $link_array); } } #foreach my $link } -- 2.11.0