[freeside-commits] freeside/FS/FS Mason.pm, 1.68, 1.69 Record.pm, 1.219, 1.220 Schema.pm, 1.278, 1.279 cust_pkg.pm, 1.199, 1.200 cust_svc.pm, 1.87, 1.88 hardware_class.pm, NONE, 1.1 hardware_status.pm, NONE, 1.1 hardware_type.pm, NONE, 1.1 part_svc.pm, 1.36, 1.37 part_svc_column.pm, 1.6, 1.7 svc_dish.pm, NONE, 1.1 svc_hardware.pm, NONE, 1.1

Mark Wells mark at wavetail.420.am
Thu Mar 31 19:52:14 PDT 2011


Update of /home/cvs/cvsroot/freeside/FS/FS
In directory wavetail.420.am:/tmp/cvs-serv29538/FS/FS

Modified Files:
	Mason.pm Record.pm Schema.pm cust_pkg.pm cust_svc.pm 
	part_svc.pm part_svc_column.pm 
Added Files:
	hardware_class.pm hardware_status.pm hardware_type.pm 
	svc_dish.pm svc_hardware.pm 
Log Message:
svc_hardware and svc_dish, #11454

Index: part_svc_column.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/part_svc_column.pm,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -d -r1.6 -r1.7
--- part_svc_column.pm	9 May 2009 00:39:13 -0000	1.6
+++ part_svc_column.pm	1 Apr 2011 02:52:12 -0000	1.7
@@ -43,7 +43,7 @@
 
 =item columnvalue - default or fixed value for the column
 
-=item columnflag - null or empty (no default), `D' for default, `F' for fixed (unchangeable), `S' for selectable choice, `M' for manual selection from inventory, or `A' for automatic selection from inventory.  For virtual fields, can also be 'X' for excluded.
+=item columnflag - null or empty (no default), `D' for default, `F' for fixed (unchangeable), `S' for selectable choice, `M' for manual selection from inventory, `A' for automatic selection from inventory, or `H' for selection from a hardware class.  For virtual fields, can also be 'X' for excluded.
 
 =back
 
@@ -94,15 +94,19 @@
   ;
   return $error if $error;
 
-  $self->columnflag =~ /^([DFSMAX]?)$/
+  $self->columnflag =~ /^([DFSMAHX]?)$/
     or return "illegal columnflag ". $self->columnflag;
   $self->columnflag(uc($1));
 
   if ( $self->columnflag =~ /^[MA]$/ ) {
     $error =
       $self->ut_foreign_key( 'columnvalue', 'inventory_class', 'classnum' );
-    return $error if $error;
   }
+  if ( $self->columnflag eq 'H' ) {
+    $error = 
+      $self->ut_foreign_key( 'columnvalue', 'hardware_class', 'classnum' );
+  }
+  return $error if $error;
 
   $self->SUPER::check;
 }

--- NEW FILE: svc_dish.pm ---
package FS::svc_dish;

use strict;
use base qw( FS::svc_Common );
use FS::Record qw( qsearch qsearchs );

=head1 NAME

FS::svc_dish - Object methods for svc_dish records

=head1 SYNOPSIS

  use FS::svc_dish;

  $record = new FS::svc_dish \%hash;
  $record = new FS::svc_dish { 'column' => 'value' };

  $error = $record->insert;

  $error = $new_record->replace($old_record);

  $error = $record->delete;

  $error = $record->check;

=head1 DESCRIPTION

An FS::svc_dish object represents a Dish Network service.  FS::svc_dish 
inherits from FS::svc_Common.

The following fields are currently supported:

=over 4

=item svcnum - Primary key

=item acctnum - DISH account number

=item note - Installation notes: location on property, physical access, etc.

=back

=head1 METHODS

=over 4

=item new HASHREF

Creates a new svc_dish object.

=cut

sub table { 'svc_dish'; }

sub table_info {
  my %opts = ( 'type' => 'text', 
               'disable_select' => 1,
               'disable_inventory' => 1,
             );
  {
    'name'           => 'Dish service',
    'display_weight' => 58,
    'cancel_weight'  => 85,
    'fields' => {
      'svcnum'    => { label => 'Service' },
      'acctnum'   => { label => 'DISH account#', %opts },
      'note'      => { label => 'Installation notes', %opts },
    }
  }
}

