spree_avatax_official 1.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.env-sample +4 -0
- data/.gitignore +22 -0
- data/.rspec +3 -0
- data/.rubocop.yml +77 -0
- data/.travis.yml +78 -0
- data/Appraisals +49 -0
- data/Gemfile +16 -0
- data/LICENSE +26 -0
- data/README.md +173 -0
- data/Rakefile +21 -0
- data/app/controllers/spree/admin/avalara_entity_use_codes_controller.rb +61 -0
- data/app/controllers/spree/admin/avatax_pings_controller.rb +19 -0
- data/app/controllers/spree/admin/avatax_settings_controller.rb +26 -0
- data/app/controllers/spree/admin/users_controller_decorator.rb +27 -0
- data/app/helpers/spree_avatax_official/http_helper.rb +17 -0
- data/app/helpers/spree_avatax_official/tax_adjustment_label_helper.rb +30 -0
- data/app/models/avatax/request_decorator.rb +34 -0
- data/app/models/spree_avatax_official/avatax_log.rb +57 -0
- data/app/models/spree_avatax_official/calculator/avatax_transaction_calculator.rb +28 -0
- data/app/models/spree_avatax_official/configuration.rb +20 -0
- data/app/models/spree_avatax_official/entity_use_code.rb +7 -0
- data/app/models/spree_avatax_official/has_uuid.rb +22 -0
- data/app/models/spree_avatax_official/spree/address_decorator.rb +31 -0
- data/app/models/spree_avatax_official/spree/inventory_unit_decorator.rb +11 -0
- data/app/models/spree_avatax_official/spree/line_item_decorator.rb +27 -0
- data/app/models/spree_avatax_official/spree/order_decorator.rb +91 -0
- data/app/models/spree_avatax_official/spree/refund_decorator.rb +22 -0
- data/app/models/spree_avatax_official/spree/shipment_decorator.rb +25 -0
- data/app/models/spree_avatax_official/spree/tax_category_decorator.rb +14 -0
- data/app/models/spree_avatax_official/spree/user_decorator.rb +11 -0
- data/app/models/spree_avatax_official/transaction.rb +27 -0
- data/app/overrides/spree/admin/shared/sub_menu/_configuration.rb +10 -0
- data/app/overrides/spree/admin/sidebar.rb +14 -0
- data/app/presenters/spree_avatax_official/address_presenter.rb +40 -0
- data/app/presenters/spree_avatax_official/item_presenter.rb +92 -0
- data/app/presenters/spree_avatax_official/ship_to_address_presenter.rb +22 -0
- data/app/presenters/spree_avatax_official/transactions/adjust_presenter.rb +31 -0
- data/app/presenters/spree_avatax_official/transactions/create_presenter.rb +80 -0
- data/app/presenters/spree_avatax_official/transactions/full_refund_presenter.rb +32 -0
- data/app/presenters/spree_avatax_official/transactions/partial_refund_presenter.rb +46 -0
- data/app/services/spree_avatax_official/address/validate.rb +27 -0
- data/app/services/spree_avatax_official/base.rb +71 -0
- data/app/services/spree_avatax_official/create_tax_adjustments_service.rb +133 -0
- data/app/services/spree_avatax_official/generate_transaction_cache_key_service.rb +94 -0
- data/app/services/spree_avatax_official/get_tax_service.rb +20 -0
- data/app/services/spree_avatax_official/settings/update_service.rb +36 -0
- data/app/services/spree_avatax_official/transactions/adjust_service.rb +36 -0
- data/app/services/spree_avatax_official/transactions/create_service.rb +47 -0
- data/app/services/spree_avatax_official/transactions/find_order_transaction_service.rb +23 -0
- data/app/services/spree_avatax_official/transactions/full_refund_service.rb +36 -0
- data/app/services/spree_avatax_official/transactions/get_by_code_service.rb +32 -0
- data/app/services/spree_avatax_official/transactions/partial_refund_service.rb +33 -0
- data/app/services/spree_avatax_official/transactions/refund_service.rb +87 -0
- data/app/services/spree_avatax_official/transactions/void_service.rb +28 -0
- data/app/services/spree_avatax_official/utilities/ping_service.rb +9 -0
- data/app/views/spree/admin/avalara_entity_use_codes/_form.html.erb +20 -0
- data/app/views/spree/admin/avalara_entity_use_codes/edit.html.erb +12 -0
- data/app/views/spree/admin/avalara_entity_use_codes/index.html.erb +35 -0
- data/app/views/spree/admin/avalara_entity_use_codes/new.html.erb +12 -0
- data/app/views/spree/admin/avatax_settings/edit.html.erb +99 -0
- data/app/views/spree/admin/users/avalara_information.html.erb +39 -0
- data/app/views/spree/admin/zones/_form.html.erb +58 -0
- data/bin/rails +8 -0
- data/config/initializers/spree_permitted_attributes.rb +5 -0
- data/config/locales/en.yml +40 -0
- data/config/routes.rb +15 -0
- data/db/migrate/20190118155953_add_exemption_number_to_spree_users.rb +7 -0
- data/db/migrate/20190118160653_create_spree_avalara_entity_use_codes.rb +11 -0
- data/db/migrate/20190118161318_add_avalara_entity_use_code_reference_to_users.rb +7 -0
- data/db/migrate/20190118162345_add_vat_id_to_spree_users.rb +7 -0
- data/db/migrate/20190122154119_create_spree_avatax_official_transactions.rb +10 -0
- data/db/migrate/20190201123706_add_tax_code_to_spree_tax_categories.rb +7 -0
- data/db/migrate/20190208130136_add_avatax_company_code_to_spree_stores.rb +8 -0
- data/db/migrate/20190225145808_add_uuid_to_spree_line_items_and_spree_shipments.rb +13 -0
- data/db/migrate/20190329071439_add_included_in_price_to_spree_zones.rb +5 -0
- data/db/migrate/20191001085458_remove_spree_avalara_entity_use_codes_table.rb +12 -0
- data/db/migrate/20191001092353_create_spree_avatax_official_entity_use_codes_table.rb +18 -0
- data/db/seeds.rb +1 -0
- data/gemfiles/spree_3_1.gemfile +16 -0
- data/gemfiles/spree_3_7.gemfile +13 -0
- data/gemfiles/spree_4_0.gemfile +14 -0
- data/gemfiles/spree_4_1.gemfile +14 -0
- data/gemfiles/spree_4_2.gemfile +14 -0
- data/gemfiles/spree_master.gemfile +14 -0
- data/lib/generators/spree_avatax_official/install/install_generator.rb +38 -0
- data/lib/generators/spree_avatax_official/install/templates/config/initializers/spree_avatax_official.rb +9 -0
- data/lib/spree_avatax_official.rb +5 -0
- data/lib/spree_avatax_official/engine.rb +32 -0
- data/lib/spree_avatax_official/factories.rb +9 -0
- data/lib/spree_avatax_official/seeder.rb +51 -0
- data/lib/spree_avatax_official/version.rb +11 -0
- data/lib/tasks/load_seeds.rake +6 -0
- data/spec/.rubocop.yml +36 -0
- data/spec/factories/canada_address_factory.rb +23 -0
- data/spec/factories/europe_address_factory.rb +22 -0
- data/spec/factories/spree/avatax_global_zone_factory.rb +16 -0
- data/spec/factories/spree/avatax_order_factory.rb +69 -0
- data/spec/factories/spree/avatax_shipment_factory.rb +31 -0
- data/spec/factories/spree/avatax_shipping_method_factory.rb +35 -0
- data/spec/factories/spree/avatax_tax_category_factory.rb +17 -0
- data/spec/factories/spree/avatax_tax_rate_factory.rb +23 -0
- data/spec/factories/spree/line_item_factory.rb +13 -0
- data/spec/factories/spree/promotion_factory.rb +35 -0
- data/spec/factories/spree/shipping_calculator_factory.rb +10 -0
- data/spec/factories/spree_avatax_official/avalara_entity_use_code_factory.rb +7 -0
- data/spec/factories/spree_avatax_official/calculator/avatax_transaction_calculator_factory.rb +3 -0
- data/spec/factories/spree_avatax_official/transaction_factory.rb +12 -0
- data/spec/factories/usa_address_factory.rb +34 -0
- data/spec/features/admin/edit_avatax_settings_spec.rb +11 -0
- data/spec/features/admin/update_avatax_settings_spec.rb +200 -0
- data/spec/features/spree/admin/avalara_entity_use_codes_controller_spec.rb +71 -0
- data/spec/features/spree/admin/users_controller_spec.rb +34 -0
- data/spec/helpers/spree_avatax_official/tax_adjustment_label_helper_spec.rb +81 -0
- data/spec/lib/spree_avatax_official/seeder_spec.rb +23 -0
- data/spec/models/spree/line_item_spec.rb +76 -0
- data/spec/models/spree/order_spec.rb +210 -0
- data/spec/models/spree/shipment_spec.rb +11 -0
- data/spec/models/spree_avatax_official/avatax_log_spec.rb +87 -0
- data/spec/models/spree_avatax_official/entity_use_code_spec.rb +9 -0
- data/spec/models/spree_avatax_official/has_uuid_spec.rb +21 -0
- data/spec/models/spree_avatax_official/spree/refund_decorator_spec.rb +31 -0
- data/spec/models/spree_avatax_official/transaction_spec.rb +9 -0
- data/spec/presenters/spree_avatax_official/address_presenter_spec.rb +53 -0
- data/spec/presenters/spree_avatax_official/item_presenter_spec.rb +159 -0
- data/spec/presenters/spree_avatax_official/ship_to_address_presenter_spec.rb +34 -0
- data/spec/presenters/spree_avatax_official/transactions/adjust_presenter_spec.rb +39 -0
- data/spec/presenters/spree_avatax_official/transactions/create_presenter_spec.rb +110 -0
- data/spec/presenters/spree_avatax_official/transactions/full_refund_presenter_spec.rb +30 -0
- data/spec/presenters/spree_avatax_official/transactions/partial_refund_presenter_spec.rb +48 -0
- data/spec/services/spree_avatax_official/address/validate_spec.rb +47 -0
- data/spec/services/spree_avatax_official/create_tax_adjustments_service_spec.rb +444 -0
- data/spec/services/spree_avatax_official/generate_transaction_cache_key_service_spec.rb +29 -0
- data/spec/services/spree_avatax_official/get_tax_service_spec.rb +33 -0
- data/spec/services/spree_avatax_official/settings/update_service_spec.rb +131 -0
- data/spec/services/spree_avatax_official/transactions/adjust_service_spec.rb +55 -0
- data/spec/services/spree_avatax_official/transactions/create_service_spec.rb +262 -0
- data/spec/services/spree_avatax_official/transactions/find_order_transaction_service_spec.rb +38 -0
- data/spec/services/spree_avatax_official/transactions/full_refund_service_spec.rb +24 -0
- data/spec/services/spree_avatax_official/transactions/get_by_code_service_spec.rb +74 -0
- data/spec/services/spree_avatax_official/transactions/partial_refund_service_spec.rb +33 -0
- data/spec/services/spree_avatax_official/transactions/refund_service_spec.rb +65 -0
- data/spec/services/spree_avatax_official/transactions/void_service_spec.rb +33 -0
- data/spec/services/spree_avatax_official/utilities/ping_service_spec.rb +35 -0
- data/spec/spec_helper.rb +104 -0
- data/spec/support/avatax.rb +15 -0
- data/spec/support/capybara.rb +21 -0
- data/spec/support/database_cleaner.rb +25 -0
- data/spec/support/factory_bot.rb +9 -0
- data/spec/support/vcr.rb +17 -0
- data/spec/vcr/SpreeAvataxOfficial_Transactions_FindOrderTransactionService/_call/with_Spree_Order/when_order_does_NOT_have_a_SalesInvoice_transaction/when_transaction_does_NOT_exist_in_avatax/returns_failure.yml +44 -0
- data/spec/vcr/SpreeAvataxOfficial_Transactions_FindOrderTransactionService/_call/with_Spree_Order/when_order_does_NOT_have_a_SalesInvoice_transaction/when_transaction_exists_in_avatax/returns_success_and_creates_a_new_SalesInvoice_transaction.yml +48 -0
- data/spec/vcr/spree_avatax_official/address/validate_failure.yml +46 -0
- data/spec/vcr/spree_avatax_official/address/validate_success.yml +43 -0
- data/spec/vcr/spree_avatax_official/address/zipcode_failure.yml +45 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/californian_stock_location.yml +60 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/completed_order_line_item_update.yml +62 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/order_adjustment_promotion.yml +61 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/shipment_adjustment_promotion.yml +60 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/simple_completed_order.yml +60 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_excluded/line_item_adjustment_promotion.yml +59 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_excluded/line_item_and_shipment.yml +60 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_excluded/multiple_line_items_multiple_quantity.yml +59 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_excluded/single_line_item.yml +55 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_included/line_item_adjustment_promotion.yml +59 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_included/line_item_and_shipment.yml +60 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_included/multiple_line_items_multiple_quantity.yml +59 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_included/single_line_item.yml +55 -0
- data/spec/vcr/spree_avatax_official/create_tax_adjustments/with_incorrect_address.yml +97 -0
- data/spec/vcr/spree_avatax_official/get_tax/error.yml +49 -0
- data/spec/vcr/spree_avatax_official/get_tax/sucsess.yml +55 -0
- data/spec/vcr/spree_avatax_official/transactions/adjust/failure.yml +101 -0
- data/spec/vcr/spree_avatax_official/transactions/adjust/invoice_order_success.yml +117 -0
- data/spec/vcr/spree_avatax_official/transactions/create/complete_order_success.yml +60 -0
- data/spec/vcr/spree_avatax_official/transactions/create/gst/canada_to_canada.yml +55 -0
- data/spec/vcr/spree_avatax_official/transactions/create/gst/canada_to_us.yml +57 -0
- data/spec/vcr/spree_avatax_official/transactions/create/gst/us_to_canada.yml +56 -0
- data/spec/vcr/spree_avatax_official/transactions/create/invoice_order_success.yml +60 -0
- data/spec/vcr/spree_avatax_official/transactions/create/sales_order_success.yml +60 -0
- data/spec/vcr/spree_avatax_official/transactions/create/timeout.yml +54 -0
- data/spec/vcr/spree_avatax_official/transactions/create/vat/europe_to_europe.yml +57 -0
- data/spec/vcr/spree_avatax_official/transactions/create/vat/europe_to_us.yml +57 -0
- data/spec/vcr/spree_avatax_official/transactions/create/vat/us_to_europe.yml +58 -0
- data/spec/vcr/spree_avatax_official/transactions/get_by_code/error.yml +44 -0
- data/spec/vcr/spree_avatax_official/transactions/get_by_code/order_with_custom_code_success.yml +49 -0
- data/spec/vcr/spree_avatax_official/transactions/get_by_code/order_with_number_success.yml +49 -0
- data/spec/vcr/spree_avatax_official/transactions/get_by_code/order_with_type_success.yml +48 -0
- data/spec/vcr/spree_avatax_official/transactions/get_by_code/order_without_type_success.yml +48 -0
- data/spec/vcr/spree_avatax_official/transactions/refund/full_refund_success.yml +114 -0
- data/spec/vcr/spree_avatax_official/transactions/refund/partial_refund_success.yml +58 -0
- data/spec/vcr/spree_avatax_official/transactions/refund/partial_refund_with_refund_success.yml +58 -0
- data/spec/vcr/spree_avatax_official/transactions/void/success.yml +112 -0
- data/spec/vcr/spree_avatax_official/utilities/ping.yml +41 -0
- data/spec/vcr/spree_avatax_official/utilities/ping_unauthorized.yml +42 -0
- data/spec/vcr/spree_line_item/update_tax_charge/decrease_quantity.yml +55 -0
- data/spec/vcr/spree_line_item/update_tax_charge/increase_quantity.yml +55 -0
- data/spec/vcr/spree_order/california_order.yml +67 -0
- data/spec/vcr/spree_order/complete_order.yml +60 -0
- data/spec/vcr/spree_order/order_transition_to_completed.yml +112 -0
- data/spec/vcr/spree_order/order_with_line_item_adjustment.yml +57 -0
- data/spec/vcr/spree_order/order_with_order_adjustment.yml +57 -0
- data/spec/vcr/spree_order/simple_order_with_single_line_item.yml +55 -0
- data/spec/vcr/spree_order/simple_order_with_single_line_item_and_shipment.yml +57 -0
- data/spec/vcr/spree_order/update_tax_charge/create_line_item.yml +55 -0
- data/spree_avatax_official.gemspec +43 -0
- metadata +486 -0
@@ -0,0 +1,9 @@
|
|
1
|
+
# Optional configuration fields
|
2
|
+
SpreeAvataxOfficial::Config.log = true
|
3
|
+
SpreeAvataxOfficial::Config.log_to_stdout = false
|
4
|
+
SpreeAvataxOfficial::Config.log_file_name = 'avatax.log'
|
5
|
+
SpreeAvataxOfficial::Config.log_frequency = 'weekly'
|
6
|
+
SpreeAvataxOfficial::Config.max_retries = 2
|
7
|
+
SpreeAvataxOfficial::Config.open_timeout = 2.0
|
8
|
+
SpreeAvataxOfficial::Config.read_timeout = 6.0
|
9
|
+
SpreeAvataxOfficial::Config.show_rate_in_label = false
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module SpreeAvataxOfficial
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
require 'spree/core'
|
4
|
+
require 'avatax'
|
5
|
+
|
6
|
+
isolate_namespace SpreeAvataxOfficial
|
7
|
+
engine_name 'spree_avatax_official'
|
8
|
+
|
9
|
+
config.autoload_paths += %W[#{config.root}/lib]
|
10
|
+
|
11
|
+
initializer 'spree_avatax_official.environment', before: :load_config_initializers do |_app|
|
12
|
+
SpreeAvataxOfficial::Config = SpreeAvataxOfficial::Configuration.new
|
13
|
+
end
|
14
|
+
|
15
|
+
initializer 'spree.avatax_certified.calculators', after: 'spree.register.calculators' do |_app|
|
16
|
+
Rails.application.config.spree.calculators.tax_rates << SpreeAvataxOfficial::Calculator::AvataxTransactionCalculator
|
17
|
+
end
|
18
|
+
|
19
|
+
# use rspec for tests
|
20
|
+
config.generators do |g|
|
21
|
+
g.test_framework :rspec
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.activate
|
25
|
+
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
26
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
config.to_prepare(&method(:activate).to_proc)
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
FACTORY_BOT_CLASS = defined?(FactoryGirl) ? FactoryGirl : FactoryBot
|
2
|
+
|
3
|
+
FACTORY_BOT_CLASS.define do
|
4
|
+
GEM_ROOT = File.dirname(File.dirname(File.dirname(__FILE__)))
|
5
|
+
|
6
|
+
Dir[File.join(GEM_ROOT, 'spec', 'factories', '**', '*.rb')].each do |factory|
|
7
|
+
require(factory)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module SpreeAvataxOfficial
|
2
|
+
class Seeder
|
3
|
+
def seed!
|
4
|
+
create_default_tax_category
|
5
|
+
create_and_assign_shipping_tax_category
|
6
|
+
create_entry_use_codes
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def create_default_tax_category
|
12
|
+
::Spree::TaxCategory.find_or_create_by!(name: 'Clothing')
|
13
|
+
.update!(tax_code: ::Spree::TaxCategory::DEFAULT_TAX_CODES['LineItem'], is_default: true)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_and_assign_shipping_tax_category
|
17
|
+
shipping_tax_category = ::Spree::TaxCategory.find_or_create_by!(name: 'Shipping')
|
18
|
+
shipping_tax_category.update!(tax_code: ::Spree::TaxCategory::DEFAULT_TAX_CODES['Shipment'])
|
19
|
+
|
20
|
+
::Spree::ShippingMethod.update_all(tax_category_id: shipping_tax_category.id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_entry_use_codes
|
24
|
+
use_codes.each do |key, val|
|
25
|
+
SpreeAvataxOfficial::EntityUseCode.find_or_create_by!(code: key, name: val)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def use_codes
|
30
|
+
{
|
31
|
+
'A': 'FEDERAL GOV',
|
32
|
+
'B': 'STATE GOV',
|
33
|
+
'C': 'TRIBAL GOVERNMENT',
|
34
|
+
'D': 'FOREIGN DIPLOMAT',
|
35
|
+
'E': 'CHARITABLE/EXEMPT ORG',
|
36
|
+
'F': 'RELIGIOUS ORG',
|
37
|
+
'G': 'RESALE',
|
38
|
+
'H': 'AGRICULTURE',
|
39
|
+
'I': 'INDUSTRIAL PROD/MANUFACTURERS',
|
40
|
+
'J': 'DIRECT PAY',
|
41
|
+
'K': 'DIRECT MAIL',
|
42
|
+
'L': 'OTHER/CUSTOM',
|
43
|
+
'N': 'EDUCATIONAL ORG',
|
44
|
+
'P': 'COMMERCIAL AQUACULTURE',
|
45
|
+
'Q': 'COMMERCIAL FISHERY',
|
46
|
+
'R': 'NON-RESIDENT',
|
47
|
+
'TAXABLE': 'NON-EXEMPT TAXABLE CUSTOMER'
|
48
|
+
}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/spec/.rubocop.yml
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require: rubocop-rspec
|
2
|
+
|
3
|
+
inherit_from: ../.rubocop.yml
|
4
|
+
|
5
|
+
Metrics/BlockLength:
|
6
|
+
Enabled: false
|
7
|
+
|
8
|
+
Style/BlockDelimiters:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
RSpec/NamedSubject:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
RSpec/MultipleExpectations:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
RSpec/ExampleLength:
|
18
|
+
Max: 20
|
19
|
+
|
20
|
+
RSpec/NestedGroups:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
RSpec/LetSetup:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
RSpec/ContextWording:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
RSpec/MessageSpies:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
RSpec/MessageChain:
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
RSpec/LeakyConstantDeclaration:
|
36
|
+
Enabled: false
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spree/testing_support/factories'
|
2
|
+
|
3
|
+
unless FACTORY_BOT_CLASS.factories.registered?(:canada_address)
|
4
|
+
FACTORY_BOT_CLASS.define do
|
5
|
+
factory :canada_address, class: Spree::Address do
|
6
|
+
firstname { FFaker::Name.first_name }
|
7
|
+
lastname { FFaker::Name.last_name }
|
8
|
+
address1 { '298 Pinetree' }
|
9
|
+
address2 { '' }
|
10
|
+
city { 'BEACONSFIELD' }
|
11
|
+
zipcode { 'H9W 5E1' }
|
12
|
+
phone { FFaker::PhoneNumberAU.mobile_phone_number }
|
13
|
+
alternative_phone { FFaker::PhoneNumberAU.mobile_phone_number }
|
14
|
+
state { |address| Spree::State.where(name: 'Quebec', abbr: 'QC', country: address.country).first_or_create }
|
15
|
+
|
16
|
+
country do
|
17
|
+
canada_attributes = { name: 'Canada', iso_name: 'CANADA', iso: 'CA', iso3: 'CAN' }
|
18
|
+
|
19
|
+
Spree::Country.find_by(canada_attributes) || create(:country, canada_attributes)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spree/testing_support/factories'
|
2
|
+
|
3
|
+
unless FACTORY_BOT_CLASS.factories.registered?(:europe_address)
|
4
|
+
FACTORY_BOT_CLASS.define do
|
5
|
+
factory :europe_address, class: Spree::Address do
|
6
|
+
firstname { FFaker::Name.first_name }
|
7
|
+
lastname { FFaker::Name.last_name }
|
8
|
+
address1 { '10 Paternoster Sq' }
|
9
|
+
address2 { '' }
|
10
|
+
city { 'London' }
|
11
|
+
zipcode { 'EC4M 7LS' }
|
12
|
+
phone { FFaker::PhoneNumberAU.mobile_phone_number }
|
13
|
+
alternative_phone { FFaker::PhoneNumberAU.mobile_phone_number }
|
14
|
+
|
15
|
+
country do
|
16
|
+
uk_attributes = { name: 'United Kingdom', iso_name: 'UNITED KINGDOM', iso: 'GB', iso3: 'GBR' }
|
17
|
+
|
18
|
+
Spree::Country.find_by(uk_attributes) || create(:country, uk_attributes)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
FACTORY_BOT_CLASS.define do
|
2
|
+
factory :avatax_global_zone, class: Spree::Zone do
|
3
|
+
name { 'GlobalZone' }
|
4
|
+
description { 'Description' }
|
5
|
+
default_tax { true }
|
6
|
+
|
7
|
+
after(:create) do |zone|
|
8
|
+
create(:country) if Spree::Country.count.zero?
|
9
|
+
|
10
|
+
Spree::Country.all.each do |country|
|
11
|
+
# Spree < 3.1 is missing zone_member factory
|
12
|
+
Spree::ZoneMember.create!(zone: zone, zoneable: country)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
FACTORY_BOT_CLASS.define do
|
2
|
+
factory :avatax_order, class: Spree::Order do
|
3
|
+
user
|
4
|
+
bill_address
|
5
|
+
ship_address { create(:usa_address) }
|
6
|
+
completed_at { nil }
|
7
|
+
email { user.email }
|
8
|
+
state { 'cart' }
|
9
|
+
|
10
|
+
transient do
|
11
|
+
line_items_price { 10.0 }
|
12
|
+
line_items_count { 0 }
|
13
|
+
line_items_quantity { 1 }
|
14
|
+
with_shipment { false }
|
15
|
+
with_shipping_tax_category { true }
|
16
|
+
shipment_cost { 5.0 }
|
17
|
+
tax_category { Spree::TaxCategory.find_by(name: 'Clothing') }
|
18
|
+
end
|
19
|
+
|
20
|
+
before(:create) do |_order, evaluator|
|
21
|
+
Spree::Zone.find_by(name: 'GlobalZone') || create(:avatax_global_zone)
|
22
|
+
Spree::TaxCategory.find_by(name: 'Clothing') || create(:avatax_tax_category, :clothing)
|
23
|
+
Spree::TaxCategory.find_by(name: 'Shipping') || create(:avatax_tax_category, :shipping)
|
24
|
+
Spree::ShippingMethod.find_by(name: 'AvaTax Ground') || create(:avatax_shipping_method, with_tax_category: evaluator.with_shipping_tax_category)
|
25
|
+
end
|
26
|
+
|
27
|
+
after(:create) do |order, evaluator|
|
28
|
+
evaluator.line_items_count.times do
|
29
|
+
create(
|
30
|
+
:line_item,
|
31
|
+
price: evaluator.line_items_price,
|
32
|
+
tax_category: evaluator.tax_category || Spree::TaxCategory.find_by(name: 'Clothing'),
|
33
|
+
quantity: evaluator.line_items_quantity,
|
34
|
+
order: order
|
35
|
+
)
|
36
|
+
end
|
37
|
+
order.line_items.reload
|
38
|
+
|
39
|
+
if evaluator.with_shipment
|
40
|
+
create(:avatax_shipment, order: order, cost: evaluator.shipment_cost)
|
41
|
+
order.shipments.reload
|
42
|
+
end
|
43
|
+
|
44
|
+
order.updater.update
|
45
|
+
end
|
46
|
+
|
47
|
+
trait :shipped do
|
48
|
+
after(:create) do |order|
|
49
|
+
create(:line_item, order: order)
|
50
|
+
create(:avatax_shipment, order: order, state: :shipped)
|
51
|
+
|
52
|
+
order.inventory_units.update_all(state: :shipped)
|
53
|
+
order.update(ship_address: create(:usa_address), completed_at: Time.current)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
trait :completed do
|
58
|
+
shipment_state { 'shipped' }
|
59
|
+
payment_state { 'paid' }
|
60
|
+
|
61
|
+
after(:create) do |order|
|
62
|
+
order.update_column(:completed_at, Time.current)
|
63
|
+
order.update_column(:state, 'complete')
|
64
|
+
create(:payment, amount: order.total, order: order, state: 'completed')
|
65
|
+
order.updater.update
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
FACTORY_BOT_CLASS.define do
|
2
|
+
factory :avatax_shipment, class: Spree::Shipment do
|
3
|
+
tracking { 'U10000' }
|
4
|
+
cost { 100.00 }
|
5
|
+
state { 'pending' }
|
6
|
+
order
|
7
|
+
stock_location
|
8
|
+
|
9
|
+
before(:create) do |shipment|
|
10
|
+
uuid = '6a9efefa-0c6c-4e63-ab43-f43f1d7b2e22'
|
11
|
+
|
12
|
+
shipment.avatax_uuid = uuid if Spree::Shipment.find_by(avatax_uuid: uuid).nil?
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:create) do |shipment|
|
16
|
+
Spree::TaxCategory.find_by(name: 'Shipping') || create(:avatax_tax_category, :shipping)
|
17
|
+
shipping_method = Spree::ShippingMethod.find_by(name: 'AvaTax Ground') || create(:avatax_shipping_method)
|
18
|
+
shipment.add_shipping_method(shipping_method, true)
|
19
|
+
|
20
|
+
shipment.order.line_items.each do |line_item|
|
21
|
+
line_item.quantity.times do
|
22
|
+
shipment.inventory_units.create(
|
23
|
+
order_id: shipment.order_id,
|
24
|
+
variant_id: line_item.variant_id,
|
25
|
+
line_item_id: line_item.id
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
FACTORY_BOT_CLASS.define do
|
2
|
+
factory :avatax_shipping_method, class: Spree::ShippingMethod do
|
3
|
+
zones { [Spree::Zone.find_by(name: 'GlobalZone') || create(:avatax_global_zone, default_tax: true)] }
|
4
|
+
name { 'AvaTax Ground' }
|
5
|
+
display_on { 'both' }
|
6
|
+
|
7
|
+
transient do
|
8
|
+
tax_included { false }
|
9
|
+
with_tax_category { true }
|
10
|
+
end
|
11
|
+
|
12
|
+
before(:create) do |shipping_method, evaluator|
|
13
|
+
create(:country) if Spree::Country.count.zero?
|
14
|
+
|
15
|
+
shipping_tax_rate = create(:avatax_tax_rate, :shipping_tax_rate, included_in_price: evaluator.tax_included)
|
16
|
+
shipping_method.tax_category = shipping_tax_rate.tax_category if evaluator.with_tax_category
|
17
|
+
shipping_method.calculator = if Gem::Version.new(Spree.version) >= Gem::Version.new('2.3.0')
|
18
|
+
build(:shipping_calculator, calculable: shipping_method, preferences: { currency: 'USD', amount: 10.0 })
|
19
|
+
else
|
20
|
+
build(:shipping_calculator, calculable: shipping_method)
|
21
|
+
end
|
22
|
+
|
23
|
+
if shipping_method.shipping_categories.empty?
|
24
|
+
shipping_method.shipping_categories << (Spree::ShippingCategory.first || create(:shipping_category))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
if Gem::Version.new(Spree.version) < Gem::Version.new('2.3.0')
|
29
|
+
after(:create) do |shipping_method|
|
30
|
+
shipping_method.calculator.preferred_currency = 'USD'
|
31
|
+
shipping_method.calculator.preferred_amount = 10.0
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
FACTORY_BOT_CLASS.define do
|
2
|
+
factory :avatax_tax_category, class: Spree::TaxCategory do
|
3
|
+
name { 'Tax category name' }
|
4
|
+
description { 'Tax category description' }
|
5
|
+
|
6
|
+
trait :clothing do
|
7
|
+
name { 'Clothing' }
|
8
|
+
tax_code { ::Spree::TaxCategory::DEFAULT_TAX_CODES['LineItem'] }
|
9
|
+
is_default { true }
|
10
|
+
end
|
11
|
+
|
12
|
+
trait :shipping do
|
13
|
+
name { 'Shipping' }
|
14
|
+
tax_code { ::Spree::TaxCategory::DEFAULT_TAX_CODES['Shipment'] }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
FACTORY_BOT_CLASS.define do
|
2
|
+
factory :avatax_tax_rate, class: Spree::TaxRate do
|
3
|
+
name { 'Default AvaTax tax rate' }
|
4
|
+
amount { 0.0 }
|
5
|
+
zone { Spree::Zone.find_by(name: 'GlobalZone') || create(:avatax_global_zone) }
|
6
|
+
show_rate_in_label { false }
|
7
|
+
tax_category do
|
8
|
+
Spree::TaxCategory.find_by(tax_code: ::Spree::TaxCategory::DEFAULT_TAX_CODES['LineItem']) ||
|
9
|
+
create(:avatax_tax_category, :clothing)
|
10
|
+
end
|
11
|
+
|
12
|
+
trait :shipping_tax_rate do
|
13
|
+
tax_category do
|
14
|
+
Spree::TaxCategory.find_by(tax_code: ::Spree::TaxCategory::DEFAULT_TAX_CODES['Shipment']) ||
|
15
|
+
create(:avatax_tax_category, :shipping)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
before(:create) do |tax_rate|
|
20
|
+
tax_rate.calculator = build(:avatax_transaction_calculator, calculable: tax_rate)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spree/testing_support/factories'
|
2
|
+
|
3
|
+
if FACTORY_BOT_CLASS.factories.registered?(:line_item)
|
4
|
+
FACTORY_BOT_CLASS.modify do
|
5
|
+
factory :line_item, class: Spree::LineItem do
|
6
|
+
before(:create) do |line_item|
|
7
|
+
uuid = 'a844605f-e114-4933-a0cf-7a434ac83cdf'
|
8
|
+
|
9
|
+
line_item.avatax_uuid = uuid if Spree::LineItem.find_by(avatax_uuid: uuid).nil?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spree/testing_support/factories'
|
2
|
+
|
3
|
+
# According to documentation it's not possible to modify traits, what forces definition of new
|
4
|
+
# trait that covers differences between Spree versions. Link:
|
5
|
+
# https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#modifying-factories
|
6
|
+
if FACTORY_BOT_CLASS.factories.registered?(:promotion)
|
7
|
+
FACTORY_BOT_CLASS.modify do
|
8
|
+
factory :promotion, class: Spree::Promotion do
|
9
|
+
trait :avatax_with_order_adjustment do
|
10
|
+
transient do
|
11
|
+
weighted_order_adjustment_amount { 10 }
|
12
|
+
end
|
13
|
+
|
14
|
+
after(:create) do |promotion, evaluator|
|
15
|
+
calculator = Spree::Calculator::FlatRate.new(preferred_amount: evaluator.weighted_order_adjustment_amount)
|
16
|
+
Spree::Promotion::Actions::CreateAdjustment.create!(calculator: calculator, promotion: promotion)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
unless FACTORY_BOT_CLASS.factories.registered?(:free_shipping_promotion)
|
24
|
+
FACTORY_BOT_CLASS.define do
|
25
|
+
factory :free_shipping_promotion, class: Spree::Promotion do
|
26
|
+
name { 'Free Shipping Promotion' }
|
27
|
+
|
28
|
+
after(:create) do |promotion|
|
29
|
+
action = Spree::Promotion::Actions::FreeShipping.new
|
30
|
+
action.promotion = promotion
|
31
|
+
action.save
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|