solidus_avatax_certified 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.env_example +4 -0
- data/.gitignore +16 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/GEM_VERSION +1 -0
- data/Gemfile +18 -0
- data/LICENSE +26 -0
- data/README.md +27 -0
- data/Rakefile +21 -0
- data/app/assets/javascripts/spree/backend/address_validator.js +84 -0
- data/app/assets/javascripts/spree/backend/solidus_avatax_certified.js +5 -0
- data/app/assets/javascripts/spree/backend/use_code_picker.js +51 -0
- data/app/assets/javascripts/spree/frontend/address_validator.js +87 -0
- data/app/assets/javascripts/spree/frontend/flash.js.coffee +26 -0
- data/app/assets/javascripts/spree/frontend/solidus_avatax_certified.js +4 -0
- data/app/assets/stylesheets/spree/backend/solidus_avatax_certified.css +4 -0
- data/app/assets/stylesheets/spree/frontend/solidus_avatax_certified.css +4 -0
- data/app/controllers/spree/admin/avalara_entity_use_codes_controller.rb +15 -0
- data/app/controllers/spree/admin/avatax_settings_controller.rb +82 -0
- data/app/controllers/spree/admin/users_controller_decorator.rb +11 -0
- data/app/controllers/spree/checkout_controller_decorator.rb +22 -0
- data/app/models/solidus_avatax_certified/address.rb +95 -0
- data/app/models/solidus_avatax_certified/avatax_log.rb +69 -0
- data/app/models/solidus_avatax_certified/line.rb +146 -0
- data/app/models/solidus_avatax_certified/preference_updater.rb +74 -0
- data/app/models/spree/address_decorator.rb +13 -0
- data/app/models/spree/adjustment_decorator.rb +10 -0
- data/app/models/spree/avalara_entity_use_code.rb +5 -0
- data/app/models/spree/avalara_preference.rb +72 -0
- data/app/models/spree/avalara_transaction.rb +181 -0
- data/app/models/spree/calculator/avalara_transaction.rb +86 -0
- data/app/models/spree/line_item_decorator.rb +25 -0
- data/app/models/spree/order_decorator.rb +85 -0
- data/app/models/spree/payment_decorator.rb +23 -0
- data/app/models/spree/refund_decorator.rb +30 -0
- data/app/models/spree/shipment_decorator.rb +28 -0
- data/app/models/spree/shipping_rate_decorator.rb +25 -0
- data/app/models/spree/user_decorator.rb +3 -0
- data/app/models/tax_svc.rb +143 -0
- data/app/overrides/spree/admin/shared/_configuration_menu.rb +10 -0
- data/app/overrides/spree/admin/users/sidebar.rb +8 -0
- data/app/overrides/spree/admin/users/validation_button.rb +6 -0
- data/app/views/spree/admin/avalara_entity_use_codes/_form.html.erb +27 -0
- data/app/views/spree/admin/avalara_entity_use_codes/edit.html.erb +16 -0
- data/app/views/spree/admin/avalara_entity_use_codes/index.html.erb +33 -0
- data/app/views/spree/admin/avalara_entity_use_codes/new.html.erb +17 -0
- data/app/views/spree/admin/avalara_entity_use_codes/show.html.erb +24 -0
- data/app/views/spree/admin/avatax_settings/edit.html.erb +183 -0
- data/app/views/spree/admin/avatax_settings/ping_my_service.js.erb +8 -0
- data/app/views/spree/admin/avatax_settings/show.html.erb +124 -0
- data/app/views/spree/admin/avatax_settings/validate_address.js.erb +8 -0
- data/app/views/spree/admin/users/avalara_information.html.erb +53 -0
- data/app/views/spree/checkout/_address.html.erb +35 -0
- data/app/views/spree/checkout/_address_validator_button.html.erb +3 -0
- data/bin/rails +7 -0
- data/circle.yml +17 -0
- data/config/initializers/avatax.rb +5 -0
- data/config/initializers/spree.rb +3 -0
- data/config/locales/en.yml +35 -0
- data/config/routes.rb +18 -0
- data/db/migrate/20160624154205_create_spree_avalara_transactions.rb +9 -0
- data/db/migrate/20160624154423_create_spree_avalara_entity_use_codes.rb +9 -0
- data/db/migrate/20160624155217_add_columns_to_spree_users.rb +6 -0
- data/db/migrate/20160628200504_create_spree_avalara_preferences.rb +10 -0
- data/db/migrate/20160805193512_add_vat_id_to_spree_users.rb +5 -0
- data/db/seeds.rb +1 -0
- data/lib/generators/solidus_avatax_certified/install/install_generator.rb +45 -0
- data/lib/solidus_avatax_certified/engine.rb +22 -0
- data/lib/solidus_avatax_certified/preference_seeder.rb +69 -0
- data/lib/solidus_avatax_certified/seeder.rb +117 -0
- data/lib/solidus_avatax_certified.rb +2 -0
- data/lib/tasks/load_seeds.rake +15 -0
- data/setup.md +12 -0
- data/solidus_avatax_certified.gemspec +42 -0
- data/spec/controllers/spree/admin/avalara_entity_use_codes_controller_spec.rb +53 -0
- data/spec/controllers/spree/admin/avatax_settings_controller_spec.rb +67 -0
- data/spec/factories/avalara_entity_use_code_factory.rb +6 -0
- data/spec/factories/avalara_factories.rb +76 -0
- data/spec/factories/avalara_order_factory.rb +62 -0
- data/spec/factories/avalara_preference_factory.rb +7 -0
- data/spec/factories/avalara_shipment_factory.rb +27 -0
- data/spec/factories/avalara_shipping_method_factory.rb +23 -0
- data/spec/factories/tax_rate_factory.rb +19 -0
- data/spec/features/certification_spec.rb +77 -0
- data/spec/features/checkout_spec.rb +156 -0
- data/spec/features/vat_spec.rb +153 -0
- data/spec/models/solidus_avatax_certified/address_spec.rb +80 -0
- data/spec/models/solidus_avatax_certified/avatax_log_spec.rb +97 -0
- data/spec/models/solidus_avatax_certified/line_spec.rb +100 -0
- data/spec/models/spree/address_decorator_spec.rb +44 -0
- data/spec/models/spree/adjustment_decorator_spec.rb +25 -0
- data/spec/models/spree/avalara_entity_use_code_spec.rb +5 -0
- data/spec/models/spree/avalara_preference_spec.rb +173 -0
- data/spec/models/spree/avalara_transaction_spec.rb +203 -0
- data/spec/models/spree/calculator/avalara_transaction_spec.rb +129 -0
- data/spec/models/spree/line_item_decorator_spec.rb +33 -0
- data/spec/models/spree/order_decorator_spec.rb +164 -0
- data/spec/models/spree/payment_decorator_spec.rb +117 -0
- data/spec/models/spree/refund_decorator_spec.rb +81 -0
- data/spec/models/spree/shipment_decorator_spec.rb +36 -0
- data/spec/models/spree/shipping_rate_decorator_spec.rb +17 -0
- data/spec/models/spree/user_decorator_spec.rb +5 -0
- data/spec/spec_helper.rb +81 -0
- data/spec/support/avatax_config_preferences.rb +8 -0
- data/spec/support/vcr.rb +9 -0
- data/spec/vcr/Certification/Exempt_sales_should_be_reflected_in_the_test_data_through_use_of_ExemptionNo_or_CustomerUsageType_/does_not_add_additional_tax.yml +276 -0
- data/spec/vcr/Certification/Transactions_have_been_committed_/commits_an_order.yml +336 -0
- data/spec/vcr/Certification/Transactions_have_been_voided/cancelled_/should_be_successful/returns_ResultCode_with_value_Success.yml +522 -0
- data/spec/vcr/Certification/return_orders/_commit_avatax_final/should_commit_avatax_final.yml +404 -0
- data/spec/vcr/Checkout/complete_order/has_tax_and_shipping_tax_adjustments_on_page.yml +72 -0
- data/spec/vcr/Checkout/complete_order/order_line_items_and_shipments_have_an_additional_tax_total_sum_of_0_40.yml +72 -0
- data/spec/vcr/Checkout/payment/tax_included/has_tax_and_shipping_tax_adjustments_on_page.yml +72 -0
- data/spec/vcr/Checkout/payment/tax_included/order_line_items_and_shipments_have_an_included_tax_total_sum_of_0_38.yml +72 -0
- data/spec/vcr/Checkout/payment/tax_not_included/on_payment_page/has_tax_and_shipping_tax_adjustments_on_page.yml +72 -0
- data/spec/vcr/Checkout/payment/tax_not_included/on_payment_page/order_line_items_and_shipments_and_shipments_have_an_additional_tax_total_sum_of_0_40.yml +72 -0
- data/spec/vcr/Checkout/payment/with_promotion/tax_not_included/has_adjusted_tax_amount_after_promotion_applied.yml +73 -0
- data/spec/vcr/SolidusAvataxCertified_Address/_validate/fails_when_information_is_incorrect.yml +54 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_included_in_price/should_be_equal_to_the_item_pre-tax_total_rate.yml +137 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_included_in_price/should_be_equal_to_the_previous_included_tax_total_is_order_is_at_address.yml +138 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_included_in_price/should_be_equal_to_the_previous_included_tax_total_is_order_is_at_cart.yml +137 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_not_included_in_price/should_be_equal_to_the_item_pre-tax_total_rate.yml +136 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_not_included_in_price/should_be_equal_to_the_previous_additional_tax_total_if_order_is_at_address.yml +137 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_not_included_in_price/should_be_equal_to_the_previous_additional_tax_total_if_order_is_at_cart.yml +136 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_not_included_in_price/should_be_equal_to_the_previous_tax_total_if_preference_tax_calculation_is_false.yml +136 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_not_included_in_price/when_the_line_item_is_discounted/should_be_equal_to_the_items_pre-tax_total_rate.yml +276 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_computing_a_line_item/when_tax_is_not_included_in_price/when_the_order_is_discounted/should_be_equal_to_the_items_pre-tax_total_rate.yml +206 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_given_a_shipment/computing_normal_shipment/should_be_equal_4_0.yml +141 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_given_a_shipment/when_tax_is_included_in_price/should_be_equal_to_3_85.yml +143 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_given_a_shipment/with_promotion/should_equal_3_96.yml +210 -0
- data/spec/vcr/Spree_Calculator_AvalaraTransaction/_compute/when_given_an_order/when_computing_an_order/should_raise_error.yml +136 -0
- data/spec/vcr/Spree_Order/_cancel_avalara/should_receive_cancel_order_when_cancel_avalara_is_called.yml +136 -0
- data/spec/vcr/Spree_Order/_cancel_avalara/state_machine_event_cancel/should_recieve_cancel_avalara_when_event_cancel_is_called.yml +259 -0
- data/spec/vcr/Spree_Order/_validate_ship_address/should_return_false_if_validation_failed.yml +54 -0
- data/spec/vcr/Spree_Order/_validate_ship_address/should_return_the_response_if_refuse_checkout_on_address_validation_is_disabled.yml +59 -0
- data/spec/vcr/Spree_Order/_validate_ship_address/should_return_the_response_if_validation_is_success.yml +59 -0
- data/spec/vcr/Spree_Payment/_avalara_finalize/should_update_the_amount_to_be_the_order_total.yml +136 -0
- data/spec/vcr/Spree_Payment/_cancel_avalara/committed_order/should_be_successful/ResultCode_returns_Success.yml +205 -0
- data/spec/vcr/Spree_Payment/_cancel_avalara/uncommitted_order/should_fail/ResultCode_returns_Error.yml +191 -0
- data/spec/vcr/Spree_Payment/_purchase_/receive_avalara_finalize.yml +136 -0
- data/spec/vcr/Spree_Payment/_void_transaction_/receive_cancel_avalara.yml +136 -0
- data/spec/vcr/Spree_Refund/full_refund/returns_correct_tax_calculations.yml +270 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_in_another_EU_country/Seller_does_not_have_Nexus_Jurisdition_Registered/TotalTax_is_equal_to_order_included_tax_total.yml +137 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_in_another_EU_country/Seller_does_not_have_Nexus_Jurisdition_Registered/origin_country_tax_is_returned.yml +138 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_in_another_EU_country/Seller_does_not_have_Nexus_Jurisdition_Registered/with_BusinessIdentificationNo/origin_country_zero_rate_is_returned.yml +143 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_in_another_EU_country/Seller_has_Nexus_Jurisdition_Registered/TotalTax_is_equal_to_order_included_tax_total.yml +139 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_in_another_EU_country/Seller_has_Nexus_Jurisdition_Registered/destination_country_tax_is_returned.yml +139 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_in_another_EU_country/Seller_has_Nexus_Jurisdition_Registered/with_BusinessIdentificationNo/origin_country_zero_rate_is_returned.yml +144 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_in_same_EU_country/TotalTax_is_equal_to_order_included_tax_total.yml +137 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_in_same_EU_country/tax_detail_country_equals_to_IT.yml +138 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_is_outside_EU/Seller_does_not_have_Nexus_Jurisdition_registered/TotalTax_is_equal_to_order_included_tax_total.yml +137 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_is_outside_EU/Seller_does_not_have_Nexus_Jurisdition_registered/tax_detail_country_equals_to_IT.yml +137 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_is_outside_EU/Seller_does_not_have_Nexus_Jurisdition_registered/total_tax_is_0_since_utah_is_not_in_jurisdiction.yml +137 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_is_outside_EU/Seller_does_not_have_Nexus_Jurisdition_registered/with_BusinessIdentificationNo/origin_country_zero_rate_is_returned.yml +138 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_is_outside_EU/Seller_has_Nexus_Jurisdiction_Registered/TotalTax_is_equal_to_order_included_tax_total.yml +195 -0
- data/spec/vcr/VAT/Seller_in_EU_country_Buyer_is_outside_EU/Seller_has_Nexus_Jurisdiction_Registered/tax_detail_region_equals_to_AL.yml +195 -0
- data/spec/vcr/address_validation_success.yml +59 -0
- data/spec/vcr/capture_with_customer_usage_type.yml +72 -0
- data/spec/vcr/order_cancel.yml +258 -0
- data/spec/vcr/order_capture.yml +72 -0
- data/spec/vcr/order_capture_finalize.yml +141 -0
- data/spec/vcr/order_capture_with_promo.yml +73 -0
- data/spec/vcr/order_return_capture.yml +68 -0
- data/spec/vcr/tax_included_order.yml +73 -0
- metadata +581 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 7a887c27e84dad711cddf9d4fb3aeae1f8f218cd
|
|
4
|
+
data.tar.gz: c0b14deafc45577a96fb16d4245b82e2e986679d
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 0d006929267b836849d0b4a8f552ad79ba1da794045d9b78fcd261051a53b659591374725b3f859930d9228f162c2a4b3fd45cf8273a66ae56fbdbeaccf78f65
|
|
7
|
+
data.tar.gz: b3f43090df24a9545a291b13e5f5bcce024cc70f74805430fd4f3bd73fc94b68c40acc9a7f528c64bb1796642655c05a979b4fa62e587bd58036dd821a1ec6fa
|
data/.env_example
ADDED
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.3.3
|
data/GEM_VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.0.0
|
data/Gemfile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
source "https://rubygems.org"
|
|
2
|
+
|
|
3
|
+
branch = ENV.fetch('SOLIDUS_BRANCH', 'v2.0')
|
|
4
|
+
gem "solidus", github: "solidusio/solidus", branch: branch
|
|
5
|
+
gem "solidus_auth_devise", github: "solidusio/solidus_auth_devise"
|
|
6
|
+
|
|
7
|
+
group :test, :development do
|
|
8
|
+
gem "pry"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
if branch == 'master' || branch >= "v2.0"
|
|
12
|
+
gem "rails-controller-testing", group: :test
|
|
13
|
+
else
|
|
14
|
+
gem "rails", '~> 4.2.7' # workaround for bundler resolution issue
|
|
15
|
+
gem "rails_test_params_backport", group: :test
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
gemspec
|
data/LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Copyright (c) 2016 [name of plugin creator]
|
|
2
|
+
All rights reserved.
|
|
3
|
+
|
|
4
|
+
Redistribution and use in source and binary forms, with or without modification,
|
|
5
|
+
are permitted provided that the following conditions are met:
|
|
6
|
+
|
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
|
8
|
+
this list of conditions and the following disclaimer.
|
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
|
11
|
+
and/or other materials provided with the distribution.
|
|
12
|
+
* Neither the name Spree nor the names of its contributors may be used to
|
|
13
|
+
endorse or promote products derived from this software without specific
|
|
14
|
+
prior written permission.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
20
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
SolidusAvataxCertified
|
|
2
|
+
===========
|
|
3
|
+
|
|
4
|
+
SolidusAvataxCertified is the *only* [officially certified Avatax solution](http://www.avalara.com/avalara-certified/) that integrates with Solidus. With this extension you can add instantaneous sales tax decisions to your store.
|
|
5
|
+
|
|
6
|
+
From Avalara's own explanation of the certification program:
|
|
7
|
+
|
|
8
|
+
> Relax. It’s certified.
|
|
9
|
+
>
|
|
10
|
+
> Our “Certified for AvaTax” Program features integrations that perform at the highest level, providing the best possible customer experience.
|
|
11
|
+
|
|
12
|
+
> Avalara’s partners who have created certified integrations for AvaTax have demonstrated that those integrations contain elements which are essential to providing customers with easy-to-use software that gives accurate sales tax calculations. The certification criteria used to demonstrate these elements are based on Avalara’s years of experience integrating into ERP, ecommerce and point-of-sale applications.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
**[For Installation and Setup instructions, please visit our wiki.](https://github.com/boomerdigital/solidus_avatax_certified/wiki)**
|
|
16
|
+
|
|
17
|
+
Testing
|
|
18
|
+
-------
|
|
19
|
+
|
|
20
|
+
Be sure to bundle your dependencies and then create a dummy test app for the specs to run against.
|
|
21
|
+
|
|
22
|
+
$ bundle
|
|
23
|
+
$ bundle exec rake test_app
|
|
24
|
+
$ bundle exec rspec spec
|
|
25
|
+
|
|
26
|
+
Copyright (c) 2016 Boomer Digital LLC, released under the New BSD License
|
|
27
|
+
|
data/Rakefile
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'bundler'
|
|
2
|
+
Bundler::GemHelper.install_tasks
|
|
3
|
+
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
5
|
+
require 'spree/testing_support/extension_rake'
|
|
6
|
+
|
|
7
|
+
RSpec::Core::RakeTask.new
|
|
8
|
+
|
|
9
|
+
task :default do
|
|
10
|
+
if Dir["spec/dummy"].empty?
|
|
11
|
+
Rake::Task[:test_app].invoke
|
|
12
|
+
Dir.chdir("../../")
|
|
13
|
+
end
|
|
14
|
+
Rake::Task[:spec].invoke
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
desc 'Generates a dummy app for testing'
|
|
18
|
+
task :test_app do
|
|
19
|
+
ENV['LIB_NAME'] = 'solidus_avatax_certified'
|
|
20
|
+
Rake::Task['extension:test_app'].invoke
|
|
21
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
Spree.ready(function(){
|
|
2
|
+
validator = new AddressValidator();
|
|
3
|
+
validator.bindListeners();
|
|
4
|
+
});
|
|
5
|
+
|
|
6
|
+
function AddressValidator(){
|
|
7
|
+
this.lineHash = {
|
|
8
|
+
address1: "Line1",
|
|
9
|
+
address2: "Line2",
|
|
10
|
+
city: "City",
|
|
11
|
+
zipcode: "PostalCode",
|
|
12
|
+
country: "Country",
|
|
13
|
+
state: "Region"
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
AddressValidator.prototype = {
|
|
18
|
+
bindListeners: function(){
|
|
19
|
+
$(".address_validator").on("click", this.validate.bind(this));
|
|
20
|
+
},
|
|
21
|
+
validate: function(){
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
var address = this.formatAddress();
|
|
24
|
+
|
|
25
|
+
$.ajax({
|
|
26
|
+
url: Spree.routes.validate_address,
|
|
27
|
+
data: {
|
|
28
|
+
address: address
|
|
29
|
+
}
|
|
30
|
+
}).done(function(data){
|
|
31
|
+
var controller = this;
|
|
32
|
+
var wrapper = controller.addressWrapper();
|
|
33
|
+
|
|
34
|
+
if (data['ResultCode'] === 'Error') {
|
|
35
|
+
return this.showFlash(data);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
$.each(["Line1", "Line2", "City", "PostalCode"], function(index, value){
|
|
39
|
+
var keyVal = controller.getKeyByValue(value);
|
|
40
|
+
$(wrapper + " input[id*='" + keyVal + "']").val(data.Address[value]);
|
|
41
|
+
}.bind(address));
|
|
42
|
+
|
|
43
|
+
this.showFlash(data);
|
|
44
|
+
}.bind(this));
|
|
45
|
+
},
|
|
46
|
+
formatAddress: function() {
|
|
47
|
+
var address = {};
|
|
48
|
+
controller = this;
|
|
49
|
+
var wrapper = controller.addressWrapper();
|
|
50
|
+
|
|
51
|
+
$(wrapper + " input").not("[name$='name]']").not("[class*=select2]").each(function(){
|
|
52
|
+
var id = $(this).attr("id");
|
|
53
|
+
var line = controller.lineHash[id.split("_").pop()];
|
|
54
|
+
address[line] = $(this).val();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
$(wrapper + " select.select2").each(function(){
|
|
58
|
+
var line = controller.lineHash[$(this).attr("id")];
|
|
59
|
+
address[line] = $(this).select2("val");
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return address;
|
|
63
|
+
},
|
|
64
|
+
getKeyByValue: function(value) {
|
|
65
|
+
return Object.keys(this.lineHash).find(function(key){ return this[key] === value}.bind(this.lineHash));
|
|
66
|
+
},
|
|
67
|
+
showFlash: function(data){
|
|
68
|
+
var resultCode = data.ResultCode.toLowerCase();
|
|
69
|
+
|
|
70
|
+
if(resultCode === "success") {
|
|
71
|
+
window.show_flash("success", "Address Validation Successful");
|
|
72
|
+
} else {
|
|
73
|
+
details = $(data['Messages']).map(function(){return this['Summary']}).get().join(' ');
|
|
74
|
+
window.show_flash("error", "Address Validation Error: " + details);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
addressWrapper: function(){
|
|
78
|
+
if($("#shipping").length != 0){
|
|
79
|
+
return "#shipping";
|
|
80
|
+
} else {
|
|
81
|
+
return "#business-address";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
$.fn.usecodeAutocomplete = function () {
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
this.select2({
|
|
5
|
+
minimumInputLength: 1,
|
|
6
|
+
multiple: false,
|
|
7
|
+
initSelection: function (element, callback) {
|
|
8
|
+
Spree.ajax({
|
|
9
|
+
url: Spree.routes.use_code_search,
|
|
10
|
+
data: {
|
|
11
|
+
ids: element.val()
|
|
12
|
+
},
|
|
13
|
+
success: function(data) {
|
|
14
|
+
callback(data[0]);
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
},
|
|
18
|
+
ajax: {
|
|
19
|
+
url: Spree.routes.use_code_search,
|
|
20
|
+
datatype: 'json',
|
|
21
|
+
data: function (term) {
|
|
22
|
+
return {
|
|
23
|
+
q: term
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
results: function (data) {
|
|
27
|
+
return {
|
|
28
|
+
results: data
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
formatResult: function (use_codes) {
|
|
33
|
+
if( !use_codes.use_code ){
|
|
34
|
+
return "Enter Avalara Entity Use Code"
|
|
35
|
+
} else {
|
|
36
|
+
return use_codes.use_code + ') Description: ' + use_codes.use_code_description;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
formatSelection: function (use_codes) {
|
|
40
|
+
if( !use_codes.use_code ){
|
|
41
|
+
return "Enter Avalara Entity Use Code"
|
|
42
|
+
} else {
|
|
43
|
+
return use_codes.use_code + ') Description: ' + use_codes.use_code_description;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
$(document).ready(function () {
|
|
50
|
+
$('.use_code_picker').usecodeAutocomplete();
|
|
51
|
+
});
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
Spree.ready(function(){
|
|
2
|
+
validator = new AddressValidator();
|
|
3
|
+
validator.bindListeners();
|
|
4
|
+
});
|
|
5
|
+
|
|
6
|
+
function AddressValidator(){
|
|
7
|
+
this.lineHash = {
|
|
8
|
+
address1: "Line1",
|
|
9
|
+
address2: "Line2",
|
|
10
|
+
city: "City",
|
|
11
|
+
zipcode: "PostalCode",
|
|
12
|
+
country: "Country",
|
|
13
|
+
state: "Region"
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
AddressValidator.prototype = {
|
|
18
|
+
bindListeners: function(){
|
|
19
|
+
$(".address_validator").on("click", this.validate.bind(this));
|
|
20
|
+
},
|
|
21
|
+
validate: function(){
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
$("#checkout_form_address").validate().form();
|
|
24
|
+
var address = this.formatAddress();
|
|
25
|
+
|
|
26
|
+
$.ajax({
|
|
27
|
+
url: Spree.routes.validate_address,
|
|
28
|
+
data: {
|
|
29
|
+
address: address,
|
|
30
|
+
state: "address"
|
|
31
|
+
}
|
|
32
|
+
}).done(function(data){
|
|
33
|
+
var controller = this;
|
|
34
|
+
var wrapper = controller.addressWrapper();
|
|
35
|
+
|
|
36
|
+
if (data['ResultCode'] === 'Error') {
|
|
37
|
+
return this.showFlash(data);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
$.each(["Line1", "Line2", "City", "PostalCode"], function(index, value){
|
|
41
|
+
var keyVal = controller.getKeyByValue(value);
|
|
42
|
+
$(wrapper + " input[id*='" + keyVal + "']").val(data.Address[value]);
|
|
43
|
+
}.bind(address));
|
|
44
|
+
|
|
45
|
+
this.showFlash(data);
|
|
46
|
+
}.bind(this));
|
|
47
|
+
},
|
|
48
|
+
formatAddress: function() {
|
|
49
|
+
var address = {};
|
|
50
|
+
controller = this;
|
|
51
|
+
var wrapper = controller.addressWrapper();
|
|
52
|
+
|
|
53
|
+
$(wrapper + " input").not("select").each(function(){
|
|
54
|
+
var id = $(this).attr("id");
|
|
55
|
+
var line = controller.lineHash[id.split("_").pop()];
|
|
56
|
+
address[line] = $(this).val();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
$(wrapper + " select").each(function(){
|
|
60
|
+
var id = $(this).attr("id");
|
|
61
|
+
var line = controller.lineHash[id.slice(0, -3).split("_").pop()];
|
|
62
|
+
address[line] = $(this).val();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return address;
|
|
66
|
+
},
|
|
67
|
+
getKeyByValue: function(value) {
|
|
68
|
+
return Object.keys(this.lineHash).find(function(key){ return this[key] === value}.bind(this.lineHash));
|
|
69
|
+
},
|
|
70
|
+
showFlash: function(data){
|
|
71
|
+
var resultCode = data.ResultCode.toLowerCase();
|
|
72
|
+
|
|
73
|
+
if(resultCode === "success") {
|
|
74
|
+
window.show_flash("success", "Address Validation Successful");
|
|
75
|
+
} else {
|
|
76
|
+
details = $(data['Messages']).map(function(){return this['Summary']}).get().join(' ');
|
|
77
|
+
window.show_flash("error", "Address Validation Error: " + details);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
addressWrapper: function(){
|
|
81
|
+
if($("#order_use_billing").is(":checked")){
|
|
82
|
+
return "#billing";
|
|
83
|
+
} else {
|
|
84
|
+
return "#shipping";
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
showTime = 5000
|
|
2
|
+
fadeOutTime = 500
|
|
3
|
+
|
|
4
|
+
Spree.ready ($) ->
|
|
5
|
+
# Make flash messages dissapear
|
|
6
|
+
# We only want to target the flash messages which are initially on the page.
|
|
7
|
+
# Otherwise we risk hiding messages added by show_flash
|
|
8
|
+
$initialFlash = $(".flash")
|
|
9
|
+
setTimeout (->
|
|
10
|
+
$initialFlash.fadeOut(fadeOutTime)
|
|
11
|
+
), showTime
|
|
12
|
+
|
|
13
|
+
window.show_flash = (type, message) ->
|
|
14
|
+
$addressValidator = $('.address_validator')
|
|
15
|
+
|
|
16
|
+
if type == 'success'
|
|
17
|
+
$addressValidator.attr('disabled', true).text(message).addClass('flash success disabled')
|
|
18
|
+
else
|
|
19
|
+
$flashWrapper = $(".js-flash-wrapper")
|
|
20
|
+
if $flashWrapper.length == 0
|
|
21
|
+
$addressValidator.before("<div class=\"js-flash-wrapper\" />")
|
|
22
|
+
$flashWrapper = $(".js-flash-wrapper")
|
|
23
|
+
$flashWrapper.empty()
|
|
24
|
+
flash_div = $("<div class='flash " + type + "' />")
|
|
25
|
+
$flashWrapper.prepend(flash_div)
|
|
26
|
+
flash_div.html(message).show().delay(showTime).fadeOut(fadeOutTime)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Admin
|
|
3
|
+
class AvalaraEntityUseCodesController < Spree::Admin::ResourceController
|
|
4
|
+
|
|
5
|
+
def index
|
|
6
|
+
@avalara_entity_use_codes = Spree::AvalaraEntityUseCode.all
|
|
7
|
+
|
|
8
|
+
respond_to do |format|
|
|
9
|
+
format.html
|
|
10
|
+
format.json { render json: @avalara_entity_use_codes }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Admin
|
|
3
|
+
class AvataxSettingsController < Spree::Admin::BaseController
|
|
4
|
+
|
|
5
|
+
before_action :load_avatax_origin, only: [:show, :edit]
|
|
6
|
+
|
|
7
|
+
def show
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def get_file_txt_tax_svc
|
|
11
|
+
send_file "#{Rails.root}/log/tax_svc.log"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get_file_post_order_to_avalara
|
|
15
|
+
send_file "#{Rails.root}/log/post_order_to_avalara.log"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def get_file_avalara_order
|
|
19
|
+
send_file "#{Rails.root}/log/avalara_order.log"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def erase_data
|
|
23
|
+
File.open("log/#{params['log_name']}.log", 'w') {}
|
|
24
|
+
|
|
25
|
+
head :ok
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def ping_my_service
|
|
29
|
+
mytax = TaxSvc.new
|
|
30
|
+
pingResult = mytax.ping
|
|
31
|
+
if pingResult['ResultCode'] == 'Success'
|
|
32
|
+
flash[:success] = 'Ping Successful'
|
|
33
|
+
|
|
34
|
+
else
|
|
35
|
+
flash[:error] = 'Ping Error'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
respond_to do |format|
|
|
39
|
+
format.js
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def validate_address
|
|
44
|
+
mytax = TaxSvc.new
|
|
45
|
+
address = permitted_address_validation_attrs
|
|
46
|
+
|
|
47
|
+
address['Country'] = Spree::Country.find_by(id: address['Country']).try(:iso)
|
|
48
|
+
address['Region'] = Spree::State.find_by(id: address['Region']).try(:abbr)
|
|
49
|
+
|
|
50
|
+
response = mytax.validate_address(address)
|
|
51
|
+
|
|
52
|
+
respond_to do |format|
|
|
53
|
+
format.json { render json: response }
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def update
|
|
58
|
+
updater = SolidusAvataxCertified::PreferenceUpdater.new(params)
|
|
59
|
+
if updater.update
|
|
60
|
+
redirect_to admin_avatax_settings_path
|
|
61
|
+
else
|
|
62
|
+
flash[:error] = 'There was an error updating your Avalara Preferences'
|
|
63
|
+
redirect_to :back
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def load_avatax_origin
|
|
70
|
+
if Spree::AvalaraPreference.origin_address.value.blank?
|
|
71
|
+
@avatax_origin = {}
|
|
72
|
+
else
|
|
73
|
+
@avatax_origin = JSON.parse(Spree::AvalaraPreference.origin_address.value)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def permitted_address_validation_attrs
|
|
78
|
+
params['address'].permit(:Line1, :Line2, :City, :PostalCode, :Country, :Region).to_h
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Spree::CheckoutController.class_eval do
|
|
2
|
+
def validate_address
|
|
3
|
+
mytax = TaxSvc.new
|
|
4
|
+
address = permitted_address_validation_attrs
|
|
5
|
+
|
|
6
|
+
address['Country'] = Spree::Country.find_by(id: address['Country']).try(:iso)
|
|
7
|
+
address['Region'] = Spree::State.find_by(id: address['Region']).try(:abbr)
|
|
8
|
+
|
|
9
|
+
response = mytax.validate_address(address)
|
|
10
|
+
|
|
11
|
+
respond_to do |format|
|
|
12
|
+
format.json { render json: response }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def permitted_address_validation_attrs
|
|
20
|
+
params['address'].permit(:Line1, :Line2, :City, :PostalCode, :Country, :Region).to_h
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
require 'net/http'
|
|
3
|
+
require 'base64'
|
|
4
|
+
require 'logger'
|
|
5
|
+
|
|
6
|
+
module SolidusAvataxCertified
|
|
7
|
+
class Address
|
|
8
|
+
attr_reader :order, :addresses
|
|
9
|
+
|
|
10
|
+
def initialize(order)
|
|
11
|
+
@order = order
|
|
12
|
+
@ship_address = order.ship_address
|
|
13
|
+
@origin_address = JSON.parse(Spree::AvalaraPreference.origin_address.value)
|
|
14
|
+
@addresses = []
|
|
15
|
+
|
|
16
|
+
build_addresses
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def build_addresses
|
|
20
|
+
origin_address
|
|
21
|
+
order_ship_address unless @ship_address.nil?
|
|
22
|
+
origin_ship_addresses
|
|
23
|
+
|
|
24
|
+
logger.debug @addresses
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def origin_address
|
|
28
|
+
addresses << {
|
|
29
|
+
AddressCode: 'Orig',
|
|
30
|
+
Line1: @origin_address['Line1'],
|
|
31
|
+
Line2: @origin_address['Line2'],
|
|
32
|
+
City: @origin_address['City'],
|
|
33
|
+
Region: @origin_address['Region'],
|
|
34
|
+
PostalCode: @origin_address['PostalCode'],
|
|
35
|
+
Country: @origin_address['Country']
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def order_ship_address
|
|
40
|
+
addresses << {
|
|
41
|
+
AddressCode: 'Dest',
|
|
42
|
+
Line1: @ship_address.address1,
|
|
43
|
+
Line2: @ship_address.address2,
|
|
44
|
+
City: @ship_address.city,
|
|
45
|
+
Region: @ship_address.state_name,
|
|
46
|
+
Country: @ship_address.country.try(:iso),
|
|
47
|
+
PostalCode: @ship_address.zipcode
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def origin_ship_addresses
|
|
52
|
+
Spree::StockLocation.where(id: stock_loc_ids).each do |stock_location|
|
|
53
|
+
addresses << {
|
|
54
|
+
AddressCode: "#{stock_location.id}",
|
|
55
|
+
Line1: stock_location.address1,
|
|
56
|
+
Line2: stock_location.address2,
|
|
57
|
+
City: stock_location.city,
|
|
58
|
+
PostalCode: stock_location.zipcode,
|
|
59
|
+
Country: stock_location.country.try(:iso)
|
|
60
|
+
}
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def validate
|
|
65
|
+
return 'Address validation disabled' unless @ship_address.validation_enabled?
|
|
66
|
+
return @ship_address if @ship_address.nil?
|
|
67
|
+
|
|
68
|
+
address_hash = {
|
|
69
|
+
Line1: @ship_address.address1,
|
|
70
|
+
Line2: @ship_address.address2,
|
|
71
|
+
City: @ship_address.city,
|
|
72
|
+
Region: @ship_address.state.try(:abbr),
|
|
73
|
+
Country: @ship_address.country.try(:iso),
|
|
74
|
+
PostalCode: @ship_address.zipcode
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
validation_response(address_hash)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
def validation_response(address)
|
|
83
|
+
validator = TaxSvc.new
|
|
84
|
+
validator.validate_address(address)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def stock_loc_ids
|
|
88
|
+
order.shipments.pluck(:stock_location_id).uniq
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def logger
|
|
92
|
+
@logger ||= SolidusAvataxCertified::AvataxLog.new('avalara_order_addresses', 'SolidusAvataxCertified::Address', "Building Addresses for Order#: #{order.number}")
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|