diff options
author | Mark Wells <mark@freeside.biz> | 2015-12-21 14:41:40 -0800 |
---|---|---|
committer | Mark Wells <mark@freeside.biz> | 2015-12-21 14:45:17 -0800 |
commit | 796750496ab90b7e10823e2a3a008b600ab8f090 (patch) | |
tree | 25817c61ebbe5a2322357c7ac641ef3dea695b70 /FS | |
parent | b2394238aa56b29ede1f7f46c023ac580e32d758 (diff) |
svc_fiber, #35260
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/AccessRight.pm | 2 | ||||
-rw-r--r-- | FS/FS/Mason.pm | 2 | ||||
-rw-r--r-- | FS/FS/Schema.pm | 46 | ||||
-rw-r--r-- | FS/FS/fiber_olt.pm | 106 | ||||
-rw-r--r-- | FS/FS/svc_fiber.pm | 323 | ||||
-rw-r--r-- | FS/MANIFEST | 2 | ||||
-rw-r--r-- | FS/t/fiber_olt.t | 5 |
7 files changed, 486 insertions, 0 deletions
diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm index 95cf29a..04b9fba 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 a2a7617..370ac1a 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 4918e79..e06007d 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -6851,6 +6851,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 0000000..a0de38d --- /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<FS::svc_fiber>) 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<FS::svc_fiber>, L<FS::Record> + +=cut + +1; + diff --git a/FS/FS/svc_fiber.pm b/FS/FS/svc_fiber.pm new file mode 100644 index 0000000..c4036dc --- /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<FS::fiber_olt>). + +=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<FS::cust_svc>) 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<FS::cust_pkg>). + +=item unsuspend + +Called by the unsuspend method of FS::cust_pkg (see L<FS::cust_pkg>). + +=item cancel + +Called by the cancel method of FS::cust_pkg (see L<FS::cust_pkg>). + +=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<FS::svc_Common/search>, plus: + +ont_typenum - the ONT L<FS::hardware_type> key + +oltnum - the OLT L<FS::fiber_olt> 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<FS::svc_Common>, L<FS::Record>, L<FS::cust_svc>, L<FS::part_svc>, +L<FS::cust_pkg>, schema.html from the base documentation. + +=cut + +1; + diff --git a/FS/MANIFEST b/FS/MANIFEST index f1195ac..176fe78 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 0000000..4caada1 --- /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"; |