From: Mark Wells Date: Wed, 22 Oct 2014 18:57:32 +0000 (-0700) Subject: ensure relocate export always runs exactly once, #14049 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=70322c9412a97ab97582d76baeae00b9117c8a12 ensure relocate export always runs exactly once, #14049 --- diff --git a/FS/FS/cust_svc.pm b/FS/FS/cust_svc.pm index f499bef71..96409c363 100644 --- a/FS/FS/cust_svc.pm +++ b/FS/FS/cust_svc.pm @@ -334,15 +334,34 @@ sub replace { #trigger a relocate export on location changes if ( $new->cust_pkg->locationnum != $old->cust_pkg->locationnum ) { - $error ||= $new->svc_x->export('relocate', - $new->cust_pkg->cust_location, - $old->cust_pkg->cust_location, + my $svc_x = $new->svc_x; + if ( $svc_x->locationnum ) { + if ( $svc_x->locationnum == $old->cust_pkg->locationnum ) { + # in this case, set the service location to be the same as the new + # package location + $svc_x->set('locationnum', $new->cust_pkg->locationnum); + # and replace it, which triggers a relocate export so we don't + # need to + $error ||= $svc_x->replace; + } else { + # the service already has a different location from its package + # so don't change it + } + } else { + # the service doesn't have a locationnum (either isn't of a type + # that has the locationnum field, or the locationnum is null and + # defaults to cust_pkg->locationnum) + # so just trigger the export here + $error ||= $new->svc_x->export('relocate', + $new->cust_pkg->cust_location, + $old->cust_pkg->cust_location, ); - } + } # if ($svc_x->locationnum) + } # if this is a location change if ( $error ) { $dbh->rollback if $oldAutoCommit; - return $error if $error; + return $error if $error } $dbh->commit or die $dbh->errstr if $oldAutoCommit;