X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg_taxproduct.pm;h=51bc37f9c437d4eed03c9d52a2ba3ff8671aef29;hp=ddea1da79ddfc7058d5196a9ff593bdc23c3c7a4;hb=7a33cb6e4c3e33b7399d6574cbd3ee38ddcba5e0;hpb=30e2dfd524a3f52445cbca6bc2cd1962dce7eb04 diff --git a/FS/FS/part_pkg_taxproduct.pm b/FS/FS/part_pkg_taxproduct.pm index ddea1da79..51bc37f9c 100644 --- a/FS/FS/part_pkg_taxproduct.pm +++ b/FS/FS/part_pkg_taxproduct.pm @@ -3,6 +3,7 @@ package FS::part_pkg_taxproduct; use strict; use vars qw( @ISA $delete_kludge ); use FS::Record qw( qsearch dbh ); +use Text::CSV_XS; @ISA = qw(FS::Record); $delete_kludge = 0; @@ -28,7 +29,7 @@ FS::part_pkg_taxproduct - Object methods for part_pkg_taxproduct records =head1 DESCRIPTION -An FS::part_pkg_taxproduct object represents a tax product. +An FS::part_pkg_taxproduct object represents a tax product. FS::part_pkg_taxproduct inherits from FS::Record. The following fields are currently supported: @@ -152,7 +153,11 @@ sub part_pkg_taxrate { map { $_->taxproductnum } $self->expand_cch_taxproduct ); - $extra_sql .= "AND taxproductnum IN($tpnums)"; + + # if there are no taxproductnums, there are no matching tax classes + return if length($tpnums) == 0; + + $extra_sql .= " AND taxproductnum IN($tpnums)"; my $addl_from = 'LEFT JOIN part_pkg_taxproduct USING ( taxproductnum )'; my $order_by = 'ORDER BY taxclassnum, length(geocode) desc, length(taxproduct) desc'; @@ -199,6 +204,73 @@ sub expand_cch_taxproduct { =cut +sub batch_import { + my ($param, $job) = @_; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $fh = $param->{filehandle}; + my $format = $param->{format}; + die "unsupported part_pkg_taxproduct format '$format'" + unless $format eq 'billsoft'; + + # this is slightly silly + my @lines = <$fh>; + my $lines = scalar @lines; + seek($fh, 0, 0); + + my $imported = 0; + my $csv = Text::CSV_XS->new; + my $error; + # for importing the "transervdesc.txt" file + while ( my $row = $csv->getline($fh) ) { + if (!defined $row) { + $dbh->rollback if $oldAutoCommit; + return "can't parse: ". $csv->error_input(); + } + + if ( $job ) { + $job->update_statustext( + int( 100 * $imported / $lines ) . ',Inserting tax product records' + ); + } + + # columns 0-2: irrelevant here + my $taxproduct = $row->[3] . ':' . $row->[5]; + my $description = $row->[4]; + $description =~ s/\s+$//; + $description .= ':' . $row->[6]; + $description =~ s/\s+$//; + my $ppt = qsearchs('part_pkg_taxproduct', { + 'data_vendor' => 'billsoft', + 'taxproduct' => $taxproduct + }); + if ( $ppt ) { + $ppt->set('description', $description); + $ppt->set('note', $row->[7]); + $error = $ppt->replace; + } else { + $ppt = FS::part_pkg_taxproduct->new({ + 'data_vendor' => 'billsoft', + 'taxproduct' => $taxproduct, + 'description' => $description, + 'note' => $row->[7], + }); + $error = $ppt->insert; + } + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "error inserting part_pkg_taxproduct $taxproduct: $error\n"; + } + $imported++; + } + + $dbh->commit if $oldAutoCommit; + return ''; +} + =head1 BUGS Confusingly named. It has nothing to do with part_pkg.