solidus_avatax_certified 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +28 -0
- data/Gemfile +3 -0
- data/README.md +4 -0
- data/app/assets/javascripts/spree/backend/address_validator.js +1 -1
- data/app/assets/javascripts/spree/frontend/address_validator.js +1 -1
- data/app/controllers/spree/admin/avatax_settings_controller.rb +5 -13
- data/app/models/solidus_avatax_certified/address.rb +2 -8
- data/app/models/solidus_avatax_certified/avatax_log.rb +10 -20
- data/app/models/solidus_avatax_certified/line.rb +0 -6
- data/app/models/solidus_avatax_certified/preference_updater.rb +11 -28
- data/app/models/solidus_avatax_certified/request/base.rb +64 -0
- data/app/models/solidus_avatax_certified/request/cancel_tax.rb +14 -0
- data/app/models/solidus_avatax_certified/request/get_tax.rb +27 -0
- data/app/models/solidus_avatax_certified/request/return_tax.rb +50 -0
- data/app/models/solidus_avatax_certified/response/address_validation.rb +11 -0
- data/app/models/solidus_avatax_certified/response/base.rb +25 -0
- data/app/models/solidus_avatax_certified/response/cancel_tax.rb +15 -0
- data/app/models/solidus_avatax_certified/response/get_tax.rb +11 -0
- data/app/models/spree/address_decorator.rb +2 -2
- data/app/models/spree/adjustment_decorator.rb +0 -2
- data/app/models/spree/avalara_transaction.rb +20 -108
- data/app/models/spree/avatax_configuration.rb +25 -0
- data/app/models/spree/calculator/avalara_transaction.rb +18 -10
- data/app/models/spree/order_decorator.rb +7 -15
- data/app/models/spree/payment_decorator.rb +2 -7
- data/app/models/spree/refund_decorator.rb +6 -10
- data/app/models/spree/shipping_rate_decorator.rb +1 -1
- data/app/models/tax_svc.rb +71 -61
- data/app/views/spree/admin/avatax_settings/edit.html.erb +34 -54
- data/app/views/spree/admin/avatax_settings/show.html.erb +28 -35
- data/app/views/spree/checkout/_address_validator_button.html.erb +1 -1
- data/config/initializers/avatax.rb +11 -2
- data/config/locales/en.yml +9 -3
- data/config/routes.rb +1 -1
- data/db/migrate/20170509201056_drop_spree_avalara_preferences.rb +6 -0
- data/lib/solidus_avatax_certified/exceptions.rb +4 -0
- data/lib/solidus_avatax_certified/preference_seeder.rb +9 -27
- data/lib/solidus_avatax_certified/version.rb +3 -0
- data/lib/solidus_avatax_certified.rb +2 -0
- data/solidus_avatax_certified.gemspec +6 -3
- data/spec/controllers/spree/admin/avatax_settings_controller_spec.rb +8 -8
- data/spec/factories/response_hash_factories.rb +88 -0
- data/spec/features/checkout_spec.rb +1 -1
- data/spec/features/vat_spec.rb +1 -1
- data/spec/models/solidus_avatax_certified/address_spec.rb +22 -7
- data/spec/models/solidus_avatax_certified/avatax_log_spec.rb +17 -24
- data/spec/models/solidus_avatax_certified/line_spec.rb +8 -4
- data/spec/models/solidus_avatax_certified/request/base_spec.rb +13 -0
- data/spec/models/solidus_avatax_certified/request/cancel_tax_spec.rb +13 -0
- data/spec/models/solidus_avatax_certified/request/get_tax_spec.rb +31 -0
- data/spec/models/solidus_avatax_certified/request/return_tax_spec.rb +31 -0
- data/spec/models/solidus_avatax_certified/response/base_spec.rb +21 -0
- data/spec/models/spree/address_decorator_spec.rb +5 -5
- data/spec/models/spree/adjustment_decorator_spec.rb +0 -10
- data/spec/models/spree/avalara_transaction_spec.rb +12 -12
- data/spec/models/spree/calculator/avalara_transaction_spec.rb +4 -3
- data/spec/models/spree/order_decorator_spec.rb +38 -12
- data/spec/models/spree/payment_decorator_spec.rb +7 -9
- data/spec/models/spree/refund_decorator_spec.rb +1 -1
- data/spec/models/tax_svc_spec.rb +65 -0
- data/spec/spec_helper.rb +3 -2
- data/spec/support/avatax_config_preferences.rb +1 -3
- data/spec/support/vcr.rb +1 -1
- data/spec/vcr/Spree_Order/_cancel_avalara/error/should_raise_exception_if_preference_is_enabled.yml +191 -0
- data/spec/vcr/Spree_Order/_cancel_avalara/error/should_receive_ResultCode_of_Error.yml +191 -0
- data/spec/vcr/{SolidusAvataxCertified_Address/_validate/fails_when_information_is_incorrect.yml → Spree_Order/_validate_ship_address/validation_failed/raise_exceptions_if_raise_exceptions_preference_is_enabled.yml} +8 -8
- data/spec/vcr/Spree_Order/_validate_ship_address/validation_failed/should_return_false.yml +54 -0
- data/spec/vcr/Spree_Payment/_avalara_finalize/should_receive_avalara_finalize.yml +205 -0
- data/spec/vcr/TaxSvc/_cancel_tax/respond_with_success.yml +121 -0
- data/spec/vcr/TaxSvc/_cancel_tax/should_raise_error.yml +58 -0
- data/spec/vcr/TaxSvc/_get_tax/fails/fails_when_no_lines_are_given.yml +60 -0
- data/spec/vcr/TaxSvc/_get_tax/fails/fails_when_no_params_are_given.yml +68 -0
- data/spec/vcr/TaxSvc/_get_tax/fails/responds_with_error_when_result_code_is_not_a_success.yml +61 -0
- data/spec/vcr/TaxSvc/_get_tax/gets_tax_when_all_credentials_are_there.yml +68 -0
- data/spec/vcr/TaxSvc/_ping/should_return_estimate.yml +81 -0
- data/spec/vcr/address_validation_failure.yml +54 -0
- data/spec/vcr/address_validation_success.yml +16 -16
- data/spec/vcr/order_capture.yml +21 -21
- data/spec/vcr/order_capture_finalize.yml +22 -91
- metadata +56 -13
- data/GEM_VERSION +0 -1
- data/app/models/spree/avalara_preference.rb +0 -72
- data/spec/factories/avalara_preference_factory.rb +0 -7
- data/spec/models/spree/avalara_preference_spec.rb +0 -173
- data/spec/vcr/Spree_Payment/_avalara_finalize/should_update_the_amount_to_be_the_order_total.yml +0 -136
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88d7c785ac3c5a75d216e1ceb29f7a541579be6c
|
4
|
+
data.tar.gz: 6d5b6363588951eeef89cbe13a747ee4c4ae29c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4831e98ede6e7d067b7d889184553261726f04faeac142133c7b53cddd19f46d1179b2ee680baf93dafbcbfd633c5edab8bcca6fc25104c96480d8d12b90067d
|
7
|
+
data.tar.gz: f4a2e6f51878e652053d1c2bc4f951e592a441cdf7f85cff13409a4d28403154b395304d3625991396509bf57410db61e6249612893b538bf4f5085eb7fa5308
|
data/.travis.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
sudo: false
|
2
|
+
language: ruby
|
3
|
+
rvm:
|
4
|
+
- 2.3.3
|
5
|
+
before_install:
|
6
|
+
- rvm @default,@global do gem uninstall bundler -x
|
7
|
+
- gem install bundler --version '~> 1.13.0'
|
8
|
+
- bundle --version
|
9
|
+
before_script:
|
10
|
+
- sh -e /etc/init.d/xvfb start
|
11
|
+
- export DISPLAY=:99.0
|
12
|
+
- bundle exec rake test_app
|
13
|
+
script:
|
14
|
+
- bundle exec rspec
|
15
|
+
env:
|
16
|
+
matrix:
|
17
|
+
- SOLIDUS_BRANCH=v1.0 DB=postgres
|
18
|
+
- SOLIDUS_BRANCH=v1.1 DB=postgres
|
19
|
+
- SOLIDUS_BRANCH=v1.2 DB=postgres
|
20
|
+
- SOLIDUS_BRANCH=v1.3 DB=postgres
|
21
|
+
- SOLIDUS_BRANCH=v1.4 DB=postgres
|
22
|
+
- SOLIDUS_BRANCH=v2.0 DB=postgres
|
23
|
+
- SOLIDUS_BRANCH=v1.0 DB=mysql
|
24
|
+
- SOLIDUS_BRANCH=v1.1 DB=mysql
|
25
|
+
- SOLIDUS_BRANCH=v1.2 DB=mysql
|
26
|
+
- SOLIDUS_BRANCH=v1.3 DB=mysql
|
27
|
+
- SOLIDUS_BRANCH=v1.4 DB=mysql
|
28
|
+
- SOLIDUS_BRANCH=v2.0 DB=mysql
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/boomerdigital/solidus_avatax_certified.svg?branch=master)](https://travis-ci.org/boomerdigital/solidus_avatax_certified)
|
2
|
+
|
1
3
|
SolidusAvataxCertified
|
2
4
|
===========
|
3
5
|
|
@@ -12,6 +14,8 @@ From Avalara's own explanation of the certification program:
|
|
12
14
|
> 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
15
|
|
14
16
|
|
17
|
+
**For Solidus versions v2.1 and up, please use branch v2.1**
|
18
|
+
|
15
19
|
**[For Installation and Setup instructions, please visit our wiki.](https://github.com/boomerdigital/solidus_avatax_certified/wiki)**
|
16
20
|
|
17
21
|
Testing
|
@@ -37,7 +37,7 @@ AddressValidator.prototype = {
|
|
37
37
|
|
38
38
|
$.each(["Line1", "Line2", "City", "PostalCode"], function(index, value){
|
39
39
|
var keyVal = controller.getKeyByValue(value);
|
40
|
-
$(wrapper + " input[id*='" + keyVal + "']").val(data.Address[value]);
|
40
|
+
$(wrapper + " input[id*='" + keyVal + "']").val(data.result.Address[value]);
|
41
41
|
}.bind(address));
|
42
42
|
|
43
43
|
this.showFlash(data);
|
@@ -39,7 +39,7 @@ AddressValidator.prototype = {
|
|
39
39
|
|
40
40
|
$.each(["Line1", "Line2", "City", "PostalCode"], function(index, value){
|
41
41
|
var keyVal = controller.getKeyByValue(value);
|
42
|
-
$(wrapper + " input[id*='" + keyVal + "']").val(data.Address[value]);
|
42
|
+
$(wrapper + " input[id*='" + keyVal + "']").val(data.result.Address[value]);
|
43
43
|
}.bind(address));
|
44
44
|
|
45
45
|
this.showFlash(data);
|
@@ -7,20 +7,12 @@ module Spree
|
|
7
7
|
def show
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
send_file "#{Rails.root}/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"
|
10
|
+
def download_avatax_log
|
11
|
+
send_file "#{Rails.root}/log/avatax.log"
|
20
12
|
end
|
21
13
|
|
22
14
|
def erase_data
|
23
|
-
File.open("log
|
15
|
+
File.open("log/avatax.log", 'w') {}
|
24
16
|
|
25
17
|
head :ok
|
26
18
|
end
|
@@ -67,10 +59,10 @@ module Spree
|
|
67
59
|
private
|
68
60
|
|
69
61
|
def load_avatax_origin
|
70
|
-
if Spree::
|
62
|
+
if Spree::Avatax::Config.origin.blank?
|
71
63
|
@avatax_origin = {}
|
72
64
|
else
|
73
|
-
@avatax_origin = JSON.parse(Spree::
|
65
|
+
@avatax_origin = JSON.parse(Spree::Avatax::Config.origin)
|
74
66
|
end
|
75
67
|
end
|
76
68
|
|
@@ -10,7 +10,7 @@ module SolidusAvataxCertified
|
|
10
10
|
def initialize(order)
|
11
11
|
@order = order
|
12
12
|
@ship_address = order.ship_address
|
13
|
-
@origin_address = JSON.parse(Spree::
|
13
|
+
@origin_address = JSON.parse(Spree::Avatax::Config.origin)
|
14
14
|
@addresses = []
|
15
15
|
|
16
16
|
build_addresses
|
@@ -20,8 +20,6 @@ module SolidusAvataxCertified
|
|
20
20
|
origin_address
|
21
21
|
order_ship_address unless @ship_address.nil?
|
22
22
|
origin_ship_addresses
|
23
|
-
|
24
|
-
logger.debug @addresses
|
25
23
|
end
|
26
24
|
|
27
25
|
def origin_address
|
@@ -81,15 +79,11 @@ module SolidusAvataxCertified
|
|
81
79
|
|
82
80
|
def validation_response(address)
|
83
81
|
validator = TaxSvc.new
|
84
|
-
validator.validate_address(address)
|
82
|
+
validator.validate_address(address).validation_result
|
85
83
|
end
|
86
84
|
|
87
85
|
def stock_loc_ids
|
88
86
|
order.shipments.pluck(:stock_location_id).uniq
|
89
87
|
end
|
90
|
-
|
91
|
-
def logger
|
92
|
-
@logger ||= SolidusAvataxCertified::AvataxLog.new('avalara_order_addresses', 'SolidusAvataxCertified::Address', "Building Addresses for Order#: #{order.number}")
|
93
|
-
end
|
94
88
|
end
|
95
89
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module SolidusAvataxCertified
|
2
2
|
class AvataxLog
|
3
|
-
def initialize(
|
4
|
-
if !Spree::
|
3
|
+
def initialize(file_name, log_info = nil, schedule = nil)
|
4
|
+
if !Spree::Avatax::Config.log_to_stdout
|
5
5
|
schedule = 'weekly' unless schedule != nil
|
6
|
-
@logger ||= Logger.new("#{Rails.root}/log
|
6
|
+
@logger ||= Logger.new("#{Rails.root}/log/avatax.log", schedule)
|
7
7
|
progname(file_name.split('/').last.chomp('.rb'))
|
8
8
|
info(log_info) unless log_info.nil?
|
9
9
|
else
|
@@ -17,7 +17,7 @@ module SolidusAvataxCertified
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def enabled?
|
20
|
-
Spree::
|
20
|
+
Spree::Avatax::Config.log || Spree::Avatax::Config.log_to_stdout
|
21
21
|
end
|
22
22
|
|
23
23
|
def progname(progname = nil)
|
@@ -26,11 +26,9 @@ module SolidusAvataxCertified
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def info(
|
29
|
+
def info(message, obj = nil)
|
30
30
|
if enabled?
|
31
|
-
|
32
|
-
logger.info "[AVATAX] #{log_info}"
|
33
|
-
end
|
31
|
+
logger.info "[AVATAX] #{message} #{obj}"
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
@@ -46,23 +44,15 @@ module SolidusAvataxCertified
|
|
46
44
|
end
|
47
45
|
|
48
46
|
|
49
|
-
def debug(obj,
|
47
|
+
def debug(obj, message='')
|
50
48
|
if enabled?
|
51
|
-
logger.debug "[AVATAX] #{obj.inspect}"
|
52
|
-
if text.nil?
|
53
|
-
obj
|
54
|
-
else
|
55
|
-
logger.debug "[AVATAX] text"
|
56
|
-
text
|
57
|
-
end
|
49
|
+
logger.debug "[AVATAX] #{message} #{obj.inspect}"
|
58
50
|
end
|
59
51
|
end
|
60
52
|
|
61
|
-
def error(
|
53
|
+
def error(obj, message='')
|
62
54
|
if enabled?
|
63
|
-
|
64
|
-
logger.error "[AVATAX] #{log_info}"
|
65
|
-
end
|
55
|
+
logger.error "[AVATAX] #{message} #{obj}"
|
66
56
|
end
|
67
57
|
end
|
68
58
|
end
|
@@ -18,8 +18,6 @@ module SolidusAvataxCertified
|
|
18
18
|
item_lines_array
|
19
19
|
shipment_lines_array
|
20
20
|
end
|
21
|
-
|
22
|
-
logger.debug @lines
|
23
21
|
end
|
24
22
|
|
25
23
|
def item_line(line_item)
|
@@ -133,10 +131,6 @@ module SolidusAvataxCertified
|
|
133
131
|
line_item.adjustments.promotion.eligible.any? || order.adjustments.promotion.eligible.any?
|
134
132
|
end
|
135
133
|
|
136
|
-
def logger
|
137
|
-
@logger ||= SolidusAvataxCertified::AvataxLog.new('avalara_order_lines', 'SolidusAvataxCertified::Line', "Building Lines for Order#: #{order.number}")
|
138
|
-
end
|
139
|
-
|
140
134
|
def tax_included_in_price?(item)
|
141
135
|
# Need better error handling
|
142
136
|
# if no tax rates, raise error tax rates needs to be set up
|
@@ -7,56 +7,39 @@ module SolidusAvataxCertified
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def update
|
10
|
+
update_storable_settings
|
11
|
+
update_boolean_settings
|
10
12
|
update_validation_enabled_countries
|
11
13
|
update_origin_address
|
12
|
-
update_stored_preferences
|
13
|
-
update_boolean_preferences
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
def
|
19
|
-
Spree::
|
20
|
-
|
21
|
-
update_value(preference, ENV["AVATAX_#{preference.name.upcase}"])
|
22
|
-
else
|
23
|
-
update_value(preference, @avatax_preferences[preference.name.downcase])
|
24
|
-
end
|
18
|
+
def update_boolean_settings
|
19
|
+
Spree::AvataxConfiguration.boolean_preferences.each do |key|
|
20
|
+
Spree::Avatax::Config[key.to_sym] = @avatax_preferences[key] || false
|
25
21
|
end
|
26
22
|
end
|
27
23
|
|
28
|
-
def
|
29
|
-
Spree::
|
30
|
-
|
31
|
-
update_value(boolean, 'true')
|
32
|
-
else
|
33
|
-
update_value(boolean, 'false')
|
34
|
-
end
|
24
|
+
def update_storable_settings
|
25
|
+
Spree::AvataxConfiguration.storable_env_preferences.each do |key|
|
26
|
+
Spree::Avatax::Config[key.to_sym] = @avatax_preferences[key] || ENV["AVATAX_#{key.upcase}"]
|
35
27
|
end
|
36
28
|
end
|
37
29
|
|
30
|
+
|
38
31
|
def update_origin_address
|
39
32
|
set_region
|
40
33
|
set_country
|
41
|
-
|
34
|
+
Spree::Avatax::Config.origin = @avatax_origin.to_json
|
42
35
|
end
|
43
36
|
|
44
37
|
def update_validation_enabled_countries
|
45
38
|
if @avatax_preferences['address_validation_enabled_countries'].present?
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def update_value(preference, param)
|
51
|
-
if value_changed?(preference, param)
|
52
|
-
preference.update_attributes(value: param)
|
39
|
+
Spree::Avatax::Config.address_validation_enabled_countries = @avatax_preferences['address_validation_enabled_countries']
|
53
40
|
end
|
54
41
|
end
|
55
42
|
|
56
|
-
def value_changed?(preference, param)
|
57
|
-
preference.value != param
|
58
|
-
end
|
59
|
-
|
60
43
|
def set_region
|
61
44
|
region = @avatax_origin['Region']
|
62
45
|
unless region.blank?
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module SolidusAvataxCertified
|
2
|
+
module Request
|
3
|
+
class Base
|
4
|
+
attr_reader :order, :request
|
5
|
+
|
6
|
+
def initialize(order, opts={})
|
7
|
+
@order = order
|
8
|
+
@doc_type = opts[:doc_type]
|
9
|
+
@commit = opts[:commit]
|
10
|
+
@request = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate
|
14
|
+
raise 'Method needs to be implemented in subclass.'
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def base_tax_hash
|
20
|
+
{
|
21
|
+
CustomerCode: customer_code,
|
22
|
+
CompanyCode: company_code,
|
23
|
+
CustomerUsageType: order.customer_usage_type,
|
24
|
+
ExemptionNo: order.user.try(:exemption_number),
|
25
|
+
Client: avatax_client_version,
|
26
|
+
ReferenceCode: order.number,
|
27
|
+
DetailLevel: 'Tax',
|
28
|
+
CurrencyCode: order.currency
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
# If there is a vat id, set BusinessIdentificationNo
|
33
|
+
def check_vat_id
|
34
|
+
if !business_id_no.blank?
|
35
|
+
@request[:BusinessIdentificationNo] = business_id_no
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def address_lines
|
40
|
+
@address_lines ||= SolidusAvataxCertified::Address.new(order).addresses
|
41
|
+
end
|
42
|
+
|
43
|
+
def sales_lines
|
44
|
+
@sales_lines ||= SolidusAvataxCertified::Line.new(order, @doc_type).lines
|
45
|
+
end
|
46
|
+
|
47
|
+
def company_code
|
48
|
+
@company_code ||= Spree::Avatax::Config.company_code
|
49
|
+
end
|
50
|
+
|
51
|
+
def business_id_no
|
52
|
+
order.user.try(:vat_id)
|
53
|
+
end
|
54
|
+
|
55
|
+
def customer_code
|
56
|
+
order.user ? order.user.id : order.email
|
57
|
+
end
|
58
|
+
|
59
|
+
def avatax_client_version
|
60
|
+
AVATAX_CLIENT_VERSION || 'a0o33000004FH8l'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module SolidusAvataxCertified
|
2
|
+
module Request
|
3
|
+
class CancelTax < SolidusAvataxCertified::Request::Base
|
4
|
+
def generate
|
5
|
+
@request = {
|
6
|
+
CompanyCode: company_code,
|
7
|
+
DocType: @doc_type,
|
8
|
+
DocCode: order.number,
|
9
|
+
CancelCode: 'DocVoided'
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module SolidusAvataxCertified
|
2
|
+
module Request
|
3
|
+
class GetTax < SolidusAvataxCertified::Request::Base
|
4
|
+
def generate
|
5
|
+
@request = {
|
6
|
+
DocCode: order.number,
|
7
|
+
DocDate: doc_date,
|
8
|
+
Discount: order.all_adjustments.promotion.eligible.sum(:amount).abs.to_s,
|
9
|
+
Commit: @commit,
|
10
|
+
DocType: @doc_type ? @doc_type : 'SalesOrder',
|
11
|
+
Addresses: address_lines,
|
12
|
+
Lines: sales_lines
|
13
|
+
}.merge(base_tax_hash)
|
14
|
+
|
15
|
+
check_vat_id
|
16
|
+
|
17
|
+
@request
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def doc_date
|
23
|
+
order.completed? ? order.completed_at.strftime('%F') : Date.today.strftime('%F')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module SolidusAvataxCertified
|
2
|
+
module Request
|
3
|
+
class ReturnTax < SolidusAvataxCertified::Request::Base
|
4
|
+
|
5
|
+
def initialize(order, opts={})
|
6
|
+
super
|
7
|
+
@refund = opts[:refund]
|
8
|
+
end
|
9
|
+
|
10
|
+
def generate
|
11
|
+
@request = {
|
12
|
+
DocCode: order.number.to_s + '.' + @refund.id.to_s,
|
13
|
+
DocDate: Date.today.strftime('%F'),
|
14
|
+
Commit: @commit,
|
15
|
+
DocType: @doc_type ? @doc_type : 'ReturnOrder',
|
16
|
+
Addresses: address_lines,
|
17
|
+
Lines: sales_lines
|
18
|
+
}.merge(base_tax_hash)
|
19
|
+
|
20
|
+
check_vat_id
|
21
|
+
|
22
|
+
@request
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def doc_date
|
28
|
+
Date.today.strftime('%F')
|
29
|
+
end
|
30
|
+
|
31
|
+
def base_tax_hash
|
32
|
+
super.merge(tax_override)
|
33
|
+
end
|
34
|
+
|
35
|
+
def tax_override
|
36
|
+
{
|
37
|
+
TaxOverride: {
|
38
|
+
TaxOverrideType: 'TaxDate',
|
39
|
+
Reason: @refund.try(:reason).try(:name).limit(255) || 'Return',
|
40
|
+
TaxDate: order.completed_at.strftime('%F')
|
41
|
+
}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def sales_lines
|
46
|
+
@sales_lines ||= SolidusAvataxCertified::Line.new(order, @doc_type, @refund).lines
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module SolidusAvataxCertified
|
2
|
+
module Response
|
3
|
+
class Base
|
4
|
+
attr_accessor :result
|
5
|
+
# To Do
|
6
|
+
# 1. Create way to display errors cleanly
|
7
|
+
|
8
|
+
def initialize(result)
|
9
|
+
@result = result
|
10
|
+
end
|
11
|
+
|
12
|
+
def success?
|
13
|
+
result['ResultCode'] == 'Success'
|
14
|
+
end
|
15
|
+
|
16
|
+
def error?
|
17
|
+
!success? rescue true
|
18
|
+
end
|
19
|
+
|
20
|
+
def description
|
21
|
+
raise 'Method needs to be implemented in subclass.'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SolidusAvataxCertified
|
2
|
+
module Response
|
3
|
+
class CancelTax < SolidusAvataxCertified::Response::Base
|
4
|
+
alias :tax_result :result
|
5
|
+
|
6
|
+
def initialize(result)
|
7
|
+
@result = result['CancelTaxResult']
|
8
|
+
end
|
9
|
+
|
10
|
+
def description
|
11
|
+
'Cancel Tax'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Spree::Address.class_eval do
|
2
2
|
def validation_enabled?
|
3
|
-
Spree::
|
3
|
+
Spree::Avatax::Config.address_validation && country_validation_enabled?
|
4
4
|
end
|
5
5
|
|
6
6
|
def country_validation_enabled?
|
@@ -8,6 +8,6 @@ Spree::Address.class_eval do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.validation_enabled_countries
|
11
|
-
Spree::
|
11
|
+
Spree::Avatax::Config.address_validation_enabled_countries
|
12
12
|
end
|
13
13
|
end
|