vizjerai-avalara 0.1.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 (61) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +25 -0
  3. data/CHANGELOG.md +14 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README +5 -0
  7. data/Rakefile +10 -0
  8. data/lib/avalara/api.rb +26 -0
  9. data/lib/avalara/configuration.rb +31 -0
  10. data/lib/avalara/errors.rb +8 -0
  11. data/lib/avalara/request/address.rb +15 -0
  12. data/lib/avalara/request/cancel_tax.rb +18 -0
  13. data/lib/avalara/request/detail_level.rb +13 -0
  14. data/lib/avalara/request/invoice.rb +40 -0
  15. data/lib/avalara/request/invoice_address.rb +19 -0
  16. data/lib/avalara/request/line.rb +24 -0
  17. data/lib/avalara/request.rb +13 -0
  18. data/lib/avalara/response/address_validation.rb +24 -0
  19. data/lib/avalara/response/cancel_tax.rb +20 -0
  20. data/lib/avalara/response/cancel_tax_result.rb +20 -0
  21. data/lib/avalara/response/invoice.rb +38 -0
  22. data/lib/avalara/response/message.rb +13 -0
  23. data/lib/avalara/response/tax.rb +24 -0
  24. data/lib/avalara/response/tax_address.rb +16 -0
  25. data/lib/avalara/response/tax_detail.rb +16 -0
  26. data/lib/avalara/response/tax_line.rb +22 -0
  27. data/lib/avalara/response/validation_address.rb +46 -0
  28. data/lib/avalara/response.rb +16 -0
  29. data/lib/avalara/types/date.rb +10 -0
  30. data/lib/avalara/types/stash.rb +28 -0
  31. data/lib/avalara/types.rb +8 -0
  32. data/lib/avalara/version.rb +5 -0
  33. data/lib/avalara.rb +121 -0
  34. data/spec/avalara.yml.example +3 -0
  35. data/spec/factories/addresses.rb +11 -0
  36. data/spec/factories/cancel_taxs.rb +9 -0
  37. data/spec/factories/detail_levels.rb +9 -0
  38. data/spec/factories/invoice_addresses.rb +15 -0
  39. data/spec/factories/invoices.rb +18 -0
  40. data/spec/factories/lines.rb +16 -0
  41. data/spec/fixtures/net/Avalara/_cancel_tax/successful_response.yml +59 -0
  42. data/spec/fixtures/net/Avalara/_cancel_tax/with_missing_doc_code/unsuccessful_response.yml +75 -0
  43. data/spec/fixtures/net/Avalara/_geographical_tax/successful_response.yml +92 -0
  44. data/spec/fixtures/net/Avalara/_geographical_tax/with_incomplete_address/unsuccessful_response.yml +66 -0
  45. data/spec/fixtures/net/Avalara/_get_tax/successful_response.yml +151 -0
  46. data/spec/fixtures/net/Avalara/_get_tax/with_missing_required_field/unsuccessful_response.yml +73 -0
  47. data/spec/fixtures/net/Avalara/_validate_address/successful_response.yml +76 -0
  48. data/spec/fixtures/net/Avalara/_validate_address/with_missing_postal_code/unsuccessful_response.yml +68 -0
  49. data/spec/models/avalara/configuration_spec.rb +55 -0
  50. data/spec/models/avalara/request/address_spec.rb +20 -0
  51. data/spec/models/avalara/request/detail_level_spec.rb +18 -0
  52. data/spec/models/avalara/request/invoice_address_spec.rb +24 -0
  53. data/spec/models/avalara/request/invoice_spec.rb +32 -0
  54. data/spec/models/avalara/request/line_spec.rb +25 -0
  55. data/spec/models/avalara_spec.rb +300 -0
  56. data/spec/spec_helper.rb +19 -0
  57. data/spec/support/avalara.rb +38 -0
  58. data/spec/support/factory_girl.rb +20 -0
  59. data/spec/support/vcr.rb +18 -0
  60. data/vizjerai-avalara.gemspec +31 -0
  61. metadata +257 -0
