summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2016-11-09 17:26:07 -0800
committerMark Wells <mark@freeside.biz>2016-11-09 17:26:07 -0800
commitb3396e3be622bc3ffe31f5639053153ee0f7b524 (patch)
treecf6035f3b3ddd6cc8b402eda4c26853d0e127dbe
parente90139791421a47a99add429e15dbe45f9412b93 (diff)
separate WA sales tax by tax class during upgrade, #73185
-rw-r--r--FS/FS/cust_main_county.pm80
1 files changed, 80 insertions, 0 deletions
diff --git a/FS/FS/cust_main_county.pm b/FS/FS/cust_main_county.pm
index 5af33c2..2c598ac 100644
--- a/FS/FS/cust_main_county.pm
+++ b/FS/FS/cust_main_county.pm
@@ -736,6 +736,86 @@ sub _upgrade_data {
die $error if $error;
}
} # foreach $record
+
+ # separate wa_sales taxes by tax class as needed
+ my $district_taxname = $conf->config('tax_district_taxname');
+ $journal = 'cust_main_county__district_taxclass';
+ if (!FS::upgrade_journal->is_done($journal)
+ and $conf->config('enable_taxclasses')) {
+ eval "use FS::part_pkg_taxclass";
+ my @taxes = qsearch({
+ 'table' => 'cust_main_county',
+ 'extra_sql' => " WHERE tax > 0 AND country = 'US' AND state = 'WA'".
+ " AND district IS NOT NULL AND source = 'wa_sales'".
+ " AND taxclass IS NULL"
+ });
+ my @classes = FS::part_pkg_taxclass->taxclass_names;
+ if ( @taxes ) {
+ warn "Separating WA sales taxes: ".scalar(@taxes)." records.\n";
+ foreach my $oldtax (@taxes) {
+ my $error;
+ my $taxnum = $oldtax->taxnum;
+ warn "Separating tax #$taxnum into classes\n";
+ foreach my $taxclass (@classes) {
+ # ensure that we end up with a single copy of the tax in this
+ # jurisdiction+class. there may already be one (or more) there.
+ # if so, they all represent the same tax; merge them together.
+ my %newtax_hash = (
+ 'country' => 'US',
+ 'state' => 'WA',
+ 'city' => $oldtax->city,
+ 'district' => $oldtax->district,
+ 'taxclass' => $taxclass,
+ 'source' => 'wa_sales',
+ );
+ my @taxes_in_class = qsearch('cust_main_county', {
+ %newtax_hash,
+ 'tax' => { op => '>', value => 0 },
+ 'setuptax' => '',
+ 'recurtax' => '',
+ });
+ my $newtax = shift @taxes_in_class;
+ if ($newtax) {
+ foreach (@taxes_in_class) {
+ # allow the merge, even if this somehow differs.
+ $_->set('tax', $newtax->tax);
+ $_->_merge_into($newtax);
+ }
+ }
+ $newtax ||= FS::cust_main_county->new(\%newtax_hash);
+ # copy properties from the pre-split tax
+ $newtax->set('tax', $oldtax->tax);
+ $newtax->set('setuptax', $oldtax->setuptax);
+ $newtax->set('recurtax', $oldtax->recurtax);
+ # and assign the defined tax name
+ $newtax->set('taxname', $district_taxname);
+ $error = ($newtax->taxnum ? $newtax->replace : $newtax->insert);
+ die "splitting taxnum ".$oldtax->taxnum.": $error\n" if $error;
+ } # foreach $taxclass
+ $oldtax->set('tax', 0);
+ $error = $oldtax->replace;
+ die "splitting taxnum ".$oldtax->taxnum.": $error\n" if $error;
+ }
+ }
+ FS::upgrade_journal->set_done($journal);
+ }
+
+ # also ensure they all have the chosen taxname now
+ if ($district_taxname) {
+ my @taxes = qsearch('cust_main_county', {
+ 'source' => 'wa_sales',
+ 'taxname' => { op => '!=', value => $district_taxname }
+ });
+ if (@taxes) {
+ warn "Renaming WA sales taxes: ".scalar(@taxes)." records.\n";
+ foreach my $tax (@taxes) {
+ $tax->set('taxname', $district_taxname);
+ my $error = $tax->replace;
+ die "renaming taxnum ".$tax->taxnum.": $error\n" if $error;
+ }
+ }
+ }
+
'';
}