bug squashing for multiple usage classes
[freeside.git] / FS / FS / tax_rate.pm
index 69dc128..bfb9c8c 100644 (file)
@@ -199,7 +199,7 @@ sub check {
     || $self->ut_textn('data_vendor')
     || $self->ut_textn('location')
     || $self->ut_foreign_key('taxclassnum', 'tax_class', 'taxclassnum')
-    || $self->ut_numbern('effective_date')
+    || $self->ut_snumbern('effective_date')
     || $self->ut_float('tax')
     || $self->ut_floatn('excessrate')
     || $self->ut_money('taxbase')
@@ -397,7 +397,12 @@ sub taxline {
   my $taxable_units = 0;
   unless ($self->recurtax =~ /^Y$/i) {
     if ($self->unittype == 0) {
-      $taxable_units += $_->units foreach @cust_bill_pkg;
+      my %seen = ();
+      foreach (@cust_bill_pkg) {
+        $taxable_units += $_->units
+          unless $seen{$_->pkgnum};
+        $seen{$_->pkgnum}++;
+      }
     }elsif ($self->unittype == 1) {
       return qq!fatal: can't (yet) handle fee with minute unit type!;
     }elsif ($self->unittype == 2) {
@@ -642,6 +647,8 @@ sub batch_import {
 
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
+      my $hashref = $insert{$_};
+      $line = join(", ", map { "$_ => ". $hashref->{$_} } keys(%$hashref) );
       return "can't insert tax_rate for $line: $error";
     }
 
@@ -667,13 +674,15 @@ sub batch_import {
         #join(" ", map { "$_ => ". $old->{$_} } @fields);
         join(" ", map { "$_ => ". $old->{$_} } keys(%$old) );
     }
-    my $new = new FS::tax_rate( $insert{$_} );
+    my $new = new FS::tax_rate({ $old->hash, %{$insert{$_}}, 'manual' => ''  });
     $new->taxnum($old->taxnum);
     my $error = $new->replace($old);
 
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
-      return "can't insert tax_rate for $line: $error";
+      my $hashref = $insert{$_};
+      $line = join(", ", map { "$_ => ". $hashref->{$_} } keys(%$hashref) );
+      return "can't replace tax_rate for $line: $error";
     }
 
     $imported++;
@@ -703,7 +712,9 @@ sub batch_import {
 
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
-      return "can't insert tax_rate for $line: $error";
+      my $hashref = $delete{$_};
+      $line = join(", ", map { "$_ => ". $hashref->{$_} } keys(%$hashref) );
+      return "can't delete tax_rate for $line: $error";
     }
 
     $imported++;
@@ -711,7 +722,7 @@ sub batch_import {
 
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
 
-  return "Empty file!" unless $imported;
+  return "Empty file!" unless ($imported || $format eq 'cch-update');
 
   ''; #no error
 
@@ -719,7 +730,7 @@ sub batch_import {
 
 =item process_batch
 
-Load an batch import as a queued JSRPC job
+Load a batch import as a queued JSRPC job
 
 =cut
 
@@ -752,7 +763,7 @@ sub process_batch {
         $error = "No $name supplied";
         next;
       }
-      my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc;
+      my $dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc;
       my $filename = "$dir/".  $files{$file};
       open my $fh, "< $filename" or $error ||= "Can't open $name file: $!";
 
@@ -781,7 +792,7 @@ sub process_batch {
                  'PLUS4',    'plus4file', \&FS::cust_tax_location::batch_import,
                  'TXMATRIX', 'txmatrix',  \&FS::part_pkg_taxrate::batch_import,
                );
-    my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc;
+    my $dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc;
     while( scalar(@list) ) {
       my ($name, $file, $import_sub) = (shift @list, shift @list, shift @list);
       unless ($files{$file}) {
@@ -831,7 +842,7 @@ sub process_batch {
       unlink $file or warn "Can't delete $file: $!";
     }
     
-    $error = "No DETAIL supplied"
+    $error ||= "No DETAIL supplied"
       unless ($files{detail});
     open my $fh, "< $dir/". $files{detail}
       or $error ||= "Can't open DETAIL file: $!";