X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=FS%2FFS%2Fcust_location.pm;h=aad25a4a7e261ee665b3fa703ee2316bf5f16c12;hb=b9b18c46a93720ba3f635d71d32d13f355861c51;hp=72cd8567e470a802a4408dec8df3441de560af8b;hpb=56d10a0d13cc291eb5ee6197c35b10407794f89c;p=freeside.git diff --git a/FS/FS/cust_location.pm b/FS/FS/cust_location.pm index 72cd8567e..aad25a4a7 100644 --- a/FS/FS/cust_location.pm +++ b/FS/FS/cust_location.pm @@ -5,7 +5,6 @@ use strict; use vars qw( $import $DEBUG $conf $label_prefix ); use Data::Dumper; use Date::Format qw( time2str ); -use Locale::Country; use FS::UID qw( dbh driver_name ); use FS::Record qw( qsearch qsearchs ); use FS::Conf; @@ -68,7 +67,7 @@ Address line two (optional) =item city -City +City (if cust_main-no_city_in_address config is set when inserting, this will be forced blank) =item county @@ -147,6 +146,12 @@ sub find_or_insert { my @essential = (qw(custnum address1 address2 city county state zip country location_number location_type location_kind disabled)); + if ($conf->exists('cust_main-no_city_in_address')) { + warn "Warning: passed city to find_or_insert when cust_main-no_city_in_address is configured, ignoring it" + if $self->get('city'); + $self->set('city',''); + } + # I don't think this is necessary #if ( !$self->coord_auto and $self->latitude and $self->longitude ) { # push @essential, qw(latitude longitude); @@ -202,6 +207,12 @@ otherwise returns false. sub insert { my $self = shift; + if ($conf->exists('cust_main-no_city_in_address')) { + warn "Warning: passed city to insert when cust_main-no_city_in_address is configured, ignoring it" + if $self->get('city'); + $self->set('city',''); + } + if ( $self->censustract ) { $self->set('censusyear' => $conf->config('census_year') || 2012); } @@ -266,14 +277,19 @@ sub replace { my $self = shift; my $old = shift; $old ||= $self->replace_old; - # the following fields are immutable - if ($self->get('unlock')) { - # well, mostly immutable - warn "WARNING: locationnum ".$old->locationnum." MODIFIED IN PLACE\n"; - } else { - foreach (qw(address1 address2 city state zip country)) { - if ( $self->$_ ne $old->$_ ) { - return "can't change cust_location field $_"; + + warn "Warning: passed city to replace when cust_main-no_city_in_address is configured" + if $conf->exists('cust_main-no_city_in_address') && $self->get('city'); + + # the following fields are immutable if this is a customer location. if + # it's a prospect location, then there are no active packages, no billing + # history, no taxes, and in general no reason to keep the old location + # around. + if ( $self->custnum ) { + foreach (qw(address1 address2 city state zip country)) { + if ( $self->$_ ne $old->$_ ) { + return "can't change cust_location field $_"; + } } } @@ -326,10 +342,12 @@ sub check { $self->ut_numbern('locationnum') || $self->ut_foreign_keyn('prospectnum', 'prospect_main', 'prospectnum') || $self->ut_foreign_keyn('custnum', 'cust_main', 'custnum') - || $self->ut_alphan('locationname') + || $self->ut_textn('locationname') || $self->ut_text('address1') || $self->ut_textn('address2') - || $self->ut_text('city') + || ($conf->exists('cust_main-no_city_in_address') + ? $self->ut_textn('city') + : $self->ut_text('city')) || $self->ut_textn('county') || $self->ut_textn('state') || $self->ut_country('country') @@ -392,14 +410,11 @@ sub check { =item country_full -Returns this locations's full country name +Returns this location's full country name =cut -sub country_full { - my $self = shift; - code2country($self->country); -} +#moved to geocode_Mixin.pm =item line @@ -627,6 +642,11 @@ Prospect object (see L) String used to join location elements +=item no_prefix + +Don't label the default service location as "Default service location". +May become the default at some point. + =back =cut @@ -636,6 +656,7 @@ sub location_label { my $prefix = $self->label_prefix; $prefix .= ($opt{join_string} || ': ') if $prefix; + $prefix = '' if $opt{'no_prefix'}; $prefix . $self->SUPER::location_label(%opt); } @@ -723,58 +744,6 @@ sub cust_main { =back -=head1 CLASS METHODS - -=item in_county_sql OPTIONS - -Returns an SQL expression to test membership in a cust_main_county -geographic area. By default, this requires district, city, county, -state, and country to match exactly. Pass "ornull => 1" to allow -partial matches where some fields are NULL in the cust_main_county -record but not in the location. - -Pass "param => 1" to receive a parameterized expression (rather than -one that requires a join to cust_main_county) and a list of parameter -names in order. - -=cut - -sub in_county_sql { - # replaces FS::cust_pkg::location_sql - my ($class, %opt) = @_; - my $ornull = $opt{ornull} ? ' OR ? IS NULL' : ''; - my $x = $ornull ? 3 : 2; - my @fields = (('district') x 3, - ('city') x 3, - ('county') x $x, - ('state') x $x, - 'country'); - - my $text = (driver_name =~ /^mysql/i) ? 'char' : 'text'; - - my @where = ( - "cust_location.district = ? OR ? = '' OR CAST(? AS $text) IS NULL", - "cust_location.city = ? OR ? = '' OR CAST(? AS $text) IS NULL", - "cust_location.county = ? OR (? = '' AND cust_location.county IS NULL) $ornull", - "cust_location.state = ? OR (? = '' AND cust_location.state IS NULL ) $ornull", - "cust_location.country = ?" - ); - my $sql = join(' AND ', map "($_)\n", @where); - if ( $opt{param} ) { - return $sql, @fields; - } - else { - # do the substitution here - foreach (@fields) { - $sql =~ s/\?/cust_main_county.$_/; - $sql =~ s/cust_main_county.$_ = ''/cust_main_county.$_ IS NULL/; - } - return $sql; - } -} - -=back - =head2 SUBROUTINES =over 4