spree_avatax_official 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (206) hide show
  1. checksums.yaml +7 -0
  2. data/.env-sample +4 -0
  3. data/.gitignore +22 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +77 -0
  6. data/.travis.yml +78 -0
  7. data/Appraisals +49 -0
  8. data/Gemfile +16 -0
  9. data/LICENSE +26 -0
  10. data/README.md +173 -0
  11. data/Rakefile +21 -0
  12. data/app/controllers/spree/admin/avalara_entity_use_codes_controller.rb +61 -0
  13. data/app/controllers/spree/admin/avatax_pings_controller.rb +19 -0
  14. data/app/controllers/spree/admin/avatax_settings_controller.rb +26 -0
  15. data/app/controllers/spree/admin/users_controller_decorator.rb +27 -0
  16. data/app/helpers/spree_avatax_official/http_helper.rb +17 -0
  17. data/app/helpers/spree_avatax_official/tax_adjustment_label_helper.rb +30 -0
  18. data/app/models/avatax/request_decorator.rb +34 -0
  19. data/app/models/spree_avatax_official/avatax_log.rb +57 -0
  20. data/app/models/spree_avatax_official/calculator/avatax_transaction_calculator.rb +28 -0
  21. data/app/models/spree_avatax_official/configuration.rb +20 -0
  22. data/app/models/spree_avatax_official/entity_use_code.rb +7 -0
  23. data/app/models/spree_avatax_official/has_uuid.rb +22 -0
  24. data/app/models/spree_avatax_official/spree/address_decorator.rb +31 -0
  25. data/app/models/spree_avatax_official/spree/inventory_unit_decorator.rb +11 -0
  26. data/app/models/spree_avatax_official/spree/line_item_decorator.rb +27 -0
  27. data/app/models/spree_avatax_official/spree/order_decorator.rb +91 -0
  28. data/app/models/spree_avatax_official/spree/refund_decorator.rb +22 -0
  29. data/app/models/spree_avatax_official/spree/shipment_decorator.rb +25 -0
  30. data/app/models/spree_avatax_official/spree/tax_category_decorator.rb +14 -0
  31. data/app/models/spree_avatax_official/spree/user_decorator.rb +11 -0
  32. data/app/models/spree_avatax_official/transaction.rb +27 -0
  33. data/app/overrides/spree/admin/shared/sub_menu/_configuration.rb +10 -0
  34. data/app/overrides/spree/admin/sidebar.rb +14 -0
  35. data/app/presenters/spree_avatax_official/address_presenter.rb +40 -0
  36. data/app/presenters/spree_avatax_official/item_presenter.rb +92 -0
  37. data/app/presenters/spree_avatax_official/ship_to_address_presenter.rb +22 -0
  38. data/app/presenters/spree_avatax_official/transactions/adjust_presenter.rb +31 -0
  39. data/app/presenters/spree_avatax_official/transactions/create_presenter.rb +80 -0
  40. data/app/presenters/spree_avatax_official/transactions/full_refund_presenter.rb +32 -0
  41. data/app/presenters/spree_avatax_official/transactions/partial_refund_presenter.rb +46 -0
  42. data/app/services/spree_avatax_official/address/validate.rb +27 -0
  43. data/app/services/spree_avatax_official/base.rb +71 -0
  44. data/app/services/spree_avatax_official/create_tax_adjustments_service.rb +133 -0
  45. data/app/services/spree_avatax_official/generate_transaction_cache_key_service.rb +94 -0
  46. data/app/services/spree_avatax_official/get_tax_service.rb +20 -0
  47. data/app/services/spree_avatax_official/settings/update_service.rb +36 -0
  48. data/app/services/spree_avatax_official/transactions/adjust_service.rb +36 -0
  49. data/app/services/spree_avatax_official/transactions/create_service.rb +47 -0
  50. data/app/services/spree_avatax_official/transactions/find_order_transaction_service.rb +23 -0
  51. data/app/services/spree_avatax_official/transactions/full_refund_service.rb +36 -0
  52. data/app/services/spree_avatax_official/transactions/get_by_code_service.rb +32 -0
  53. data/app/services/spree_avatax_official/transactions/partial_refund_service.rb +33 -0
  54. data/app/services/spree_avatax_official/transactions/refund_service.rb +87 -0
  55. data/app/services/spree_avatax_official/transactions/void_service.rb +28 -0
  56. data/app/services/spree_avatax_official/utilities/ping_service.rb +9 -0
  57. data/app/views/spree/admin/avalara_entity_use_codes/_form.html.erb +20 -0
  58. data/app/views/spree/admin/avalara_entity_use_codes/edit.html.erb +12 -0
  59. data/app/views/spree/admin/avalara_entity_use_codes/index.html.erb +35 -0
  60. data/app/views/spree/admin/avalara_entity_use_codes/new.html.erb +12 -0
  61. data/app/views/spree/admin/avatax_settings/edit.html.erb +99 -0
  62. data/app/views/spree/admin/users/avalara_information.html.erb +39 -0
  63. data/app/views/spree/admin/zones/_form.html.erb +58 -0
  64. data/bin/rails +8 -0
  65. data/config/initializers/spree_permitted_attributes.rb +5 -0
  66. data/config/locales/en.yml +40 -0
  67. data/config/routes.rb +15 -0
  68. data/db/migrate/20190118155953_add_exemption_number_to_spree_users.rb +7 -0
  69. data/db/migrate/20190118160653_create_spree_avalara_entity_use_codes.rb +11 -0
  70. data/db/migrate/20190118161318_add_avalara_entity_use_code_reference_to_users.rb +7 -0
  71. data/db/migrate/20190118162345_add_vat_id_to_spree_users.rb +7 -0
  72. data/db/migrate/20190122154119_create_spree_avatax_official_transactions.rb +10 -0
  73. data/db/migrate/20190201123706_add_tax_code_to_spree_tax_categories.rb +7 -0
  74. data/db/migrate/20190208130136_add_avatax_company_code_to_spree_stores.rb +8 -0
  75. data/db/migrate/20190225145808_add_uuid_to_spree_line_items_and_spree_shipments.rb +13 -0
  76. data/db/migrate/20190329071439_add_included_in_price_to_spree_zones.rb +5 -0
  77. data/db/migrate/20191001085458_remove_spree_avalara_entity_use_codes_table.rb +12 -0
  78. data/db/migrate/20191001092353_create_spree_avatax_official_entity_use_codes_table.rb +18 -0
  79. data/db/seeds.rb +1 -0
  80. data/gemfiles/spree_3_1.gemfile +16 -0
  81. data/gemfiles/spree_3_7.gemfile +13 -0
  82. data/gemfiles/spree_4_0.gemfile +14 -0
  83. data/gemfiles/spree_4_1.gemfile +14 -0
  84. data/gemfiles/spree_4_2.gemfile +14 -0
  85. data/gemfiles/spree_master.gemfile +14 -0
  86. data/lib/generators/spree_avatax_official/install/install_generator.rb +38 -0
  87. data/lib/generators/spree_avatax_official/install/templates/config/initializers/spree_avatax_official.rb +9 -0
  88. data/lib/spree_avatax_official.rb +5 -0
  89. data/lib/spree_avatax_official/engine.rb +32 -0
  90. data/lib/spree_avatax_official/factories.rb +9 -0
  91. data/lib/spree_avatax_official/seeder.rb +51 -0
  92. data/lib/spree_avatax_official/version.rb +11 -0
  93. data/lib/tasks/load_seeds.rake +6 -0
  94. data/spec/.rubocop.yml +36 -0
  95. data/spec/factories/canada_address_factory.rb +23 -0
  96. data/spec/factories/europe_address_factory.rb +22 -0
  97. data/spec/factories/spree/avatax_global_zone_factory.rb +16 -0
  98. data/spec/factories/spree/avatax_order_factory.rb +69 -0
  99. data/spec/factories/spree/avatax_shipment_factory.rb +31 -0
  100. data/spec/factories/spree/avatax_shipping_method_factory.rb +35 -0
  101. data/spec/factories/spree/avatax_tax_category_factory.rb +17 -0
  102. data/spec/factories/spree/avatax_tax_rate_factory.rb +23 -0
  103. data/spec/factories/spree/line_item_factory.rb +13 -0
  104. data/spec/factories/spree/promotion_factory.rb +35 -0
  105. data/spec/factories/spree/shipping_calculator_factory.rb +10 -0
  106. data/spec/factories/spree_avatax_official/avalara_entity_use_code_factory.rb +7 -0
  107. data/spec/factories/spree_avatax_official/calculator/avatax_transaction_calculator_factory.rb +3 -0
  108. data/spec/factories/spree_avatax_official/transaction_factory.rb +12 -0
  109. data/spec/factories/usa_address_factory.rb +34 -0
  110. data/spec/features/admin/edit_avatax_settings_spec.rb +11 -0
  111. data/spec/features/admin/update_avatax_settings_spec.rb +200 -0
  112. data/spec/features/spree/admin/avalara_entity_use_codes_controller_spec.rb +71 -0
  113. data/spec/features/spree/admin/users_controller_spec.rb +34 -0
  114. data/spec/helpers/spree_avatax_official/tax_adjustment_label_helper_spec.rb +81 -0
  115. data/spec/lib/spree_avatax_official/seeder_spec.rb +23 -0
  116. data/spec/models/spree/line_item_spec.rb +76 -0
  117. data/spec/models/spree/order_spec.rb +210 -0
  118. data/spec/models/spree/shipment_spec.rb +11 -0
  119. data/spec/models/spree_avatax_official/avatax_log_spec.rb +87 -0
  120. data/spec/models/spree_avatax_official/entity_use_code_spec.rb +9 -0
  121. data/spec/models/spree_avatax_official/has_uuid_spec.rb +21 -0
  122. data/spec/models/spree_avatax_official/spree/refund_decorator_spec.rb +31 -0
  123. data/spec/models/spree_avatax_official/transaction_spec.rb +9 -0
  124. data/spec/presenters/spree_avatax_official/address_presenter_spec.rb +53 -0
  125. data/spec/presenters/spree_avatax_official/item_presenter_spec.rb +159 -0
  126. data/spec/presenters/spree_avatax_official/ship_to_address_presenter_spec.rb +34 -0
  127. data/spec/presenters/spree_avatax_official/transactions/adjust_presenter_spec.rb +39 -0
  128. data/spec/presenters/spree_avatax_official/transactions/create_presenter_spec.rb +110 -0
  129. data/spec/presenters/spree_avatax_official/transactions/full_refund_presenter_spec.rb +30 -0
  130. data/spec/presenters/spree_avatax_official/transactions/partial_refund_presenter_spec.rb +48 -0
  131. data/spec/services/spree_avatax_official/address/validate_spec.rb +47 -0
  132. data/spec/services/spree_avatax_official/create_tax_adjustments_service_spec.rb +444 -0
  133. data/spec/services/spree_avatax_official/generate_transaction_cache_key_service_spec.rb +29 -0
  134. data/spec/services/spree_avatax_official/get_tax_service_spec.rb +33 -0
  135. data/spec/services/spree_avatax_official/settings/update_service_spec.rb +131 -0
  136. data/spec/services/spree_avatax_official/transactions/adjust_service_spec.rb +55 -0
  137. data/spec/services/spree_avatax_official/transactions/create_service_spec.rb +262 -0
  138. data/spec/services/spree_avatax_official/transactions/find_order_transaction_service_spec.rb +38 -0
  139. data/spec/services/spree_avatax_official/transactions/full_refund_service_spec.rb +24 -0
  140. data/spec/services/spree_avatax_official/transactions/get_by_code_service_spec.rb +74 -0
  141. data/spec/services/spree_avatax_official/transactions/partial_refund_service_spec.rb +33 -0
  142. data/spec/services/spree_avatax_official/transactions/refund_service_spec.rb +65 -0
  143. data/spec/services/spree_avatax_official/transactions/void_service_spec.rb +33 -0
  144. data/spec/services/spree_avatax_official/utilities/ping_service_spec.rb +35 -0
  145. data/spec/spec_helper.rb +104 -0
  146. data/spec/support/avatax.rb +15 -0
  147. data/spec/support/capybara.rb +21 -0
  148. data/spec/support/database_cleaner.rb +25 -0
  149. data/spec/support/factory_bot.rb +9 -0
  150. data/spec/support/vcr.rb +17 -0
  151. 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
  152. 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
  153. data/spec/vcr/spree_avatax_official/address/validate_failure.yml +46 -0
  154. data/spec/vcr/spree_avatax_official/address/validate_success.yml +43 -0
  155. data/spec/vcr/spree_avatax_official/address/zipcode_failure.yml +45 -0
  156. data/spec/vcr/spree_avatax_official/create_tax_adjustments/californian_stock_location.yml +60 -0
  157. data/spec/vcr/spree_avatax_official/create_tax_adjustments/completed_order_line_item_update.yml +62 -0
  158. data/spec/vcr/spree_avatax_official/create_tax_adjustments/order_adjustment_promotion.yml +61 -0
  159. data/spec/vcr/spree_avatax_official/create_tax_adjustments/shipment_adjustment_promotion.yml +60 -0
  160. data/spec/vcr/spree_avatax_official/create_tax_adjustments/simple_completed_order.yml +60 -0
  161. data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_excluded/line_item_adjustment_promotion.yml +59 -0
  162. data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_excluded/line_item_and_shipment.yml +60 -0
  163. data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_excluded/multiple_line_items_multiple_quantity.yml +59 -0
  164. data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_excluded/single_line_item.yml +55 -0
  165. data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_included/line_item_adjustment_promotion.yml +59 -0
  166. data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_included/line_item_and_shipment.yml +60 -0
  167. data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_included/multiple_line_items_multiple_quantity.yml +59 -0
  168. data/spec/vcr/spree_avatax_official/create_tax_adjustments/tax_included/single_line_item.yml +55 -0
  169. data/spec/vcr/spree_avatax_official/create_tax_adjustments/with_incorrect_address.yml +97 -0
  170. data/spec/vcr/spree_avatax_official/get_tax/error.yml +49 -0
  171. data/spec/vcr/spree_avatax_official/get_tax/sucsess.yml +55 -0
  172. data/spec/vcr/spree_avatax_official/transactions/adjust/failure.yml +101 -0
  173. data/spec/vcr/spree_avatax_official/transactions/adjust/invoice_order_success.yml +117 -0
  174. data/spec/vcr/spree_avatax_official/transactions/create/complete_order_success.yml +60 -0
  175. data/spec/vcr/spree_avatax_official/transactions/create/gst/canada_to_canada.yml +55 -0
  176. data/spec/vcr/spree_avatax_official/transactions/create/gst/canada_to_us.yml +57 -0
  177. data/spec/vcr/spree_avatax_official/transactions/create/gst/us_to_canada.yml +56 -0
  178. data/spec/vcr/spree_avatax_official/transactions/create/invoice_order_success.yml +60 -0
  179. data/spec/vcr/spree_avatax_official/transactions/create/sales_order_success.yml +60 -0
  180. data/spec/vcr/spree_avatax_official/transactions/create/timeout.yml +54 -0
  181. data/spec/vcr/spree_avatax_official/transactions/create/vat/europe_to_europe.yml +57 -0
  182. data/spec/vcr/spree_avatax_official/transactions/create/vat/europe_to_us.yml +57 -0
  183. data/spec/vcr/spree_avatax_official/transactions/create/vat/us_to_europe.yml +58 -0
  184. data/spec/vcr/spree_avatax_official/transactions/get_by_code/error.yml +44 -0
  185. data/spec/vcr/spree_avatax_official/transactions/get_by_code/order_with_custom_code_success.yml +49 -0
  186. data/spec/vcr/spree_avatax_official/transactions/get_by_code/order_with_number_success.yml +49 -0
  187. data/spec/vcr/spree_avatax_official/transactions/get_by_code/order_with_type_success.yml +48 -0
  188. data/spec/vcr/spree_avatax_official/transactions/get_by_code/order_without_type_success.yml +48 -0
  189. data/spec/vcr/spree_avatax_official/transactions/refund/full_refund_success.yml +114 -0
  190. data/spec/vcr/spree_avatax_official/transactions/refund/partial_refund_success.yml +58 -0
  191. data/spec/vcr/spree_avatax_official/transactions/refund/partial_refund_with_refund_success.yml +58 -0
  192. data/spec/vcr/spree_avatax_official/transactions/void/success.yml +112 -0
  193. data/spec/vcr/spree_avatax_official/utilities/ping.yml +41 -0
  194. data/spec/vcr/spree_avatax_official/utilities/ping_unauthorized.yml +42 -0
  195. data/spec/vcr/spree_line_item/update_tax_charge/decrease_quantity.yml +55 -0
  196. data/spec/vcr/spree_line_item/update_tax_charge/increase_quantity.yml +55 -0
  197. data/spec/vcr/spree_order/california_order.yml +67 -0
  198. data/spec/vcr/spree_order/complete_order.yml +60 -0
  199. data/spec/vcr/spree_order/order_transition_to_completed.yml +112 -0
  200. data/spec/vcr/spree_order/order_with_line_item_adjustment.yml +57 -0
  201. data/spec/vcr/spree_order/order_with_order_adjustment.yml +57 -0
  202. data/spec/vcr/spree_order/simple_order_with_single_line_item.yml +55 -0
  203. data/spec/vcr/spree_order/simple_order_with_single_line_item_and_shipment.yml +57 -0
  204. data/spec/vcr/spree_order/update_tax_charge/create_line_item.yml +55 -0
  205. data/spree_avatax_official.gemspec +43 -0
  206. 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,5 @@
1
+ require 'spree_core'
2
+ require 'spree_backend'
3
+ require 'spree_extension'
4
+ require 'spree_avatax_official/engine'
5
+ require 'spree_avatax_official/version'
@@ -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
@@ -0,0 +1,11 @@
1
+ module SpreeAvataxOfficial
2
+ VERSION = '1.7.1'.freeze
3
+
4
+ module_function
5
+
6
+ # Returns the version of the currently loaded SpreeAvataxOfficial as a
7
+ # <tt>Gem::Version</tt>.
8
+ def version
9
+ Gem::Version.new VERSION
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ namespace :spree_avatax_official do
2
+ desc 'Migrate from SpreeAvataxCertified and create initial data.'
3
+ task load_seeds: :environment do
4
+ SpreeAvataxOfficial::Seeder.new.seed!
5
+ end
6
+ 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