=item location_hash
Returns a list of key/value pairs, with the following keys: address1, address2,
-city, county, state, zip, country. The shipping address is used if present.
+city, county, state, zip, country, geocode, location_type, location_number,
+location_kind. The shipping address is used if present.
=cut
my $prefix = $self->has_ship_address ? 'ship_' : '';
my $notfirst = 0;
- foreach (qw ( address1 address2 location_type location_number ) ) {
+ foreach (qw ( address1 address2 ) ) {
my $method = "$prefix$_";
$line .= ($notfirst ? $separator : ''). &$escape($self->$method)
if $self->$method;
$notfirst++;
}
+
+ my %location_type;
+ if ( 1 ) { #ikano, switch on via config
+ { no warnings 'void';
+ eval { 'use FS::part_export::ikano;' };
+ die $@ if $@;
+ }
+ %location_type = FS::part_export::ikano->location_types;
+ } else {
+ %location_type = (); #?
+ }
+
+ $line .= ' '. &$escape( $location_type{ $self->get($prefix.'location_type') })
+ if $self->get($prefix.'location_type');
+ $line .= ' '. &$escape($self->get($prefix.'location_number'))
+ if $self->get($prefix.'location_number');
+
$notfirst = 0;
foreach (qw ( city county state zip ) ) {
my $method = "$prefix$_";
$geocode;
}
+=item alternize
+
+Attempts to parse data for location_type and location_number from address1
+and address2.
+
+=cut
+
+sub alternize {
+ my $self = shift;
+ my $prefix = $self->has_ship_address ? 'ship_' : '';
+
+ return '' if $self->get($prefix.'location_type')
+ || $self->get($prefix.'location_number');
+
+ my %parse;
+ if ( 1 ) { #ikano, switch on via config
+ { no warnings 'void';
+ eval { 'use FS::part_export::ikano;' };
+ die $@ if $@;
+ }
+ %parse = FS::part_export::ikano->location_types_parse;
+ } else {
+ %parse = (); #?
+ }
+
+ foreach my $from ('address1', 'address2') {
+ foreach my $parse ( keys %parse ) {
+ my $value = $self->get($prefix.$from);
+ if ( $value =~ s/(^|\W+)$parse\W+(\w+)\W*$//i ) {
+ $self->set($prefix.'location_type', $parse{$parse});
+ $self->set($prefix.'location_number', $2);
+ $self->set($prefix.$from, $value);
+ return '';
+ }
+ }
+ }
+
+ #nothing matched, no changes
+ $self->get($prefix.'address2')
+ ? "Can't parse unit type and number from ${prefix}address2"
+ : '';
+}
+
=back
=head1 BUGS
'LOT' => 'Lot',
'RM' => 'Room',
'SLIP' => 'Slip',
+ 'SUIT' => 'Suite',
'TRLR' => 'Trailer',
'UNIT' => 'Unit',
'WING' => 'Wing',
);
}
+sub location_types_parse {
+ my $class = shift;
+ my %t = $class->location_types;
+ delete $t{''};
+ (
+ (map { $_ => $_ } keys %t),
+ (reverse %t),
+ 'STE' => 'SUIT', #USPS
+ );
+}
+
sub dsl_pull {
# we distinguish between invalid new data (return error) versus data that
# has legitimately changed (may eventually execute hooks; now just update)
my %location_hash = $qual->location_hash;
return 'No address provided' unless keys %location_hash;
+ warn Dumper(\%location_hash);
return 'Location kind is required' unless $location_hash{location_kind};
my $svctn = $qual->phonenum;
if ( $options{'cust_location'} ) {
my $cust_location = $options{'cust_location'};
- my $error = $cust_location->insert;
+ my $method = $cust_location->locationnum ? 'replace' : 'insert';
+ my $error = $cust_location->$method();
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error;
sub location_hash {
my $self = shift;
- use Data::Dumper; warn Dumper($self);
if ( $self->locationnum ) {
my $l = qsearchs( 'cust_location',
{ 'locationnum' => $self->locationnum });
my $error = '';
my $cust_location = '';
+my %location_hash = (
+ map { $_ => scalar($cgi->param($_)) }
+ qw( address1 address2 city county state zip country geocode ),
+ grep scalar($cgi->param($_)),
+ qw( location_type location_number location_kind )
+);
+
if ( $locationnum == -1 ) { # adding a new one
$cust_location = new FS::cust_location {
$cust_or_prospect."num" => $custnum_or_prospectnum,
- map { $_ => scalar($cgi->param($_)) }
- qw( address1 address2 city county state zip country geocode ),
- grep scalar($cgi->param($_)),
- qw( location_type location_number location_kind )
+ %location_hash,
};
#locationnum '': default service location
#locationnum -2: address not required for qual
} elsif ( $locationnum == -2 && $phonenum eq '' ) {
$error = "Nothing to qualify - neither phone number nor address specified";
+
+} else { #existing location, possibly with an edit
+ $cust_location = qsearchs('cust_location', { 'locationnum'=>$locationnum })
+ or die "Unknown locationnum $locationnum";
+ $cust_location->$_($location_hash{$_}) foreach keys %location_hash;
}
my $qual = new FS::qual {
'status' => 'N',
};
-$qual->phonenum($phonenum) if $phonenum ne '';
+$qual->phonenum($phonenum) if $phonenum ne '';
+#$qual->locationnum($locationnum) if $locationnum > 0;
+$qual->exportnum($exportnum) if $exportnum > 0;
$qual->set( $cust_or_prospect."num" => $custnum_or_prospectnum )
unless $locationnum == -1 || $locationnum > 0;
-$qual->exportnum($exportnum) if $exportnum > 0;
$error ||= $qual->insert( 'cust_location' => $cust_location );
% if ( $opt{'alt_format'} ) {
<TR>
- <<%$th%> ALIGN="right">Location kind</<%$th%>>
+ <<%$th%> ALIGN="right">Location kind</<%$th%>>
<TD>
<% include('/elements/select.html',
'cgi' => $cgi,
>
<TR>
- <<%$th%> ALIGN="right">Unit type and #</<%$th%>>
+ <<%$th%> ALIGN="right">Unit type and #</<%$th%>>
<TD COLSPAN=7>
% my $location_type = scalar($cgi->param('location_type'))
<% $style %>
>
-% if ( $object->get($pre.'address2') ) {
-
-% #XXX try to parse first
-% if ( 0 ) {
-% } else { #XXX i don't work so well when the dropdown is changed :/ i probably need to be triggered by "default service address"
- Can't parse unit type and number from <B><% $object->get($pre.'address2') |h %></B>
-% }
-
-% }
+% #XXX i don't work so well when the dropdown is changed :/ i probably need to be triggered by "default service address"
+% $alt_err =~ s/(ship_)?address2/'<B>'.encode_entities($object->get($1.'address2')).'<\/B>'/e;
+ <% $alt_err %>
</TD>
unless $object->get($pre.'state')
|| $object->get($pre.'country') ne $countrydefault;
+my $alt_err = ($opt{'alt_format'} && !$disabled) ? $object->alternize : '';
+
my @style = ();
push @style, 'background-color: #dddddd' if $disabled;
<SCRIPT TYPE="text/javascript">
+ function location_disable(what) {
+% for (@location_fields, 'city_select') {
+ what.form.<%$_%>.disabled = true;
+ var ftype = what.form.<%$_%>.tagName;
+ if( ftype == 'SELECT') changeSelect(what.form.<%$_%>, '');
+ else what.form.<%$_%>.value = '';
+ if( ftype != 'SELECT') what.form.<%$_%>.style.backgroundColor = '#dddddd';
+% }
+ }
+
+ function location_enable(what) {
+% for (grep { $_ ne 'location_number' } @location_fields, 'city_select') {
+ what.form.<%$_%>.disabled = false;
+ var ftype = what.form.<%$_%>.tagName;
+ if( ftype != 'SELECT') what.form.<%$_%>.style.backgroundColor = '#ffffff';
+ if( ftype == 'INPUT' ) what.form.<%$_%>.value = '';
+% }
+
+ if ( what.form.location_type.options[what.form.location_type.selectedIndex].value ) {
+ what.form.location_number.disabled = false;
+ what.form.location_number.style.backgroundColor = '#ffffff';
+ }
+ what.form.location_number.value = '';
+ }
+
function locationnum_changed(what) {
var locationnum = what.options[what.selectedIndex].value;
if ( locationnum == -2 ) {
-% for (@location_fields, 'city_select') {
- what.form.<%$_%>.disabled = true;
- var ftype = what.form.<%$_%>.tagName;
- if( ftype == 'SELECT') changeSelect(what.form.<%$_%>, '');
- else what.form.<%$_%>.value = '';
- what.form.<%$_%>.style.backgroundColor = '#dddddd';
-% }
- return;
+ location_disable(what);
+ return;
}
-
if ( locationnum == -1 ) {
-
-% for (@location_fields, 'city_select') {
- what.form.<%$_%>.disabled = false;
- what.form.<%$_%>.style.backgroundColor = '#ffffff';
- var ftype = what.form.<%$_%>.tagName;
- if( ftype == 'INPUT' ) what.form.<%$_%>.value = '';
-% }
+ location_enable(what);
changeSelect(what.form.country, <% $countrydefault |js_string %>);
''
)
);
+ return;
+ }
- } else {
+ if ( locationnum == 0 ) {
+% if ( $cust_main ) {
+ what.form.address1.value = <% $cust_main->get($prefix.'address1') |js_string %>;
+ what.form.address2.value = <% $cust_main->get($prefix.'address2') |js_string %>;
+ what.form.city.value = <% $cust_main->get($prefix.'city') |js_string %>;
+ what.form.zip.value = <% $cust_main->get($prefix.'zip') |js_string %>;
- if ( locationnum == 0 ) {
-% if ( $cust_main ) {
- what.form.address1.value = <% $cust_main->get($prefix.'address1') |js_string %>;
- what.form.address2.value = <% $cust_main->get($prefix.'address2') |js_string %>;
- what.form.city.value = <% $cust_main->get($prefix.'city') |js_string %>;
- what.form.zip.value = <% $cust_main->get($prefix.'zip') |js_string %>;
+ changeSelect(what.form.country, <% $cust_main->get($prefix.'country') | js_string %> );
- changeSelect(what.form.country, <% $cust_main->get($prefix.'country') | js_string %> );
-
- country_changed( what.form.country,
- fix_state_factory( <% $cust_main->get($prefix.'state') | js_string %>,
- <% $cust_main->get($prefix.'county') | js_string %>
- )
- );
-% }
+ country_changed( what.form.country,
+ fix_state_factory( <% $cust_main->get($prefix.'state') | js_string %>,
+ <% $cust_main->get($prefix.'county') | js_string %>
+ )
+ );
+% }
- } else {
- get_location( locationnum, update_location );
- }
+ } else {
+ get_location( locationnum, update_location );
+ }
-% if ( $editable ) {
- if ( locationnum == 0 ) {
-% }
+% if ( $editable ) {
+ if ( locationnum == 0 ) {
+% }
-%#sleep/wait until dropdowns are updated?
-% for (@location_fields, 'city_select') {
- what.form.<%$_%>.disabled = true;
- what.form.<%$_%>.style.backgroundColor = '#dddddd';
-% }
+% #sleep/wait until dropdowns are updated?
+ location_disable(what);
-% if ( $editable ) {
- } else {
+% if ( $editable ) {
+ } else {
-%#sleep/wait until dropdowns are updated?
-% for (@location_fields, 'city_select') {
- what.form.<%$_%>.disabled = false;
- what.form.<%$_%>.style.backgroundColor = '#ffffff';
-% }
+% #sleep/wait until dropdowns are updated?
+ location_enable(what);
- }
-% }
+ }
+% }
- }
}
function fix_state_factory (state, county) {
'disabled' => $disabled,
'no_asterisks' => 1,
'no_bold' => $opt{'no_bold'},
- 'alt_format' => $opt{'alt_format'},
+ 'alt_format' => $opt{'alt_format'},
)
%>