sub label {
  my $self = shift;
  $self->acctnum;
}

sub search_sql {
  my($class, $string) = @_;
  $class->search_sql_field('acctnum', $string);
}

=item insert

Adds this record to the database.  If there is an error, returns the error,
otherwise returns false.

=item delete

Delete this record from the database.

=item replace OLD_RECORD

Replaces the OLD_RECORD with this one in the database.  If there is an error,
returns the error, otherwise returns false.

# the replace method can be inherited from FS::Record

=item check

Checks all fields to make sure this is a valid service.  If there is
an error, returns the error, otherwise returns false.  Called by the insert
and replace methods.

=cut

sub check {
  my $self = shift;

  my $x = $self->setfixed;
  return $x unless ref $x;

  my $error = 
    $self->ut_numbern('svcnum')
    || $self->ut_text('acctnum')
    || $self->ut_textn('note')
  ;
  return $error if $error;

  $self->SUPER::check;
}

=back

=head1 SEE ALSO

L<FS::Record>, L<FS::svc_Common>, schema.html from the base documentation.

=cut

1;


--- NEW FILE: hardware_type.pm ---
package FS::hardware_type;

use strict;
use base qw( FS::Record );
use FS::Record qw( qsearch qsearchs );

=head1 NAME

FS::hardware_type - Object methods for hardware_type records

=head1 SYNOPSIS

  use FS::hardware_type;

  $record = new FS::hardware_type \%hash;
  $record = new FS::hardware_type { 'column' => 'value' };

  $error = $record->insert;

  $error = $new_record->replace($old_record);

  $error = $record->delete;

  $error = $record->check;

=head1 DESCRIPTION

An FS::hardware_type object represents a device type (a model name or 
number) assignable as a hardware service (L<FS::svc_hardware)>).
FS::hardware_type inherits from FS::Record.  The following fields are 
currently supported:

=over 4

=item typenum - primary key

=item classnum - key to an L<FS::hardware_class> record defining the class 
to which this device type belongs.

=item model - descriptive model name or number

=back

=head1 METHODS

=over 4

=item new HASHREF

Creates a new record.  To add the record to the database, see L<"insert">.

Note that this stores the hash reference, not a distinct copy of the hash it
points to.  You can ask the object for a copy with the I<hash> method.

=cut

# the new method can be inherited from FS::Record, if a table method is defined

sub table { 'hardware_type'; }

=item insert

Adds this record to the database.  If there is an error, returns the error,
otherwise returns false.

=cut

# the insert method can be inherited from FS::Record

=item delete

Delete this record from the database.

=cut

# the delete method can be inherited from FS::Record

=item replace OLD_RECORD

Replaces the OLD_RECORD with this one in the database.  If there is an error,
returns the error, otherwise returns false.

=cut

# the replace method can be inherited from FS::Record

=item check

Checks all fields to make sure this is a valid hardware type.  If there is
an error, returns the error, otherwise returns false.  Called by the insert
and replace methods.

=cut

# the check method should currently be supplied - FS::Record contains some
# data checking routines

sub check {
  my $self = shift;

  my $error = 
    $self->ut_numbern('typenum')
    || $self->ut_foreign_key('classnum', 'hardware_class', 'classnum')
    || $self->ut_text('model')
  ;
  return $error if $error;

  $self->SUPER::check;
}

=item hardware_class

Returns the L<FS::hardware_class> associated with this device.

=cut

sub hardware_class {
  my $self = shift;
  return qsearchs('hardware_class', { 'classnum' => $self->classnum });
}

=back

=head1 SEE ALSO

L<FS::svc_hardware>, L<FS::Record>, schema.html from the base documentation.

=cut

1;


Index: cust_svc.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_svc.pm,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -w -d -r1.87 -r1.88
--- cust_svc.pm	16 Jan 2011 20:20:22 -0000	1.87
+++ cust_svc.pm	1 Apr 2011 02:52:12 -0000	1.88
@@ -371,6 +371,20 @@
   $self->h_date('insert');
 }
 
