X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Ftax_rate.pm;h=d55b09b22091dbfe51ca66a6c9154b99d75235ee;hb=00e023763e31710f1ba2b2bd9a5f4b513d9852c4;hp=2808c6ef86decd246f30bf2556859e0b2d79009d;hpb=bc521ca75f4189ebd6d927aa263bdcce500150a5;p=freeside.git diff --git a/FS/FS/tax_rate.pm b/FS/FS/tax_rate.pm index 2808c6ef8..d55b09b22 100644 --- a/FS/FS/tax_rate.pm +++ b/FS/FS/tax_rate.pm @@ -917,6 +917,7 @@ sub process_batch_import { 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, @@ -972,9 +973,26 @@ sub process_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); @@ -1316,7 +1334,7 @@ sub process_download_and_update { 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"); } @@ -1426,6 +1444,7 @@ sub process_download_and_update { my @insert_list = (); my @delete_list = (); + my @predelete_list = (); my @list = ( 'geocode', \&FS::tax_rate_location::batch_import, @@ -1491,13 +1510,31 @@ sub process_download_and_update { %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); @@ -1664,6 +1701,50 @@ sub _upgrade_data { # class method } } + } elsif ( $dbh->{pg_server_version} =~ /^704/ ) { + + # ideally this would be supported in DBIx-DBSchema and friends + + foreach my $column ( @column ) { + my $columndef = dbdef->table($self->table)->column($column); + unless ($columndef->type eq 'numeric') { + + warn "updating tax_rate column $column to numeric\n" if $DEBUG; + + foreach my $table ( qw( tax_rate h_tax_rate ) ) { + + my $sql = "ALTER TABLE $table RENAME $column TO old_$column"; + my $sth = $dbh->prepare($sql) or die $dbh->errstr; + $sth->execute or die $sth->errstr; + + my $def = dbdef->table($table)->column($column); + $def->type('numeric'); + $def->length('14,8'); + my $null = $def->null; + $def->null('NULL'); + + $sql = "ALTER TABLE $table ADD COLUMN ". $def->line($dbh); + $sth = $dbh->prepare($sql) or die $dbh->errstr; + $sth->execute or die $sth->errstr; + + $sql = "UPDATE $table SET $column = CAST( old_$column AS numeric )"; + $sth = $dbh->prepare($sql) or die $dbh->errstr; + $sth->execute or die $sth->errstr; + + unless ( $null eq 'NULL' ) { + $sql = "ALTER TABLE $table ALTER $column SET NOT NULL"; + $sth = $dbh->prepare($sql) or die $dbh->errstr; + $sth->execute or die $sth->errstr; + } + + $sql = "ALTER TABLE $table DROP old_$column"; + $sth = $dbh->prepare($sql) or die $dbh->errstr; + $sth->execute or die $sth->errstr; + + } + } + } + } else { warn "WARNING: tax_rate table upgrade unsupported for this Pg version\n";