From 41f561eb60f8a69d1ce3685e04cfd1e1a8efefad Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 12 Mar 2010 21:29:16 +0000 Subject: [PATCH] finishing e911/svc_phone location, RT#7047 --- FS/FS/cust_location.pm | 14 +++ FS/FS/cust_main.pm | 19 ++++ FS/FS/location_Mixin.pm | 14 +++ FS/FS/svc_phone.pm | 116 ++++++++++++++++++++++- httemplate/edit/elements/svc_Common.html | 5 + httemplate/edit/process/svc_phone.html | 19 ++++ httemplate/edit/svc_phone.cgi | 3 + httemplate/elements/tr-select-cust_location.html | 5 + httemplate/view/svc_phone.cgi | 12 +-- 9 files changed, 195 insertions(+), 12 deletions(-) diff --git a/FS/FS/cust_location.pm b/FS/FS/cust_location.pm index 87c6c3eb6..a90fbe170 100644 --- a/FS/FS/cust_location.pm +++ b/FS/FS/cust_location.pm @@ -225,6 +225,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 fc6503989..5116049f3 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -1910,6 +1910,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) 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 diff --git a/httemplate/edit/elements/svc_Common.html b/httemplate/edit/elements/svc_Common.html index 1cb1659f4..36950b2c9 100644 --- a/httemplate/edit/elements/svc_Common.html +++ b/httemplate/edit/elements/svc_Common.html @@ -101,6 +101,11 @@ }; } + if ( $f->{'field'} eq 'custnum' && $pkgnum ) { + my $cust_pkg = qsearchs('cust_pkg', {'pkgnum' => $pkgnum}); + $object->set('custnum', $cust_pkg->custnum); + } + }, 'html_init' => sub { diff --git a/httemplate/edit/process/svc_phone.html b/httemplate/edit/process/svc_phone.html index 27a703cdf..e02ec5ccc 100644 --- a/httemplate/edit/process/svc_phone.html +++ b/httemplate/edit/process/svc_phone.html @@ -1,5 +1,6 @@ <% include( 'elements/svc_Common.html', 'table' => 'svc_phone', + 'args_callback' => $args_callback, ) %> <%init> @@ -7,4 +8,22 @@ die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Provision customer service'); #something else more specific? +my $args_callback = sub { + my( $cgi, $object ) = @_; + + my %opt = (); + if ( $cgi->param('locationnum') == -1 ) { + my $cust_location = new FS::cust_location { + map { $_ => scalar($cgi->param($_)) } + qw( custnum address1 address2 city county state zip country ) + }; + $opt{'cust_location'} = $cust_location; + } + + %opt; + +}; + + + diff --git a/httemplate/edit/svc_phone.cgi b/httemplate/edit/svc_phone.cgi index 779708b4e..4715ec146 100644 --- a/httemplate/edit/svc_phone.cgi +++ b/httemplate/edit/svc_phone.cgi @@ -62,10 +62,13 @@ push @fields, { field => 'pbxsvc', my $cust_pkg = qsearchs('cust_pkg', {'pkgnum' => $pkgnum}); my $cust_main = $cust_pkg ? $cust_pkg->cust_main : ''; ( 'no_bold' => 1, + 'cust_pkg' => $cust_pkg, 'cust_main' => $cust_main, ); }, }, + { field => 'custnum', type=> 'hidden' }, #for new cust_locations ; + diff --git a/httemplate/elements/tr-select-cust_location.html b/httemplate/elements/tr-select-cust_location.html index 695070699..bc3915441 100644 --- a/httemplate/elements/tr-select-cust_location.html +++ b/httemplate/elements/tr-select-cust_location.html @@ -157,6 +157,7 @@ my $statedefault = $conf->config('statedefault') my %opt = @_; my $cgi = $opt{'cgi'}; +my $cust_pkg = $opt{'cust_pkg'}; my $cust_main = $opt{'cust_main'}; my $prefix = length($cust_main->ship_last) ? 'ship_' : ''; @@ -171,6 +172,10 @@ if ( $locationnum && $locationnum != -1 ) { $cust_location = new FS::cust_location; if ( $locationnum == -1 ) { $cust_location->$_( $cgi->param($_) ) foreach @location_fields; + } elsif ( $cust_pkg && $cust_pkg->locationnum ) { + my $pkg_location = $cust_pkg->cust_location; + $cust_location->$_( $pkg_location->$_ ) foreach @location_fields; + $opt{'empty_label'} ||= 'package address: '.$pkg_location->line; } else { $cust_location->$_( $cust_main->get($prefix.$_) ) foreach @location_fields; } diff --git a/httemplate/view/svc_phone.cgi b/httemplate/view/svc_phone.cgi index ebde42228..75591c747 100644 --- a/httemplate/view/svc_phone.cgi +++ b/httemplate/view/svc_phone.cgi @@ -29,18 +29,16 @@ my $html_foot = sub { # E911 Info ### - my $loc = $svc_phone->cust_location_or_main; - my $e911 = 'E911 Information'. &ntable("#cccccc"). ''. ntable("#cccccc",2). 'Location'. ''. - $loc->location_label( 'join_string' => '
', - 'double_space' => '   ', - 'escape_function' => \&encode_entities, - 'countrydefault' => $countrydefault, - ). + $svc_phone->location_label( 'join_string' => '
', + 'double_space' => '   ', + 'escape_function' => \&encode_entities, + 'countrydefault' => $countrydefault, + ). ''. ''. '
' -- 2.11.0