summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivan <ivan>2010-03-12 21:29:04 +0000
committerivan <ivan>2010-03-12 21:29:04 +0000
commitf433b4f187e484e8c40bdcebbeb5a5d51b3ae38e (patch)
tree6597ace03fadaa451eaceca9c986e40ebfe6bcc8
parent02348fb69ac302f117ca8b510b68871eff25d4c6 (diff)
finishing e911/svc_phone location, RT#7047
-rw-r--r--FS/FS/cust_location.pm14
-rw-r--r--FS/FS/cust_main.pm19
-rw-r--r--FS/FS/location_Mixin.pm14
-rw-r--r--FS/FS/svc_phone.pm116
-rw-r--r--httemplate/edit/elements/svc_Common.html5
-rw-r--r--httemplate/edit/process/svc_phone.html19
-rw-r--r--httemplate/edit/svc_phone.cgi3
-rw-r--r--httemplate/elements/tr-select-cust_location.html5
-rw-r--r--httemplate/view/svc_phone.cgi12
9 files changed, 195 insertions, 12 deletions
diff --git a/FS/FS/cust_location.pm b/FS/FS/cust_location.pm
index da586f0..0c5c023 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 a45fcf2..6c2bcf3 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 675e002..d457386 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 7405a71..5d102ce 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 1cb1659..36950b2 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 27a703c..e02ec5c 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;
+
+};
+
+
+
</%init>
diff --git a/httemplate/edit/svc_phone.cgi b/httemplate/edit/svc_phone.cgi
index 779708b..4715ec1 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
;
+
</%init>
diff --git a/httemplate/elements/tr-select-cust_location.html b/httemplate/elements/tr-select-cust_location.html
index f266497..f06ea0f 100644
--- a/httemplate/elements/tr-select-cust_location.html
+++ b/httemplate/elements/tr-select-cust_location.html
@@ -187,6 +187,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 $prospect_main = $opt{'prospect_main'};
@@ -213,6 +214,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;
} elsif ( $cust_main ) {
$cust_location->$_( $cust_main->get($prefix.$_) ) foreach @location_fields;
}
diff --git a/httemplate/view/svc_phone.cgi b/httemplate/view/svc_phone.cgi
index ebde422..75591c7 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"). '<TR><TD>'. ntable("#cccccc",2).
'<TR><TD>Location</TD>'.
'<TD BGCOLOR="#FFFFFF">'.
- $loc->location_label( 'join_string' => '<BR>',
- 'double_space' => ' &nbsp; ',
- 'escape_function' => \&encode_entities,
- 'countrydefault' => $countrydefault,
- ).
+ $svc_phone->location_label( 'join_string' => '<BR>',
+ 'double_space' => ' &nbsp; ',
+ 'escape_function' => \&encode_entities,
+ 'countrydefault' => $countrydefault,
+ ).
'</TD></TR>'.
'</TABLE></TD></TR></TABLE>'.
'<BR>'