finally fix part_svc!!!
authorivan <ivan>
Thu, 6 Sep 2001 20:42:00 +0000 (20:42 +0000)
committerivan <ivan>
Thu, 6 Sep 2001 20:42:00 +0000 (20:42 +0000)
22 files changed:
FS/FS.pm
FS/FS/UID.pm
FS/FS/part_svc.pm
FS/FS/svc_Common.pm
FS/FS/svc_acct.pm
FS/FS/svc_acct_sm.pm
FS/FS/svc_domain.pm
FS/FS/svc_forward.pm
FS/FS/svc_www.pm
FS/MANIFEST
FS/t/part_svc_column.t [new file with mode: 0644]
README.1.4.0pre2-3 [new file with mode: 0644]
bin/fs-migrate-part_svc [new file with mode: 0755]
bin/fs-migrate-payref
bin/fs-radius-add-check
bin/fs-radius-add-reply
bin/fs-setup
httemplate/browse/part_svc.cgi
httemplate/docs/schema.html
httemplate/docs/upgrade8.html
httemplate/edit/part_svc.cgi
httemplate/edit/process/part_svc.cgi

index 652e458..cd11e96 100644 (file)
--- a/FS/FS.pm
+++ b/FS/FS.pm
@@ -46,12 +46,16 @@ L<FS::svc_domain> - Domain class
 
 L<FS::domain_record> - DNS zone entries
 
-L<FS::svc_acct_sm> - Vitual mail alias class
+L<FS::svc_forward> - Mail forwarding class
+
+L<FS::svc_acct_sm> - (Depreciated) Vitual mail alias class
 
 L<FS::svc_www> - Web virtual host class.
 
 L<FS::part_svc> - Service definition class
 
+L<FS::part_svc_column> - Column constraint class
+
 L<FS::part_pkg> - Package (billing item) definition class
 
 L<FS::pkg_svc> - Class linking package (billing item)
@@ -117,6 +121,9 @@ To quote perl(1), "If you're intending to read these straight through for the
 first time, the suggested order will tend to reduce the number of forward
 references."
 
+If you've never used OO modules before,
+http://www.cpan.org/doc/FMTEYEWTK/easy_objects.html might help you out.
+
 =head1 DESCRIPTION
 
 Freeside is a billing and administration package for Internet Service
@@ -128,7 +135,7 @@ The main documentation is in htdocs/docs.
 
 =head1 VERSION
 
-$Id: FS.pm,v 1.6 2001-09-02 04:25:55 ivan Exp $
+$Id: FS.pm,v 1.7 2001-09-06 20:41:59 ivan Exp $
 
 =head1 SUPPORT
 
index 3e71f09..f80156e 100644 (file)
@@ -118,7 +118,7 @@ Returns the CGI (see L<CGI>) object.
 =cut
 
 sub cgi {
-  carp "warning: \$FS::UID::cgi isa Apache" if $cgi->isa('Apache');
+  #carp "warning: \$FS::UID::cgi isa Apache" if $cgi->isa('Apache');
   $cgi;
 }
 
@@ -249,7 +249,7 @@ coderef into the hash %FS::UID::callback :
 
 =head1 VERSION
 
-$Id: UID.pm,v 1.8 2001-08-21 09:34:13 ivan Exp $
+$Id: UID.pm,v 1.9 2001-09-06 20:41:59 ivan Exp $
 
 =head1 BUGS
 
index ccf0413..e64f09a 100644 (file)
@@ -2,7 +2,8 @@ package FS::part_svc;
 
 use strict;
 use vars qw( @ISA );
-use FS::Record qw( fields );
+use FS::Record qw( qsearchs fields dbh );
+use FS::part_svc_column;
 
 @ISA = qw(FS::Record);
 
@@ -14,8 +15,8 @@ FS::part_svc - Object methods for part_svc objects
 
   use FS::part_svc;
 
-  $record = new FS::part_referral \%hash
-  $record = new FS::part_referral { 'column' => 'value' };
+  $record = new FS::part_svc \%hash
+  $record = new FS::part_svc { 'column' => 'value' };
 
   $error = $record->insert;
 
@@ -37,7 +38,7 @@ FS::Record.  The following fields are currently supported:
 =item svc - text name of this service definition
 
 =item svcdb - table used for this service.  See L<FS::svc_acct>,
