From 38444ef88b5e93aa9aa724369ae8fe17c97fa480 Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Mon, 21 Dec 2015 14:41:40 -0800 Subject: [PATCH] svc_fiber, #35260 --- FS/FS/AccessRight.pm | 2 + FS/FS/Mason.pm | 2 + FS/FS/Schema.pm | 46 +++++ FS/FS/fiber_olt.pm | 106 +++++++++++ FS/FS/svc_fiber.pm | 323 ++++++++++++++++++++++++++++++++ FS/MANIFEST | 2 + FS/t/fiber_olt.t | 5 + httemplate/browse/fiber_olt.html | 11 ++ httemplate/edit/fiber_olt.html | 24 +++ httemplate/edit/process/fiber_olt.html | 11 ++ httemplate/edit/process/svc_fiber.html | 11 ++ httemplate/edit/svc_fiber.html | 36 ++++ httemplate/elements/menu.html | 14 +- httemplate/search/report_svc_fiber.html | 47 +++++ httemplate/search/svc_fiber.html | 69 +++++++ httemplate/view/svc_fiber.cgi | 34 ++++ 16 files changed, 740 insertions(+), 3 deletions(-) create mode 100644 FS/FS/fiber_olt.pm create mode 100644 FS/FS/svc_fiber.pm create mode 100644 FS/t/fiber_olt.t create mode 100644 httemplate/browse/fiber_olt.html create mode 100644 httemplate/edit/fiber_olt.html create mode 100644 httemplate/edit/process/fiber_olt.html create mode 100644 httemplate/edit/process/svc_fiber.html create mode 100644 httemplate/edit/svc_fiber.html create mode 100755 httemplate/search/report_svc_fiber.html create mode 100644 httemplate/search/svc_fiber.html create mode 100644 httemplate/view/svc_fiber.cgi diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm index a96a6cb41..51e47adaf 100644 --- a/FS/FS/AccessRight.pm +++ b/FS/FS/AccessRight.pm @@ -314,6 +314,8 @@ tie my %rights, 'Tie::IxHash', 'Services: Alarm services', 'Services: Video', 'Services: Circuits', + 'Services: Fiber', + 'Services: Fiber: Advanced search', 'Services: External services', 'Usage: RADIUS sessions', 'Usage: Call Detail Records (CDRs)', diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index a2a761737..370ac1af7 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -411,6 +411,8 @@ if ( -e $addl_handler_use_file ) { use FS::report_batch; use FS::report_batch; use FS::password_history; + use FS::svc_fiber; + use FS::fiber_olt; # Sammath Naur if ( $FS::Mason::addl_handler_use ) { diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index c1ed79cda..a10b5c023 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -6870,6 +6870,52 @@ sub tables_hashref { ], }, + 'svc_fiber' => { + 'columns' => [ + 'svcnum', 'int', '', '', '', '', + 'oltnum', 'int', 'NULL', '', '', '', + 'shelf', 'int', 'NULL', '', '', '', + 'card', 'int', 'NULL', '', '', '', + 'olt_port', 'int', 'NULL', '', '', '', + 'ont_id', 'int', 'NULL', '', '', '', + 'ont_typenum', 'int', 'NULL', '', '', '', + 'ont_serial', 'varchar', 'NULL', $char_d, '', '', + 'ont_port', 'varchar', 'NULL', 16, '', '', + 'vlan', 'int', 'NULL', '', '', '', + 'signal', 'int', 'NULL', '', '', '', + 'speed_up', 'int', 'NULL', '', '', '', + 'speed_down', 'int', 'NULL', '', '', '', + 'ont_install','varchar', 'NULL', $char_d, '', '', + ], + 'primary_key' => 'svcnum', + 'unique' => [ ], + 'index' => [ [ 'ont_serial' ] ], + 'foreign_keys' => [ + { columns => [ 'svcnum' ], + table => 'cust_svc', + }, + { columns => [ 'oltnum' ], + table => 'fiber_olt', + }, + { columns => [ 'ont_typenum' ], + table => 'hardware_type', + references => [ 'typenum' ], + }, + ], + }, + + 'fiber_olt' => { + 'columns' => [ + 'oltnum', 'serial', '', '', '', '', + 'oltname', 'varchar', '', $char_d, '', '', + 'serial', 'varchar', '', $char_d, '', '', + 'disabled', 'char', 'NULL', 1, '', '', + ], + 'primary_key' => 'oltnum', + 'unique' => [ ], + 'index' => [ ], + }, + 'vend_main' => { 'columns' => [ 'vendnum', 'serial', '', '', '', '', diff --git a/FS/FS/fiber_olt.pm b/FS/FS/fiber_olt.pm new file mode 100644 index 000000000..a0de38d6d --- /dev/null +++ b/FS/FS/fiber_olt.pm @@ -0,0 +1,106 @@ +package FS::fiber_olt; +use base qw( FS::Record ); + +use strict; +use FS::Record qw( qsearch qsearchs ); + +=head1 NAME + +FS::fiber_olt - Object methods for fiber_olt records + +=head1 SYNOPSIS + + use FS::fiber_olt; + + $record = new FS::fiber_olt \%hash; + $record = new FS::fiber_olt { 'column' => 'value' }; + + $error = $record->insert; + + $error = $new_record->replace($old_record); + + $error = $record->delete; + + $error = $record->check; + +=head1 DESCRIPTION + +An FS::fiber_olt object represents an Optical Line Terminal that fiber +connections (L) connect to. FS::fiber_olt inherits from +FS::Record. The following fields are currently supported: + +=over 4 + +=item oltnum - primary key + +=item oltname - name of this device + +=item serial - serial number + +=item disabled - set to 'Y' to make this OLT unavailable for new connections + +=back + +=head1 METHODS + +=over 4 + +=item new HASHREF + +Creates a new fiber_olt record. To add it to the database, see L<"insert">. + +=cut + +# the new method can be inherited from FS::Record, if a table method is defined + +sub table { 'fiber_olt'; } + +=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('oltnum') + || $self->ut_text('oltname') + || $self->ut_text('serial') + || $self->ut_flag('disabled') + ; + return $error if $error; + + $self->SUPER::check; +} + +=back + +=head1 SEE ALSO + +L, L + +=cut + +1; + diff --git a/FS/FS/svc_fiber.pm b/FS/FS/svc_fiber.pm new file mode 100644 index 000000000..c4036dc66 --- /dev/null +++ b/FS/FS/svc_fiber.pm @@ -0,0 +1,323 @@ +package FS::svc_fiber; + +use strict; +use base qw( FS::svc_Common ); +use FS::cust_svc; +use FS::hardware_type; +use FS::fiber_olt; +use FS::Record 'dbh'; + +=head1 NAME + +FS::svc_fiber - Object methods for svc_fiber records + +=head1 SYNOPSIS + + use FS::table_name; + + $record = new FS::table_name \%hash; + $record = new FS::table_name { 'column' => 'value' }; + + $error = $record->insert; + + $error = $new_record->replace($old_record); + + $error = $record->delete; + + $error = $record->check; + + $error = $record->suspend; + + $error = $record->unsuspend; + + $error = $record->cancel; + +=head1 DESCRIPTION + +An FS::svc_fiber object represents a fiber-to-the-premises service. +FS::svc_fiber inherits from FS::svc_Common. The following fields are +currently supported: + +=over 4 + +=item svcnum - Primary key + +=item oltnum - The Optical Line Terminal this service connects to (see +L). + +=item shelf - The shelf number on the OLT. + +=item card - The card number on the OLT shelf. + +=item olt_port - The port number on that card. + +=item vlan - The VLAN number. + +=item signal - Measured signal strength in dB. + +=item speed_up - Measured uplink speed in Mbps. + +=item speed_down - Measured downlink speed in Mbps. + +=back + +=head1 METHODS + +=over 4 + +=item new HASHREF + +Creates a new fiber service record. To add it to the database, see L<"insert">. + +=cut + +sub table { 'svc_fiber'; } + +sub table_info { + { + 'name' => 'Fiber', + 'name_plural' => 'Fiber', # really the name of the ACL + 'longname_plural' => 'Fiber services', + 'sorts' => [ 'oltnum', ], + 'display_weight' => 74, + 'cancel_weight' => 74, + 'fields' => { + 'oltnum' => { + 'label' => 'OLT', + 'type' => 'select', + 'select_table' => 'fiber_olt', + 'select_key' => 'oltnum', + 'select_label' => 'oltname', + 'disable_inventory' => 1, + }, + 'shelf' => { + 'label' => 'Shelf', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + 'card' => { + 'label' => 'Card', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + 'olt_port' => { + 'label' => 'GPON port', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + # ONT stuff + 'ont_id' => { + 'label' => 'ONT #', + 'disable_select' => 1, + }, + 'ont_typenum' => { + 'label' => 'Device type', + 'type' => 'select-hardware', + 'disable_select' => 1, + 'disable_default' => 1, + 'disable_inventory' => 1, + }, + 'ont_serial' => { + 'label' => 'Serial number', + 'disable_select' => 1, + }, + 'ont_port' => { + 'label' => 'GE port', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + 'vlan' => { + 'label' => 'VLAN #', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + 'signal' => { + 'label' => 'Signal strength (dB)', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + 'speed_down' => { + 'label' => 'Download speed (Mbps)', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + 'speed_up' => { + 'label' => 'Upload speed (Mbps)', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + 'ont_install' => { + 'label' => 'ONT install location', + 'type' => 'text', + 'disable_inventory' => 1, + 'disable_select' => 1, + }, + }, + }; +} + +=item search_sql STRING + +Class method which returns an SQL fragment to search for the given string. +For svc_fiber, STRING can be a full or partial ONT serial number. + +=cut + +#or something more complicated if necessary +sub search_sql { + my($class, $string) = @_; + $string = dbh->quote('%' . $string . '%'); + "LOWER(svc_fiber.ont_serial) LIKE LOWER($string)"; +} + +=item label + +Returns a description of this fiber service containing the OLT name and +port location, 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); +} + +# nothing special for insert, delete, or replace + +=item insert + +Adds this record to the database. If there is an error, returns the error, +otherwise returns false. + +The additional fields pkgnum and svcpart (see L) should be +defined. An FS::cust_svc record will be created and inserted. + +=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 suspend + +Called by the suspend method of FS::cust_pkg (see L). + +=item unsuspend + +Called by the unsuspend method of FS::cust_pkg (see L). + +=item cancel + +Called by the cancel method of FS::cust_pkg (see L). + +=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 repalce methods. + +=cut + +sub check { + my $self = shift; + + my $x = $self->setfixed; + return $x unless ref($x); + my $part_svc = $x; + + my $error = + $self->ut_number('oltnum') + || $self->ut_numbern('shelf') + || $self->ut_numbern('card') + || $self->ut_numbern('olt_port') + || $self->ut_number('ont_id') + || $self->ut_number('ont_typenum') + || $self->ut_alphan('ont_serial') + || $self->ut_alphan('ont_port') + || $self->ut_numbern('vlan') + || $self->ut_snumbern('signal') + || $self->ut_numbern('speed_up') + || $self->ut_numbern('speed_down') + || $self->ut_textn('ont_install') + ; + return $error if $error; + + $self->SUPER::check; +} + +=item ont_description + +Returns the description of the ONT hardware, if there is one. + +=cut + +sub ont_description { + my $self = shift; + $self->ont_typenum ? $self->hardware_type->description : ''; +} + +=item search HASHREF + +Returns a qsearch hash expression to search for parameters specified in +HASHREF. + +Parameters are those in L, plus: + +ont_typenum - the ONT L key + +oltnum - the OLT L key + +shelf, card, olt_port - the OLT port location fields + +vlan - the VLAN number + +ont_serial - the ONT serial number + +=cut + +sub _search_svc { + my ($class, $params, $from, $where) = @_; + + # make this simple: all of these are numeric fields, except that 0 means null + foreach my $field (qw(ont_typenum oltnum shelf olt_port card vlan)) { + if ( $params->{$field} =~ /^(\d+)$/ ) { + push @$where, "COALESCE($field,0) = $1"; + } + } + if ( length($params->{ont_serial}) ) { + my $string = dbh->quote('%'.$params->{ont_serial}.'%'); + push @$where, "LOWER(ont_serial) LIKE LOWER($string)"; + } + +} + +#stub still needed under 4.x+ + +sub hardware_type { + my $self = shift; + $self->ont_typenum ? FS::hardware_type->by_key($self->ont_typenum) : ''; +} + +=back + +=head1 SEE ALSO + +L, L, L, L, +L, schema.html from the base documentation. + +=cut + +1; + diff --git a/FS/MANIFEST b/FS/MANIFEST index f1195acc7..176fe7884 100644 --- a/FS/MANIFEST +++ b/FS/MANIFEST @@ -860,3 +860,5 @@ FS/report_batch.pm t/report_batch.t FS/password_history.pm t/password_history.t +FS/fiber_olt.pm +t/fiber_olt.t diff --git a/FS/t/fiber_olt.t b/FS/t/fiber_olt.t new file mode 100644 index 000000000..4caada134 --- /dev/null +++ b/FS/t/fiber_olt.t @@ -0,0 +1,5 @@ +BEGIN { $| = 1; print "1..1\n" } +END {print "not ok 1\n" unless $loaded;} +use FS::fiber_olt; +$loaded=1; +print "ok 1\n"; diff --git a/httemplate/browse/fiber_olt.html b/httemplate/browse/fiber_olt.html new file mode 100644 index 000000000..bffd5f222 --- /dev/null +++ b/httemplate/browse/fiber_olt.html @@ -0,0 +1,11 @@ +<& elements/browse-simple.html, + 'table' => 'fiber_olt', + 'title' => 'Fiber service OLTs', + 'menubar' => [ ], + 'name_singular' => 'OLT', + 'acl' => 'Configuration', +# overrides + 'disabled_statuspos' => 3, + 'header' => [ '#', 'Name', 'Serial' ], + 'fields' => [ 'oltnum', 'oltname', 'serial' ], +&> diff --git a/httemplate/edit/fiber_olt.html b/httemplate/edit/fiber_olt.html new file mode 100644 index 000000000..ab7d2f07e --- /dev/null +++ b/httemplate/edit/fiber_olt.html @@ -0,0 +1,24 @@ +<& elements/edit.html, + 'popup' => 1, + 'table' => 'fiber_olt', + 'name_singular' => 'OLT', + 'labels' => \%labels, + 'fields' => \@fields, +&> +<%init> +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Configuration'); + +my @fields = ( + 'oltname', + 'serial', + { field => 'disabled', type => 'checkbox', value => 'Y' } +); + +my %labels = ( + 'oltnum' => '', + 'oltname' => 'Name', + 'serial' => 'Serial', + 'disabled' => 'Disabled', +); + diff --git a/httemplate/edit/process/fiber_olt.html b/httemplate/edit/process/fiber_olt.html new file mode 100644 index 000000000..c8c4af490 --- /dev/null +++ b/httemplate/edit/process/fiber_olt.html @@ -0,0 +1,11 @@ +<& elements/process.html, + 'table' => 'fiber_olt', + 'viewall_dir' => 'browse', + 'popup_reload' => 'Updating', +&> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Configuration'); + + diff --git a/httemplate/edit/process/svc_fiber.html b/httemplate/edit/process/svc_fiber.html new file mode 100644 index 000000000..815a8eeb8 --- /dev/null +++ b/httemplate/edit/process/svc_fiber.html @@ -0,0 +1,11 @@ +<& elements/svc_Common.html, + table => 'svc_fiber', + edit_ext => 'html', + redirect => popurl(3)."view/svc_fiber.cgi?", +&> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific? + + diff --git a/httemplate/edit/svc_fiber.html b/httemplate/edit/svc_fiber.html new file mode 100644 index 000000000..e07caa1b1 --- /dev/null +++ b/httemplate/edit/svc_fiber.html @@ -0,0 +1,36 @@ +<& elements/svc_Common.html, + 'table' => 'svc_fiber', + 'fields' => \@fields, +&> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific? + +my $conf = new FS::Conf; + +my @fields = ( + { field => 'oltnum', + type => 'select-table', + table => 'fiber_olt', + name_col => 'oltname', + hashref => { disabled => '' }, + disable_empty => 1, + }, + { field => 'shelf' }, + { field => 'card' }, + { field => 'olt_port' }, + { field => 'ont_id' }, + { field => 'ont_typenum', + type => 'select-hardware_type' + }, + { field => 'ont_serial' }, + { field => 'ont_port' }, + { field => 'vlan' }, + { field => 'signal' }, + { field => 'speed_down' }, + { field => 'speed_up' }, + { field => 'ont_install', size => 50 }, +); + + diff --git a/httemplate/elements/menu.html b/httemplate/elements/menu.html index fa44e86e7..a3bfeb7b0 100644 --- a/httemplate/elements/menu.html +++ b/httemplate/elements/menu.html @@ -227,10 +227,12 @@ foreach my $svcdb ( FS::part_svc->svc_tables() ) { ]; } - $report_svc{"Advanced $lcsname reports"} = + if ( $curuser->access_right("Services: $name: Advanced search") + && $svcdb =~ /^svc_(acct|broadband|hardware|phone|fiber)$/ ) { + + $report_svc{"Advanced $lcsname reports"} = [ $fsurl."search/report_$svcdb.html", '' ] - if $svcdb =~ /^svc_(acct|broadband|hardware|phone)$/ - && $curuser->access_right("Services: $name: Advanced search"); + } if ( $svcdb eq 'svc_phone' ) { @@ -594,6 +596,10 @@ tie my %config_circuit, 'Tie::IxHash', 'Termination types' => [ $fsurl.'browse/circuit_termination.html', '' ], ; +tie my %config_fiber, 'Tie::IxHash', + 'OLTs' => [ $fsurl.'browse/fiber_olt.html', '' ], +; + tie my %config_export_svc, 'Tie::IxHash', (); if ( $curuser->access_right('Configuration') ) { $config_export_svc{'Service definitions'} = [ $fsurl.'browse/part_svc.cgi', 'Services are items you offer to your customers' ]; @@ -617,6 +623,8 @@ $config_export_svc{'Alarm'} = [ \%config_alarm, '' ] if $curuser->access_right(['Alarm configuration', 'Alarm global configuration']); $config_export_svc{'Circuits'} = [ \%config_circuit, '' ] if $curuser->access_right('Configuration'); +$config_export_svc{'Fiber'} = [ \%config_fiber, '' ] + if $curuser->access_right('Configuration'); $config_export_svc{'Hardware types'} = [ $fsurl.'browse/hardware_class.html', 'Set up hardware type catalog' ] if $curuser->access_right('Configuration'); diff --git a/httemplate/search/report_svc_fiber.html b/httemplate/search/report_svc_fiber.html new file mode 100755 index 000000000..d563c5339 --- /dev/null +++ b/httemplate/search/report_svc_fiber.html @@ -0,0 +1,47 @@ +<& /elements/header.html, $title &> + +
+ + + + + + + <& /elements/tr-select-table.html, + label => 'OLT', + table => 'fiber_olt', + name_col => 'oltname', + &> + <& /elements/tr-input-text.html, field => 'shelf', label => 'Shelf' &> + <& /elements/tr-input-text.html, field => 'card', label => 'Card' &> + <& /elements/tr-input-text.html, field => 'olt_port', label => 'Port' &> + + <& /elements/tr-td-label.html, label => 'ONT model' &> + + + + <& /elements/tr-input-text.html, field => 'ont_serial', label => 'Serial number' &> + <& /elements/tr-input-text.html, field => 'vlan', label => 'VLAN' &> +
Search options
+ <& /elements/select-hardware_type.html, + 'empty_label' => '(all)' + &> +
+ +
+ + +
+ +<& /elements/footer.html &> +<%init> + +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Services: Fiber'); + +my $title = 'Search Fiber Services'; + +my @olts = qsearch('fiber_olt', {}); + + + diff --git a/httemplate/search/svc_fiber.html b/httemplate/search/svc_fiber.html new file mode 100644 index 000000000..0cb735c96 --- /dev/null +++ b/httemplate/search/svc_fiber.html @@ -0,0 +1,69 @@ +<& elements/svc_Common.html, + 'title' => 'Fiber Search Results', + 'name' => 'fiber services', + 'query' => $query, + 'count_query' => $query->{'count_query'}, + 'redirect' => $link, + 'header' => [ '#', + 'OLT', + 'Shelf/Card/Port', + 'ONT', + 'Model', + 'Serial', + FS::UI::Web::cust_header($cgi->param('cust_fields')), + ], + 'fields' => [ 'svcnum', + 'oltname', + sub { my $svc = shift; + join('-', $svc->shelf, $svc->card, $svc->olt_port) + }, + 'ont_id', + 'ont_description', + 'ont_serial', + \&FS::UI::Web::cust_fields, + ], + 'links' => [ $link, + '', + '', + $link, + $link, + $link, + FS::UI::Web::cust_links($cgi->param('cust_fields')), + ], + 'align' => 'rlllll'. FS::UI::Web::cust_aligns(), + 'color' => [ + ('') x 6, + FS::UI::Web::cust_colors(), + ], + 'style' => [ + ('') x 6, + FS::UI::Web::cust_styles(), + ], + +&> +<%init> + +die "access denied" unless + $FS::CurrentUser::CurrentUser->access_right([ 'Services: Fiber', + 'List services' + ]); + +my $conf = new FS::Conf; + +my %search_hash; +if ( $cgi->param('magic') eq 'unlinked' ) { + %search_hash = ( 'unlinked' => 1 ); +} else { + foreach (qw( custnum agentnum svcpart cust_fields + ont_typenum oltnum shelf olt_port card vlan )) { + $search_hash{$_} = $cgi->param($_) if defined($cgi->param($_)); + } +} + +my $query = FS::svc_fiber->search(\%search_hash); +$query->{addl_from} .= ' LEFT JOIN fiber_olt USING (oltnum) '; +$query->{select} .= ', oltname'; + +my $link = [ $p.'view/svc_fiber.cgi?', 'svcnum' ]; + + diff --git a/httemplate/view/svc_fiber.cgi b/httemplate/view/svc_fiber.cgi new file mode 100644 index 000000000..ce9c03dc7 --- /dev/null +++ b/httemplate/view/svc_fiber.cgi @@ -0,0 +1,34 @@ +<& elements/svc_Common.html, + 'table' => 'svc_fiber', + 'fields' => \@fields, + 'labels' => \%labels, + 'edit_url' => $fsurl.'edit/svc_fiber.html?', +&> +<%init> + +my @fields = ( + { field => 'oltnum', + type => 'select-table', + table => 'fiber_olt', + name_col => 'oltname', + }, + 'shelf', + 'card', + 'olt_port', + 'ont_id', + 'ont_description', + 'ont_serial', + 'ont_port', + 'vlan', + 'signal', + 'speed_down', + 'speed_up', + 'ont_install', +); + +my $fields = FS::svc_fiber->table_info->{'fields'}; +my %labels = map { $_ => $fields->{$_}{'label'} } keys %$fields; + +$labels{'ont_description'} = 'ONT model'; + + -- 2.11.0