|| $self->ut_enum('passflag', [ '', 'Y', 'N' ])
|| $self->ut_enum('setuptax', [ '', 'Y' ] )
|| $self->ut_enum('recurtax', [ '', 'Y' ] )
+ || $self->ut_enum('inoutcity', [ '', 'I', 'O' ] )
+ || $self->ut_enum('inoutlocal', [ '', 'I', 'O' ] )
|| $self->ut_enum('manual', [ '', 'Y' ] )
|| $self->ut_enum('disabled', [ '', 'Y' ] )
|| $self->SUPER::check
$hash->{'taxclassnum'} = $tax_class->taxclassnum;
- foreach (qw( inoutcity inoutlocal taxtype taxcat )) {
+ foreach (qw( taxtype taxcat )) {
delete($hash->{$_});
}
my $error = $job->update_statustext(
int( 100 * $imported / $count ). ",Importing tax rates"
);
- die $error if $error;
+ if ($error) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
$last = time;
}
}
my $error = $job->update_statustext(
int( 100 * $imported / $count ). ",Importing tax rates"
);
- die $error if $error;
+ if ($error) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
$last = time;
}
}
my $error = $job->update_statustext(
int( 100 * $imported / $count ). ",Importing tax rates"
);
- die $error if $error;
+ if ($error) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
$last = time;
}
}
my $error = $job->update_statustext(
int( 100 * $imported / $count ). ",Importing tax rates"
);
- die $error if $error;
+ if ($error) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
$last = time;
}
}
my $error = '';
my @insert_list = ();
my @delete_list = ();
+ my @predelete_list = ();
my @list = ( 'GEOCODE', 'geofile', \&FS::tax_rate_location::batch_import,
'CODE', 'codefile', \&FS::tax_class::batch_import,
close $dfh;
push @insert_list, $name, $ifh->filename, $import_sub;
- unshift @delete_list, $name, $dfh->filename, $import_sub;
+ if ( $name eq 'GEOCODE' ) { #handle this whole ordering issue better
+ unshift @predelete_list, $name, $dfh->filename, $import_sub;
+ } else {
+ unshift @delete_list, $name, $dfh->filename, $import_sub;
+ }
+
+ }
+
+ while( scalar(@predelete_list) ) {
+ my ($name, $file, $import_sub) =
+ (shift @predelete_list, shift @predelete_list, shift @predelete_list);
+ my $fmt = $format. ( $name eq 'ZIP' ? '-zip' : '' );
+ open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
+ $error ||=
+ &{$import_sub}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
+ close $fh;
+ unlink $file or warn "Can't delete $file: $!";
}
+
while( scalar(@insert_list) ) {
my ($name, $file, $import_sub) =
(shift @insert_list, shift @insert_list, shift @insert_list);
#remember disabled taxes
my %disabled_tax_rate = ();
- foreach my $tax_rate ( qsearch( { table => 'tax_rate',
- hashref => { disabled => 'Y',
- data_vendor => $format,
- },
- select => 'geocode, taxclassnum',
- }
- )
- )
- {
+ my @items = qsearch( { table => 'tax_rate',
+ hashref => { disabled => 'Y',
+ data_vendor => $format,
+ },
+ select => 'geocode, taxclassnum',
+ }
+ );
+ $count = scalar(@items);
+ foreach my $tax_rate ( @items ) {
+ if ( time - $min_sec > $last ) {
+ my $error = $job->update_statustext(
+ int( 100 * $imported / $count ). ",Remembering disabled taxes"
+ );
+ if ($error) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
+ $last = time;
+ }
+ $imported++;
my $tax_class =
qsearchs( 'tax_class', { taxclassnum => $tax_rate->taxclassnum } );
unless ( $tax_class ) {
" part_pkg_option.pkgpart = part_pkg.pkgpart AND ".
" optionname LIKE 'usage_taxproductnum_%' AND ".
" optionvalue != '' )";
- foreach my $part_pkg ( qsearch( { table => 'part_pkg',
- select => 'DISTINCT pkgpart,taxproductnum',
- hashref => {},
- extra_sql => $extra_sql,
- }
- )
- )
- {
+ @items = qsearch( { table => 'part_pkg',
+ select => 'DISTINCT pkgpart,taxproductnum',
+ hashref => {},
+ extra_sql => $extra_sql,
+ }
+ );
+ $count = scalar(@items);
+ $imported = 0;
+ foreach my $part_pkg ( @items ) {
+ if ( time - $min_sec > $last ) {
+ my $error = $job->update_statustext(
+ int( 100 * $imported / $count ). ",Remembering tax products"
+ );
+ if ($error) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
+ $last = time;
+ }
+ $imported++;
warn "working with package part ". $part_pkg->pkgpart.
"which has a taxproductnum of ". $part_pkg->taxproductnum. "\n" if $DEBUG;
my $part_pkg_taxproduct = $part_pkg->taxproduct('');
}
#wipe out the old data
+ $error = $job->update_statustext( "0,Removing old tax data" );
+ if ($error) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
foreach my $tax_rate_location ( qsearch( 'tax_rate_location',
{ data_vendor => $format,
disabled => '',
tax_rate part_pkg_taxrate part_pkg_taxproduct tax_class cust_tax_location
);
foreach my $table ( @table ) {
- foreach my $row ( qsearch( $table, { data_vendor => $format } ) ) {
- my $error = $row->delete;
- if ( $error ) {
- $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
- die $error;
- }
+ my $dbh = dbh;
+# my $primary_key = dbdef->table($table)->primary_key;
+# my $sql = "SELECT $primary_key FROM $table WHERE data_vendor = ".
+ my $sql = "DELETE FROM $table WHERE data_vendor = ".
+ $dbh->quote($format);
+ my $sth = $dbh->prepare($sql);
+ unless ($sth) {
+ $error = $dbh->errstr;
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
}
+ unless ($sth->execute) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die "Failed to execute $sql: ". $sth->errstr;
+ }
+# foreach my $row ( @{ $sth->fetchall_arrayref } ) {
+# my $record = qsearchs( $table, { $primary_key => $row->[0] } )
+# or die "Failed to find $table with $primary_key ". $row->[0];
+# my $error = $record->delete;
+# if ( $error ) {
+# $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+# die $error;
+# }
+# }
}
if ( $format eq 'cch' ) {
}
#import new data
- process_download_and_update($job, @_);
+ my $statement = ' &process_download_and_update($job, @_); ';
+ eval $statement;
+ if ($@) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $@;
+ }
#restore taxproducts
+ $count = scalar(keys %taxproduct);
+ $imported = 0;
foreach my $pkgpart ( keys %taxproduct ) {
warn "restoring taxproductnums on pkgpart $pkgpart\n" if $DEBUG;
+ if ( time - $min_sec > $last ) {
+ my $error = $job->update_statustext(
+ int( 100 * $imported / $count ). ",Restoring tax products"
+ );
+ if ( $error ) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
+ $last = time;
+ }
+ $imported++;
my $part_pkg = qsearchs('part_pkg', { pkgpart => $pkgpart } );
unless ( $part_pkg ) {
}
#disable tax_rates
+ $count = scalar(keys %disabled_tax_rate);
+ $imported = 0;
foreach my $key (keys %disabled_tax_rate) {
+ if ( time - $min_sec > $last ) {
+ my $error = $job->update_statustext(
+ int( 100 * $imported / $count ). ",Disabling tax rates"
+ );
+ if ( $error ) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ die $error;
+ }
+ $last = time;
+ }
+ $imported++;
my ($geocode,$taxclass) = split /:/, $key, 2;
my @tax_class = qsearch( 'tax_class', { data_vendor => $format,
taxclass => $taxclass,
if (-d $dir) {
if (-d "$dir.4") {
- opendir(my $dirh, $dir) or die "failed to open $dir.4: $!\n";
+ opendir(my $dirh, "$dir.4") or die "failed to open $dir.4: $!\n";
foreach my $file (readdir($dirh)) {
unlink "$dir.4/$file" if (-f "$dir.4/$file");
}
my @insert_list = ();
my @delete_list = ();
+ my @predelete_list = ();
my @list = (
'geocode', \&FS::tax_rate_location::batch_import,
%oldlines = ();
push @insert_list, $name, $ifh->filename, $method;
- unshift @delete_list, $name, $dfh->filename, $method
- unless $name eq 'detail';
+ if ( $name eq 'geocode' ) {
+ unshift @predelete_list, $name, $dfh->filename, $method
+ unless $name eq 'detail';
+ } else {
+ unshift @delete_list, $name, $dfh->filename, $method
+ unless $name eq 'detail';
+ }
close $dfh;
close $ifh;
}
+ while( scalar(@predelete_list) ) {
+ my ($name, $file, $method) =
+ (shift @predelete_list, shift @predelete_list, shift @predelete_list);
+
+ my $fmt = "$format-update";
+ $fmt = $fmt. ( $name eq 'zip' ? '-zip' : '' );
+ open my $fh, "< $file" or $error ||= "Can't open $name file $file: $!";
+ $error ||=
+ &{$method}({ 'filehandle' => $fh, 'format' => $fmt }, $job);
+ close $fh;
+ #unlink $file or warn "Can't delete $file: $!";
+ }
+
while( scalar(@insert_list) ) {
my ($name, $file, $method) =
(shift @insert_list, shift @insert_list, shift @insert_list);