solidus_tax_cloud 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.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +35 -0
  3. data/.gem_release.yml +5 -0
  4. data/.gitignore +20 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +7 -0
  7. data/.rubocop_todo.yml +132 -0
  8. data/CHANGELOG.md +52 -0
  9. data/Gemfile +33 -0
  10. data/LICENSE +26 -0
  11. data/README.md +130 -0
  12. data/Rakefile +6 -0
  13. data/TaxCloudImplementationVerificationGuide.pdf +0 -0
  14. data/app/assets/javascripts/spree/backend/solidus_tax_cloud.js +2 -0
  15. data/app/assets/javascripts/spree/frontend/solidus_tax_cloud.js +2 -0
  16. data/app/assets/stylesheets/spree/backend/solidus_tax_cloud.css +4 -0
  17. data/app/assets/stylesheets/spree/backend/solidus_tax_cloud.scss +0 -0
  18. data/app/assets/stylesheets/spree/frontend/solidus_tax_cloud.css +4 -0
  19. data/app/decorators/models/solidus_tax_cloud/spree/app_configuration_decorator.rb +18 -0
  20. data/app/decorators/models/solidus_tax_cloud/spree/line_item_decorator.rb +47 -0
  21. data/app/decorators/models/solidus_tax_cloud/spree/order_decorator.rb +42 -0
  22. data/app/decorators/models/solidus_tax_cloud/spree/product_decorator.rb +25 -0
  23. data/app/decorators/models/solidus_tax_cloud/spree/shipment_decorator.rb +27 -0
  24. data/app/models/spree/calculator/tax_cloud_calculator.rb +111 -0
  25. data/app/models/spree/tax_cloud.rb +66 -0
  26. data/app/overrides/spree/admin/products/_form.rb +9 -0
  27. data/app/overrides/spree/admin/shared/_configuration_menu.rb +9 -0
  28. data/bin/console +17 -0
  29. data/bin/r +15 -0
  30. data/bin/rails +15 -0
  31. data/bin/rake +7 -0
  32. data/bin/sandbox +84 -0
  33. data/bin/sandbox_rails +18 -0
  34. data/bin/setup +8 -0
  35. data/config/initializers/tax_cloud_usps_username.rb +5 -0
  36. data/config/locales/en.yml +13 -0
  37. data/config/routes.rb +7 -0
  38. data/db/migrate/20121220192438_create_spree_tax_cloud_transactions.rb +13 -0
  39. data/db/migrate/20121220193944_create_spree_tax_cloud_cart_items.rb +22 -0
  40. data/db/migrate/20130829215819_fix_scale_of_cart_item_prices.rb +15 -0
  41. data/db/migrate/20140623225628_add_tic_to_products.rb +11 -0
  42. data/lib/assets/javascripts/spree/frontend/solidus_tax_cloud.js.erb +1 -0
  43. data/lib/assets/stylesheets/spree/frontend/solidus_tax_cloud.css.erb +5 -0
  44. data/lib/controllers/backend/spree/admin/tax_cloud_settings_controller.rb +29 -0
  45. data/lib/decorators/backend/controllers/solidus_tax_cloud/spree/admin/orders_controller_decorator.rb +21 -0
  46. data/lib/decorators/frontend/controllers/solidus_tax_cloud/spree/checkout_controller_decorator.rb +24 -0
  47. data/lib/generators/solidus_tax_cloud/install/install_generator.rb +29 -0
  48. data/lib/generators/solidus_tax_cloud/templates/ca-bundle.crt +3895 -0
  49. data/lib/solidus_tax_cloud.rb +10 -0
  50. data/lib/solidus_tax_cloud/engine.rb +23 -0
  51. data/lib/solidus_tax_cloud/error.rb +6 -0
  52. data/lib/solidus_tax_cloud/factories.rb +4 -0
  53. data/lib/solidus_tax_cloud/version.rb +5 -0
  54. data/lib/tasks/.gitkeep +0 -0
  55. data/lib/tasks/tax_cloud.rake +74 -0
  56. data/lib/views/backend/spree/admin/products/_edit_tax_cloud_tic.html.erb +6 -0
  57. data/lib/views/backend/spree/admin/tax_cloud_settings/edit.html.erb +32 -0
  58. data/solidus_tax_cloud.gemspec +39 -0
  59. data/spec/features/checkout_spec.rb +511 -0
  60. data/spec/models/tax_cloud_api_spec.rb +192 -0
  61. data/spec/spec_helper.rb +27 -0
  62. data/spec/support/capybara.rb +20 -0
  63. data/spec/support/tax_cloud.rb +20 -0
  64. data/spec/support/transactions.rb +5 -0
  65. metadata +204 -0
