X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fsvc_alarm.pm;h=1714109e5dde471236a939a890d112d86a035229;hp=631891476e3f6ee2226a80c7841f6cd00d9b2c3d;hb=bb7e827141c9ed68f30765c9ca2ddcd1d760ad2d;hpb=ee7bb8218d50ca38148427c9b24a8decbd3ace86 diff --git a/FS/FS/svc_alarm.pm b/FS/FS/svc_alarm.pm index 631891476..1714109e5 100644 --- a/FS/FS/svc_alarm.pm +++ b/FS/FS/svc_alarm.pm @@ -1,8 +1,11 @@ package FS::svc_alarm; +use base qw( FS::svc_Common ); use strict; -use base qw( FS::svc_Common ); -use FS::Record; # qw( qsearch qsearchs ); +use Tie::IxHash; +use FS::alarm_system; +use FS::alarm_type; +use FS::alarm_station; =head1 NAME @@ -34,9 +37,11 @@ The following fields are currently supported: =item svcnum - Primary key -=item alarm_system - Alarm System +=item alarmsystemnum - Alarm System Vendor (see L) -=item alarm_type = Alarm Type +=item alarmtypenum - Alarm System Type (inputs/outputs) (see L) + +=item alarmstationnum - Alarm central station (see L) =item acctnum - Account number @@ -63,25 +68,56 @@ sub table_info { #'disable_select' => 1, 'disable_inventory' => 1, ); + + tie my %fields, 'Tie::IxHash', + 'svcnum' => { label => 'Service' }, + 'acctnum' => { label => 'Account #', %opts }, + '_password' => { label => 'Password' , %opts }, + 'location' => { label => 'Location', %opts }, + 'cs_receiver' => { label => 'CS Receiver #'}, + 'cs_phonenum' => { label => 'CS Phone #' }, + 'serialnum' => { label => 'Alarm Serial #' }, + 'alarmsystemnum' => { label => 'Alarm System Vendor', + type => 'select-alarm_system', + disable_inventory => 1, + value_callback => sub { + shift->alarm_system->systemname + }, + }, + 'alarmtypenum' => { label => 'Alarm System Type', + type => 'select-alarm_type', + disable_inventory => 1, + value_callback => sub { + shift->alarm_type->typename + }, + }, + 'alarmstationnum' => { label => 'Alarm Central Station', + type => 'select-alarm_station', + disable_inventory => 1, + value_callback => sub { + shift->alarm_station->stationname + }, + }, + ; + { - 'name' => 'Alarm service', - 'sorts' => 'acctnum', - 'display_weight' => 80, - 'cancel_weight' => 85, - 'fields' => { - 'svcnum' => { label => 'Service' }, - 'alarm_system' => { label => 'Alarm System', %opts }, - 'alarm_type' => { label => 'Alarm Type', %opts }, - 'acctnum' => { label => 'Account #', %opts }, - '_password' => { label => 'Password', %opts }, - 'location' => { label => 'Location', %opts }, - }, + 'name' => 'Alarm service', + 'sorts' => 'acctnum', + 'display_weight' => 80, + 'cancel_weight' => 85, + 'fields' => \%fields, + 'addl_process_fields' => [qw( alarmsystemnum_systemname + alarmtypenum_inputs alarmtypenum_outputs + alarmstationnum_stationname + )], }; } sub label { my $self = shift; - $self->acctnum; + $self->acctnum . '@'. $self->alarm_station->stationname. #? + ' ('. $self->alarm_system->systemname. ' '. $self->alarm_type->typename. ')' + ; } sub search_sql { @@ -103,7 +139,49 @@ Delete this record from the database. 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 +=cut + +sub preinsert_hook_first { shift->_inline_add(@_); } +sub prereplace_hook_first { shift->_inline_add(@_); } + +sub _inline_add { + my $self = shift; + + my $agentnum = $self->cust_svc->cust_pkg->cust_main->agentnum; + + if ( $self->alarmsystemnum == -1 ) { + my $alarm_system = new FS::alarm_system { + 'agentnum' => $agentnum, + 'systemname' => $self->alarmsystemnum_systemname, + }; + my $error = $alarm_system->insert; + return $error if $error; + $self->alarmsystemnum($alarm_system->alarmsystemnum); + } + + if ( $self->alarmtypenum == -1 ) { + my $alarm_type = new FS::alarm_type { + 'agentnum' => $agentnum, + 'inputs' => $self->alarmtypenum_inputs, + 'outputs' => $self->alarmtypenum_outputs, + }; + my $error = $alarm_type->insert; + return $error if $error; + $self->alarmtypenum($alarm_type->alarmtypenum); + } + + if ( $self->alarmstationnum == -1 ) { + my $alarm_station = new FS::alarm_station { + 'agentnum' => $agentnum, + 'stationname' => $self->alarmstationnum_stationname, + }; + my $error = $alarm_station->insert; + return $error if $error; + $self->alarmstationnum($alarm_station->alarmstationnum) + } + + ''; +} =item check @@ -119,14 +197,26 @@ sub check { my $x = $self->setfixed; return $x unless ref $x; - my $error = + my $iso3166 = $self->cust_main->ship_location->country(); + + my $error = $self->ut_numbern('svcnum') || $self->ut_text('acctnum') - || $self->ut_numbern('installdate') - || $self->ut_anything('note') + || $self->ut_alphan('_password') + || $self->ut_textn('location') + || $self->ut_numbern('cs_receiver') + || $self->ut_phonen('cs_phonenum', $iso3166) + || $self->ut_alphan('serialnum') + || $self->ut_foreign_key('alarmsystemnum', 'alarm_system', 'systemnum') + || $self->ut_foreign_key('alarmtypenum', 'alarm_type', 'typenum') + || $self->ut_foreign_key('alarmstationnum', 'alarm_station', 'stationnum') ; return $error if $error; + #really just an signed int, but to discourage storing other data (e.g. phone) + return 'CS Receiver must be 9 digits or less' + if $self->cs_receiver =~ /\d{10}/; + $self->SUPER::check; }