[freeside-commits] branch master updated. 569f676f4a06512a46120e12edc6a6410e93ff93

Mitch Jackson mitch at freeside.biz
Sat Jan 19 06:31:11 PST 2019


The branch, master has been updated
       via  569f676f4a06512a46120e12edc6a6410e93ff93 (commit)
      from  39fe6499bd38e6e7c468f549b1d4919a7cf2c44d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 569f676f4a06512a46120e12edc6a6410e93ff93
Author: Mitch Jackson <mitch at freeside.biz>
Date:   Sat Jan 19 07:41:08 2019 -0500

    RT# 80488 Live look up of WA state tax district
    
    When conf flag 'tax_district_method' is set, tax district
    is queried for address before form is submitted
    
    Affected Pages:
    * New Customer
    * Edit Customer
    * Order Package
    * Change Package
    * Edit Package Location

diff --git a/FS/FS/cust_location.pm b/FS/FS/cust_location.pm
index fee77a8b1..63492dd33 100644
--- a/FS/FS/cust_location.pm
+++ b/FS/FS/cust_location.pm
@@ -265,8 +265,15 @@ sub insert {
     return $error;
   }
 
-  #false laziness with cust_main, will go away eventually
-  if ( !$import and $conf->config('tax_district_method') ) {
+  # If using tax_district_method, for rows in state of Washington,
+  # without a tax district already specified, queue a job to find
+  # the tax district
+  if (
+       !$import
+    && !$self->district
+    && lc $self->state eq 'wa'
+    && $conf->config('tax_district_method')
+  ) {
 
     my $queue = new FS::queue {
       'job' => 'FS::geocode_Mixin::process_district_update'
@@ -990,7 +997,11 @@ sub _upgrade_data {
       die "$error (fixing whitespace in $field, locationnum ".$location->locationnum.')'
         if $error;
 
-      if ( $use_districts ) {
+      if (
+        $use_districts
+        && !$location->district
+        && lc $location->state eq 'wa'
+      ) {
         my $queue = new FS::queue {
           'job' => 'FS::geocode_Mixin::process_district_update'
         };
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index cc0e83f23..920f4d413 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -743,20 +743,6 @@ sub insert {
     }
   }
 
-  # FS::geocode_Mixin::after_insert or something?
-  if ( $conf->config('tax_district_method') and !$import ) {
-    # if anything non-empty, try to look it up
-    my $queue = new FS::queue {
-      'job'     => 'FS::geocode_Mixin::process_district_update',
-      'custnum' => $self->custnum,
-    };
-    my $error = $queue->insert( ref($self), $self->custnum );
-    if ( $error ) {
-      $dbh->rollback if $oldAutoCommit;
-      return "queueing tax district update: $error";
-    }
-  }
-
   # cust_main exports!
   warn "  exporting\n" if $DEBUG > 1;
 
diff --git a/httemplate/edit/cust_location.cgi b/httemplate/edit/cust_location.cgi
index 38816db7a..93311c5c3 100755
--- a/httemplate/edit/cust_location.cgi
+++ b/httemplate/edit/cust_location.cgi
@@ -17,10 +17,21 @@ ACTION="<% $p %>edit/process/cust_location.cgi" METHOD=POST>
 &>
 <& /elements/standardize_locations.html,
             'form'          => 'EditLocationForm',
-            'callback'      => 'document.EditLocationForm.submit();',
+            'callback'    => $conf->exists('tax_district_method')
+                              ? 'wa_state_tax_district()'
+                              : 'submit_continue()',
             'with_census'   => 1,
             'with_census_functions' => 1,
 &>
+<script>
+  <& /elements/wa_state_tax_district.js &>
+
+  // wa_sate_tax_district() will call submit_continue() upon success,
+  //   or submit_abort() upon error
+  function submit_continue() {
+    document.EditLocationForm.submit();
+  }
+</script>
 </TABLE>
 
 <BR>
diff --git a/httemplate/edit/cust_main/bottomfixup.js b/httemplate/edit/cust_main/bottomfixup.js
index 97816aad7..d2a277b2f 100644
--- a/httemplate/edit/cust_main/bottomfixup.js
+++ b/httemplate/edit/cust_main/bottomfixup.js
@@ -7,6 +7,9 @@ my $company_longitude = $conf->config('company_longitude');
 
 my @fixups = ('standardize_locations');
 
+push @fixups, 'wa_state_tax_district'
+  if $conf->exists('tax_district_method');
+
 push @fixups, 'confirm_censustract_bill', 'confirm_censustract_ship'
     if $conf->exists('cust_main-require_censustract');
 
@@ -57,6 +60,8 @@ function do_submit() {
   'with_census' => 1, # no with_firm, apparently
 &>
 
+<& /elements/wa_state_tax_district.js &>
+
 % # the value in pre+'censustract' is the confirmed censustract (either from
 % # the previous saved record, or from address standardization (if the backend
 % # supports it), or from an aborted previous submit. only need to reconfirm
diff --git a/httemplate/elements/tr-select-cust_location.html b/httemplate/elements/tr-select-cust_location.html
index 7a2d886d3..1e6cf5b7f 100644
--- a/httemplate/elements/tr-select-cust_location.html
+++ b/httemplate/elements/tr-select-cust_location.html
@@ -202,6 +202,7 @@ Example:
      'alt_format'         => $opt{'alt_format'},
      'enable_coords'      => 1,
      'enable_censustract' => 1,
+     'enable_district'    => $conf->exists('tax_district_method') ? 1 : 0,
 &>
 
 <SCRIPT TYPE="text/javascript">
diff --git a/httemplate/elements/wa_state_tax_district.js b/httemplate/elements/wa_state_tax_district.js
new file mode 100644
index 000000000..03f262b52
--- /dev/null
+++ b/httemplate/elements/wa_state_tax_district.js
@@ -0,0 +1,159 @@
+<%doc>
+
+Provide js function in support of a lookup hook for wa_state_tax_districts
+
+wa_state_tax_district()
+* Checks form_address_info() to collect address data
+* If any addresses are in Washington State,
+* Uses misc/xmlhttp-wa_state-find_district_for_address.html to query
+  wa state tax districting database
+* Displays error, or updates the district input element for the addresses
+* Calls submit_continue() upon success
+* Calls submit_abort() upon error
+
+</%doc>
+
+function wa_state_tax_district() {
+  // Queries the WA State API to get a Tax District for this address
+  // upon failure: User can choose to skip or cancel
+  // upon success: set value of district input box and submit_continue()
+
+  address_info = form_address_info();
+  // console.log( address_info );
+
+  if (
+       address_info['state'] != 'WA'
+    && address_info['state'] != 'wa'
+    && address_info['bill_state'] != 'WA'
+    && address_info['bill_state'] != 'wa'
+    && (
+      address_info['same']
+      || (
+        address_info['ship_state'] != 'WA'
+        && address_info['ship_state'] != 'wa'
+      )
+    )
+  ) {
+    // nothing to do, not in Washington state
+    submit_continue();
+    return;
+  }
+
+  wa_state_tax_district_overlib( 'Looking up tax district... please wait...' );
+
+  $.post({
+    url: "<% $fsurl %>misc/xmlhttp-wa_state-find_district_for_address.html",
+    data: address_info,
+    success: function(response) {
+      // console.log(response);
+
+      let error = '';
+      if ( response['error'] ) {
+        error = error + response['error'] + ' ';
+      }
+
+      // populate Billing Address district into form, or record error
+      if ( response['bill'] && response['bill']['district'] ) {
+        $('#bill_district').val( response['bill']['district'] );
+      }
+      else if ( response['bill'] && response['bill']['error'] ) {
+        error = error + 'Cound not set tax district for billing address. ';
+      }
+
+      // populate Shipping Address district into form, or record error
+      if (
+        ! address_info['same']
+        && response['ship']
+        && response['ship']['district']
+      ) {
+        $('#ship_district').val( response['ship']['district'] );
+      }
+      else if (
+        ! address_info['same']
+        && response['ship']
+        && response['ship']['error']
+      ) {
+        error = error + 'Could not set tax district for service address. ';
+      }
+
+      // populate Plain Address district into form, or record error
+      if (
+        response['address']
+        && response['address']['district']
+      ) {
+        $('#district').val( response['address']['district'] );
+      }
+      else if (
+        response['address']
+        && response['address']['error']
+      ) {
+        error = error + 'Could not set tax district for address. ';
+      }
+
+      if ( error ) {
+        wa_state_tax_district_overlib(
+          'An error occured determining Washington state tax district:<br>'
+          + '<br>'
+          + error + '<br>'
+          + '<br>'
+          + 'If you choose to skip this step, taxes will not be calculated '
+          + 'for this customer, unless you enter a tax district manually.'
+          + '<br>'
+          + '<a href="https://webgis.dor.wa.gov/taxratelookup/SalesTax.aspx" target="_blank">See WA Dept of Revenue</a>'
+        );
+      }
+      else {
+        cClick();
+        submit_continue();
+        return;
+      }
+
+    }
+  })
+  .fail(function() {
+    wa_state_tax_district_overlib(
+      'A network error occured determining Washington state tax district:<br>'
+      + '<br>'
+      + 'If you choose to skip this step, taxes will not be calculated '
+      + 'for this customer, unless you enter a tax district manually.'
+      + '<br>'
+      + '<a href="https://webgis.dor.wa.gov/taxratelookup/SalesTax.aspx" target="_blank">See WA Dept of Revenue</a>'
+    );
+  });
+}
+
+function wa_state_tax_district_overlib(html) {
+  html =
+      '<div style="text-align: center;">'
+    +   '<h2>Washington State Tax District Lookup</h2>'
+    +   '<p>' + html + '</p>'
+    + '<a href="#" onclick="wa_state_tax_district_skip()">skip</a>'
+    + ' | '
+    + '<a href="#" onclick="wa_state_tax_district_cancel()">cancel</a>'
+    + '</div>';
+
+  overlib(
+    html,
+    CAPTION, 'WA State Tax District',
+    STICKY,
+    CLOSETEXT, '',
+    MIDX, 0,
+    MIDY, 0,
+    WIDTH, 500,
+    BGCOLOR, '#339',
+    CGCOLOR, '#339',
+    TEXTSIZE, 3
+  );
+}
+
+function wa_state_tax_district_skip() {
+  // Click target to skip tax district determination
+  cClick()
+  submit_continue();
+}
+
+function wa_state_tax_district_cancel() {
+  // Click target to cancel submit from tax district determination
+  cClick()
+  submit_abort();
+}
diff --git a/httemplate/misc/change_pkg.cgi b/httemplate/misc/change_pkg.cgi
index c588c9e6c..9729c6b5f 100755
--- a/httemplate/misc/change_pkg.cgi
+++ b/httemplate/misc/change_pkg.cgi
@@ -119,9 +119,21 @@
             'form'        => "OrderPkgForm",
             'with_census' => 1,
             'with_census_functions' => 1,
-            'callback'   => 'document.OrderPkgForm.submit()',
+            'callback'    => $conf->exists('tax_district_method')
+                              ? 'wa_state_tax_district()'
+                              : 'submit_continue()',
 &>
 
+<script>
+  <& /elements/wa_state_tax_district.js &>
+
+  // wa_sate_tax_district() will call submit_continue() upon success,
+  //   or submit_abort() upon error
+  function submit_continue() {
+    document.OrderPkgForm.submit();
+  }
+</script>
+
 <INPUT NAME    = "submitButton"
        TYPE    = "button"
        VALUE   = "<% mt("Change package") |h %>"
diff --git a/httemplate/misc/order_pkg.html b/httemplate/misc/order_pkg.html
index 1efe7456e..7a63b5c2b 100644
--- a/httemplate/misc/order_pkg.html
+++ b/httemplate/misc/order_pkg.html
@@ -188,11 +188,23 @@
 
   <& /elements/standardize_locations.html,
                 'form'        => "OrderPkgForm",
-                'callback'    => 'document.OrderPkgForm.submit()',
+                'callback'    => $conf->exists('tax_district_method')
+                                 ? 'wa_state_tax_district()'
+                                 : 'submit_continue()',
                 'with_census' => 1,
                 'with_census_functions' => 1,
   &>
 
+  <script>
+    <& /elements/wa_state_tax_district.js &>
+
+    // wa_sate_tax_district() will call submit_continue() upon success,
+    //   or submit_abort() upon error
+    function submit_continue() {
+      document.OrderPkgForm.submit();
+    }
+  </script>
+
 % }
 
 % if ($quotationnum) {
diff --git a/httemplate/misc/xmlhttp-wa_state-find_district_for_address.html b/httemplate/misc/xmlhttp-wa_state-find_district_for_address.html
new file mode 100644
index 000000000..e59789bd1
--- /dev/null
+++ b/httemplate/misc/xmlhttp-wa_state-find_district_for_address.html
@@ -0,0 +1,76 @@
+<%doc>
+
+Expects POST keys:
+* address1
+* address2
+* city
+* state
+* zip
+* country
+
+Also accepts all the above keys with the prefixes bill_ and ship_
+
+Returns json with a key for each given address, e.g., whose value is
+the tax district number. e.g.
+{
+  address: {
+    district: 1234
+    tax: 7.9
+    exempt_amount: 0
+    city: MOXEE CITY
+    state: WA
+  },
+  bill: {
+    error: district not found
+    district:
+  },
+}
+
+</%doc>
+<% encode_json($return) %>
+<%init>
+use Data::Dumper;
+use FS::Misc::Geo;
+
+http_header('Content-Type' => 'application/json');
+
+my $DEBUG = 0;
+my %param = ( $cgi->Vars );
+my $return = {};
+
+warn '$param: '.Dumper( \%param )."\n"
+  if $DEBUG;
+
+my %address;
+for my $prefix ( '', 'bill', 'ship' ) {
+  my $addr_key = $prefix || 'address';
+  $address{$addr_key} = {};
+  $address{$addr_key}->{$_} = $param{ $prefix ? "${prefix}_${_}" : $_ }
+    for qw/ address1 address2 city state zip country /;
+  delete $address{$addr_key}
+    unless $address{$addr_key}->{address1}
+        && $address{$addr_key}->{city};
+}
+warn Dumper( \%address )
+  if $DEBUG;
+
+for my $k ( keys %address ) {
+  next unless lc $address{$k}->{state} eq 'wa';
+  my $response = FS::Misc::Geo::wa_sales( $address{$k} );
+  warn Dumper( $response )
+    if $DEBUG;
+
+  if ( ref $response ) {
+    $return->{$k} = $response;
+  } else {
+    $return->{$k} = { error => 'Lookup Failed' };
+  }
+}
+
+unless ( keys %$return ) {
+  $return->{error} = 'No WA addresses passed for lookup - nothing to do';
+}
+
+warn '$return: '.Dumper( $return )."\n"
+  if $DEBUG;
+</%init>

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/cust_location.pm                             |  17 ++-
 FS/FS/cust_main.pm                                 |  14 --
 httemplate/edit/cust_location.cgi                  |  13 +-
 httemplate/edit/cust_main/bottomfixup.js           |   5 +
 httemplate/elements/tr-select-cust_location.html   |   1 +
 httemplate/elements/wa_state_tax_district.js       | 159 +++++++++++++++++++++
 httemplate/misc/change_pkg.cgi                     |  14 +-
 httemplate/misc/order_pkg.html                     |  14 +-
 ...xmlhttp-wa_state-find_district_for_address.html |  76 ++++++++++
 9 files changed, 293 insertions(+), 20 deletions(-)
 create mode 100644 httemplate/elements/wa_state_tax_district.js
 create mode 100644 httemplate/misc/xmlhttp-wa_state-find_district_for_address.html




More information about the freeside-commits mailing list