@@ -0,0 +1,192 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ # This spec ensures that the low-level TaxCloud API returns the values specified by the TaxCloud Implementation Guide.
6
+ # If any errors are found in the Solidus-related feature specs, this will serve as a means for verifying whether the errors
7
+ # are coming from the TaxCloud gem or API, or whether they are related to the Solidus integration specifically.
8
+
9
+ describe 'Models' do
10
+ origin = TaxCloud::Address.new(address1: '3121 West Government Way', city: 'Seattle', state: 'WA', zip5: '98199', zip4: '1402')
11
+
12
+ it 'TaxCloud Test Case 1a: Verify Address with error' do
13
+ destination = TaxCloud::Address.new(address1: '1 3rd Street', city: 'Seattle', state: 'WA', zip5: '98001')
14
+ cart_items = []
15
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'TestItem1', tic: '00000', quantity: 1, price: 10.00)
16
+ transaction = test_transaction(cart_items, origin, destination)
17
+
18
+ result = transaction.lookup
19
+
20
+ # From TaxCloud:
21
+ # This address will not verify correctly (the VerifyAddress API call will return an error).
22
+ # That is okay. Occasionally an address cannot be verified. When that happens, pass the
23
+ # destination address as originally entered to Lookup. The address can still be passed to
24
+ # Lookup. The only error that should prevent an order from proceeding is when a customer
25
+ # provided zip code does not exist within the customer provided state (discussed later in Test
26
+ # Case 7, Handling Errors).
27
+
28
+ expect { destination.verify }.to raise_error(TaxCloud::Errors::ApiError)
29
+
30
+ expect(result.cart_items.size).to eq 1
31
+ expect(result.cart_items.first.cart_item_index).to eq 0
32
+ expect(result.cart_items.first.tax_amount).to eq 0.99
33
+ end
34
+
35
+ it 'TaxCloud Test Case 1b: Verify Address without error' do
36
+ destination = TaxCloud::Address.new(address1: '16422 SE 128th St', city: 'Renton', state: 'WA', zip5: '98059')
37
+ cart_items = []
38
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'TestItem2', tic: '00000', quantity: 1, price: 10.00)
39
+ transaction = test_transaction(cart_items, origin, destination)
40
+
41
+ result = transaction.lookup
42
+
43
+ # From TaxCloud:
44
+ # The destination address used as-is will not give the most accurate rate ($1.00 in tax).
45
+ # The verified address will have a Plus4 Zip Code of 98059-8625 give a correct result
46
+ # ($0.86 in tax).
47
+
48
+ expect(result.cart_items.size).to eq 1
49
+ expect(result.cart_items.first.cart_item_index).to eq 0
50
+ expect(result.cart_items.first.tax_amount).to eq 0.86
51
+ end
52
+
53
+ it 'TaxCloud Test Case 2a: If all items in cart are tax exempt, shipping is not taxed (in some states)' do
54
+ destination = TaxCloud::Address.new(address1: '75 Rev Martin Luther King Jr Drive', city: 'St. Paul', state: 'MN', zip5: '55155')
55
+ cart_items = []
56
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'Shirt001', tic: '20010', quantity: 1, price: 10.00)
57
+ cart_items << TaxCloud::CartItem.new(index: 1, item_id: 'Shipping', tic: '11010', quantity: 1, price: 10.00)
58
+ transaction = test_transaction(cart_items, origin, destination)
59
+
60
+ result = transaction.lookup
61
+
62
+ expect(result.cart_items.size).to eq 2
63
+ expect(result.cart_items.detect { |i| i.cart_item_index == 0 }.tax_amount).to eq 0
64
+ expect(result.cart_items.detect { |i| i.cart_item_index == 1 }.tax_amount).to eq 0
65
+
66
+ # capture = transaction.authorized_with_capture
67
+ # expect(capture).to eq('OK')
68
+ end
69
+
70
+ it 'TaxCloud Test Case 2b: With both taxable and tax exempt items, shipping is taxable' do
71
+ destination = TaxCloud::Address.new(address1: '75 Rev Martin Luther King Jr Drive', city: 'St. Paul', state: 'MN', zip5: '55155')
72
+ cart_items = []
73
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'Shirt001', tic: '20010', quantity: 1, price: 10.00)
74
+ cart_items << TaxCloud::CartItem.new(index: 1, item_id: 'Gadget001', tic: '00000', quantity: 1, price: 10.00)
75
+ cart_items << TaxCloud::CartItem.new(index: 2, item_id: 'Shipping', tic: '11010', quantity: 1, price: 10.00)
76
+ transaction = test_transaction(cart_items, origin, destination)
77
+
78
+ result = transaction.lookup
79
+
80
+ expect(result.cart_items.size).to eq 3
81
+ expect(result.cart_items.detect { |i| i.cart_item_index == 0 }.tax_amount).to eq 0
82
+ expect(result.cart_items.detect { |i| i.cart_item_index == 1 }.tax_amount).to eq 0.79
83
+ expect(result.cart_items.detect { |i| i.cart_item_index == 2 }.tax_amount).to eq 0.79
84
+
85
+ # capture = transaction.authorized_with_capture
86
+ # expect(capture).to eq('OK')
87
+ end
88
+
89
+ it 'TaxCloud Test Case 3: Item taxable, shipping not taxable' do
90
+ destination = TaxCloud::Address.new(address1: '2300 N Lincoln Blvd', city: 'Oklahoma City', state: 'OK', zip5: '73105')
91
+ cart_items = []
92
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'Shirt002', tic: '20010', quantity: 1, price: 10.00)
93
+ cart_items << TaxCloud::CartItem.new(index: 1, item_id: 'Shipping', tic: '11010', quantity: 1, price: 10.00)
94
+ transaction = test_transaction(cart_items, origin, destination)
95
+
96
+ result = transaction.lookup
97
+
98
+ expect(result.cart_items.size).to eq 2
99
+ expect(result.cart_items.detect { |i| i.cart_item_index == 0 }.tax_amount).to eq 0.86
100
+ expect(result.cart_items.detect { |i| i.cart_item_index == 1 }.tax_amount).to eq 0
101
+
102
+ # capture = transaction.authorized_with_capture
103
+ # expect(capture).to eq('OK')
104
+ end
105
+
106
+ skip 'TaxCloud Test Case 4: Return all items in previous order' do
107
+ # TODO
108
+ end
109
+
110
+ skip 'TaxCloud Test Case 5: Return single item in previous order' do
111
+ # TODO
112
+ end
113
+
114
+ it 'TaxCloud Test Case 6: Item and shipping taxable' do
115
+ destination = TaxCloud::Address.new(address1: '384 Northyards Blvd NW', city: 'Atlanta', state: 'GA', zip5: '30313')
116
+ cart_items = []
117
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'Shirt003', tic: '20010', quantity: 1, price: 10.00)
118
+ cart_items << TaxCloud::CartItem.new(index: 1, item_id: 'Shipping', tic: '11010', quantity: 1, price: 10.00)
119
+ transaction = test_transaction(cart_items, origin, destination)
120
+
121
+ result = transaction.lookup
122
+
123
+ expect(result.cart_items.size).to eq 2
124
+ expect(result.cart_items.detect { |i| i.cart_item_index == 0 }.tax_amount).to eq 0.89
125
+ expect(result.cart_items.detect { |i| i.cart_item_index == 1 }.tax_amount).to eq 0.89
126
+ end
127
+
128
+ it 'TaxCloud Test Case 7: Handling errors' do
129
+ destination = TaxCloud::Address.new(address1: '384 Northyards Blvd NW', city: 'Atlanta', state: 'GA', zip5: '30313', zip4: '2440')
130
+ cart_items = []
131
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'Gadget002', tic: '00000', quantity: 1, price: -5.00)
132
+ transaction = test_transaction(cart_items, origin, destination)
133
+
134
+ expect { transaction.lookup }.to raise_error(TaxCloud::Errors::ApiError)
135
+
136
+ begin
137
+ transaction.lookup
138
+ rescue StandardError => e
139
+ expect(e.problem).to eq('Cart Item 0 has a negative Price (-5). Only positive values can be used')
140
+ end
141
+ end
142
+
143
+ context 'with discounts' do
144
+ it 'TaxCloud Test Case 3, with item discount' do
145
+ destination = TaxCloud::Address.new(address1: '2300 N Lincoln Blvd', city: 'Oklahoma City', state: 'OK', zip5: '73105')
146
+ cart_items = []
147
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'Shirt002', tic: '20010', quantity: 1, price: 5.00)
148
+ cart_items << TaxCloud::CartItem.new(index: 1, item_id: 'Shipping', tic: '11010', quantity: 1, price: 10.00)
149
+ transaction = test_transaction(cart_items, origin, destination)
150
+
151
+ result = transaction.lookup
152
+
153
+ expect(result.cart_items.size).to eq 2
154
+ expect(result.cart_items.detect { |i| i.cart_item_index == 0 }.tax_amount).to eq 0.43
155
+ expect(result.cart_items.detect { |i| i.cart_item_index == 1 }.tax_amount).to eq 0
156
+
157
+ # capture = transaction.authorized_with_capture
158
+ # expect(capture).to eq('OK')
159
+ end
160
+
161
+ it 'TaxCloud Test Case 3, with item discount, multiple items' do
162
+ destination = TaxCloud::Address.new(address1: '2300 N Lincoln Blvd', city: 'Oklahoma City', state: 'OK', zip5: '73105')
163
+ cart_items = []
164
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'Shirt002', tic: '20010', quantity: 2, price: 7.50)
165
+ cart_items << TaxCloud::CartItem.new(index: 1, item_id: 'Shipping', tic: '11010', quantity: 2, price: 20.00)
166
+ transaction = test_transaction(cart_items, origin, destination)
167
+
168
+ result = transaction.lookup
169
+
170
+ expect(result.cart_items.size).to eq 2
171
+ expect(result.cart_items.detect { |i| i.cart_item_index == 0 }.tax_amount).to eq 1.29
172
+ expect(result.cart_items.detect { |i| i.cart_item_index == 1 }.tax_amount).to eq 0
173
+
174
+ # capture = transaction.authorized_with_capture
175
+ # expect(capture).to eq('OK')
176
+ end
177
+
178
+ it 'TaxCloud Test Case 6, with shipping promotion' do
179
+ destination = TaxCloud::Address.new(address1: '384 Northyards Blvd NW', city: 'Atlanta', state: 'GA', zip5: '30313')
180
+ cart_items = []
181
+ cart_items << TaxCloud::CartItem.new(index: 0, item_id: 'Shirt003', tic: '20010', quantity: 1, price: 10.00)
182
+ cart_items << TaxCloud::CartItem.new(index: 1, item_id: 'Shipping', tic: '11010', quantity: 1, price: 0.00)
183
+ transaction = test_transaction(cart_items, origin, destination)
184
+
185
+ result = transaction.lookup
186
+
187
+ expect(result.cart_items.size).to eq 2
188
+ expect(result.cart_items.detect { |i| i.cart_item_index == 0 }.tax_amount).to eq 0.89
189
+ expect(result.cart_items.detect { |i| i.cart_item_index == 1 }.tax_amount).to eq 0.00
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Configure Rails Environment
4
+ ENV['RAILS_ENV'] = 'test'
5
+
6
+ # Run Coverage report
7
+ require 'solidus_dev_support/rspec/coverage'
8
+
9
+ require File.expand_path('dummy/config/environment.rb', __dir__).tap { |file|
10
+ # Create the dummy app if it's still missing.
11
+ system 'bin/rake extension:test_app' unless File.exist? file
12
+ }
13
+
14
+ # Requires factories and other useful helpers defined in spree_core.
15
+ require 'solidus_dev_support/rspec/feature_helper'
16
+
17
+ # Requires supporting ruby files with custom matchers and macros, etc,
18
+ # in spec/support/ and its subdirectories.
19
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
20
+
21
+ # Requires factories defined in lib/solidus_tax_cloud/factories.rb
22
+ require 'solidus_tax_cloud/factories'
23
+
24
+ RSpec.configure do |config|
25
+ config.infer_spec_type_from_file_location!
26
+ config.use_transactional_fixtures = false
27
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module TestingSupport
5
+ module CapybaraHelpers
6
+ def sign_in_as!(user)
7
+ visit spree.login_path
8
+ within '#new_spree_user' do
9
+ fill_in 'Email', with: user.email
10
+ fill_in 'Password', with: user.password
11
+ end
12
+ click_button 'Login'
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ RSpec.configure do |config|
19
+ config.include Spree::TestingSupport::CapybaraHelpers, type: :feature
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ # Official verification and test harness login credentials provided 7/8/14
5
+ # by David Campbell of The Federal Tax Authority.
6
+ # This account is configured to collect sales tax in the 24 SSUTA states:
7
+ # AR, GA, IN, IA, KS, KY, MI, MN, NE, NV, NJ, NC, ND, OH, OK, RI, SD, TN, UT, VT, WA, WV, WI, and WY
8
+ # The account does not collect sales tax in the remaining sales tax states:
9
+ # AL, AK, AZ, CA, CO, CT, DC, FL, HI, ID, IL, LA, ME, MD, MA, MS, MO, NM, NY, PA, SC, TX, and VA
10
+ config.before :suite do
11
+ TaxCloud.configure do |config|
12
+ config.api_login_id = '2D7D820'
13
+ config.api_key = '0946110C-2AA9-4387-AD5C-4E1C551B8D0C'
14
+ end
15
+ end
16
+
17
+ config.before do
18
+ stub_spree_preferences(taxcloud_default_product_tic: '00000', taxcloud_shipping_tic: '11010')
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ def test_transaction(cart_items, origin, destination)
4
+ TaxCloud::Transaction.new(customer_id: SecureRandom.hex(8), cart_id: SecureRandom.hex(8), order_id: SecureRandom.hex(8), cart_items: cart_items, origin: origin, destination: destination)
5
+ end
metadata ADDED
@@ -0,0 +1,204 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solidus_tax_cloud
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jerrold Thompson
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-06-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: deface
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: savon
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.12.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.12.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: solidus_core
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 2.0.0
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '3'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 2.0.0
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '3'
61
+ - !ruby/object:Gem::Dependency
62
+ name: solidus_support
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.5'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.5'
75
+ - !ruby/object:Gem::Dependency
76
+ name: tax_cloud
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 0.3.0
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.3.0
89
+ - !ruby/object:Gem::Dependency
90
+ name: solidus_dev_support
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: Solidus extension providing Tax Cloud services
104
+ email: jet@whidbey.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - ".circleci/config.yml"
110
+ - ".gem_release.yml"
111
+ - ".gitignore"
112
+ - ".rspec"
113
+ - ".rubocop.yml"
114
+ - ".rubocop_todo.yml"
115
+ - CHANGELOG.md
116
+ - Gemfile
117
+ - LICENSE
118
+ - README.md
119
+ - Rakefile
120
+ - TaxCloudImplementationVerificationGuide.pdf
121
+ - app/assets/javascripts/spree/backend/solidus_tax_cloud.js
122
+ - app/assets/javascripts/spree/frontend/solidus_tax_cloud.js
123
+ - app/assets/stylesheets/spree/backend/solidus_tax_cloud.css
124
+ - app/assets/stylesheets/spree/backend/solidus_tax_cloud.scss
125
+ - app/assets/stylesheets/spree/frontend/solidus_tax_cloud.css
126
+ - app/decorators/models/solidus_tax_cloud/spree/app_configuration_decorator.rb
127
+ - app/decorators/models/solidus_tax_cloud/spree/line_item_decorator.rb
128
+ - app/decorators/models/solidus_tax_cloud/spree/order_decorator.rb
129
+ - app/decorators/models/solidus_tax_cloud/spree/product_decorator.rb
130
+ - app/decorators/models/solidus_tax_cloud/spree/shipment_decorator.rb
131
+ - app/models/spree/calculator/tax_cloud_calculator.rb
132
+ - app/models/spree/tax_cloud.rb
133
+ - app/overrides/spree/admin/products/_form.rb
134
+ - app/overrides/spree/admin/shared/_configuration_menu.rb
135
+ - bin/console
136
+ - bin/r
137
+ - bin/rails
138
+ - bin/rake
139
+ - bin/sandbox
140
+ - bin/sandbox_rails
141
+ - bin/setup
142
+ - config/initializers/tax_cloud_usps_username.rb
143
+ - config/locales/en.yml
144
+ - config/routes.rb
145
+ - db/migrate/20121220192438_create_spree_tax_cloud_transactions.rb
146
+ - db/migrate/20121220193944_create_spree_tax_cloud_cart_items.rb
147
+ - db/migrate/20130829215819_fix_scale_of_cart_item_prices.rb
148
+ - db/migrate/20140623225628_add_tic_to_products.rb
149
+ - lib/assets/javascripts/spree/frontend/solidus_tax_cloud.js.erb
150
+ - lib/assets/stylesheets/spree/frontend/solidus_tax_cloud.css.erb
151
+ - lib/controllers/backend/spree/admin/tax_cloud_settings_controller.rb
152
+ - lib/decorators/backend/controllers/solidus_tax_cloud/spree/admin/orders_controller_decorator.rb
153
+ - lib/decorators/frontend/controllers/solidus_tax_cloud/spree/checkout_controller_decorator.rb
154
+ - lib/generators/solidus_tax_cloud/install/install_generator.rb
155
+ - lib/generators/solidus_tax_cloud/templates/ca-bundle.crt
156
+ - lib/solidus_tax_cloud.rb
157
+ - lib/solidus_tax_cloud/engine.rb
158
+ - lib/solidus_tax_cloud/error.rb
159
+ - lib/solidus_tax_cloud/factories.rb
160
+ - lib/solidus_tax_cloud/version.rb
161
+ - lib/tasks/.gitkeep
162
+ - lib/tasks/tax_cloud.rake
163
+ - lib/views/backend/spree/admin/products/_edit_tax_cloud_tic.html.erb
164
+ - lib/views/backend/spree/admin/tax_cloud_settings/edit.html.erb
165
+ - solidus_tax_cloud.gemspec
166
+ - spec/features/checkout_spec.rb
167
+ - spec/models/tax_cloud_api_spec.rb
168
+ - spec/spec_helper.rb
169
+ - spec/support/capybara.rb
170
+ - spec/support/tax_cloud.rb
171
+ - spec/support/transactions.rb
172
+ homepage: https://github.com/solidusio-contrib/solidus_tax_cloud
173
+ licenses:
174
+ - BSD-3-Clause
175
+ metadata:
176
+ homepage_uri: https://github.com/solidusio-contrib/solidus_tax_cloud
177
+ source_code_uri: https://github.com/solidusio-contrib/solidus_tax_cloud
178
+ changelog_uri: https://github.com/solidusio-contrib/solidus_tax_cloud/blob/master/CHANGELOG.md
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '2.5'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubygems_version: 3.0.8
195
+ signing_key:
196
+ specification_version: 4
197
+ summary: Solidus extension providing Tax Cloud services
198
+ test_files:
199
+ - spec/features/checkout_spec.rb
200
+ - spec/models/tax_cloud_api_spec.rb
201
+ - spec/spec_helper.rb
202
+ - spec/support/capybara.rb
203
+ - spec/support/tax_cloud.rb
204
+ - spec/support/transactions.rb