diff options
author | ivan <ivan> | 2010-03-12 21:29:04 +0000 |
---|---|---|
committer | ivan <ivan> | 2010-03-12 21:29:04 +0000 |
commit | f433b4f187e484e8c40bdcebbeb5a5d51b3ae38e (patch) | |
tree | 6597ace03fadaa451eaceca9c986e40ebfe6bcc8 /FS | |
parent | 02348fb69ac302f117ca8b510b68871eff25d4c6 (diff) |
finishing e911/svc_phone location, RT#7047
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/cust_location.pm | 14 | ||||
-rw-r--r-- | FS/FS/cust_main.pm | 19 | ||||
-rw-r--r-- | FS/FS/location_Mixin.pm | 14 | ||||
-rw-r--r-- | FS/FS/svc_phone.pm | 116 |
4 files changed, 158 insertions, 5 deletions
diff --git a/FS/FS/cust_location.pm b/FS/FS/cust_location.pm index da586f00c..0c5c02388 100644 --- a/FS/FS/cust_location.pm +++ b/FS/FS/cust_location.pm @@ -234,6 +234,20 @@ sub line { $self->location_label; } +=item location_hash + +Returns a list of key/value pairs, with the following keys: address1, adddress2, +city, county, state, zip, country. + +=cut + +#geocode? not yet set + +sub location_hash { + my $self = shift; + map { $_ => $self->$_ } qw( address1 address2 city county state zip country ); +} + =back =head1 BUGS diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index a45fcf245..6c2bcf377 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -1912,6 +1912,25 @@ sub has_ship_address { scalar( grep { $self->getfield("ship_$_") ne '' } $self->addr_fields ); } +=item location_hash + +Returns a list of key/value pairs, with the following keys: address1, adddress2, +city, county, state, zip, country. The shipping address is used if present. + +=cut + +#geocode? dependent on tax-ship_address config, not available in cust_location +#mostly. not yet then. + +sub location_hash { + my $self = shift; + my $prefix = $self->has_ship_address ? 'ship_' : ''; + + map { $_ => $self->get($prefix.$_) } + qw( address1 address2 city county state zip country geocode ); + #fields that cust_location has +} + =item all_pkgs [ EXTRA_QSEARCH_PARAMS_HASHREF ] Returns all packages (see L<FS::cust_pkg>) for this customer. diff --git a/FS/FS/location_Mixin.pm b/FS/FS/location_Mixin.pm index 675e00255..d45738682 100644 --- a/FS/FS/location_Mixin.pm +++ b/FS/FS/location_Mixin.pm @@ -40,4 +40,18 @@ sub location_label { $object->location_label(@_); } +=item location_hash + +Returns a hash of values for the location, either from the location object, +the cust_main shipping address, or the cust_main address, whichever is present +first. + +=cut + +sub location_hash { + my $self = shift; + my $object = $self->cust_location_or_main; + $object->location_hash(@_); +} + 1; diff --git a/FS/FS/svc_phone.pm b/FS/FS/svc_phone.pm index 7405a71fd..5d102ce2a 100644 --- a/FS/FS/svc_phone.pm +++ b/FS/FS/svc_phone.pm @@ -2,7 +2,9 @@ package FS::svc_phone; use strict; use base qw( FS::svc_Domain_Mixin FS::location_Mixin FS::svc_Common ); -use vars qw( @pw_set $conf ); +use vars qw( $DEBUG $me @pw_set $conf ); +use Data::Dumper; +use Scalar::Util qw( blessed ); use FS::Conf; use FS::Record qw( qsearch qsearchs dbh ); use FS::Msgcat qw(gettext); @@ -12,6 +14,9 @@ use FS::svc_pbx; use FS::svc_domain; use FS::cust_location; +$me = '[' . __PACKAGE__ . ']'; +$DEBUG = 0; + #avoid l 1 and o O 0 @pw_set = ( 'a'..'k', 'm','n', 'p-z', 'A'..'N', 'P'..'Z' , '2'..'9' ); @@ -179,12 +184,54 @@ sub label { =item insert -Adds this record to the database. If there is an error, returns the error, -otherwise returns false. +Adds this phone number to the database. If there is an error, returns the +error, otherwise returns false. =cut -# the insert method can be inherited from FS::Record +sub insert { + my $self = shift; + my %options = @_; + + if ( $DEBUG ) { + warn "[$me] insert called on $self: ". Dumper($self). + "\nwith options: ". Dumper(%options); + } + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + #false laziness w/cust_pkg.pm... move this to location_Mixin? that would + #make it more of a base class than a mixin... :) + if ( $options{'cust_location'} + && ( ! $self->locationnum || $self->locationnum == -1 ) ) { + my $error = $options{'cust_location'}->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "inserting cust_location (transaction rolled back): $error"; + } + $self->locationnum( $options{'cust_location'}->locationnum ); + } + #what about on-the-fly edits? if the ui supports it? + + my $error = $self->SUPER::insert(%options); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + ''; + +} =item delete @@ -234,7 +281,53 @@ returns the error, otherwise returns false. =cut -# the replace method can be inherited from FS::Record +sub replace { + my $new = shift; + + my $old = ( blessed($_[0]) && $_[0]->isa('FS::Record') ) + ? shift + : $new->replace_old; + + my %options = @_; + + if ( $DEBUG ) { + warn "[$me] replacing $old with $new\n". + "\nwith options: ". Dumper(%options); + } + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + #false laziness w/cust_pkg.pm... move this to location_Mixin? that would + #make it more of a base class than a mixin... :) + if ( $options{'cust_location'} + && ( ! $new->locationnum || $new->locationnum == -1 ) ) { + my $error = $options{'cust_location'}->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "inserting cust_location (transaction rolled back): $error"; + } + $new->locationnum( $options{'cust_location'}->locationnum ); + } + #what about on-the-fly edits? if the ui supports it? + + my $error = $new->SUPER::replace($old, %options); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error if $error; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + ''; #no error +} =item suspend @@ -275,6 +368,8 @@ sub check { } $self->phonenum($phonenum); + $self->locationnum('') if !$self->locationnum || $self->locationnum == -1; + my $error = $self->ut_numbern('svcnum') || $self->ut_numbern('countrycode') @@ -414,6 +509,17 @@ sub phone_device { qsearch('phone_device', { 'svcnum' => $self->svcnum } ); } +#override location_Mixin version cause we want to try the cust_pkg location +#in between us and cust_main +# XXX what to do in the unlinked case??? return a pseudo-object that returns +# empty fields? +sub cust_location_or_main { + my $self = shift; + return $self->cust_location if $self->locationnum; + my $cust_pkg = $self->cust_svc->cust_pkg; + $cust_pkg ? $cust_pkg->cust_location_or_main : ''; +} + =back =head1 BUGS |