X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=httemplate%2Felements%2Fstandardize_locations.js;h=817a2e3576878c47ded33f30637505af5251da66;hp=ff45b1826a96558c23976c5059a24912e9278415;hb=7516e3da0f17eeecba27219ef96a8b5f46af2083;hpb=84fa358b56b89205fff99927080d5c28c01d57ff diff --git a/httemplate/elements/standardize_locations.js b/httemplate/elements/standardize_locations.js index ff45b1826..817a2e357 100644 --- a/httemplate/elements/standardize_locations.js +++ b/httemplate/elements/standardize_locations.js @@ -1,54 +1,45 @@ +function status_message(text, caption) { + text = '

' + text + '

'; + caption = caption || 'Please wait...'; + overlib(text, WIDTH, 444, HEIGHT, 168, CAPTION, caption, STICKY, AUTOSTATUSCAP, CLOSECLICK, MIDX, 0, MIDY, 0); +} + function form_address_info() { var cf = document.<% $formname %>; - var state_el = cf.elements['<% $main_prefix %>state']; - var ship_state_el = cf.elements['<% $ship_prefix %>state']; - return { -% if ( $onlyship ) { - 'onlyship': 1, -% } else { -% if ( $withfirm ) { - 'company', cf.elements['company'].value, -% } - 'address1': cf.elements['<% $main_prefix %>address1'].value, - 'address2': cf.elements['<% $main_prefix %>address2'].value, - 'city': cf.elements['<% $main_prefix %>city'].value, - 'state': state_el.options[ state_el.selectedIndex ].value, - 'zip': cf.elements['<% $main_prefix %>zip'].value, - 'country': cf.elements['<% $main_prefix %>country'].value, -% } -% if ( $withcensus ) { - 'ship_censustract': cf.elements['enter_censustract'].value, -% } - 'ship_address1': cf.elements['<% $ship_prefix %>address1'].value, - 'ship_address2': cf.elements['<% $ship_prefix %>address2'].value, - 'ship_city': cf.elements['<% $ship_prefix %>city'].value, - 'ship_state': ship_state_el.options[ ship_state_el.selectedIndex ].value, - 'ship_zip': cf.elements['<% $ship_prefix %>zip'].value, - 'ship_country': cf.elements['<% $ship_prefix %>country'].value, -% if ( !$onlyship ) { - 'same': cf.elements['same'].checked + + var returnobj = { billship: <% $billship %> }; +% if ( $billship ) { + returnobj['same'] = cf.elements['same'].checked; % } - }; +% for my $pre (@prefixes) { +% # normal case +% for my $field (qw(address1 address2 city state zip country)) { + returnobj['<% $pre %><% $field %>'] = cf.elements['<% $pre %><% $field %>'].value; +% } #for $field +% if ( $withcensus ) { + returnobj['<% $pre %>censustract'] = cf.elements['<% $pre %>enter_censustract'].value; +% } +% } #foreach $pre + + return returnobj; } function standardize_locations() { - var startup_msg = '

Verifying address...

'; - overlib(startup_msg, WIDTH, 444, HEIGHT, 168, CAPTION, 'Please wait...', STICKY, AUTOSTATUSCAP, CLOSECLICK, MIDX, 0, MIDY, 0); var cf = document.<% $formname %>; var address_info = form_address_info(); var changed = false; // have any of the address fields been changed? // clear coord_auto fields if the user has changed the coordinates -% for my $pre ($ship_prefix, $onlyship ? () : $main_prefix) { +% for my $pre (@prefixes) { % for my $field ($pre.'latitude', $pre.'longitude') { if ( cf.elements['<% $field %>'].value != cf.elements['old_<% $field %>'].value ) { cf.elements['<% $pre %>coord_auto'].value = ''; } -% } +% } #foreach $field // but if the coordinates have been set to null, turn coord_auto on // and standardize if ( cf.elements['<% $pre %>latitude'].value == '' && @@ -56,17 +47,12 @@ function standardize_locations() { cf.elements['<% $pre %>coord_auto'].value = 'Y'; changed = true; } - -% } - // standardize if the old address wasn't clean - if ( cf.elements['old_<% $ship_prefix %>addr_clean'].value == '' || - ( <% !$onlyship || 0 %> && - cf.elements['old_<% $main_prefix %>addr_clean'].value == '' ) ) { - + if ( cf.elements['<% $pre %>addr_clean'].value == '' ) { changed = true; - } +% } #foreach $pre + // or if it was clean but has been changed for (var key in address_info) { var old_el = cf.elements['old_'+key]; @@ -79,19 +65,29 @@ function standardize_locations() { % # If address hasn't been changed, auto-confirm the existing value of % # censustract so that we don't ask the user to confirm it again. - if ( !changed ) { - cf.elements['<% $main_prefix %>censustract'].value = - address_info['ship_censustract']; + if ( !changed && <% $withcensus %> ) { +% if ( $billship ) { + if ( address_info['same'] ) { + cf.elements['bill_censustract'].value = + address_info['bill_censustract']; + } else { + cf.elements['ship_censustract'].value = + address_info['ship_censustract']; + } +% } else { + cf.elements['censustract'].value = + address_info['censustract']; +% } } % if ( $conf->config('address_standardize_method') ) { if ( changed ) { + status_message('Verifying address...'); address_standardize(JSON.stringify(address_info), confirm_standardize); } else { - cf.elements['<% $ship_prefix %>addr_clean'].value = 'Y'; -% if ( !$onlyship ) { - cf.elements['<% $main_prefix %>addr_clean'].value = 'Y'; +% foreach my $pre (@prefixes) { + cf.elements['<% $pre %>addr_clean'].value = 'Y'; % } post_standardization(); } @@ -114,8 +110,14 @@ function confirm_standardize(arg) { replace_address(); // with the contents of returned['new'] - } - else { + } else if ( returned['all_same'] ) { + + // then all entered address fields are correct + // but we still need to set the lat/long fields and addr_clean + status_message('Verified'); + replace_address(); + + } else { var querystring = encodeURIComponent( JSON.stringify(returned) ); // confirmation popup: knows to call replace_address(), @@ -138,55 +140,26 @@ function replace_address() { var newaddr = returned['new']; - var clean = newaddr['addr_clean'] == 'Y'; - var ship_clean = newaddr['ship_addr_clean'] == 'Y'; - var error = newaddr['error']; - var ship_error = newaddr['ship_error']; - var cf = document.<% $formname %>; - var state_el = cf.elements['<% $main_prefix %>state']; - var ship_state_el = cf.elements['<% $ship_prefix %>state']; - -% if ( !$onlyship ) { +% foreach my $pre (@prefixes) { + var clean = newaddr['<% $pre %>addr_clean'] == 'Y'; + var error = newaddr['<% $pre %>error']; if ( clean ) { -% if ( $withfirm ) { - cf.elements['<% $main_prefix %>company'].value = newaddr['company']; -% } - cf.elements['<% $main_prefix %>address1'].value = newaddr['address1']; - cf.elements['<% $main_prefix %>address2'].value = newaddr['address2']; - cf.elements['<% $main_prefix %>city'].value = newaddr['city']; - setselect(cf.elements['<% $main_prefix %>state'], newaddr['state']); - cf.elements['<% $main_prefix %>zip'].value = newaddr['zip']; - cf.elements['<% $main_prefix %>addr_clean'].value = 'Y'; - - if ( cf.elements['<% $main_prefix %>coord_auto'].value ) { - cf.elements['<% $main_prefix %>latitude'].value = newaddr['latitude']; - cf.elements['<% $main_prefix %>longitude'].value = newaddr['longitude']; - } - } -% } +% foreach my $field (qw(address1 address2 city state zip addr_clean )) { + cf.elements['<% $pre %><% $field %>'].value = newaddr['<% $pre %><% $field %>']; +% } #foreach $field - if ( ship_clean ) { -% if ( $withfirm ) { - cf.elements['<% $ship_prefix %>company'].value = newaddr['ship_company']; -% } - cf.elements['<% $ship_prefix %>address1'].value = newaddr['ship_address1']; - cf.elements['<% $ship_prefix %>address2'].value = newaddr['ship_address2']; - cf.elements['<% $ship_prefix %>city'].value = newaddr['ship_city']; - setselect(cf.elements['<% $ship_prefix %>state'], newaddr['ship_state']); - cf.elements['<% $ship_prefix %>zip'].value = newaddr['ship_zip']; - cf.elements['<% $ship_prefix %>addr_clean'].value = 'Y'; - if ( cf.elements['<% $ship_prefix %>coord_auto'].value ) { - cf.elements['<% $ship_prefix %>latitude'].value = newaddr['latitude']; - cf.elements['<% $ship_prefix %>longitude'].value = newaddr['longitude']; - } - } -% if ( $withcensus ) { -% # then set the censustract if address_standardize provided one. - if ( ship_clean && newaddr['ship_censustract'] ) { - cf.elements['<% $main_prefix %>censustract'].value = newaddr['ship_censustract']; - } -% } + if ( cf.elements['<% $pre %>coord_auto'].value ) { + cf.elements['<% $pre %>latitude'].value = newaddr['<% $pre %>latitude']; + cf.elements['<% $pre %>longitude'].value = newaddr['<% $pre %>longitude']; + } +% if ( $withcensus ) { + if ( clean && newaddr['<% $pre %>censustract'] ) { + cf.elements['<% $pre %>censustract'].value = newaddr['<% $pre %>censustract']; + } +% } #if $withcensus + } // if clean +% } #foreach $pre post_standardization(); @@ -196,33 +169,45 @@ function confirm_manual_address() { %# not much to do in this case, just confirm the censustract % if ( $withcensus ) { var cf = document.<% $formname %>; - cf.elements['<% $main_prefix %>censustract'].value = - cf.elements['enter_censustract'].value; -% } +% foreach my $pre (@prefixes) { + cf.elements['<% $pre %>censustract'].value = + cf.elements['<% $pre %>enter_censustract'].value; +% } +% } # $withcensus post_standardization(); } function post_standardization() { -% if ( $conf->exists('enable_taxproducts') ) { +% if ( $need_tax_location ) { - if ( new String(cf.elements['<% $taxpre %>zip'].value).length < 10 ) + var cf = document.<% $formname %>; + + var prefix = '<% $taxpre %>'; + // fix edge case with cust_main + if ( cf.elements['same'] + && cf.elements['same'].checked + && prefix == 'ship_' ) { + + prefix = 'bill_'; + } + + if ( new String(cf.elements[prefix + 'zip'].value).length < 10 ) { - var country_el = cf.elements['<% $taxpre %>country']; + var country_el = cf.elements[prefix + 'country']; var country = country_el.options[ country_el.selectedIndex ].value; - var geocode = cf.elements['geocode'].value; + var geocode = cf.elements[prefix + 'geocode'].value; if ( country == 'CA' || country == 'US' ) { - var state_el = cf.elements['<% $taxpre %>state']; + var state_el = cf.elements[prefix + 'state']; var state = state_el.options[ state_el.selectedIndex ].value; - var url = "<% $p %>/misc/choose_tax_location.html" + - "?data_vendor=cch-zip" + - ";city=" + cf.elements['<% $taxpre %>city'].value + + var url = "<% $p %>/misc/choose_tax_location.html?" + + "city=" + cf.elements[prefix + 'city'].value + ";state=" + state + - ";zip=" + cf.elements['<% $taxpre %>zip'].value + + ";zip=" + cf.elements[prefix + 'zip'].value + ";country=" + country + ";geocode=" + geocode + ";formname=" + '<% $formname %>' + @@ -233,14 +218,14 @@ function post_standardization() { } else { - cf.elements['geocode'].value = 'DEFAULT'; + cf.elements[prefix + 'geocode'].value = 'DEFAULT'; <% $post_geocode %>; } } else { - cf.elements['geocode'].value = ''; + cf.elements[prefix + 'geocode'].value = ''; <% $post_geocode %>; } @@ -259,20 +244,24 @@ function update_geocode() { set_geocode = function (what) { var cf = document.<% $formname %>; + var prefix = '<% $taxpre %>'; + if ( cf.elements['same'] + && cf.elements['same'].checked + && prefix == 'ship_' ) { + prefix = 'bill_'; + } - //alert(what.options[what.selectedIndex].value); - var argsHash = eval('(' + what.options[what.selectedIndex].value + ')'); - cf.elements['<% $taxpre %>city'].value = argsHash['city']; - setselect(cf.elements['<% $taxpre %>state'], argsHash['state']); - cf.elements['<% $taxpre %>zip'].value = argsHash['zip']; - cf.elements['geocode'].value = argsHash['geocode']; +%# this used to set the city/state/zip to the selected value; I think +%# that's wrong. + var argsHash = JSON.parse(what.value); + cf.elements[prefix + 'geocode'].value = argsHash['geocode']; <% $post_geocode %>; } // popup a chooser - overlib( OLresponseAJAX, CAPTION, 'Select tax location', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, DRAGGABLE, WIDTH, 576, HEIGHT, 268, BGCOLOR, '#333399', CGCOLOR, '#333399', TEXTSIZE, 3 ); + overlib( OLresponseAJAX, CAPTION, 'Select tax location', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, WIDTH, 576, HEIGHT, 268, BGCOLOR, '#333399', CGCOLOR, '#333399', TEXTSIZE, 3 ); } @@ -285,22 +274,73 @@ function setselect(el, value) { } } + +% if ($census_functions) { # do not use this in cust_main +function confirm_censustract() { +% if ( FS::Conf->new->exists('cust_main-require_censustract') ) { + var form = document.<% $formname %>; + // this is the existing/confirmed censustract, not the manually entered one + if ( form.elements['censustract'].value == '' || + form.elements['censustract'].value != + form.elements['enter_censustract'].value ) { + var address_info = form_address_info(); + address_info['latitude'] = form.elements['latitude'].value; + address_info['longitude'] = form.elements['longitude'].value; + OLpostAJAX( + '<%$p%>/misc/confirm-censustract.html', + 'q=' + encodeURIComponent(JSON.stringify(address_info)), + function() { + overlib( OLresponseAJAX, CAPTION, 'Confirm censustract', STICKY, + AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, DRAGGABLE, WIDTH, + 576, HEIGHT, 268, BGCOLOR, '#333399', CGCOLOR, '#333399', + TEXTSIZE, 3 ); + }, + 0); + } else { + <% $post_censustract %>; + } +% } else { # skip this step + <% $post_censustract %>; +% } +} + +function set_censustract(tract, year) { + var form = document.<% $formname %>; + form.elements['censustract'].value = tract; + form.elements['censusyear'].value = year; + <% $post_censustract %>; +} + +% } # $census_functions + <%init> my %opt = @_; my $conf = new FS::Conf; -my $withfirm = 1; -my $withcensus = 1; +my $withcensus = $opt{'with_census'} ? 1 : 0; + +my @prefixes = ''; +my $billship = $opt{'billship'} ? 1 : 0; # whether to have bill_ and ship_ prefixes +my $taxpre = ''; +# probably should just geocode both addresses, since either one could +# be a package address in the future +if ($billship) { + @prefixes = qw(bill_ ship_); + $taxpre = $conf->exists('tax-ship_address') ? 'ship_' : 'bill_'; +} my $formname = $opt{form} || 'CustomerForm'; -my $onlyship = $opt{onlyship} || ''; -my $main_prefix = $opt{main_prefix} || ''; -my $ship_prefix = $opt{ship_prefix} || ($onlyship ? '' : 'ship_'); -my $taxpre = $main_prefix; -$taxpre = $ship_prefix if ( $conf->exists('tax-ship_address') || $onlyship ); my $post_geocode = $opt{callback} || 'post_geocode();'; -$withfirm = 0 if $opt{no_company}; -$withcensus = 0 if $opt{no_census}; +my $post_censustract; + +my $census_functions = $opt{'with_census_functions'} ? 1 : 0; +if ( $census_functions ) { + $post_censustract = $post_geocode; + $post_geocode = 'confirm_censustract()'; +} + +my $tax_engine = FS::TaxEngine->new; +my $need_tax_location = $tax_engine->info->{manual_tax_location} ? 1 : 0;