-L<FS::svc_domain>, and L<FS::svc_acct_sm>, among others.
+L<FS::svc_domain>, and L<FS::svc_forward>, among others.
 
 =item I<svcdb>__I<field> - Default or fixed value for I<field> in I<svcdb>.
 
@@ -62,6 +63,73 @@ sub table { 'part_svc'; }
 
 Adds this service definition to the database.  If there is an error, returns
 the error, otherwise returns false.
+=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
+
+=cut
+
+sub insert {
+  my $self = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  my $error = $self->SUPER::insert;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  my $svcdb = $self->svcdb;
+#  my @rows = map { /^${svcdb}__(.*)$/; $1 }
+#    grep ! /_flag$/,
+#      grep /^${svcdb}__/,
+#        fields('part_svc');
+  foreach my $field (
+    grep { $_ ne 'svcnum'
+           && defined( $self->getfield($svcdb.'__'.$_.'_flag') )
+         } fields($svcdb)
+  ) {
+    my $part_svc_column = $self->part_svc_column($field);
+    my $previous = qsearchs('part_svc_column', {
+      'svcpart'    => $self->svcpart,
+      'columnname' => $field,
+    } );
+
+    my $flag = $self->getfield($svcdb.'__'.$field.'_flag');
+    if ( uc($flag) =~ /^([DF])$/ ) {
+      $part_svc_column->setfield('columnflag', $1);
+      $part_svc_column->setfield('columnvalue',
+        $self->getfield($svcdb.'__'.$field)
+      );
+      if ( $previous ) {
+        $error = $part_svc_column->replace($previous);
+      } else {
+        $error = $part_svc_column->insert;
+      }
+    } else {
+      $error = $part_svc_column->delete;
+    }
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+  '';
+}
 
 =item delete
 
@@ -113,38 +181,58 @@ sub check {
   my @fields = eval { fields( $recref->{svcdb} ) }; #might die
   return "Unknown svcdb!" unless @fields;
 
-  my $svcdb;
-  foreach $svcdb ( qw(
-    svc_acct svc_acct_sm svc_domain
-  ) ) {
-    my @rows = map { /^${svcdb}__(.*)$/; $1 }
-      grep ! /_flag$/,
-        grep /^${svcdb}__/,
-          fields('part_svc');
-    foreach my $row (@rows) {
-      unless ( $svcdb eq $recref->{svcdb} ) {
-        $recref->{$svcdb.'__'.$row}='';
-        $recref->{$svcdb.'__'.$row.'_flag'}='';
-        next;
-      }
-      $recref->{$svcdb.'__'.$row.'_flag'} =~ /^([DF]?)$/
-        or return "Illegal flag for $svcdb $row";
-      $recref->{$svcdb.'__'.$row.'_flag'} = $1;
+#  my $svcdb;
+#  foreach $svcdb ( qw(
+#    svc_acct svc_acct_sm svc_domain
+#  ) ) {
+#    my @rows = map { /^${svcdb}__(.*)$/; $1 }
+#      grep ! /_flag$/,
+#        grep /^${svcdb}__/,
+#          fields('part_svc');
+#    foreach my $row (@rows) {
+#      unless ( $svcdb eq $recref->{svcdb} ) {
+#        $recref->{$svcdb.'__'.$row}='';
+#        $recref->{$svcdb.'__'.$row.'_flag'}='';
+#        next;
+#      }
+#      $recref->{$svcdb.'__'.$row.'_flag'} =~ /^([DF]?)$/
+#        or return "Illegal flag for $svcdb $row";
+#      $recref->{$svcdb.'__'.$row.'_flag'} = $1;
+#
+#      my $error = $self->ut_anything($svcdb.'__'.$row);
+#      return $error if $error;
+#
+#    }
+#  }
+
+  ''; #no error
+}
 
-      my $error = $self->ut_anything($svcdb.'__'.$row);
-      return $error if $error;
+=item part_svc_column COLUMNNAME
 
-    }
-  }
+Returns the part_svc_column object (see L<FS::part_svc_column>) for the given
+COLUMNNAME, or a new part_svc_column object if none exists.
 
-  ''; #no error
+=cut
+
+sub part_svc_column {
+  my $self = shift;
+  my $columnname = shift;
+  qsearchs('part_svc_column',  {
+                                 'svcpart'    => $self->svcpart,
+                                 'columnname' => $columnname,
+                               }
+  ) or new FS::part_svc_column {
+                                 'svcpart'    => $self->svcpart,
+                                 'columnname' => $columnname,
+                               };
 }
 
 =back
 
 =head1 VERSION
 
-$Id: part_svc.pm,v 1.2 2001-08-11 05:51:24 ivan Exp $
+$Id: part_svc.pm,v 1.3 2001-09-06 20:41:59 ivan Exp $
 
 =head1 BUGS
 
@@ -156,7 +244,7 @@ should be fixed.
 =head1 SEE ALSO
 
 L<FS::Record>, L<FS::part_pkg>, L<FS::pkg_svc>, L<FS::cust_svc>,
-L<FS::svc_acct>, L<FS::svc_acct_sm>, L<FS::svc_domain>, schema.html from the
+L<FS::svc_acct>, L<FS::svc_forward>, L<FS::svc_domain>, schema.html from the
 base documentation.
 
 =cut
index bc5b756..c47cdbf 100644 (file)
@@ -164,9 +164,11 @@ sub setx {
   return "Unkonwn svcpart" unless $part_svc;
 
   #set default/fixed/whatever fields from part_svc
-  foreach my $field ( fields('svc_acct') ) {
-    if ( $part_svc->getfield('svc_acct__'. $field. '_flag') eq $x ) {
-      $self->setfield( $field, $part_svc->getfield('svc_acct__'. $field) );
+  my $table = $self->table;
+  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 );
     }
   }
 
@@ -193,7 +195,7 @@ sub cancel { ''; }
 
 =head1 VERSION
 
-$Id: svc_Common.pm,v 1.4 2001-04-22 00:49:30 ivan Exp $
+$Id: svc_Common.pm,v 1.5 2001-09-06 20:41:59 ivan Exp $
 
 =head1 BUGS
 
index 7e27fd8..a4ce3f7 100644 (file)
@@ -185,7 +185,7 @@ sub insert {
   my $part_svc = qsearchs( 'part_svc', { 'svcpart' => $self->svcpart } );
   return "Unknown svcpart" unless $part_svc;
   return "uid in use"
-    if $part_svc->svc_acct__uid_flag ne 'F'
+    if $part_svc->part_svc_column('uid')->columnflag ne 'F'
       && qsearchs( 'svc_acct', { 'uid' => $self->uid } )
       && $self->username !~ /^(hyla)?fax$/
     ;
@@ -456,7 +456,7 @@ sub check {
     ! $recref->{popnum} ||
     qsearchs('svc_acct_pop',{'popnum'=> $recref->{popnum} } );
 
-  unless ( $part_svc->getfield('svc_acct__uid_flag') eq 'F' ) {
+  unless ( $part_svc->part_svc_column('uid')->columnflag eq 'F' ) {
 
     $recref->{uid} =~ /^(\d*)$/ or return "Illegal uid";
     $recref->{uid} = $1 eq '' ? $self->unique('uid') : $1;
@@ -506,7 +506,7 @@ sub check {
       return "Can't have quota without uid" : ( $recref->{quota}='' );
   }
 
-  unless ( $part_svc->getfield('svc_acct__slipip_flag') eq 'F' ) {
+  unless ( $part_svc->part_svc_column('slipip')->columnflag eq 'F' ) {
     unless ( $recref->{slipip} eq '0e0' ) {
       $recref->{slipip} =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/
         or return "Illegal slipip". $self->slipip;
@@ -633,7 +633,7 @@ sub email {
 
 =head1 VERSION
 
-$Id: svc_acct.pm,v 1.29 2001-09-02 04:51:11 ivan Exp $
+$Id: svc_acct.pm,v 1.30 2001-09-06 20:41:59 ivan Exp $
 
 =head1 BUGS
 
index 7615c21..c92f142 100644 (file)
@@ -211,7 +211,7 @@ sub check {
 
   my $x = $self->setfixed;
   return $x unless ref($x);
-  my $part_svc = $x;
+  #my $part_svc = $x;
 
   my($recref) = $self->hashref;
 
@@ -238,7 +238,7 @@ sub check {
 
 =head1 VERSION
 
-$Id: svc_acct_sm.pm,v 1.4 2001-08-20 09:41:52 ivan Exp $
+$Id: svc_acct_sm.pm,v 1.5 2001-09-06 20:41:59 ivan Exp $
 
 =head1 BUGS
 
index 4d652f8..58c6423 100644 (file)
@@ -338,7 +338,7 @@ sub check {
 
   my $x = $self->setfixed;
   return $x unless ref($x);
-  my $part_svc = $x;
+  #my $part_svc = $x;
 
   my $error = $self->ut_numbern('svcnum')
               || $self->ut_numbern('catchall')
@@ -533,7 +533,7 @@ sub submit_internic {
 
 =head1 VERSION
 
-$Id: svc_domain.pm,v 1.19 2001-08-21 00:39:07 ivan Exp $
+$Id: svc_domain.pm,v 1.20 2001-09-06 20:41:59 ivan Exp $
 
 =head1 BUGS
 
index 288ab34..6ee1d5b 100644 (file)
@@ -263,7 +263,7 @@ sub check {
 
   my $x = $self->setfixed;
   return $x unless ref($x);
-  my $part_svc = $x;
+  #my $part_svc = $x;
 
   my $error = $self->ut_numbern('svcnum')
               || $self->ut_number('srcsvc')
@@ -299,7 +299,7 @@ sub check {
 
 =head1 VERSION
 
-$Id: svc_forward.pm,v 1.6 2001-08-21 00:39:07 ivan Exp $
+$Id: svc_forward.pm,v 1.7 2001-09-06 20:41:59 ivan Exp $
 
 =head1 BUGS
 
index 44d7487..d4e3988 100644 (file)
@@ -198,7 +198,7 @@ sub check {
 
   my $x = $self->setfixed;
   return $x unless ref($x);
-  my $part_svc = $x;
+  #my $part_svc = $x;
 
   my $error =
     $self->ut_numbern('svcnum')
@@ -220,7 +220,7 @@ sub check {
 
 =head1 VERSION
 
-$Id: svc_www.pm,v 1.5 2001-08-21 02:44:47 ivan Exp $
+$Id: svc_www.pm,v 1.6 2001-09-06 20:41:59 ivan Exp $
 
 =head1 BUGS
 
index 209c93a..2db053d 100644 (file)
@@ -34,6 +34,7 @@ FS/cust_svc.pm
 FS/part_pkg.pm
 FS/part_referral.pm
 FS/part_svc.pm
+FS/part_svc_column.pm
 FS/pkg_svc.pm
 FS/svc_Common.pm
 FS/svc_acct.pm
@@ -73,6 +74,7 @@ t/nas.t
 t/part_pkg.t
 t/part_referral.t
 t/part_svc.t
+t/part_svc_column.t
 t/pkg_svc.t
 t/port.t
 t/prepay_credit.t
diff --git a/FS/t/part_svc_column.t b/FS/t/part_svc_column.t
new file mode 100644 (file)
index 0000000..467025c
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::part_svc_column;
+$loaded=1;
+print "ok 1\n";
diff --git a/README.1.4.0pre2-3 b/README.1.4.0pre2-3
new file mode 100644 (file)
index 0000000..23b838e
--- /dev/null
@@ -0,0 +1,16 @@
+the following is necessary to upgrade from 1.4.0pre2 to pre3 or later.
+
+CREATE TABLE part_svc_column (
+  columnnum int primary key,
+  svcpart int not null,
+  columnname varchar(64) not null,
+  columnvalue varchar(80) null,
+  columnflag char(1) null
+);
+
+CREATE UNIQUE INDEX part_svc_column1 ON part_svc_column ( svcpart, columnname );
+
+Run bin/fs-migrate-part_svc
+
+Run bin/dbdef-create
+
diff --git a/bin/fs-migrate-part_svc b/bin/fs-migrate-part_svc
new file mode 100755 (executable)
index 0000000..96332f7
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+use strict;
+use FS::UID qw(adminsuidsetup);
+use FS::Record qw(qsearchs);
+use FS::part_svc
+
+my $user = shift or die &usage;
+my $dbh = adminsuidsetup $user;
+
+my $oldAutoCommit = $FS::UID::AutoCommit;
+local $FS::UID::AutoCommit = 0
+
+foreach my $part_svc ( qsearch('part_svc', {} ) ) {
+  foreach my $field (
+    grep { defined($part_svc->getfield($part_svc->svcdb.'__'.$field.'_flag') ) }
+      fields($self->svcdb)
+  ) {
+    my $flag = $self->getfield($part_svc->svcdb.'__'.$field.'_flag');
+    if ( uc($flag) =~ /^([DF])$/ ) {
+      $part_svc_column->setfield('columnflag', $1);
+      $part_svc_column->setfield('columnvalue',
+        $self->getfield($part_svc->svcdb.'__'.$field)
+      );
+      $error = $part_svc_column->insert;
+    } else {
+      $error = $part_svc_column->delete;
+    }
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      die $error;
+    }
+
+  }
+}
+
+sub usage {
+  die "Usage:\n  fs-migrate-part_svc user\n"; 
+}
+
index f151311..1584197 100755 (executable)
@@ -9,9 +9,6 @@ use FS::cust_refund;
 my $user = shift or die &usage;
 my $dbh = adminsuidsetup $user;
 
-#local $FS::UID::AutoCommit = 0; #quelle hack, in this case
-# $FS::UID::AutoCommit = 0; #quelle hack, in this case
-
 # apply payments to invoices
 
 foreach my $cust_pay ( qsearch('cust_pay', {} ) ) {
@@ -28,3 +25,7 @@ foreach my $cust_refund ( qsearch('cust_refund') ) {
 
 # ? apply credits to invoices
 
+sub usage {
+  die "Usage:\n  fs-migrate-payref user\n"; 
+}
+
index 92523eb..fadba01 100755 (executable)
@@ -35,8 +35,8 @@ my($char_d) = 80; #default maxlength for text fields
 foreach my $attribute ( @attributes ) {
   foreach my $statement ( 
     "ALTER TABLE svc_acct ADD rc_$attribute varchar($char_d) NULL",
-    "ALTER TABLE part_svc ADD svc_acct__rc_$attribute varchar($char_d) NULL;",
-    "ALTER TABLE part_svc ADD svc_acct__rc_${attribute}_flag char(1) NULL;",
+#    "ALTER TABLE part_svc ADD svc_acct__rc_$attribute varchar($char_d) NULL;",
+#    "ALTER TABLE part_svc ADD svc_acct__rc_${attribute}_flag char(1) NULL;",
   ) {
     $dbh->do( $statement ) or warn "Error executing $statement: ". $dbh->errstr;  }
 }
index 7938fea..997a8ea 100755 (executable)
@@ -35,8 +35,8 @@ my($char_d) = 80; #default maxlength for text fields
 foreach my $attribute ( @attributes ) {
   foreach my $statement ( 
     "ALTER TABLE svc_acct ADD radius_$attribute varchar($char_d) NULL",
-    "ALTER TABLE part_svc ADD svc_acct__radius_$attribute varchar($char_d) NULL;",
-    "ALTER TABLE part_svc ADD svc_acct__radius_${attribute}_flag char(1) NULL;",
+#    "ALTER TABLE part_svc ADD svc_acct__radius_$attribute varchar($char_d) NULL;",
+#    "ALTER TABLE part_svc ADD svc_acct__radius_${attribute}_flag char(1) NULL;",
   ) {
     $dbh->do( $statement ) or warn "Error executing $statement: ". $dbh->errstr;  }
 }
index 5dc666a..53d96f6 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -Tw
 #
-# $Id: fs-setup,v 1.53 2001-09-04 11:15:58 ivan Exp $
+# $Id: fs-setup,v 1.54 2001-09-06 20:41:59 ivan Exp $
 
 #to delay loading dbdef until we're ready
 BEGIN { $FS::Record::setup_hack = 1; }
@@ -122,32 +122,32 @@ foreach $attribute (@check_attributes) {
   ));
 }
 
-#make part_svc table (but now as object)
-
-my($part_svc)=$dbdef->table('part_svc');
-
-#because of svc_acct_pop
-#foreach (grep /^svc_/, $dbdef->tables) { 
-#foreach (qw(svc_acct svc_acct_sm svc_charge svc_domain svc_wo)) {
-foreach (qw(svc_acct svc_domain svc_forward svc_www)) {
-  my($table)=$dbdef->table($_);
-  my($col);
-  foreach $col ( $table->columns ) {
-    next if $col =~ /^svcnum$/;
-    $part_svc->addcolumn( new DBIx::DBSchema::Column (
-      $table->name. '__' . $table->column($col)->name,
-      'varchar', #$table->column($col)->type, 
-      'NULL',
-      $char_d, #$table->column($col)->length,
-    ));
-    $part_svc->addcolumn ( new DBIx::DBSchema::Column (
-      $table->name. '__'. $table->column($col)->name . "_flag",
-      'char',
-      'NULL',
-      1,
-    ));
-  }
-}
+##make part_svc table (but now as object)
+#
+#my($part_svc)=$dbdef->table('part_svc');
+#
+##because of svc_acct_pop
+##foreach (grep /^svc_/, $dbdef->tables) { 
+##foreach (qw(svc_acct svc_acct_sm svc_charge svc_domain svc_wo)) {
+#foreach (qw(svc_acct svc_domain svc_forward svc_www)) {
+#  my($table)=$dbdef->table($_);
+#  my($col);
+#  foreach $col ( $table->columns ) {
+#    next if $col =~ /^svcnum$/;
+#    $part_svc->addcolumn( new DBIx::DBSchema::Column (
+#      $table->name. '__' . $table->column($col)->name,
+#      'varchar', #$table->column($col)->type, 
+#      'NULL',
+#      $char_d, #$table->column($col)->length,
+#    ));
+#    $part_svc->addcolumn ( new DBIx::DBSchema::Column (
+#      $table->name. '__'. $table->column($col)->name . "_flag",
+#      'char',
+#      'NULL',
+#      1,
+#    ));
+#  }
+#}
 
 #important
 $dbdef->save($dbdef_file);
@@ -580,6 +580,19 @@ sub tables_hash_hack {
       'index' => [ [] ],
     },
 
+    'part_svc_column' => {
+      'columns' => [
+        'columnnum',   'int',         '', '',
+        'svcpart',     'int',         '', '',
+        'columnname',  'varchar',     '', 64,
+        'columnvalue', 'varchar', 'NULL', $char_d,
+        'columnflag',  'char',    'NULL', 1, 
+      ],
+      'primary_key' => 'columnnum',
+      'unique' => [ [ 'svcpart', 'columnname' ] ],
+      'index' => [ [ 'svcpart' ] ],
+    }
+
     #(this should be renamed to part_pop)
     'svc_acct_pop' => {
       'columns' => [
index 1306ac0..cfb1ad8 100755 (executable)
@@ -1,4 +1,4 @@
-<!-- $Id: part_svc.cgi,v 1.3 2001-09-04 14:44:06 ivan Exp $ -->
+<!-- $Id: part_svc.cgi,v 1.4 2001-09-06 20:41:59 ivan Exp $ -->
 <%= header('Service Definition Listing', menubar( 'Main Menu' => $p) ) %>
 
     Services are items you offer to your customers.<BR><BR>
    } qsearch('part_svc',{}) ) {
      my($hashref)=$part_svc->hashref;
      my($svcdb)=$hashref->{svcdb};
-     my(@rows)=
-       grep $hashref->{${svcdb}.'__'.$_.'_flag'},
-         map { /^${svcdb}__(.*)$/; $1 }
-           grep ! /_flag$/,
-             grep /^${svcdb}__/,
-               fields('part_svc')
-     ;
-     my($rowspan)=scalar(@rows) || 1;
+     my @fields =
+       grep { $_ ne 'svcnum' && $part_svc->part_svc_column($_)->columnflag }
+            fields($svcdb);
+
+     my($rowspan)=scalar(@fields) || 1;
      my $url = "${p}edit/part_svc.cgi?$hashref->{svcpart}";
 %>
 
@@ -35,9 +32,8 @@
       <%= $hashref->{svcdb} %></TD>
 
 <%   my($n1)='';
-     my($row);
-     foreach $row ( @rows ) {
-       my($flag)=$part_svc->getfield($svcdb.'__'.$row.'_flag');
+     foreach my $field ( @fields ) {
+       my $flag = $part_svc->part_svc_column($field)->columnflag;
 %>
      <%= $n1 %><TD><%= $row %></TD><TD>
 
@@ -45,7 +41,7 @@
          elsif ( $flag eq "F" ) { print "Fixed"; }
          else { print "(Unknown!)"; }
 %>
-       </TD><TD><%= $part_svc->getfield($svcdb."__".$row) %></TD>
+       </TD><TD><%= $part_svc->part_svc_column($field)->columnvalue%></TD>
 <%     $n1="</TR><TR>";
      }
 %>
index c90f476..59d68b7 100644 (file)
         <li>svcpart - primary key
         <li>svc - name of this service
         <li>svcdb - table used for this service: svc_acct, svc_acct_sm, svc_forward, svc_domain, svc_charge or svc_wo
-        <li><i>table</i>__<i>field</i> - Default or fixed value for <i>field</i> in <i>table</i>
+<!--        <li><i>table</i>__<i>field</i> - Default or fixed value for <i>field</i> in <i>table</i>
         <li><i>table</i>__<i>field</i>_flag - null, D or F
+-->
+      </ul>
+    <li><a name="part_svc_column" href="man/FS/part_svc_column.html">part_svc_column</a>
+      <ul>
+        <li>columnnum - primary key
+        <li>svcpart - <a href="#part_svc">Service definition</a>
+        <li>columnname - column name in part_svc.svcdb table
+        <li>columnvalue - default or fixed value for the column
+        <li>columnflag - null, D or F
       </ul>
     <li><a name="pkg_svc" href="man/FS/pkg_svc.html">pkg_svc</a>
       <ul>
index 518d761..67b0e5f 100644 (file)
@@ -95,19 +95,17 @@ CREATE TABLE cust_credit_refund (
   amount decimal(10,2) not null
 );
 
+CREATE TABLE part_svc_column (
+  columnnum int primary key,
+  svcpart int not null,
+  columnname varchar(64) not null,
+  columnvalue varchar(80) null,
+  columnflag char(1) null
+);
+
 
 ALTER TABLE svc_acct ADD domsvc integer NOT NULL;
 ALTER TABLE svc_domain ADD catchall integer NULL;
-ALTER TABLE part_svc ADD svc_acct__domsvc integer NULL;
-ALTER TABLE part_svc ADD svc_acct__domsvc_flag char(1) NULL;
-ALTER TABLE part_svc ADD svc_domain__catchall integer NULL;
-ALTER TABLE part_svc ADD svc_domain__catchall_flag char(1) NULL;
-ALTER TABLE part_svc ADD svc_forward__srcsvc integer NULL;
-ALTER TABLE part_svc ADD svc_forward__srcsvc_flag char(1) NULL;
-ALTER TABLE part_svc ADD svc_forward__dstsvc integer NULL;
-ALTER TABLE part_svc ADD svc_forward__dstsvc_flag char(1) NULL;
-ALTER TABLE part_svc ADD svc_forward__dst integer NULL;
-ALTER TABLE part_svc ADD svc_forward__dst_flag char(1) NULL;
 ALTER TABLE cust_main ADD referral_custnum integer NULL;
 ALTER TABLE cust_pay ADD custnum integer;
 ALTER TABLE cust_refund ADD custnum integer;
@@ -118,6 +116,7 @@ CREATE INDEX cust_bill_pay1 ON cust_bill_pay ( invnum );
 CREATE INDEX cust_bill_pay2 ON cust_bill_pay ( paynum );
 CREATE INDEX cust_credit_refund1 ON cust_credit_refund ( crednum );
 CREATE INDEX cust_credit_refund2 ON cust_credit_refund ( refundnum );
+CREATE UNIQUE INDEX part_svc_column1 ON part_svc_column ( svcpart, columnname );
 </pre>
 
   <li>If you are using PostgreSQL, apply the following changes to your database:
@@ -177,6 +176,7 @@ ALTER TABLE cust_main ADD COLUMN comments varchar NULL;
   <li>create a service based on svc_forward
   <li>Run bin/fs-migrate-svc_acct_sm
   <li>Run bin/fs-migrate-payref
+  <li>Run bin/fs-migrate-part_svc
   <li><b>After running bin/fs-migrate-payref</b>, apply the following changes to your database:
   <table border><tr><th>PostgreSQL</th><th>MySQL, others</th></tr>
 <tr><td>
index 01574e9..c0d632f 100755 (executable)
@@ -1,4 +1,4 @@
-<!-- $Id: part_svc.cgi,v 1.6 2001-09-04 14:44:06 ivan Exp $ -->
+<!-- $Id: part_svc.cgi,v 1.7 2001-09-06 20:42:00 ivan Exp $ -->
 <% 
    my $part_svc;
    if ( $cgi->param('error') ) { #error
@@ -145,10 +145,9 @@ foreach my $svcdb ( qw(
   konq_kludge svc_acct svc_domain svc_acct_sm svc_forward svc_www
 ) ) {
 
-  my(@rows)=map { /^${svcdb}__(.*)$/; $1 }
-    grep ! /_flag$/,
-      grep /^${svcdb}__/,
-        fields('part_svc');
+  my(@fields) = $svcdb eq 'konq_kludge'
+                  ? ()
+                  : grep { $_ ne 'svcnum' } fields($svcdb) );
   #my($rowspan)=scalar(@rows);
 
   #my($ptmp)="<TD ROWSPAN=$rowspan>$svcdb</TD>";
@@ -177,22 +176,26 @@ function fixup(what) {
   print "$svcdb" unless $svcdb eq 'konq_kludge';
   print "<BR><TABLE BORDER=1><TH>Field</TH><TH COLSPAN=2>Modifier</TH>" unless $svcdb eq 'konq_kludge';
 
-  my($row);
-  foreach $row (@rows) {
-    my $value = $part_svc->getfield($svcdb. '__'. $row);
-    my $flag = $part_svc->getfield($svcdb. '__'. $row. '_flag');
-    #print "<TR>$ptmp<TD>$row";
-    print "<TR><TD>$row";
-    print "- <FONT SIZE=-1>$defs{$svcdb}{$row}</FONT>"
-      if defined $defs{$svcdb}{$row};
+  foreach my $field (@fields) {
+    my $part_svc_column = $part_svc->part_svc_column($field);
+    my $value = $cgi->param('error')
+                  ? $cgi->param("${svcdb}__${field}")
+                  : $$part_svc_column->columnvalue;
+    my $flag = $cgi->param('error')
+                 ? $cgi->param("${svcdb}__${field}_flag")
+                 : $part_svc_column->columnflag;
+    #print "<TR>$ptmp<TD>$field";
+    print "<TR><TD>$field";
+    print "- <FONT SIZE=-1>$defs{$svcdb}{$field}</FONT>"
+      if defined $defs{$svcdb}{$field};
     print "</TD>";
-    print qq!<TD><INPUT TYPE="radio" NAME="${svcdb}__${row}_flag" VALUE=""!.
+    print qq!<TD><INPUT TYPE="radio" NAME="${svcdb}__${field}_flag" VALUE=""!.
       ' CHECKED'x($flag eq ''). ">Off</TD>";
-    print qq!<TD><INPUT TYPE="radio" NAME="${svcdb}__${row}_flag" VALUE="D"!.
+    print qq!<TD><INPUT TYPE="radio" NAME="${svcdb}__${field}_flag" VALUE="D"!.
       ' CHECKED'x($flag eq 'D'). ">Default ";
-    print qq!<INPUT TYPE="radio" NAME="${svcdb}__${row}_flag" VALUE="F"!.
+    print qq!<INPUT TYPE="radio" NAME="${svcdb}__${field}_flag" VALUE="F"!.
       ' CHECKED'x($flag eq 'F'). ">Fixed ";
-    print qq!<INPUT TYPE="text" NAME="${svcdb}__${row}" VALUE="$value">!,
+    print qq!<INPUT TYPE="text" NAME="${svcdb}__${field}" VALUE="$value">!,
       "</TD></TR>\n";
     #$ptmp='';
   }
index 093d86a..5652c58 100755 (executable)
@@ -8,7 +8,11 @@ my $new = new FS::part_svc ( {
   map {
     $_, scalar($cgi->param($_));
 #  } qw(svcpart svc svcdb)
-  } fields('part_svc')
+  } ( fields('part_svc'),
+      map { my $svcdb = $_;
+            map { ( $svcdb.'__'.$_, $svcdb.'__'.$_.'_flag' )  }
+              fields($svcdb)
+          } qw( svc_acct svc_domain svc_acct_sm svc_forward svc_www ) )
 } );
 
 my $error;