vizjerai-avalara 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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