X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Ftax_rate.pm;h=8bc0c6ef3ff30d5db71c05c4e151e8aee42e908b;hb=a354fed1dedc65cf62e63d940e1cfb9c4364e6d3;hp=8579020e1281a5376a2982344d0423646560fee7;hpb=0fda4498e5b48587090b03d40ea97fec1e024385;p=freeside.git diff --git a/FS/FS/tax_rate.pm b/FS/FS/tax_rate.pm index 8579020e1..8bc0c6ef3 100644 --- a/FS/FS/tax_rate.pm +++ b/FS/FS/tax_rate.pm @@ -386,10 +386,7 @@ Takes an arrayref of L objects representing taxable line items, and an arrayref of charge classes ('setup', 'recur', '' for unclassified usage, or an L number). Calculates the tax on each item under this tax definition and returns a list of new -L objects for the taxes charged. Each returned object -will have a pseudo-field, "cust_bill_pkg_tax_rate_location", containing a -single L object linking the tax rate -back to this tax, and to its originating sale. +L objects for the taxes charged. If the taxable objects are linked to an invoice, this will also calculate per-customer exemptions (cust_exempt and cust_taxname_exempt) and attach them @@ -401,9 +398,6 @@ method together, and NO items from any other invoice should be included. =cut -# future optimization: it would probably suffice to return only the link -# records, and let the consolidation routine build the cust_bill_pkgs - sub taxline_cch { my $self = shift; # this used to accept a hash of options but none of them did anything @@ -461,7 +455,7 @@ sub taxline_cch { $self->_fatal_or_null( 'tax with "'. $self->basetype_name. '" basis' ); } - my @tax_locations; + my @tax_links; # for output my %seen; # locationnum or pkgnum => 1 my $taxable_cents = 0; @@ -514,7 +508,7 @@ sub taxline_cch { # yeah, some false laziness with cust_main_county my $this_tax_cents = int(100 * $taxable_charged * $self->tax); - my $tax_location = FS::cust_bill_pkg_tax_rate_location->new({ + my $tax_link = FS::cust_bill_pkg_tax_rate_location->new({ 'taxnum' => $self->taxnum, 'taxtype' => ref($self), 'cents' => $this_tax_cents, # not a real field @@ -524,7 +518,7 @@ sub taxline_cch { 'taxratelocationnum' => $taxratelocationnum, 'taxclass' => $class, }); - push @tax_locations, $tax_location; + push @tax_links, $tax_link; $taxable_cents += 100 * $taxable_charged; $tax_cents += $this_tax_cents; @@ -579,15 +573,17 @@ sub taxline_cch { return $self->_fatal_or_null( 'unknown unit type in tax'. $self->taxnum ); } my $this_tax_cents = int($units * $self->fee * 100); - my $tax_location = FS::cust_bill_pkg_tax_rate_location->new({ + my $tax_link = FS::cust_bill_pkg_tax_rate_location->new({ 'taxnum' => $self->taxnum, 'taxtype' => ref($self), 'cents' => $this_tax_cents, 'locationtaxid' => $self->location, + 'taxable_billpkgnum' => $cust_bill_pkg->billpkgnum, 'taxable_cust_bill_pkg' => $cust_bill_pkg, 'taxratelocationnum' => $taxratelocationnum, + 'taxclass' => $class, }); - push @tax_locations, $tax_location; + push @tax_links, $tax_link; $taxable_units += $units; $tax_cents += $this_tax_cents; @@ -614,7 +610,7 @@ sub taxline_cch { my $extra_cents = sprintf('%.0f', $total_tax_cents - $tax_cents); $tax_cents += $extra_cents; my $i = 0; - foreach (@tax_locations) { # can never require more than a single pass, yes? + foreach (@tax_links) { # can never require more than a single pass, yes? my $cents = $_->get('cents'); if ( $extra_cents > 0 ) { $cents++; @@ -623,26 +619,7 @@ sub taxline_cch { $_->set('amount', sprintf('%.2f', $cents/100)); } - # just transform each CBPTRL record into a tax line item. - # calculate_taxes will consolidate them, but before that happens we have - # to do tax on tax calculation. - my @tax_items; - foreach (@tax_locations) { - next if $_->amount == 0; - my $tax_item = FS::cust_bill_pkg->new({ - 'pkgnum' => 0, - 'recur' => 0, - 'setup' => $_->amount, - 'sdate' => '', # $_->sdate? - 'edate' => '', - 'itemdesc' => $name, - 'cust_bill_pkg_tax_rate_location' => [ $_ ], - }); - $_->set('tax_cust_bill_pkg' => $tax_item); - push @tax_items, $tax_item; - } - - return @tax_items; + return @tax_links; } sub _fatal_or_null { @@ -712,7 +689,9 @@ sub tax_on_tax { "AND (". join(' OR ', map { "taxclassnum = $_" } @taxclassnums ). ")"; qsearch({ 'table' => 'tax_rate', - 'hashref' => { 'geocode' => $geocode, }, + 'hashref' => { 'data_vendor' => $self->data_vendor, + 'geocode' => $geocode, + }, 'extra_sql' => $extra_sql, }) @@ -2351,12 +2330,20 @@ EOF my $dropstring = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc. '/report.'; $reportname =~ s/^$dropstring//; - my $reporturl = "%%%ROOTURL%%%/misc/queued_report?report=$reportname"; + my $reporturl = "%%%ROOTURL%%%/misc/queued_report.html?report=$reportname"; die "view\n"; } +sub _upgrade_data { + my $class = shift; + + my $sql = "UPDATE tax_rate SET data_vendor = 'compliance_solutions' WHERE data_vendor = 'compliance solutions'"; + my $sth = dbh->prepare($sql) or die $DBI::errstr; + $sth->execute() or die $sth->errstr; + +} =back