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;
   $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);
+  $error = $new_record->replace($old_record, '1.3-COMPAT', [ 'pseudofield' ] );
+  $error = $new_record->replace($old_record, '1.3-COMPAT', [ 'pseudofield' ], \%exportnums );
 
   $error = $record->delete;
 
 
   $error = $record->delete;
 
@@ -60,25 +64,40 @@ database, see L<"insert">.
 
 sub table { 'part_svc'; }
 
 
 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.
 
 
 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.
 
 
 =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 = ();
 
 =cut
 
 sub insert {
   my $self = shift;
   my @fields = ();
+  my @exportnums = ();
   @fields = @{shift(@_)} if @_;
   @fields = @{shift(@_)} if @_;
+  if ( @_ ) {
+    my $exportnums = shift;
+    @exportnums = grep $exportnums->{$_}, keys %$exportnums;
+  }
 
   local $SIG{HUP} = 'IGNORE';
   local $SIG{INT} = 'IGNORE';
 
   local $SIG{HUP} = 'IGNORE';
   local $SIG{INT} = 'IGNORE';
@@ -97,6 +116,8 @@ sub insert {
     return $error;
   }
 
     return $error;
   }
 
+  # add part_svc_column records
+
   my $svcdb = $self->svcdb;
 #  my @rows = map { /^${svcdb}__(.*)$/; $1 }
 #    grep ! /_flag$/,
   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;
 
   '';
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
 
   '';
@@ -141,7 +176,7 @@ sub insert {
 
 =item delete
 
 
 =item delete
 
-Currently unimplemented.
+Currently unimplemented.  Set the "disabled" field instead.
 
 =cut
 
 
 =cut
 
@@ -150,14 +185,14 @@ sub delete {
 # check & make sure the svcpart isn't in cust_svc or pkg_svc (in any packages)?
 }
 
 # 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
 
 
 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
 
 
 =cut
 
@@ -188,6 +223,9 @@ sub replace {
     shift;
     my @fields = ();
     @fields = @{shift(@_)} if @_;
     shift;
     my @fields = ();
     @fields = @{shift(@_)} if @_;
+    my $exportnums = @_ ? shift : '';
+
+   # maintain part_svc_column records
 
     my $svcdb = $new->svcdb;
     foreach my $field (
 
     my $svcdb = $new->svcdb;
     foreach my $field (
@@ -220,6 +258,39 @@ sub replace {
         return $error;
       }
     }
         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';
   } 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()\""
 %>
 #   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"
 <%= 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">
 <% } %>
 
 <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>
 <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.
 <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',
     '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;
     '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);
       $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;
                       ? $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};
                      ? $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");
-}
-
-%>