Merge branch 'master' of ssh://git.freeside.biz/home/git/freeside
[freeside.git] / FS / FS / cust_bill_pkg_detail.pm
index b8af013..19b15f7 100644 (file)
@@ -55,6 +55,10 @@ inherits from FS::Record.  The following fields are currently supported:
 
 =item phonenum -
 
+=item accountcode - accountcode
+
+=item startdate - CDR startdate, if any
+
 =item detail - detail description
 
 =back
@@ -84,15 +88,56 @@ otherwise returns false.
 
 =cut
 
-# the insert method can be inherited from FS::Record
+sub insert {
+  my $self = shift;
+  my $error = $self->SUPER::insert(@_);
+  return $error if $error;
+
+  # link CDRs
+  my $acctids = $self->get('acctid') or return '';
+  $acctids = [ $acctids ] unless ref $acctids;
+  foreach my $acctid ( @$acctids ) {
+    my $cdr = FS::cdr->by_key($acctid);
+    $cdr->set('detailnum', $self->detailnum);
+    $error = $cdr->replace;
+    # this should never happen
+    return "error linking CDR #$acctid: $error" if $error;
+  }
+  '';
+}
 
-=item delete
+=item delete [ ARG => VALUE ... ]
 
 Delete this record from the database.
 
+If the "reprocess_cdrs" argument is set to true, resets the status of any
+related CDRs (and deletes their associated cdr_termination records, if any).
+
 =cut
 
-# the delete method can be inherited from FS::Record
+sub delete {
+  my( $self, %args ) = @_;
+
+  my $error = $self->SUPER::delete;
+  return $error if $error;
+
+  foreach my $cdr (qsearch('cdr', { detailnum => $self->detailnum })) {
+
+    $cdr->set('detailnum', '');
+    $cdr->set('freesidestatus', '') if $args{'reprocess_cdrs'};
+    $error = $cdr->replace;
+    return "error unlinking CDR #" . $cdr->acctid . ": $error" if $error;
+
+    #well, technically this could have been on other invoices / termination
+    # partners... separate flag?
+    $self->scalar_sql( 'DELETE FROM cdr_termination WHERE acctid = ?',
+                       $cdr->acctid )
+      if $args{'reprocess_cdrs'};
+
+  }
+
+  '';
+}
 
 =item replace OLD_RECORD
 
@@ -101,7 +146,7 @@ returns the error, otherwise returns false.
 
 =cut
 
-# the replace method can be inherited from FS::Record
+# the replace method can be inherited from FS::Record (doesn't touch CDRs)
 
 =item check
 
@@ -137,9 +182,11 @@ sub check {
     || $self->ut_enum('format', [ '', 'C' ] )
     || $self->ut_numbern('duration')
     || $self->ut_textn('regionname')
+    || $self->ut_textn('accountcode')
     || $self->ut_text('detail')
     || $self->ut_foreign_keyn('classnum', 'usage_class', 'classnum')
     || $self->$phonenum_check_method('phonenum')
+    || $self->ut_numbern('startdate')
     || $self->SUPER::check
     ;
 
@@ -158,11 +205,13 @@ for tabular appearance in those environments if possible.
 If I<escape_function> is set then the format is processed by this
 function before being returned.
 
+DEPRECATED? (mostly unused, expensive)
 If I<format_function> is set then the detail is handed to this callback
 for processing.
 
 =cut
 
+#totally false laziness w/cust_bill_pkg->detail
 sub formatted {
   my ( $self, %opt ) = @_;
   my $format = $opt{format} || '';
@@ -230,6 +279,18 @@ sub formatted {
   ;
 }
 
+=item cust_bill_pkg
+
+Returns the L<FS::cust_bill_pkg> object (the invoice line item) that
+this detail belongs to.
+
+=cut
+
+sub cust_bill_pkg {
+  my $self = shift;
+  my $billpkgnum = $self->billpkgnum or return '';
+  FS::cust_bill_pkg->by_key($billpkgnum);
+}
 
 # Used by FS::Upgrade to migrate to a new database schema
 sub _upgrade_schema { # class method
@@ -238,7 +299,10 @@ sub _upgrade_schema { # class method
 
   warn "$me upgrading $class\n" if $DEBUG;
 
-  my $type = dbdef->table($class->table)->column('classnum')->type;
+  my $classnum = dbdef->table($class->table)->column('classnum')
+    or return;
+
+  my $type = $classnum->type;
   unless ( $type =~ /^int/i || $type =~ /int$/i ) {
 
     my $dbh = dbh;