diff options
| -rw-r--r-- | FS/FS/Mason.pm | 1 | ||||
| -rw-r--r-- | FS/FS/Schema.pm | 24 | ||||
| -rw-r--r-- | FS/FS/fiber_olt.pm | 32 | ||||
| -rw-r--r-- | FS/FS/olt_site.pm | 106 | ||||
| -rw-r--r-- | FS/FS/svc_fiber.pm | 18 | ||||
| -rw-r--r-- | FS/MANIFEST | 2 | ||||
| -rw-r--r-- | FS/t/olt_site.t | 5 | ||||
| -rw-r--r-- | httemplate/browse/fiber_olt.html | 6 | ||||
| -rw-r--r-- | httemplate/browse/olt_site.html | 12 | ||||
| -rw-r--r-- | httemplate/edit/elements/edit.html | 2 | ||||
| -rw-r--r-- | httemplate/edit/fiber_olt.html | 9 | ||||
| -rw-r--r-- | httemplate/edit/olt_site.html | 20 | ||||
| -rw-r--r-- | httemplate/edit/process/olt_site.html | 4 | ||||
| -rw-r--r-- | httemplate/edit/process/svc_fiber.html | 12 | ||||
| -rw-r--r-- | httemplate/edit/svc_fiber.html | 7 | ||||
| -rw-r--r-- | httemplate/elements/tr-input-fiber_circuit.html | 31 | ||||
| -rw-r--r-- | httemplate/view/svc_fiber.cgi | 3 | 
17 files changed, 281 insertions, 13 deletions
| diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index ff9be69ab..4d01d7c9e 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -388,6 +388,7 @@ if ( -e $addl_handler_use_file ) {    use FS::password_history;    use FS::svc_fiber;    use FS::fiber_olt; +  use FS::olt_site;    # Sammath Naur    if ( $FS::Mason::addl_handler_use ) { diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index da66d7dba..bfc8e3eeb 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -4731,8 +4731,9 @@ sub tables_hashref {          'ont_typenum',    'int', 'NULL',      '', '', '',          'ont_serial', 'varchar', 'NULL', $char_d, '', '',          'ont_port',   'varchar', 'NULL',      16, '', '', +        'circuit_id', 'varchar', 'NULL', $char_d, '', '',          'vlan',           'int', 'NULL',      '', '', '', -        'signal',         'int', 'NULL',      '', '', '', +        'signal',     'decimal', 'NULL',  '10,2', '', '',          'speed_up',       'int', 'NULL',      '', '', '',          'speed_down',     'int', 'NULL',      '', '', '',          'ont_install','varchar', 'NULL', $char_d, '', '', @@ -4746,14 +4747,35 @@ sub tables_hashref {        'columns' => [          'oltnum',   'serial', '',       '', '', '',          'oltname', 'varchar', '',  $char_d, '', '', +        'sitenum',     'int', '',       '', '', '',          'serial',  'varchar', '',  $char_d, '', '',          'disabled',   'char', 'NULL',    1, '', '',        ],        'primary_key' => 'oltnum',        'unique' => [ ],        'index'  => [ ], +      'foreign_keys' => [ +                          { columns => [ 'sitenum' ], +                            table   => 'olt_site', +                          }, +                        ], +    }, + +    'olt_site' => { +      'columns' => [ +        'sitenum',  'serial', '',      '', '', '', +        'market',  'varchar', '', $char_d, '', '', +        'site',    'varchar', '', $char_d, '', '', +      ], +      'primary_key' => 'sitenum', +      'unique' => [ [ 'market', 'site' ] ], +      'index' => [ ],      }, + + + +      'vend_main' => {        'columns' => [          'vendnum',   'serial',     '',      '', '', '', diff --git a/FS/FS/fiber_olt.pm b/FS/FS/fiber_olt.pm index d083e9eb6..e26e829ea 100644 --- a/FS/FS/fiber_olt.pm +++ b/FS/FS/fiber_olt.pm @@ -4,6 +4,7 @@ use base qw( FS::Record );  use strict;  use FS::Record qw( qsearch qsearchs );  use FS::svc_fiber; +use FS::olt_site;  =head1 NAME @@ -38,6 +39,8 @@ FS::Record.  The following fields are currently supported:  =item serial - serial number +=item sitenum - the L<FS::olt_site> where this OLT is installed +  =item disabled - set to 'Y' to make this OLT unavailable for new connections  =back @@ -88,6 +91,7 @@ sub check {      $self->ut_numbern('oltnum')      || $self->ut_text('oltname')      || $self->ut_text('serial') +    || $self->ut_foreign_keyn('sitenum', 'olt_site', 'sitenum')      || $self->ut_flag('disabled')    ;    return $error if $error; @@ -95,6 +99,32 @@ sub check {    $self->SUPER::check;  } +=item site_description + +Returns the OLT's site description. + +=cut + +sub site_description { +  my $self = shift; +  return '' if !$self->sitenum; +  my $olt_site = FS::olt_site->by_key($self->sitenum); +  return $olt_site->description; +} + +=item description + +Returns the OLT's site name and unit name. + +=cut + +sub description { +  my $self = shift; +  my $desc = $self->oltname; +  $desc = $self->site_description . '/' . $desc if $self->sitenum; +  return $desc; +} +  # 3.x stub  sub svc_fiber { @@ -106,7 +136,7 @@ sub svc_fiber {  =head1 SEE ALSO -L<FS::svc_fiber>, L<FS::Record> +L<FS::svc_fiber>, L<FS::olt_site>, L<FS::Record>  =cut diff --git a/FS/FS/olt_site.pm b/FS/FS/olt_site.pm new file mode 100644 index 000000000..1c826f8e5 --- /dev/null +++ b/FS/FS/olt_site.pm @@ -0,0 +1,106 @@ +package FS::olt_site; + +use strict; +use base qw( FS::Record ); +use FS::Record qw( qsearch qsearchs ); + +=head1 NAME + +FS::olt_site - Object methods for olt_site records + +=head1 SYNOPSIS + +  use FS::olt_site; + +  $record = new FS::olt_site \%hash; +  $record = new FS::olt_site { 'column' => 'value' }; + +  $error = $record->insert; + +  $error = $new_record->replace($old_record); + +  $error = $record->delete; + +  $error = $record->check; + +=head1 DESCRIPTION + +An FS::olt_site object represents a central office housing Optical Line +Terminals (L<FS::fiber_olt>). FS::olt_site inherits from +FS::Record.  The following fields are currently supported: + +=over 4 + +=item sitenum - primary key + +=item market - market designator, indicating the general area the site serves + +=item site - site designator + +=back + +=head1 METHODS + +=over 4 + +=item new HASHREF + +Creates a new record.  To add the record to the database, see L<"insert">. + +=cut + +sub table { 'olt_site'; } + +=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. + +=item check + +Checks all fields to make sure this is a valid example.  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('sitenum') +    || $self->ut_text('market') +    || $self->ut_text('site') +  ; +  return $error if $error; + +  $self->SUPER::check; +} + +sub description { +  my $self = shift; +  return $self->market . '/' . $self->site; +} + +=back + +=head1 SEE ALSO + +L<FS::Record>, L<FS::fiber_olt> + +=cut + +1; + diff --git a/FS/FS/svc_fiber.pm b/FS/FS/svc_fiber.pm index 4515d013f..41df2d5df 100644 --- a/FS/FS/svc_fiber.pm +++ b/FS/FS/svc_fiber.pm @@ -108,6 +108,13 @@ sub table_info {                            'disable_inventory' => 1,                            'disable_select'    => 1,                           }, +      # ODN circuit +      'circuit_id'    => { +                          'label' => 'ODN circuit', +                          'type'  => 'input-fiber_circuit', +                          'disable_inventory' => 1, +                          'disable_select'    => 1, +                         },        # ONT stuff        'ont_id'        => {                            'label' => 'ONT #', @@ -180,15 +187,14 @@ sub search_sql {  =item label -Returns a description of this fiber service containing the OLT name and -port location, and the ONT serial number. +Returns a description of this fiber service containing the circuit ID +and the ONT serial number.  =cut  sub label {    my $self = shift; -  $self->ont_serial . ' @ ' . $self->fiber_olt->oltname . ' ' . -  join('-', $self->shelf, $self->card, $self->olt_port); +  $self->ont_serial . ' @ ' . $self->circuit_id;  }  # nothing special for insert, delete, or replace @@ -247,13 +253,15 @@ sub check {      || $self->ut_alphan('ont_serial')      || $self->ut_alphan('ont_port')      || $self->ut_numbern('vlan') -    || $self->ut_snumbern('signal') +    || $self->ut_sfloatn('signal')      || $self->ut_numbern('speed_up')      || $self->ut_numbern('speed_down')      || $self->ut_textn('ont_install')    ;    return $error if $error; +  $self->set('signal', sprintf('%.2f', $self->get('signal'))); +    $self->SUPER::check;  } diff --git a/FS/MANIFEST b/FS/MANIFEST index 838c7e6c2..37212e260 100644 --- a/FS/MANIFEST +++ b/FS/MANIFEST @@ -802,3 +802,5 @@ FS/password_history.pm  t/password_history.t  FS/fiber_olt.pm  t/fiber_olt.t +FS/olt_site.pm +t/olt_site.t diff --git a/FS/t/olt_site.t b/FS/t/olt_site.t new file mode 100644 index 000000000..d475da17c --- /dev/null +++ b/FS/t/olt_site.t @@ -0,0 +1,5 @@ +BEGIN { $| = 1; print "1..1\n" } +END {print "not ok 1\n" unless $loaded;} +use FS::olt_site; +$loaded=1; +print "ok 1\n"; diff --git a/httemplate/browse/fiber_olt.html b/httemplate/browse/fiber_olt.html index bffd5f222..2355ec023 100644 --- a/httemplate/browse/fiber_olt.html +++ b/httemplate/browse/fiber_olt.html @@ -1,11 +1,11 @@  <& elements/browse-simple.html,    'table'               => 'fiber_olt',    'title'               => 'Fiber service OLTs', -  'menubar'             => [ ], +  'menubar'             => [ 'View sites' => 'olt_site.html' ],    'name_singular'       => 'OLT',    'acl'                 => 'Configuration',  # overrides    'disabled_statuspos' => 3, -  'header' => [ '#',      'Name',     'Serial' ], -  'fields' => [ 'oltnum', 'oltname',  'serial' ], +  'header' => [ '#',      'Site',             'Name',     'Serial' ], +  'fields' => [ 'oltnum', 'site_description', 'oltname',  'serial' ],  &> diff --git a/httemplate/browse/olt_site.html b/httemplate/browse/olt_site.html new file mode 100644 index 000000000..ea2e7de1f --- /dev/null +++ b/httemplate/browse/olt_site.html @@ -0,0 +1,12 @@ +<& elements/browse-simple.html, +  'table'               => 'olt_site', +  'title'               => 'Fiber OLT markets and sites', +  'menubar'             => [ 'View OLTs' => 'fiber_olt.html' ], +  'name_singular'       => 'site', +  'acl'                 => 'Configuration', +# overrides +  'disabled_statuspos' => '', +  'disableable'        => 0, +  'header' => [ '#',      'Market', 'Site', ], +  'fields' => [ 'sitenum', 'market', 'site', ], +&> diff --git a/httemplate/edit/elements/edit.html b/httemplate/edit/elements/edit.html index c9eceb459..5bee7886f 100644 --- a/httemplate/edit/elements/edit.html +++ b/httemplate/edit/elements/edit.html @@ -333,7 +333,7 @@ Example:  %   $include_common{$_} = $f->{$_} foreach grep exists($f->{$_}),  %     qw( js_only html_only select_only layers_only cell_style ),#selectlayers,?  %     qw( empty_label ),                                   # select-* -%     qw( value_col compare_sub order_by ),                # select-table +%     qw( value_col compare_sub order_by addl_from ), # select-table  %     qw( table name_col ),                           #(select,checkboxes)-table  %     qw( target_table link_table ),                       #checkboxes-table  %     qw( hashref agent_virt agent_null agent_null_right ),#*-table diff --git a/httemplate/edit/fiber_olt.html b/httemplate/edit/fiber_olt.html index ab7d2f07e..8cbcbb590 100644 --- a/httemplate/edit/fiber_olt.html +++ b/httemplate/edit/fiber_olt.html @@ -11,6 +11,14 @@ die "access denied"  my @fields = (    'oltname', +  { +    field       => 'sitenum', +    type        => 'select-table', +    table       => 'olt_site', +    name_col    => 'description', +    order_by    => 'ORDER BY market, site', +    empty_label => ' ', +  },    'serial',    { field => 'disabled', type => 'checkbox', value => 'Y' }  ); @@ -18,6 +26,7 @@ my @fields = (  my %labels = (    'oltnum' => '',    'oltname' => 'Name', +  'sitenum' => 'Site',    'serial'  => 'Serial',    'disabled' => 'Disabled',  ); diff --git a/httemplate/edit/olt_site.html b/httemplate/edit/olt_site.html new file mode 100644 index 000000000..c243bab18 --- /dev/null +++ b/httemplate/edit/olt_site.html @@ -0,0 +1,20 @@ +<& elements/edit.html, +  popup => 1, +  name_singular => 'OLT site', +  table         => 'olt_site', +  viewall_dir   => 'browse', +  fields        => [ +                     { field => 'market', +                       type => 'text', +                       size => 4, +                     }, +                     { field => 'site', +                       type => 'text', +                       size => 4, +                     }, +                   ], +  labels        => { 'market'    => 'Market', +                     'site'      => 'Site', +                     'sitenum'   => 'Site', +                   }, +&> diff --git a/httemplate/edit/process/olt_site.html b/httemplate/edit/process/olt_site.html new file mode 100644 index 000000000..f328cfefe --- /dev/null +++ b/httemplate/edit/process/olt_site.html @@ -0,0 +1,4 @@ +<& elements/process.html,  +    table       => 'olt_site', +    viewall_dir => 'browse', +&> diff --git a/httemplate/edit/process/svc_fiber.html b/httemplate/edit/process/svc_fiber.html index 815a8eeb8..3dabede13 100644 --- a/httemplate/edit/process/svc_fiber.html +++ b/httemplate/edit/process/svc_fiber.html @@ -2,10 +2,22 @@      table       => 'svc_fiber',      edit_ext    => 'html',      redirect    => popurl(3)."view/svc_fiber.cgi?", +    precheck_callback => $precheck_callback,  &>  <%init>  die "access denied"    unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific? +my $precheck_callback = sub { +  my $cgi = shift; +  # recombine fdu/fat/subfat/port +  my $circuit_id = $cgi->param('circuit_id_fdu') . '/' . +                   $cgi->param('circuit_id_fat') . $cgi->param('circuit_id_subfat') . '/' . +                   $cgi->param('circuit_id_port'); +  $cgi->param('circuit_id', $circuit_id); +  $cgi->delete(qw( circuit_id_fdu circuit_id_fat circuit_id_subfat circuit_id_port )); +  ''; +}; +  </%init> diff --git a/httemplate/edit/svc_fiber.html b/httemplate/edit/svc_fiber.html index e07caa1b1..982b0bf05 100644 --- a/httemplate/edit/svc_fiber.html +++ b/httemplate/edit/svc_fiber.html @@ -10,10 +10,15 @@ die "access denied"  my $conf = new FS::Conf;  my @fields = ( +  { field     => 'circuit_id', +    type      => 'input-fiber_circuit', +  },    { field     => 'oltnum',      type      => 'select-table',      table     => 'fiber_olt', -    name_col  => 'oltname', +    name_col  => 'description', +    addl_from => 'LEFT JOIN olt_site USING (sitenum)', +    order_by  => 'ORDER BY market, site, oltname',      hashref   => { disabled => '' },      disable_empty => 1,    }, diff --git a/httemplate/elements/tr-input-fiber_circuit.html b/httemplate/elements/tr-input-fiber_circuit.html new file mode 100644 index 000000000..fb6462bb6 --- /dev/null +++ b/httemplate/elements/tr-input-fiber_circuit.html @@ -0,0 +1,31 @@ +<& /elements/tr-td-label.html, %opt &> +  <td> +    <table class="inv"> +      <tr> +        <th>FDU#</th> +        <td><input name="<% $field %>_fdu" value="<% $fdu |h %>" SIZE="1"></td> +        <th>FAT#</th> +        <td><input name="<% $field %>_fat" value="<% $fat |h %>" SIZE="1"> +            <input name="<% $field %>_subfat" value="<% $subfat |h %>" SIZE="1"> +        </td> +        <th>Port#</th> +        <td><input name="<% $field %>_port" value="<% $port |h %>" SIZE="1"></td> +      </tr> +    </table> +  </td> +</tr> +<%doc> +Supports a circuit ID of the form +FDU# (digit), FAT# (digit), SubFAT (letter), Port# (numeric) +May support other formats in the future, or just a free text field. +</%doc> +<%init> +my %opt = @_; +my $value = length($opt{curr_value}) ? $opt{curr_value} : $opt{value}; +my ($fdu, $fat, $port) = split('/', $value); +my $subfat = ''; +if ( $fat =~ /[A-Z]$/i ) { +  $subfat = substr($fat, -1, 1, ''); +} +my $field = $opt{'field'} || 'circuit_id'; +</%init> diff --git a/httemplate/view/svc_fiber.cgi b/httemplate/view/svc_fiber.cgi index ce9c03dc7..80a833890 100644 --- a/httemplate/view/svc_fiber.cgi +++ b/httemplate/view/svc_fiber.cgi @@ -7,10 +7,11 @@  <%init>  my @fields = ( +  'circuit_id',    { field     => 'oltnum',      type      => 'select-table',      table     => 'fiber_olt', -    name_col  => 'oltname', +    name_col  => 'description',    },    'shelf',    'card', | 
