fix (hopefully the rest of the) fallout from rating CDRs to sub-penny amounts
[freeside.git] / FS / FS / cust_bill_pkg.pm
index d0c51cf..96f09c9 100644 (file)
@@ -30,10 +30,6 @@ FS::cust_bill_pkg - Object methods for cust_bill_pkg records
 
   $error = $record->insert;
 
-  $error = $new_record->replace($old_record);
-
-  $error = $record->delete;
-
   $error = $record->check;
 
 =head1 DESCRIPTION
@@ -67,6 +63,8 @@ supported:
 
 =item unitrecur - If not set, defaults to recur
 
+=item hidden - If set to Y, indicates data should not appear as separate line item on invoice
+
 =back
 
 sdate and edate are specified as UNIX timestamps; see L<perlfunc/"time">.  Also
@@ -113,7 +111,7 @@ sub insert {
     return $error;
   }
 
-  if ( defined dbdef->table('cust_bill_pkg_detail') && $self->get('details') ) {
+  if ( $self->get('details') ) {
     foreach my $detail ( @{$self->get('details')} ) {
       my $cust_bill_pkg_detail = new FS::cust_bill_pkg_detail {
         'billpkgnum' => $self->billpkgnum,
@@ -121,22 +119,23 @@ sub insert {
         'detail'     => (ref($detail) ? $detail->[1] : $detail ),
         'amount'     => (ref($detail) ? $detail->[2] : '' ),
         'classnum'   => (ref($detail) ? $detail->[3] : '' ),
+        'phonenum'   => (ref($detail) ? $detail->[4] : '' ),
       };
       $error = $cust_bill_pkg_detail->insert;
       if ( $error ) {
         $dbh->rollback if $oldAutoCommit;
-        return $error;
+        return "error inserting cust_bill_pkg_detail: $error";
       }
     }
   }
 
-  if ( defined dbdef->table('cust_bill_pkg_display') && $self->get('display') ){
+  if ( $self->get('display') ) {
     foreach my $cust_bill_pkg_display ( @{ $self->get('display') } ) {
       $cust_bill_pkg_display->billpkgnum($self->billpkgnum);
       $error = $cust_bill_pkg_display->insert;
       if ( $error ) {
         $dbh->rollback if $oldAutoCommit;
-        return $error;
+        return "error inserting cust_bill_pkg_display: $error";
       }
     }
   }
@@ -147,7 +146,7 @@ sub insert {
       $error = $cust_tax_exempt_pkg->insert;
       if ( $error ) {
         $dbh->rollback if $oldAutoCommit;
-        return $error;
+        return "error inserting cust_tax_exempt_pkg: $error";
       }
     }
   }
@@ -161,11 +160,35 @@ sub insert {
       warn $error;
       if ( $error ) {
         $dbh->rollback if $oldAutoCommit;
-        return $error;
+        return "error inserting cust_bill_pkg_tax_location: $error";
       }
     }
   }
 
+  my $tax_rate_location = $self->get('cust_bill_pkg_tax_rate_location');
+  if ( $tax_rate_location ) {
+    foreach my $cust_bill_pkg_tax_rate_location ( @$tax_rate_location ) {
+      $cust_bill_pkg_tax_rate_location->billpkgnum($self->billpkgnum);
+      $error = $cust_bill_pkg_tax_rate_location->insert;
+      warn $error;
+      if ( $error ) {
+        $dbh->rollback if $oldAutoCommit;
+        return "error inserting cust_bill_pkg_tax_rate_location: $error";
+      }
+    }
+  }
+
+  my $cust_tax_adjustment = $self->get('cust_tax_adjustment');
+  if ( $cust_tax_adjustment ) {
+    $cust_tax_adjustment->billpkgnum($self->billpkgnum);
+    $error = $cust_tax_adjustment->replace;
+    warn $error;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return "error replacing cust_tax_adjustment: $error";
+    }
+  }
+
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
   '';
 
@@ -182,16 +205,18 @@ sub delete {
   return "Can't delete cust_bill_pkg records!";
 }
 
-=item replace OLD_RECORD
-
-Currently unimplemented.  This would be even more of an accounting nightmare
-than deleteing the items.  Just don't do it.
-
-=cut
-
-sub replace {
-  return "Can't modify cust_bill_pkg records!";
-}
+#alas, bin/follow-tax-rename
+#
+#=item replace OLD_RECORD
+#
+#Currently unimplemented.  This would be even more of an accounting nightmare
+#than deleteing the items.  Just don't do it.
+#
+#=cut
+#
+#sub replace {
+#  return "Can't modify cust_bill_pkg records!";
+#}
 
 =item check
 
@@ -213,6 +238,8 @@ sub check {
       || $self->ut_numbern('sdate')
       || $self->ut_numbern('edate')
       || $self->ut_textn('itemdesc')
+      || $self->ut_textn('itemcomment')
+      || $self->ut_enum('hidden', [ '', 'Y' ])
   ;
   return $error if $error;
 
@@ -265,6 +292,24 @@ sub cust_bill {
   qsearchs( 'cust_bill', { 'invnum' => $self->invnum } );
 }
 
+=item previous_cust_bill_pkg
+
+Returns the previous cust_bill_pkg for this package, if any.
+
+=cut
+
+sub previous_cust_bill_pkg {
+  my $self = shift;
+  return unless $self->sdate;
+  qsearchs({
+    'table'    => 'cust_bill_pkg',
+    'hashref'  => { 'pkgnum' => $self->pkgnum,
+                    'sdate'  => { op=>'<', value=>$self->sdate },
+                  },
+    'order_by' => 'ORDER BY sdate DESC LIMIT 1',
+  });
+}
+
 =item details [ OPTION => VALUE ... ]
 
 Returns an array of detail information for the invoice line item.
@@ -327,7 +372,7 @@ sub details {
   $format_sub = $opt{format_function} if $opt{format_function};
 
   map { ( $_->format eq 'C'
-          ? &{$format_sub}( $_->detail )
+          ? &{$format_sub}( $_->detail, $_ )
           : &{$escape_function}( $_->detail )
         )
       }
@@ -353,7 +398,9 @@ sub desc {
   if ( $self->pkgnum > 0 ) {
     $self->itemdesc || $self->part_pkg->pkg;
   } else {
-    $self->itemdesc || 'Tax';
+    my $desc = $self->itemdesc || 'Tax';
+    $desc .= ' '. $self->itemcomment if $self->itemcomment =~ /\S/;
+    $desc;
   }
 }