finishing e911/svc_phone location, RT#7047
authorivan <ivan>
Fri, 12 Mar 2010 21:29:16 +0000 (21:29 +0000)
committerivan <ivan>
Fri, 12 Mar 2010 21:29:16 +0000 (21:29 +0000)
FS/FS/cust_location.pm
FS/FS/cust_main.pm
FS/FS/location_Mixin.pm
FS/FS/svc_phone.pm
httemplate/edit/elements/svc_Common.html
httemplate/edit/process/svc_phone.html
httemplate/edit/svc_phone.cgi
httemplate/elements/tr-select-cust_location.html
httemplate/view/svc_phone.cgi

index 87c6c3e..a90fbe1 100644 (file)
@@ -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
index fc65039..5116049 100644 (file)
@@ -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<FS::cust_pkg>) for this customer.
index 675e002..d457386 100644 (file)
@@ -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;
index 7405a71..5d102ce 100644 (file)
@@ -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
index 1cb1659..36950b2 100644 (file)
                            };
                    }
 
+                   if ( $f->{'field'} eq 'custnum' && $pkgnum ) {
+                     my $cust_pkg = qsearchs('cust_pkg', {'pkgnum' => $pkgnum});
+                     $object->set('custnum', $cust_pkg->custnum);
+                   }
+
                  },
 
                  'html_init' => sub {
index 27a703c..e02ec5c 100644 (file)
@@ -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>
index 779708b..4715ec1 100644 (file)
@@ -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>
index 6950706..bc39154 100644 (file)
@@ -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;
   }
index ebde422..75591c7 100644 (file)
@@ -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>'