add skip_dcontext_suffix to skip CDRs with dcontext ending in a definable string...
[freeside.git] / FS / FS / cust_pkg_reason.pm
index bb0542b..d11d05e 100644 (file)
@@ -1,10 +1,12 @@
 package FS::cust_pkg_reason;
+use base qw( FS::otaker_Mixin FS::Record );
 
 use strict;
-use vars qw( @ISA );
-use FS::Record qw( qsearch qsearchs );
+use vars qw( $ignore_empty_action );
+use FS::Record qw( qsearch ); #qsearchs );
+use FS::upgrade_journal;
 
-@ISA = qw(FS::Record);
+$ignore_empty_action = 0;
 
 =head1 NAME
 
@@ -34,16 +36,17 @@ currently supported:
 
 =over 4
 
-=item num - primary key
+=item num
 
-=item pkgnum - 
+primary key
 
-=item reasonnum - 
+=item pkgnum
 
-=item otaker - 
+=item reasonnum
 
-=item date - 
+=item usernum
 
+=item date
 
 =back
 
@@ -94,12 +97,15 @@ and replace methods.
 sub check {
   my $self = shift;
 
+  my @actions = ( 'A', 'C', 'E', 'S' );
+  push @actions, '' if $ignore_empty_action;
+
   my $error = 
     $self->ut_numbern('num')
     || $self->ut_number('pkgnum')
     || $self->ut_number('reasonnum')
-    || $self->ut_enum('action', [ 'A', 'C', 'E', 'S' ])
-    || $self->ut_text('otaker')
+    || $self->ut_enum('action', \@actions)
+    || $self->ut_alphan('otaker')
     || $self->ut_numbern('date')
   ;
   return $error if $error;
@@ -111,13 +117,6 @@ sub check {
 
 Returns the reason (see L<FS::reason>) associated with this cust_pkg_reason.
 
-=cut
-
-sub reason {
-  my $self = shift;
-  qsearchs( 'reason', { 'reasonnum' => $self->reasonnum } );
-}
-
 =item reasontext
 
 Returns the text of the reason (see L<FS::reason>) associated with this
@@ -136,13 +135,10 @@ sub reasontext {
 
 use FS::h_cust_pkg;
 use FS::h_cust_pkg_reason;
-use FS::Schema qw(dbdef);
 
 sub _upgrade_data { # class method
   my ($class, %opts) = @_;
 
-  return '' unless dbdef->table('cust_pkg_reason')->column('action');
-
   my $action_replace =
     " AND ( history_action = 'replace_old' OR history_action = 'replace_new' )";
 
@@ -207,9 +203,28 @@ sub _upgrade_data { # class method
   }
 
   #remove nullability if scalar(@migrated) - $count == 0 && ->column('action');
+
+  unless ( FS::upgrade_journal->is_done('cust_pkg_reason__missing_reason') ) {
+    $class->_upgrade_missing_reason(%opts);
+    FS::upgrade_journal->set_done('cust_pkg_reason__missing_reason');
+  }
+
+  #still can't fill in an action?  don't abort the upgrade
+  local($ignore_empty_action) = 1;
+
+  $class->_upgrade_otaker(%opts);
+
+}
+
+sub _upgrade_missing_reason {
+  my ($class, %opts) = @_;
+
+  #false laziness w/above
+  my $action_replace =
+    " AND ( history_action = 'replace_old' OR history_action = 'replace_new' )";
   
   #seek expirations/adjourns without reason
-  foreach my $field qw( expire adjourn cancel susp ) {
+  foreach my $field (qw( expire adjourn cancel susp )) {
     my $addl_from =
       "LEFT JOIN h_cust_pkg ON ".
       "(cust_pkg_reason.pkgnum = h_cust_pkg.pkgnum AND".
@@ -269,7 +284,7 @@ sub _upgrade_data { # class method
   }
 
   #seek cancels/suspends without reason, but with expire/adjourn reason
-  foreach my $field qw( cancel susp ) {
+  foreach my $field (qw( cancel susp )) {
 
     my %precursor_map = ( 'cancel' => 'expire', 'susp' => 'adjourn' );
     my $precursor = $precursor_map{$field};
@@ -307,16 +322,12 @@ sub _upgrade_data { # class method
     }
   }
 
-  '';
-
 }
 
 =back
 
 =head1 BUGS
 
-Here be termites.  Don't use on wooden computers.
-
 =head1 SEE ALSO
 
 L<FS::Record>, schema.html from the base documentation.