rework edit/part_svc.cgi so it doesn't use a separate process/ file, this allows...
authorivan <ivan>
Thu, 9 Sep 2004 12:04:53 +0000 (12:04 +0000)
committerivan <ivan>
Thu, 9 Sep 2004 12:04:53 +0000 (12:04 +0000)
FS/FS/part_svc.pm
httemplate/edit/part_svc.cgi
httemplate/edit/process/part_svc.cgi [deleted file]

index cd05774..e7f205d 100644 (file)
@@ -22,8 +22,12 @@ FS::part_svc - Object methods for part_svc objects
   $record = new FS::part_svc { 'column' => 'value' };
 
   $error = $record->insert;
+  $error = $record->insert( [ 'pseudofield' ] );
+  $error = $record->insert( [ 'pseudofield' ], \%exportnums );
 
   $error = $new_record->replace($old_record);
+  $error = $new_record->replace($old_record, '1.3-COMPAT', [ 'pseudofield' ] );
+  $error = $new_record->replace($old_record, '1.3-COMPAT', [ 'pseudofield' ], \%exportnums );
 
   $error = $record->delete;
 
@@ -60,25 +64,40 @@ database, see L<"insert">.
 
 sub table { 'part_svc'; }
 
-=item insert EXTRA_FIELDS_ARRAYREF
+=item insert [ EXTRA_FIELDS_ARRAYREF [ , EXPORTNUMS_HASHREF ] ] 
 
 Adds this service definition to the database.  If there is an error, returns
 the error, otherwise returns false.
 
-TODOC:
+The following pseudo-fields may be defined, and will be maintained in
+the part_svc_column table appropriately (see L<FS::part_svc_column>).
+
+=over 4
 
 =item I<svcdb>__I<field> - Default or fixed value for I<field> in I<svcdb>.
 
 =item I<svcdb>__I<field>_flag - defines I<svcdb>__I<field> action: null, `D' for default, or `F' for fixed.  For virtual fields, can also be 'X' for excluded.
 