data/lib/avalara.rb ADDED
@@ -0,0 +1,121 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'avalara/version'
4
+ require 'avalara/errors'
5
+ require 'avalara/configuration'
6
+
7
+ require 'avalara/api'
8
+
9
+ require 'avalara/types'
10
+ require 'avalara/request'
11
+ require 'avalara/response'
12
+
13
+ module Avalara
14
+
15
+ def self.configuration
16
+ @@_configuration ||= Avalara::Configuration.new
17
+ yield @@_configuration if block_given?
18
+ @@_configuration
19
+ end
20
+
21
+ def self.configuration=(configuration)
22
+ raise ArgumentError, 'Expected a Avalara::Configuration instance' unless configuration.kind_of?(Configuration)
23
+ @@_configuration = configuration
24
+ end
25
+
26
+ def self.configure(&block)
27
+ configuration(&block)
28
+ end
29
+
30
+ def self.endpoint
31
+ configuration.endpoint
32
+ end
33
+ def self.endpoint=(endpoint)
34
+ configuration.endpoint = endpoint
35
+ end
36
+
37
+ def self.username
38
+ configuration.username
39
+ end
40
+ def self.username=(username)
41
+ configuration.username = username
42
+ end
43
+
44
+ def self.password
45
+ configuration.password
46
+ end
47
+ def self.password=(password)
48
+ configuration.password = password
49
+ end
50
+
51
+ def self.version
52
+ configuration.version
53
+ end
54
+ def self.version=(version)
55
+ configuration.version = version
56
+ end
57
+
58
+ def self.cancel_tax(cancel_invoice)
59
+ uri = [endpoint, version, 'tax', 'cancel'].join('/')
60
+
61
+ response = API.post(uri,
62
+ :body => cancel_invoice.to_json,
63
+ :headers => API.headers_for(cancel_invoice.to_json.length),
64
+ :basic_auth => authorization
65
+ )
66
+
67
+ Response::CancelTax.new(response)
68
+ rescue Timeout::Error => e
69
+ raise TimeoutError.new(e)
70
+ end
71
+
72
+ def self.geographical_tax(latitude, longitude, sales_amount)
73
+ uri = [endpoint, version, 'tax', "#{latitude},#{longitude}", 'get'].join('/')
74
+
75
+ response = API.get(uri,
76
+ :headers => API.headers_for(),
77
+ :query => {:saleamount => sales_amount},
78
+ :basic_auth => authorization
79
+ )
80
+
81
+ Response::Tax.new(response)
82
+ rescue Timeout::Error => e
83
+ raise TimeoutError.new(e)
84
+ end
85
+
86
+ def self.get_tax(invoice)
87
+ uri = [endpoint, version, 'tax', 'get'].join('/')
88
+
89
+ response = API.post(uri,
90
+ :body => invoice.to_json,
91
+ :headers => API.headers_for(invoice.to_json.length),
92
+ :basic_auth => authorization
93
+ )
94
+
95
+ Response::Invoice.new(response)
96
+ rescue Timeout::Error => e
97
+ raise TimeoutError.new(e)
98
+ rescue ApiError => e
99
+ raise e
100
+ rescue Exception => e
101
+ raise Error.new(e)
102
+ end
103
+
104
+ def self.validate_address(address)
105
+ uri = [endpoint, version, 'address', 'validate'].join('/')
106
+ response = API.get(uri,
107
+ :headers => API.headers_for(),
108
+ :query => address.to_hash,
109
+ :basic_auth => authorization
110
+ )
111
+ Response::AddressValidation.new(response)
112
+ rescue Timeout::Error => e
113
+ raise TimeoutError.new(e)
114
+ end
115
+
116
+ private
117
+
118
+ def self.authorization
119
+ {:username => username, :password => password}
120
+ end
121
+ end
@@ -0,0 +1,3 @@
1
+ username: 'testaccount'
2
+ password: 'testkey'
3
+ endpoint: 'https://development.avalara.net'
@@ -0,0 +1,11 @@
1
+ FactoryGirl.define do
2
+ factory :address, :class => Avalara::Request::Address do
3
+ line_1 "435 Ericksen Avenue Northeast"
4
+ line_2 "#250"
5
+ # line_3 "line_3"
6
+ # city "city"
7
+ # region "region"
8
+ # country "country"
9
+ postal_code "98110"
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ FactoryGirl.define do
2
+ factory :cancel_tax, :class => Avalara::Request::CancelTax do
3
+ company_code 83
4
+ doc_type 'SalesInvoice'
5
+ doc_code '1234'
6
+ cancel_code 'DocVoided'
7
+ #doc_id '12345678' #avatax's internal document_id
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ FactoryGirl.define do
2
+ factory :detail_level, :class => Avalara::Request::DetailLevel do
3
+ line "line"
4
+ summary "summary"
5
+ document "document"
6
+ tax "tax"
7
+ diagnostic "diagnostic"
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ FactoryGirl.define do
2
+ factory :invoice_address, :class => Avalara::Request::InvoiceAddress do
3
+ address_code 1
4
+ line_1 "435 Ericksen Avenue Northeast"
5
+ line_2 "#250"
6
+ # line_3 "line_3"
7
+ # city "city"
8
+ # region "region"
9
+ # country "country"
10
+ postal_code "98110"
11
+ # latitude "latitude"
12
+ # longitude "longitude"
13
+ # tax_region_id "tax_region_id"
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ FactoryGirl.define do
2
+ factory :invoice, :class => Avalara::Request::Invoice do
3
+ customer_code 1
4
+ doc_date Time.now
5
+ company_code 83
6
+ # commit false
7
+ # customer_usage_type "customer_usage_type"
8
+ # discount "discount"
9
+ # doc_code "1234"
10
+ # purchase_order_no "purchase_order_no"
11
+ # exemption_no "exemption_no"
12
+ # detail_level 'Tax'
13
+ # doc_type "SalesInvoice"
14
+ lines { [FactoryGirl.build_via_new(:line)] }
15
+ addresses { [FactoryGirl.build_via_new(:invoice_address)] }
16
+ # reference_code "reference_code"
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ FactoryGirl.define do
2
+ factory :line, :class => Avalara::Request::Line do
3
+ line_no "1"
4
+ destination_code "1"
5
+ origin_code "1"
6
+ # item_code "item_code"
7
+ # tax_code "tax_code"
8
+ # customer_usage_type "customer_usage_type"
9
+ qty 1
10
+ amount 10.00
11
+ # discounted "discounted"
12
+ # tax_included "tax_included"
13
+ # ref_1 "ref_1"
14
+ # ref_2 "ref_2"
15
+ end
16
+ end
@@ -0,0 +1,59 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://API_BASIC_AUTH@API_ENDPOINT/1.0/tax/cancel
6
+ body:
7
+ encoding: UTF-8
8
+ string: ! "{\n \"CompanyCode\": 83,\n \"DocType\": \"SalesInvoice\",\n
9
+ \ \"DocCode\": \"1234\",\n \"CancelCode\": \"DocVoided\"\n}"
10
+ headers:
11
+ Accept:
12
+ - application/json
13
+ Content-Type:
14
+ - text/json
15
+ Date:
16
+ - Thu, 13 Jun 2013 15:16:45 GMT
17
+ User-Agent:
18
+ - avalara/0.0.2 (Rubygems; Ruby 1.9.3 x86_64-freebsd8.1)
19
+ Content-Length:
20
+ - '114'
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ Cache-Control:
27
+ - private
28
+ Content-Type:
29
+ - text/json; charset=utf-8
30
+ X-Aspnet-Version:
31
+ - 4.0.30319
32
+ X-Powered-By:
33
+ - ASP.NET
34
+ Date:
35
+ - Thu, 13 Jun 2013 15:16:45 GMT
36
+ Content-Length:
37
+ - '99'
38
+ Set-Cookie:
39
+ - TS6198e2=d40d1ce94b23b9e6506eccd96db341b0cb5341f860a07a5551b9e25e; Path=/
40
+ - TS6198e2_28=9a561136e47d2984b432bf0734724926cb5341f860a07a5500000000000000000051b9e25e84b5fba9ed3b7d38;
41
+ Path=/
42
+ body:
43
+ encoding: US-ASCII
44
+ string: ! '{
45
+
46
+ "CancelTaxResult": {
47
+
48
+ "DocId": "34279849",
49
+
50
+ "TransactionId": 431361022,
51
+
52
+ "ResultCode": "Success"}
53
+
54
+ }
55
+
56
+ '
57
+ http_version:
58
+ recorded_at: Thu, 13 Jun 2013 15:16:46 GMT
59
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,75 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://API_BASIC_AUTH@API_ENDPOINT/1.0/tax/cancel
6
+ body:
7
+ encoding: UTF-8
8
+ string: ! "{\n \"CompanyCode\": 83,\n \"DocType\": \"SalesInvoice\",\n
9
+ \ \"DocCode\": null,\n \"CancelCode\": \"DocVoided\"\n}"
10
+ headers:
11
+ Accept:
12
+ - application/json
13
+ Content-Type:
14
+ - text/json
15
+ Date:
16
+ - Thu, 13 Jun 2013 15:36:29 GMT
17
+ User-Agent:
18
+ - avalara/0.0.2 (Rubygems; Ruby 1.9.3 x86_64-freebsd8.1)
19
+ Content-Length:
20
+ - '112'
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ Cache-Control:
27
+ - private
28
+ Content-Type:
29
+ - text/json; charset=utf-8
30
+ X-Aspnet-Version:
31
+ - 4.0.30319
32
+ X-Powered-By:
33
+ - ASP.NET
34
+ Date:
35
+ - Thu, 13 Jun 2013 15:36:29 GMT
36
+ Content-Length:
37
+ - '256'
38
+ Set-Cookie:
39
+ - TS6198e2=50d7d6baf19fd161cb134b400fce18d4444b7183dbbfac4551b9e6fd; Path=/
40
+ - TS6198e2_28=80a3b3ce66ce069f077bb60ed98a73de444b7183dbbfac4500000000000000000051b9e6fc20fb4fdba28c2eb6;
41
+ Path=/
42
+ body:
43
+ encoding: US-ASCII
44
+ string: ! '{
45
+
46
+ "CancelTaxResult": {
47
+
48
+ "TransactionId": 431377420,
49
+
50
+ "ResultCode": "Error",
51
+
52
+ "Messages": [
53
+
54
+ {
55
+
56
+ "Summary": "DocCode is required.",
57
+
58
+ "RefersTo": "DocCode",
59
+
60
+ "Severity": "Error",
61
+
62
+ "Source": "Avalara.AvaTax.Services",
63
+
64
+ "Details": "This value must be specified."}
65
+
66
+ ]
67
+
68
+ }
69
+
70
+ }
71
+
72
+ '
73
+ http_version:
74
+ recorded_at: Thu, 13 Jun 2013 15:36:29 GMT
75
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,92 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://API_BASIC_AUTH@API_ENDPOINT/1.0/tax/47.627935,-122.51702/get?saleamount=100
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ Content-Type:
13
+ - text/json
14
+ Date:
15
+ - Tue, 11 Jun 2013 20:06:02 GMT
16
+ User-Agent:
17
+ - avalara/0.0.2 (Rubygems; Ruby 1.9.3 x86_64-freebsd8.1)
18
+ Content-Length:
19
+ - '0'
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Cache-Control:
26
+ - private
27
+ Content-Type:
28
+ - text/json; charset=utf-8
29
+ X-Aspnet-Version:
30
+ - 4.0.30319
31
+ X-Powered-By:
32
+ - ASP.NET
33
+ Date:
34
+ - Tue, 11 Jun 2013 20:06:03 GMT
35
+ Content-Length:
36
+ - '356'
37
+ Set-Cookie:
38
+ - TS6198e2=f269f6ec01f43005c796a696d743adbab44110d473ce2a0751b7832b; Path=/
39
+ - TS6198e2_28=7dc6acf5dae9dc5790ffe92f50b06bc0b44110d473ce2a0700000000000000000051b7832b91f2ed2d3b9cab78;
40
+ Path=/
41
+ body:
42
+ encoding: US-ASCII
43
+ string: ! '{
44
+
45
+ "Rate": 0.086,
46
+
47
+ "Tax": 8.6,
48
+
49
+ "TaxDetails": [
50
+
51
+ {
52
+
53
+ "Country": "US",
54
+
55
+ "Region": "WA",
56
+
57
+ "JurisType": "State",
58
+
59
+ "Rate": 0.065,
60
+
61
+ "Tax": 6.5,
62
+
63
+ "JurisName": "WASHINGTON",
64
+
65
+ "TaxName": "WA STATE TAX"}
66
+
67
+ ,{
68
+
69
+ "Country": "US",
70
+
71
+ "Region": "WA",
72
+
73
+ "JurisType": "City",
74
+
75
+ "Rate": 0.021,
76
+
77
+ "Tax": 2.1,
78
+
79
+ "JurisName": "BAINBRIDGE ISLAND",
80
+
81
+ "TaxName": "WA CITY TAX"}
82
+
83
+ ]
84
+
85
+ ,
86
+
87
+ "ResultCode": "Success"}
88
+
89
+ '
90
+ http_version:
91
+ recorded_at: Tue, 11 Jun 2013 20:06:05 GMT
92
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,66 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://API_BASIC_AUTH@API_ENDPOINT/1.0/tax/47.627935,122.51702/get?saleamount=100
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ Content-Type:
13
+ - text/json
14
+ Date:
15
+ - Tue, 11 Jun 2013 20:06:05 GMT
16
+ User-Agent:
17
+ - avalara/0.0.2 (Rubygems; Ruby 1.9.3 x86_64-freebsd8.1)
18
+ Content-Length:
19
+ - '0'
20
+ response:
21
+ status:
22
+ code: 500
23
+ message: Internal Server Error
24
+ headers:
25
+ Cache-Control:
26
+ - private
27
+ Content-Type:
28
+ - text/json; charset=utf-8
29
+ X-Aspnet-Version:
30
+ - 4.0.30319
31
+ X-Powered-By:
32
+ - ASP.NET
33
+ Date:
34
+ - Tue, 11 Jun 2013 20:06:05 GMT
35
+ Content-Length:
36
+ - '199'
37
+ Set-Cookie:
38
+ - TS6198e2=0fbc977705f174841c183156e45d6384a9fcff46f066e83251b7832e; Path=/
39
+ - TS6198e2_28=c97054c1ff46a2126a0bf4f1be5e95bda9fcff46f066e83200000000000000000051b7832d85aedc9eb7336aa4;
40
+ Path=/
41
+ body:
42
+ encoding: US-ASCII
43
+ string: ! '{
44
+
45
+ "ResultCode": "Error",
46
+
47
+ "Messages": [
48
+
49
+ {
50
+
51
+ "Summary": "Geocoding error Address is incomplete or invalid.",
52
+
53
+ "RefersTo": "Addresses[0]",
54
+
55
+ "Severity": "Error",
56
+
57
+ "Source": "Avalara.AvaTax.Services.Tax"}
58
+
59
+ ]
60
+
61
+ }
62
+
63
+ '
64
+ http_version:
65
+ recorded_at: Tue, 11 Jun 2013 20:06:06 GMT
66
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,151 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://API_BASIC_AUTH@API_ENDPOINT/1.0/tax/get
6
+ body:
7
+ encoding: UTF-8
8
+ string: ! "{\n \"CustomerCode\": 1,\n \"DocDate\": \"2012-01-01\",\n \"CompanyCode\":
9
+ 83,\n \"Lines\": [\n {\n \"LineNo\": \"1\",\n \"DestinationCode\":
10
+ \"1\",\n \"OriginCode\": \"1\",\n \"Qty\": \"1\",\n \"Amount\":
11
+ 10\n }\n ],\n \"Addresses\": [\n {\n \"AddressCode\": 1,\n \"Line1\":
12
+ \"435 Ericksen Avenue Northeast\",\n \"Line2\": \"#250\",\n \"PostalCode\":
13
+ \"98110\"\n }\n ]\n}"
14
+ headers:
15
+ Accept:
16
+ - application/json
17
+ Content-Type:
18
+ - text/json
19
+ Date:
20
+ - Tue, 11 Jun 2013 14:34:23 GMT
21
+ User-Agent:
22
+ - avalara/0.0.2 (Rubygems; Ruby 1.9.3 x86_64-freebsd8.1)
23
+ Content-Length:
24
+ - '371'
25
+ response:
26
+ status:
27
+ code: 200
28
+ message: OK
29
+ headers:
30
+ Cache-Control:
31
+ - private
32
+ Content-Type:
33
+ - text/json; charset=utf-8
34
+ X-Aspnet-Version:
35
+ - 4.0.30319
36
+ X-Powered-By:
37
+ - ASP.NET
38
+ Date:
39
+ - Tue, 11 Jun 2013 14:34:22 GMT
40
+ Content-Length:
41
+ - '913'
42
+ Set-Cookie:
43
+ - TS6198e2=adc831970a86a132df47df6ed8f792d66572192cd45d204451b7356f; Path=/
44
+ - TS6198e2_28=a2af8f18ee62469c80989b4f0b1f20846572192cd45d204400000000000000000051b7356e3a5ef616b7cfc578;
45
+ Path=/
46
+ body:
47
+ encoding: US-ASCII
48
+ string: ! '{
49
+
50
+ "ResultCode": "Success",
51
+
52
+ "DocCode": "221f9d47-2717-446b-b805-cb6bc887cf22",
53
+
54
+ "DocDate": "2012-01-01",
55
+
56
+ "Timestamp": "2013-06-11T14:34:23.6768215Z",
57
+
58
+ "TotalAmount": "10",
59
+
60
+ "TotalDiscount": "0",
61
+
62
+ "TotalExemption": "10",
63
+
64
+ "TotalTaxable": "0",
65
+
66
+ "TotalTax": "0",
67
+
68
+ "TotalTaxCalculated": "0",
69
+
70
+ "TaxLines": [
71
+
72
+ {
73
+
74
+ "LineNo": "1",
75
+
76
+ "TaxCode": "P0000000",
77
+
78
+ "Taxability": "true",
79
+
80
+ "BoundaryLevel": "Address",
81
+
82
+ "Exemption": "10",
83
+
84
+ "Discount": "0",
85
+
86
+ "Taxable": "0",
87
+
88
+ "Rate": "0",
89
+
90
+ "Tax": "0",
91
+
92
+ "TaxCalculated": "0",
93
+
94
+ "TaxDetails": [
95
+
96
+ {
97
+
98
+ "Country": "US",
99
+
100
+ "Region": "WA",
101
+
102
+ "JurisType": "State",
103
+
104
+ "Taxable": "0",
105
+
106
+ "Rate": "0",
107
+
108
+ "Tax": "0",
109
+
110
+ "JurisName": "WASHINGTON",
111
+
112
+ "TaxName": "WA STATE TAX"}
113
+
114
+ ]
115
+
116
+ }
117
+
118
+ ]
119
+
120
+ ,
121
+
122
+ "TaxAddresses": [
123
+
124
+ {
125
+
126
+ "Address": "435 ERICKSEN AVE NE STE 250",
127
+
128
+ "AddressCode": "1",
129
+
130
+ "City": "BAINBRIDGE ISLAND",
131
+
132
+ "Country": "US",
133
+
134
+ "PostalCode": "98110-2876",
135
+
136
+ "Region": "WA",
137
+
138
+ "TaxRegionId": "2109716",
139
+
140
+ "JurisCode": "5303503736"}
141
+
142
+ ]
143
+
144
+ ,
145
+
146
+ "TaxDate": "2012-01-01"}
147
+
148
+ '
149
+ http_version:
150
+ recorded_at: Tue, 11 Jun 2013 14:34:23 GMT
151
+ recorded_with: VCR 2.5.0