don't change otaker when just editing account, closes: Bug#921
[freeside.git] / FS / FS / svc_Common.pm
index a154f3f..315b7c0 100644 (file)
@@ -1,14 +1,17 @@
 package FS::svc_Common;
 
 use strict;
-use vars qw( @ISA $noexport_hack );
-use FS::Record qw( qsearch qsearchs fields dbh );
+use vars qw( @ISA $noexport_hack $DEBUG );
+use FS::Record qw( qsearchs fields dbh );
 use FS::cust_svc;
 use FS::part_svc;
 use FS::queue;
 
 @ISA = qw( FS::Record );
 
+$DEBUG = 0;
+#$DEBUG = 1;
+
 =head1 NAME
 
 FS::svc_Common - Object method for all svc_ records
@@ -28,61 +31,7 @@ inherit from, i.e. FS::svc_acct.  FS::svc_Common inherits from FS::Record.
 
 =over 4
 
-=cut
-
-sub virtual_fields {
-
-  # This restricts the fields based on part_svc_column and the svcpart of 
-  # the service.  There are four possible cases:
-  # 1.  svcpart passed as part of the svc_x hash.
-  # 2.  svcpart fetched via cust_svc based on svcnum.
-  # 3.  No svcnum or svcpart.  In this case, return ALL the fields with 
-  #     dbtable eq $self->table.
-  # 4.  Called via "fields('svc_acct')" or something similar.  In this case
-  #     there is no $self object.
-
-  my $self = shift;
-  my $svcpart;
-  my @vfields = $self->SUPER::virtual_fields;
-
-  return @vfields unless (ref $self); # Case 4
-
-  if ($self->svcpart) { # Case 1
-    $svcpart = $self->svcpart;
-  } elsif ( $self->svcnum
-            && qsearchs('cust_svc',{'svcnum'=>$self->svcnum} )
-          ) { #Case 2
-    $svcpart = $self->cust_svc->svcpart;
-  } else { # Case 3
-    $svcpart = '';
-  }
-
-  if ($svcpart) { #Cases 1 and 2
-    my %flags = map { $_->columnname, $_->columnflag } (
-        qsearch ('part_svc_column', { svcpart => $svcpart } )
-      );
-    return grep { not ($flags{$_} eq 'X') } @vfields;
-  } else { # Case 3
-    return @vfields;
-  } 
-  return ();
-}
-
-=item check
-
-Checks the validity of fields in this record.
-
-At present, this does nothing but call FS::Record::check (which, in turn, 
-does nothing but run virtual field checks).
-
-=cut
-
-sub check {
-  my $self = shift;
-  $self->SUPER::check;
-}
-
-=item insert [ JOBNUM_ARRAYREF [ OBJECTS_ARRAYREF ] ]
+=item insert [ , OPTION => VALUE ... ]
 
 Adds this record to the database.  If there is an error, returns the error,
 otherwise returns false.
@@ -90,19 +39,36 @@ otherwise returns false.
 The additional fields pkgnum and svcpart (see L<FS::cust_svc>) should be 
 defined.  An FS::cust_svc record will be created and inserted.
 
-If an arrayref is passed as parameter, the B<jobnum>s of any export jobs will
-be added to the array.
+Currently available options are: I<jobnums>, I<child_objects> and
+I<depend_jobnum>.
+
+If I<jobnum> is set to an array reference, the jobnums of any export jobs will
+be added to the referenced array.
 
-If an arrayref of FS::tablename objects (for example, FS::acct_snarf objects)
-is passed as the optional second parameter, they will have their svcnum fields
-set and will be inserted after this record, but before any exports are run.
+If I<child_objects> is set to an array reference of FS::tablename objects (for
+example, FS::acct_snarf objects), they will have their svcnum fieldsset and
+will be inserted after this record, but before any exports are run.
+
+If I<depend_jobnum> is set (to a scalar jobnum or an array reference of
+jobnums), all provisioning jobs will have a dependancy on the supplied
+jobnum(s) (they will not run until the specific job(s) complete(s)).
 
 =cut
 
 sub insert {
   my $self = shift;
-  local $FS::queue::jobnums = shift if @_;
-  my $objects = scalar(@_) ? shift : [];
+  my %options = @_;
+  warn "FS::svc_Common::insert called with options ".
+     join(', ', map { "$_: $options{$_}" } keys %options ). "\n"
+  if $DEBUG;
+
+  my @jobnums = ();
+  local $FS::queue::jobnums = \@jobnums;
+  warn "FS::svc_Common::insert: set \$FS::queue::jobnums to $FS::queue::jobnums"
+    if $DEBUG;
+  my $objects = $options{'child_objects'} || [];
+  my $depend_jobnums = $options{'depend_jobnum'} || [];
+  $depend_jobnums = [ $depend_jobnums ] unless ref($depend_jobnums);
   my $error;
 
   local $SIG{HUP} = 'IGNORE';
@@ -162,6 +128,10 @@ sub insert {
 
   #new-style exports!
   unless ( $noexport_hack ) {
+
+    warn "FS::svc_Common::insert: \$FS::queue::jobnums is $FS::queue::jobnums"
+      if $DEBUG;
+
     foreach my $part_export ( $self->cust_svc->part_svc->part_export ) {
       my $error = $part_export->export_insert($self);
       if ( $error ) {
@@ -170,6 +140,26 @@ sub insert {
                " (transaction rolled back): $error";
       }
     }
+
+    foreach my $depend_jobnum ( @$depend_jobnums ) {
+      warn "inserting dependancies on supplied job $depend_jobnum\n"
+        if $DEBUG;
+      foreach my $jobnum ( @jobnums ) {
+        my $queue = qsearchs('queue', { 'jobnum' => $jobnum } );
+        warn "inserting dependancy for job $jobnum on $depend_jobnum\n"
+          if $DEBUG;
+        my $error = $queue->depend_insert($depend_jobnum);
+        if ( $error ) {
+          $dbh->rollback if $oldAutoCommit;
+          return "error queuing job dependancy: $error";
+        }
+      }
+    }
+
+  }
+
+  if ( exists $options{'jobnums'} ) {
+    push @{ $options{'jobnums'} }, @jobnums;
   }
 
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
@@ -324,7 +314,7 @@ sub setx {
 
   #set default/fixed/whatever fields from part_svc
   my $table = $self->table;
-  foreach my $field ( grep { $_ ne 'svcnum' } $self->fields ) {
+  foreach my $field ( grep { $_ ne 'svcnum' } fields($table) ) {
     my $part_svc_column = $part_svc->part_svc_column($field);
     if ( $part_svc_column->columnflag eq $x ) {
       $self->setfield( $field, $part_svc_column->columnvalue );
@@ -456,6 +446,10 @@ sub clone_kludge_unsuspend {
 
 =back
 
+=head1 VERSION
+
+$Id: svc_Common.pm,v 1.12.4.6 2004-03-03 13:44:27 ivan Exp $
+
 =head1 BUGS
 
 The setfixed method return value.