+=item pkg_cancel_date
+
+Returns the date this service's package was canceled.  This normally only 
+exists for a service that's been preserved through cancellation with the 
+part_pkg.preserve flag.
+
+=cut
+
+sub pkg_cancel_date {
+  my $self = shift;
+  my $cust_pkg = $self->cust_pkg or return;
+  return $cust_pkg->getfield('cancel') || '';
+}
+
 =item label
 
 Returns a list consisting of:

Index: part_svc.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/part_svc.pm,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -w -d -r1.36 -r1.37
--- part_svc.pm	25 Nov 2010 01:46:33 -0000	1.36
+++ part_svc.pm	1 Apr 2011 02:52:12 -0000	1.37
@@ -53,6 +53,8 @@
 
 =item disabled - Disabled flag, empty or `Y'
 
+=item preserve - Preserve after cancellation, empty or 'Y'
+
 =back
 
 =head1 METHODS
@@ -381,6 +383,7 @@
     || $self->ut_text('svc')
     || $self->ut_alpha('svcdb')
     || $self->ut_enum('disabled', [ '', 'Y' ] )
+    || $self->ut_enum('preserve', [ '', 'Y' ] )
   ;
   return $error if $error;
 
@@ -758,7 +761,7 @@
 
               map {
                     my $f = $svcdb.'__'.$_;
-                    if ( $param->{ $f.'_flag' } =~ /^[MA]$/ ) {
+                    if ( $param->{ $f.'_flag' } =~ /^[MAH]$/ ) {
                       $param->{ $f } = delete( $param->{ $f.'_classnum' } );
                     }
 		    if ( $param->{ $f.'_flag' } =~ /^S$/ ) {

Index: cust_pkg.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_pkg.pm,v
retrieving revision 1.199
retrieving revision 1.200
diff -u -w -d -r1.199 -r1.200
--- cust_pkg.pm	10 Mar 2011 09:42:08 -0000	1.199
+++ cust_pkg.pm	1 Apr 2011 02:52:12 -0000	1.200
@@ -761,6 +761,8 @@
     map  { [ $_, $_->svc_x->table_info->{'cancel_weight'} ]; }
     qsearch( 'cust_svc', { 'pkgnum' => $self->pkgnum } )
   ) {
+    my $part_svc = $cust_svc->part_svc;
+    next if ( defined($part_svc) and $part_svc->preserve );
     my $error = $cust_svc->cancel( %svc_cancel_opt );
 
     if ( $error ) {

--- NEW FILE: hardware_class.pm ---
package FS::hardware_class;

use strict;
use base qw( FS::Record );
use FS::Record qw( qsearch qsearchs );

=head1 NAME

FS::hardware_class - Object methods for hardware_class records

=head1 SYNOPSIS

  use FS::hardware_class;

  $record = new FS::hardware_class \%hash;
  $record = new FS::hardware_class { 'column' => 'value' };

  $error = $record->insert;

  $error = $new_record->replace($old_record);

  $error = $record->delete;

  $error = $record->check;

=head1 DESCRIPTION

An FS::hardware_class object represents a class of hardware types which can 
be assigned to similar services (see L<FS::svc_hardware>).  FS::hardware_class 
inherits from FS::Record.  The following fields are currently supported:

=over 4

=item classnum - primary key

=item classname - classname


=back

=head1 METHODS

=over 4

=item new HASHREF

Creates a new record.  To add the record to the database, see L<"insert">.

Note that this stores the hash reference, not a distinct copy of the hash it
points to.  You can ask the object for a copy with the I<hash> method.

=cut

# the new method can be inherited from FS::Record, if a table method is defined

sub table { 'hardware_class'; }

=item insert

Adds this record to the database.  If there is an error, returns the error,
otherwise returns false.

=cut

# the insert method can be inherited from FS::Record

=item delete

Delete this record from the database.

=cut

# the delete method can be inherited from FS::Record

=item replace OLD_RECORD

Replaces the OLD_RECORD with this one in the database.  If there is an error,
returns the error, otherwise returns false.

=cut

# the replace method can be inherited from FS::Record

=item check

Checks all fields to make sure this is a valid hardware class.  If there is
an error, returns the error, otherwise returns false.  Called by the insert
and replace methods.

=cut

# the check method should currently be supplied - FS::Record contains some
# data checking routines

sub check {
  my $self = shift;

  my $error = 
    $self->ut_numbern('classnum')
    || $self->ut_text('classname')
  ;
  return $error if $error;

  $self->SUPER::check;
}

=item hardware_type

Returns all L<FS::hardware_type> objects belonging to this class.

=cut

sub hardware_type {
  my $self = shift;
  return qsearch('hardware_type', { 'classnum' => $self->classnum });
}

=back

=head1 SEE ALSO

L<FS::hardware_type>, L<FS::Record>, schema.html from the base documentation.

=cut

1;


--- NEW FILE: hardware_status.pm ---
package FS::hardware_status;

use strict;
use base qw( FS::Record );
use FS::Record qw( qsearch qsearchs );

=head1 NAME

FS::hardware_status - Object methods for hardware_status records

=head1 SYNOPSIS

  use FS::hardware_status;

  $record = new FS::hardware_status \%hash;
  $record = new FS::hardware_status { 'column' => 'value' };

  $error = $record->insert;

  $error = $new_record->replace($old_record);

  $error = $record->delete;

  $error = $record->check;

=head1 DESCRIPTION

An FS::hardware_status object represents an installation status for hardware 
services.  FS::hardware_status inherits from FS::Record.  The following fields 
are currently supported:

=over 4

=item statusnum - primary key

=item label - descriptive label


=back

=head1 METHODS

=over 4

=item new HASHREF

Creates a new record.  To add the record to the database, see L<"insert">.

Note that this stores the hash reference, not a distinct copy of the hash it
points to.  You can ask the object for a copy with the I<hash> method.

=cut

# the new method can be inherited from FS::Record, if a table method is defined

sub table { 'hardware_status'; }

=item insert

Adds this record to the database.  If there is an error, returns the error,
otherwise returns false.

=cut

# the insert method can be inherited from FS::Record

=item delete

Delete this record from the database.

=cut

# the delete method can be inherited from FS::Record

=item replace OLD_RECORD

Replaces the OLD_RECORD with this one in the database.  If there is an error,
returns the error, otherwise returns false.

=cut

# the replace method can be inherited from FS::Record

=item check

Checks all fields to make sure this is a valid status.  If there is
an error, returns the error, otherwise returns false.  Called by the insert
and replace methods.

=cut

# the check method should currently be supplied - FS::Record contains some
# data checking routines

sub check {
  my $self = shift;

  my $error = 
    $self->ut_numbern('statusnum')
    || $self->ut_text('label')
  ;
  return $error if $error;

  $self->SUPER::check;
}

=back

=head1 SEE ALSO

L<FS::svc_hardware>, L<FS::Record>, schema.html from the base documentation.

=cut

1;


Index: Record.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/Record.pm,v
retrieving revision 1.219
retrieving revision 1.220
diff -u -w -d -r1.219 -r1.220
--- Record.pm	13 Feb 2011 07:19:45 -0000	1.219
+++ Record.pm	1 Apr 2011 02:52:11 -0000	1.220
@@ -21,6 +21,7 @@
 use FS::Schema qw(dbdef);
 use FS::SearchCache;
 use FS::Msgcat qw(gettext);
+use NetAddr::IP; # for validation
 #use FS::Conf; #dependency loop bs, in install_callback below instead
 
 use FS::part_virtual_field;
@@ -2376,6 +2377,35 @@
   }
 }
 
+=item ut_ip46 COLUMN
+
+Check/untaint IPv4 or IPv6 address.
+
+=cut
+
+sub ut_ip46 {
+  my( $self, $field ) = @_;
+  my $ip = NetAddr::IP->new($self->getfield($field))
+    or return "Illegal (IP address) $field: ".$self->getfield($field);
+  $self->setfield($field, lc($ip->addr));
+  return '';
+}
+
+=item ut_ip46n
+
+Check/untaint IPv6 or IPv6 address.  May be null.
+
+=cut
+
+sub ut_ip46n {
+  my( $self, $field ) = @_;
+  if ( $self->getfield($field) =~ /^$/ ) {
+    $self->setfield($field, '');
+    return '';
+  }
+  $self->ut_ip46($field);
+}
+
 =item ut_coord COLUMN [ LOWER [ UPPER ] ]
 
 Check/untaint coordinates.

Index: Schema.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/Schema.pm,v
retrieving revision 1.278
retrieving revision 1.279
diff -u -w -d -r1.278 -r1.279
--- Schema.pm	29 Mar 2011 01:04:31 -0000	1.278
+++ Schema.pm	1 Apr 2011 02:52:11 -0000	1.279
@@ -1745,6 +1745,7 @@
         'svc',        'varchar',   '',   $char_d, '', '', 
         'svcdb',      'varchar',   '',   $char_d, '', '', 
         'disabled',   'char',  'NULL',   1, '', '', 
+        'preserve',   'char', 'NULL',  1, '', '',
       ],
       'primary_key' => 'svcpart',
       'unique' => [],
@@ -2003,6 +2004,63 @@
       'index' => [ ['svcnum'] ],
     },
 
+    'svc_dish' => {
+      'columns' => [
+        'svcnum',   'int',     '',     '', '', '',
+        'acctnum',  'varchar', '',     16, '', '',
+        'note',     'text',    'NULL', '', '', '',
+      ],
+      'primary_key' => 'svcnum',
+      'unique' => [ ],
+      'index' => [ ],
+    },
+
+    'svc_hardware' => {
+      'columns' => [
+        'svcnum',   'int',     '',          '', '', '',
+        'typenum',  'int',     '',          '', '', '',
+        'serial',   'varchar', 'NULL', $char_d, '', '',
+        'ip_addr',  'varchar', 'NULL',      40, '', '',
+        'hw_addr',  'varchar', 'NULL',      12, '', '',
+        'statusnum','int', 'NULL',          '', '', '',
+        'note',     'text',    'NULL',      '', '', '',
+      ],
+      'primary_key' => 'svcnum',
+      'unique' => [ ],
+      'index' => [ ],
+    },
+
+    'hardware_class' => {
+      'columns' => [
+        'classnum',   'serial', '',      '', '', '',
+        'classname', 'varchar', '', $char_d, '', '',
+      ],
+      'primary_key' => 'classnum',
+      'unique' => [ ],
+      'index'  => [ ],
+    },
+
+    'hardware_type' => {
+      'columns' => [
+        'typenum',  'serial', '',      '', '', '',
+        'classnum',    'int', '',      '', '', '',
+        'model',   'varchar', '', $char_d, '', '',
+      ],
+      'primary_key' => 'typenum',
+      'unique' => [ ],
+      'index'  => [ ],
+    },
+
+    'hardware_status' => {
+      'columns' => [
+        'statusnum', 'serial', '',      '', '', '',
+        'label'    ,'varchar', '', $char_d, '', '',
+      ],
+      'primary_key' => 'statusnum',
+      'unique' => [ ],
+      'index'  => [ ],
+    },
+
     'domain_record' => {
       'columns' => [
         'recnum',    'serial',     '',  '', '', '', 

--- NEW FILE: svc_hardware.pm ---
package FS::svc_hardware;

use strict;
use base qw( FS::svc_Common );
use FS::Record qw( qsearch qsearchs );
use FS::hardware_type;
use FS::hardware_status;

=head1 NAME

FS::svc_hardware - Object methods for svc_hardware records

=head1 SYNOPSIS

  use FS::svc_hardware;

  $record = new FS::svc_hardware \%hash;
  $record = new FS::svc_hardware { 'column' => 'value' };

  $error = $record->insert;

  $error = $new_record->replace($old_record);

  $error = $record->delete;

  $error = $record->check;

=head1 DESCRIPTION

An FS::svc_hardware object represents an equipment installation, such as 
a wireless broadband receiver, satellite antenna, or DVR.  FS::svc_hardware 
inherits from FS::svc_Common.

The following fields are currently supported:

=over 4

=item svcnum - Primary key

=item typenum - Device type number (see L<FS::hardware_type>)

=item ip_addr - IP address

=item hw_addr - Hardware address

=item serial - Serial number

=item statusnum - Service status (see L<FS::hardware_status>)

=item note - Installation notes: location on property, physical access, etc.

=back

=head1 METHODS

=over 4

=item new HASHREF

Creates a new svc_hardware object.

=cut

sub table { 'svc_hardware'; }

sub table_info {
  my %opts = ( 'type' => 'text', 'disable_select' => 1 );
  {
    'name'           => 'Hardware', #?
    'name_plural'    => 'Hardware',
    'display_weight' => 59,
    'cancel_weight'  => 86,
    'fields' => {
      'svcnum'    => { label => 'Service' },
      'typenum'   => { label => 'Device type',
                       type  => 'select-hardware',
                       disable_select    => 1,
                       disable_fixed     => 1,
                       disable_default   => 1,
                       disable_inventory => 1,
                     },
      'serial'    => { label => 'Serial number', %opts },
      'hw_addr'   => { label => 'Hardware address', %opts },
      'ip_addr'   => { label => 'IP address', %opts },
      'statusnum' => { label => 'Service status', 
                       type  => 'select',
                       select_table => 'hardware_status',
                       select_key   => 'statusnum',
                       select_label => 'label',
                       disable_inventory => 1,
                     },
      'note'      => { label => 'Installation notes', %opts },
    }
  }
}

sub search_sql {
  my ($class, $string) = @_;
  my @where = ();

  my $ip = NetAddr::IP->new($string);
  if ( $ip ) {
    push @where, $class->search_sql_field('ip_addr', $ip->addr);
  }
  
  if ( $string =~ /^(\w+)$/ ) {
    push @where, 'LOWER(svc_hardware.serial) LIKE \'%'.lc($string).'%\'';
  }

  if ( $string =~ /^([0-9A-Fa-f]|\W)+$/ ) {
    my $hex = uc($string);
    $hex =~ s/\W//g;
    push @where, 'svc_hardware.hw_addr LIKE \'%'.$hex.'%\'';
  }
  '(' . join(' OR ', @where) . ')';
}

sub label {
  my $self = shift;
  $self->serial || $self->hw_addr;
}

=item insert

Adds this record to the database.  If there is an error, returns the error,
otherwise returns false.

=item delete

Delete this record from the database.

=item replace OLD_RECORD

Replaces the OLD_RECORD with this one in the database.  If there is an error,
returns the error, otherwise returns false.

# the replace method can be inherited from FS::Record

=item check

Checks all fields to make sure this is a valid service.  If there is
an error, returns the error, otherwise returns false.  Called by the insert
and replace methods.

=cut

sub check {
  my $self = shift;

  my $x = $self->setfixed;
  return $x unless ref $x;

  my $hw_addr = $self->getfield('hw_addr');
  $hw_addr = join('', split(/\W/, $hw_addr));
  $self->setfield('hw_addr', $hw_addr);

  my $error = 
    $self->ut_numbern('svcnum')
    || $self->ut_foreign_key('typenum', 'hardware_type', 'typenum')
    || $self->ut_ip46n('ip_addr')
    || $self->ut_hexn('hw_addr')
    || $self->ut_alphan('serial')
    || $self->ut_foreign_keyn('statusnum', 'hardware_status', 'statusnum')
    || $self->ut_textn('note')
  ;
  return $error if $error;

  if ( !length($self->getfield('hw_addr')) 
        and !length($self->getfield('serial')) ) {
    return 'Serial number or hardware address required';
  }
 
  $self->SUPER::check;
}

=item hardware_type

Returns the L<FS::hardware_type> object associated with this installation.

=cut

sub hardware_type {
  my $self = shift;
  return qsearchs('hardware_type', { 'typenum' => $self->typenum });
}

=item status_label

Returns the 'label' field of the L<FS::hardware_status> object associated 
with this installation.

=cut

sub status_label {
  my $self = shift;
  my $status = qsearchs('hardware_status', { 'statusnum' => $self->statusnum })
    or return '';
  $status->label;
}


=back

=head1 SEE ALSO

L<FS::Record>, L<FS::svc_Common>, schema.html from the base documentation.

=cut

1;


Index: Mason.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/Mason.pm,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -w -d -r1.68 -r1.69
--- Mason.pm	13 Mar 2011 20:19:12 -0000	1.68
+++ Mason.pm	1 Apr 2011 02:52:11 -0000	1.69
@@ -273,6 +273,11 @@
   use FS::torrus_srvderive;
   use FS::torrus_srvderive_component;
   use FS::areacode;
+  use FS::svc_dish;
+  use FS::svc_hardware;
+  use FS::hardware_class;
+  use FS::hardware_type;
+  use FS::hardware_status;
   # Sammath Naur
 
   if ( $FS::Mason::addl_handler_use ) {



More information about the freeside-commits mailing list