-TODOC: EXTRA_FIELDS_ARRAYREF
+=back
+
+If you want to add part_svc_column records for fields that do not exist as
+(real or virtual) fields in the I<svcdb> table, make sure to list then in 
+EXTRA_FIELDS_ARRAYREF also.
+
+If EXPORTNUMS_HASHREF is specified (keys are exportnums and values are
+boolean), the appopriate export_svc records will be inserted.
 
 =cut
 
 sub insert {
   my $self = shift;
   my @fields = ();
+  my @exportnums = ();
   @fields = @{shift(@_)} if @_;
+  if ( @_ ) {
+    my $exportnums = shift;
+    @exportnums = grep $exportnums->{$_}, keys %$exportnums;
+  }
 
   local $SIG{HUP} = 'IGNORE';
   local $SIG{INT} = 'IGNORE';
@@ -97,6 +116,8 @@ sub insert {
     return $error;
   }
 
+  # add part_svc_column records
+
   my $svcdb = $self->svcdb;
 #  my @rows = map { /^${svcdb}__(.*)$/; $1 }
 #    grep ! /_flag$/,
@@ -134,6 +155,20 @@ sub insert {
 
   }
 
+  # add export_svc records
+
+  foreach my $exportnum ( @exportnums ) {
+    my $export_svc = new FS::export_svc ( {
+      'exportnum' => $exportnum,
+      'svcpart'   => $self->svcpart,
+    } );
+    $error = $export_svc->insert;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
 
   '';
@@ -141,7 +176,7 @@ sub insert {
 
 =item delete
 
-Currently unimplemented.
+Currently unimplemented.  Set the "disabled" field instead.
 
 =cut
 
@@ -150,14 +185,14 @@ sub delete {
 # check & make sure the svcpart isn't in cust_svc or pkg_svc (in any packages)?
 }
 
-=item replace OLD_RECORD [ '1.3-COMPAT' [ , EXTRA_FIELDS_ARRAYREF ] ]
+=item replace OLD_RECORD [ '1.3-COMPAT' [ , EXTRA_FIELDS_ARRAYREF [ , EXPORTNUMS_HASHREF ] ] ]
 
 Replaces OLD_RECORD with this one in the database.  If there is an error,
 returns the error, otherwise returns false.
 
 TODOC: 1.3-COMPAT
 
-TODOC: EXTRA_FIELDS_ARRAYREF
+TODOC: EXTRA_FIELDS_ARRAYREF (same as insert method)
 
 =cut
 
@@ -188,6 +223,9 @@ sub replace {
     shift;
     my @fields = ();
     @fields = @{shift(@_)} if @_;
+    my $exportnums = @_ ? shift : '';
+
+   # maintain part_svc_column records
 
     my $svcdb = $new->svcdb;
     foreach my $field (
@@ -220,6 +258,39 @@ sub replace {
         return $error;
       }
     }
+
+    # maintain export_svc records
+
+    if ( $exportnums ) {
+
+      #false laziness w/ edit/process/agent_type.cgi
+      foreach my $part_export ( qsearch('part_export', {}) ) {
+        my $exportnum = $part_export->exportnum;
+        my $hashref = {
+          'exportnum' => $exportnum,
+          'svcpart'   => $new->svcpart,
+        };
+        my $export_svc = qsearchs('export_svc', $hashref);
+
+        if ( $export_svc && ! $exportnums->{$exportnum} ) {
+          $error = $export_svc->delete;
+          if ( $error ) {
+            $dbh->rollback if $oldAutoCommit;
+            return $error;
+          }
+        } elsif ( ! $export_svc && $exportnums->{$exportnum} ) {
+          $export_svc = new FS::export_svc ( $hashref );
+          $error = $export_svc->insert;
+          if ( $error ) {
+            $dbh->rollback if $oldAutoCommit;
+            return $error;
+          }
+        }
+        
+      }
+
+    }
+
   } else {
     $dbh->rollback if $oldAutoCommit;
     return 'non-1.3-COMPAT interface not yet written';
index 72fffae..89f75a5 100755 (executable)
@@ -1,33 +1,74 @@
-<!-- mason kludge -->
-<% 
-   my $part_svc;
-   my $clone = '';
-   if ( $cgi->param('error') ) { #error
-     $part_svc = new FS::part_svc ( {
-       map { $_, scalar($cgi->param($_)) } fields('part_svc')
-     } );
-   } elsif ( $cgi->param('clone') && $cgi->param('clone') =~ /^(\d+)$/ ) {#clone
-     #$cgi->param('clone') =~ /^(\d+)$/ or die "malformed query: $query";
-     $part_svc = qsearchs('part_svc', { 'svcpart'=>$1 } )
-       or die "unknown svcpart: $1";
-     $clone = $part_svc->svcpart;
-     $part_svc->svcpart('');
-   } elsif ( $cgi->keywords ) { #edit
-     my($query) = $cgi->keywords;
-     $query =~ /^(\d+)$/ or die "malformed query: $query";
-     $part_svc=qsearchs('part_svc', { 'svcpart'=>$1 } )
-       or die "unknown svcpart: $1";
-   } else { #adding
-     $part_svc = new FS::part_svc {};
-   }
-   my $action = $part_svc->svcpart ? 'Edit' : 'Add';
-   my $hashref = $part_svc->hashref;
+<%
+my $part_svc;
+my $clone = '';
+my $error = '';
+if ( $cgi->param('magic') eq 'process' ) {
+
+  my $svcpart = $cgi->param('svcpart');
+  my $old = qsearchs('part_svc', { 'svcpart' => $svcpart }) if $svcpart;
+  
+  $cgi->param( 'svc_acct__usergroup',
+               join(',', $cgi->param('svc_acct__usergroup') ) );
+  
+  my $new = new FS::part_svc ( {
+    map {
+      $_, scalar($cgi->param($_));
+  #  } qw(svcpart svc svcdb)
+    } ( fields('part_svc'),
+        map { my $svcdb = $_;
+              my @fields = fields($svcdb);
+              push @fields, 'usergroup' if $svcdb eq 'svc_acct'; #kludge
+              map { ( $svcdb.'__'.$_, $svcdb.'__'.$_.'_flag' )  } @fields;
+            } grep defined( $FS::Record::dbdef->table($_) ),
+                   qw( svc_acct svc_domain svc_forward svc_www svc_broadband )
+      )
+  } );
+  
+  my %exportnums =
+    map { $_->exportnum => $cgi->param('exportnum'.$_->exportnum) }
+        qsearch('part_export', {} );
+  
+  if ( $svcpart ) {
+    $error = $new->replace($old, '1.3-COMPAT', [ 'usergroup' ], \%exportnums );
+  } else {
+    $error = $new->insert( [ 'usergroup' ], \%exportnums );
+    $svcpart = $new->getfield('svcpart');
+  }
+
+  unless ( $error ) { #no error, redirect
+    #print $cgi->redirect(popurl(3)."browse/part_svc.cgi");
+    print $cgi->redirect("${p}browse/part_svc.cgi");
+    myexit;
+  }
+
+  $part_svc = $new; #??
+  #$part_svc = new FS::part_svc ( {
+  #  map { $_, scalar($cgi->param($_)) } fields('part_svc')
+  #} );
+
+} elsif ( $cgi->param('clone') && $cgi->param('clone') =~ /^(\d+)$/ ) {#clone
+  #$cgi->param('clone') =~ /^(\d+)$/ or die "malformed query: $query";
+  $part_svc = qsearchs('part_svc', { 'svcpart'=>$1 } )
+    or die "unknown svcpart: $1";
+  $clone = $part_svc->svcpart;
+  $part_svc->svcpart('');
+} elsif ( $cgi->keywords ) { #edit
+  my($query) = $cgi->keywords;
+  $query =~ /^(\d+)$/ or die "malformed query: $query";
+  $part_svc=qsearchs('part_svc', { 'svcpart'=>$1 } )
+    or die "unknown svcpart: $1";
+} else { #adding
+  $part_svc = new FS::part_svc {};
+}
+
+my $action = $part_svc->svcpart ? 'Edit' : 'Add';
+my $hashref = $part_svc->hashref;
 #   my $p_svcdb = $part_svc->svcdb || 'svc_acct';
 
 
            #" onLoad=\"visualize()\""
 %>
-
+<!-- mason kludge -->
 <%= header("$action Service Definition",
            menubar( 'Main Menu'         => $p,
                     'View all service definitions' => "${p}browse/part_svc.cgi"
@@ -35,8 +76,8 @@
            )
 %>
 
-<% if ( $cgi->param('error') ) { %>
-<FONT SIZE="+1" COLOR="#ff0000">Error: <%= $cgi->param('error') %></FONT>
+<% if ( $error ) { %>
+<FONT SIZE="+1" COLOR="#ff0000">Error: <%= $error %></FONT>
 <% } %>
 
 <FORM NAME="dummy">
@@ -45,6 +86,7 @@
 <BR><BR>
 Service  <INPUT TYPE="text" NAME="svc" VALUE="<%= $hashref->{svc} %>"><BR>
 Disable new orders <INPUT TYPE="checkbox" NAME="disabled" VALUE="Y"<%= $hashref->{disabled} eq 'Y' ? ' CHECKED' : '' %>><BR>
+<INPUT TYPE="hidden" NAME="magic" VALUE="process">
 <INPUT TYPE="hidden" NAME="svcpart" VALUE="<%= $hashref->{svcpart} %>">
 <BR>
 Services are items you offer to your customers.
@@ -169,8 +211,9 @@ my %defs = (
     'selected_layer' => $hashref->{svcdb} || 'svc_acct',
     'options'        => \%svcdb,
     'form_name'      => 'dummy',
-    'form_action'    => 'process/part_svc.cgi',
-    'form_text'      => [ qw( svc svcpart ) ],
+    #'form_action'    => 'process/part_svc.cgi',
+    'form_action'    => 'part_svc.cgi', #self
+    'form_text'      => [ qw( magic svc svcpart ) ],
     'form_checkbox'  => [ 'disabled' ],
     'layer_callback' => sub {
       my $layer = shift;
@@ -207,10 +250,10 @@ my %defs = (
       $part_svc->svcpart($clone) if $clone; #haha, undone below
       foreach my $field (@fields) {
         my $part_svc_column = $part_svc->part_svc_column($field);
-        my $value = $cgi->param('error')
+        my $value = $error
                       ? $cgi->param("${layer}__${field}")
                       : $part_svc_column->columnvalue;
-        my $flag = $cgi->param('error')
+        my $flag = $error
                      ? $cgi->param("${layer}__${field}_flag")
                      : $part_svc_column->columnflag;
         my $def = $defs{$layer}{$field};
diff --git a/httemplate/edit/process/part_svc.cgi b/httemplate/edit/process/part_svc.cgi
deleted file mode 100755 (executable)
index 9633fab..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<%
-
-my $svcpart = $cgi->param('svcpart');
-
-my $old = qsearchs('part_svc',{'svcpart'=>$svcpart}) if $svcpart;
-
-$cgi->param( 'svc_acct__usergroup',
-             join(',', $cgi->param('svc_acct__usergroup') ) );
-
-my $new = new FS::part_svc ( {
-  map {
-    $_, scalar($cgi->param($_));
-#  } qw(svcpart svc svcdb)
-  } ( fields('part_svc'),
-      map { my $svcdb = $_;
-            my @fields = fields($svcdb);
-            push @fields, 'usergroup' if $svcdb eq 'svc_acct'; #kludge
-            map { ( $svcdb.'__'.$_, $svcdb.'__'.$_.'_flag' )  } @fields;
-          } grep defined( $FS::Record::dbdef->table($_) ),
-                 qw( svc_acct svc_domain svc_forward svc_www svc_broadband )
-    )
-} );
-
-my $error;
-if ( $svcpart ) {
-  $error = $new->replace($old, '1.3-COMPAT', [ 'usergroup' ] );
-} else {
-  $error = $new->insert( [ 'usergroup' ] );
-  $svcpart=$new->getfield('svcpart');
-}
-
-if ( $error ) {
-  $cgi->param('error', $error);
-  print $cgi->redirect(popurl(2). "part_svc.cgi?". $cgi->query_string );
-} else {
-
-  #false laziness w/ edit/process/agent_type.cgi
-  foreach my $part_export (qsearch('part_export',{})) {
-    my $exportnum = $part_export->exportnum;
-    my $export_svc = qsearchs('export_svc', {
-      'exportnum' => $part_export->exportnum,
-      'svcpart'   => $new->svcpart,
-    } );
-    if ( $export_svc && ! $cgi->param("exportnum". $part_export->exportnum) ) {
-      $error = $export_svc->delete;
-      die $error if $error;
-    } elsif ( $cgi->param("exportnum". $part_export->exportnum)
-              && ! $export_svc ) {
-      $export_svc = new FS::export_svc ( {
-        'exportnum' => $part_export->exportnum,
-        'svcpart'   => $new->svcpart,
-      } );
-      $error = $export_svc->insert;
-      die $error if $error;
-    }
-
-  }
-
-  print $cgi->redirect(popurl(3)."browse/part_svc.cgi");
-}
-
-%>