solidus_easypost 2.0.0 → 3.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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +6 -0
  3. data/.github/stale.yml +4 -4
  4. data/.github_changelog_generator +2 -0
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +3 -0
  7. data/.rubocop_todo.yml +12 -47
  8. data/CHANGELOG.md +113 -0
  9. data/LICENSE +1 -1
  10. data/README.md +111 -21
  11. data/app/controllers/spree/admin/postage_labels_controller.rb +20 -0
  12. data/app/decorators/models/solidus_easypost/spree/carton_decorator.rb +38 -0
  13. data/app/decorators/models/solidus_easypost/spree/shipment_decorator.rb +18 -23
  14. data/app/models/solidus_easypost/parcel_dimension.rb +34 -0
  15. data/app/models/solidus_easypost/return_authorization.rb +2 -13
  16. data/app/overrides/spree/admin/orders/_shipment/add_postage_label.html.erb.deface +10 -0
  17. data/bin/rails +0 -1
  18. data/bin/rails-engine +0 -2
  19. data/bin/rails-sandbox +1 -2
  20. data/bin/sandbox +2 -0
  21. data/config/initializers/webhooks.rb +7 -0
  22. data/config/locales/en.yml +7 -4
  23. data/config/routes.rb +5 -1
  24. data/db/migrate/20201025110912_add_tracker_id_to_cartons.rb +6 -0
  25. data/lib/generators/solidus_easypost/install/install_generator.rb +7 -1
  26. data/lib/generators/solidus_easypost/install/templates/initializer.rb +26 -0
  27. data/lib/solidus_easypost/address_builder.rb +45 -0
  28. data/lib/solidus_easypost/calculator/base_dimension_calculator.rb +28 -0
  29. data/lib/solidus_easypost/calculator/weight_dimension_calculator.rb +22 -0
  30. data/lib/solidus_easypost/configuration.rb +25 -2
  31. data/lib/solidus_easypost/errors/unknown_partial_resource_error.rb +11 -0
  32. data/lib/solidus_easypost/estimator.rb +37 -0
  33. data/lib/solidus_easypost/parcel_builder.rb +27 -0
  34. data/lib/solidus_easypost/shipment_builder.rb +32 -0
  35. data/lib/solidus_easypost/shipping_method_selector.rb +17 -0
  36. data/lib/solidus_easypost/shipping_rate_calculator.rb +9 -0
  37. data/lib/solidus_easypost/testing_support/factories/address_factory.rb +10 -0
  38. data/lib/solidus_easypost/testing_support/factories/product_factory.rb +7 -0
  39. data/lib/solidus_easypost/testing_support/factories/shipment_factory.rb +30 -0
  40. data/lib/solidus_easypost/testing_support/factories/shipping_method_factory.rb +8 -0
  41. data/lib/solidus_easypost/testing_support/factories/stock_location_factory.rb +10 -0
  42. data/lib/solidus_easypost/testing_support/factories/variant_factory.rb +7 -0
  43. data/lib/solidus_easypost/testing_support/factories.rb +3 -0
  44. data/lib/solidus_easypost/tracker_webhook_handler.rb +14 -0
  45. data/lib/solidus_easypost/version.rb +1 -1
  46. data/lib/solidus_easypost.rb +11 -0
  47. data/solidus_easypost.gemspec +8 -5
  48. data/spec/cassettes/{Spree_Address/_easypost_address/is_an_EasyPost_Address_object.yml → address_builder/from_address.yml} +19 -23
  49. data/spec/cassettes/{Spree_StockLocation/_easypost_address/is_an_EasyPost_Address_object.yml → address_builder/from_stock_location.yml} +19 -23
  50. data/spec/cassettes/{Spree_Stock_Estimator/_shipping_rates/when_rates_are_found/when_shipping_methods_exist/when_shipping_methods_are_front_end_visible/has_the_correct_costs.yml → estimator.yml} +0 -0
  51. data/spec/cassettes/integration/checkout.yml +377 -0
  52. data/spec/cassettes/integration/order_shipping/with_purchase_labels.yml +373 -0
  53. data/spec/cassettes/integration/order_shipping/without_purchase_labels.yml +251 -0
  54. data/spec/cassettes/{Spree_Stock_Package/_easypost_parcel/is_an_EasyPost_Parcel_object.yml → parcel_builder/from_package.yml} +17 -22
  55. data/spec/cassettes/{Spree_Stock_Package/_easypost_parcel/has_the_correct_attributes.yml → parcel_builder/from_return_authorization.yml} +17 -22
  56. data/spec/cassettes/postage_labels/show.yml +72 -0
  57. data/spec/cassettes/return_authorization.yml +310 -0
  58. data/spec/cassettes/{Spree_Stock_Package/_easypost_shipment/is_an_EasyPost_Shipment_object.yml → shipment_builder/from_package.yml} +74 -92
  59. data/spec/cassettes/{Spree_Stock_Estimator/_shipping_rates/when_rates_are_found/when_shipping_methods_exist/create_no_new_shipping_methods.yml → shipment_builder/from_return_authorization.yml} +77 -95
  60. data/spec/cassettes/shipment_builder/from_shipment.yml +250 -0
  61. data/spec/controllers/spree/admin/postage_labels_controller_spec.rb +18 -0
  62. data/spec/features/admin/postage_labels_spec.rb +18 -0
  63. data/spec/integration/checkout_spec.rb +45 -0
  64. data/spec/integration/order_shipping_spec.rb +33 -0
  65. data/spec/models/solidus_easypost/parcel_dimension_spec.rb +80 -0
  66. data/spec/models/solidus_easypost/return_authorization_spec.rb +7 -40
  67. data/spec/models/spree/carton_spec.rb +57 -0
  68. data/spec/models/spree/shipment_spec.rb +48 -59
  69. data/spec/models/spree/shipping_rate_spec.rb +14 -7
  70. data/spec/solidus_easypost/address_builder_spec.rb +17 -0
  71. data/spec/solidus_easypost/calculator/weight_dimension_calculator_spec.rb +39 -0
  72. data/spec/solidus_easypost/estimator_spec.rb +52 -0
  73. data/spec/solidus_easypost/parcel_builder_spec.rb +113 -0
  74. data/spec/solidus_easypost/shipment_builder_spec.rb +28 -0
  75. data/spec/solidus_easypost/shipping_method_selector_spec.rb +33 -0
  76. data/spec/solidus_easypost/shipping_rate_calculator_spec.rb +12 -0
  77. data/spec/solidus_easypost/tracker_webhook_handler_spec.rb +58 -0
  78. data/spec/spec_helper.rb +11 -7
  79. data/spec/support/easypost.rb +3 -1
  80. data/spec/support/helpers/api_stubs.rb +40 -0
  81. data/spec/support/helpers/configuration.rb +28 -0
  82. data/spec/support/helpers/shipping_methods.rb +26 -0
  83. data/spec/support/solidus.rb +1 -0
  84. data/spec/support/vcr.rb +1 -0
  85. metadata +118 -85
  86. data/app/decorators/models/solidus_easypost/spree/address_decorator.rb +0 -30
  87. data/app/decorators/models/solidus_easypost/spree/stock/estimator_decorator.rb +0 -15
  88. data/app/decorators/models/solidus_easypost/spree/stock/package_decorator.rb +0 -27
  89. data/app/decorators/models/solidus_easypost/spree/stock_location_decorator.rb +0 -26
  90. data/app/models/solidus_easypost/estimator.rb +0 -51
  91. data/lib/solidus_easypost/factories.rb +0 -24
  92. data/spec/cassettes/SolidusEasypost_ReturnAuthorization/_easypost_shipment/is_an_EasyPost_Shipment_object.yml +0 -271
  93. data/spec/cassettes/SolidusEasypost_ReturnAuthorization/_return_label/has_the_correct_fields.yml +0 -336
  94. data/spec/cassettes/SolidusEasypost_ReturnAuthorization/_return_label/is_an_EasyPost_PackageLabel_object.yml +0 -336
  95. data/spec/cassettes/Spree_Address/_easypost_address/has_the_correct_attributes.yml +0 -69
  96. data/spec/cassettes/Spree_Order/_refresh_shipment_rates/can_get_rates_from_easy_post.yml +0 -271
  97. data/spec/cassettes/Spree_Order/_refresh_shipment_rates/create_shipping_methods_for_the_rates.yml +0 -269
  98. data/spec/cassettes/Spree_Shipment/_buys_a_shipping_rate_after_transitioning_to_ship.yml +0 -403
  99. data/spec/cassettes/Spree_Shipment/_easypost_shipment/when_it_is_a_new_shipment/behaves_like_an_easypost_shipment/is_an_EasyPost_Shipment_object.yml +0 -271
  100. data/spec/cassettes/Spree_Shipment/_easypost_shipment/when_it_is_a_new_shipment/calls_the_api.yml +0 -200
  101. data/spec/cassettes/Spree_Shipment/_easypost_shipment/when_it_is_an_existing_shipment/behaves_like_an_easypost_shipment/is_an_EasyPost_Shipment_object.yml +0 -334
  102. data/spec/cassettes/Spree_Shipment/_easypost_shipment/when_it_is_an_existing_shipment/loads_the_existing_shipment.yml +0 -271
  103. data/spec/cassettes/Spree_StockLocation/_easypost_address/has_the_correct_attributes.yml +0 -69
  104. data/spec/cassettes/Spree_Stock_Estimator/_shipping_rates/when_rates_are_found/when_shipping_methods_dont_exist/creates_new_shipping_methods.yml +0 -269
  105. data/spec/cassettes/Spree_Stock_Estimator/_shipping_rates/when_rates_are_found/when_shipping_methods_dont_exist/is_empty.yml +0 -269
  106. data/spec/cassettes/Spree_Stock_Estimator/_shipping_rates/when_rates_are_found/when_shipping_methods_exist/when_shipping_methods_are_front_end_visible/has_the_correct_names.yml +0 -269
  107. data/spec/cassettes/Spree_Stock_Estimator/_shipping_rates/when_rates_are_found/when_shipping_methods_exist/when_shipping_methods_are_not_front_end_visible/is_empty.yml +0 -269
  108. data/spec/cassettes/Spree_Stock_Package/_easypost_shipment/calls_the_api.yml +0 -200
  109. data/spec/factories/spree_modification.rb +0 -25
  110. data/spec/models/spree/address_spec.rb +0 -31
  111. data/spec/models/spree/order_spec.rb +0 -31
  112. data/spec/models/spree/stock/estimator_spec.rb +0 -80
  113. data/spec/models/spree/stock/package_spec.rb +0 -35
  114. data/spec/models/spree/stock_location_spec.rb +0 -31
  115. data/spec/support/shipping_method_helpers.rb +0 -43
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SolidusEasypost
4
- module Spree
5
- module StockLocationDecorator
6
- def easypost_address
7
- attributes = {
8
- street1: address1,
9
- street2: address2,
10
- city: city,
11
- zip: zipcode,
12
- phone: phone,
13
- name: name,
14
- company: name
15
- }
16
-
17
- attributes[:state] = state ? state.abbr : state_name
18
- attributes[:country] = country&.iso
19
-
20
- ::EasyPost::Address.create attributes
21
- end
22
-
23
- ::Spree::StockLocation.prepend self
24
- end
25
- end
26
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SolidusEasypost
4
- class Estimator
5
- def shipping_rates(package, _frontend_only = true)
6
- shipment = package.easypost_shipment
7
- rates = shipment.rates.sort_by { |r| r.rate.to_i }
8
-
9
- shipping_rates = []
10
-
11
- if rates.any?
12
- rates.each do |rate|
13
- spree_rate = ::Spree::ShippingRate.new(
14
- name: "#{rate.carrier} #{rate.service}",
15
- cost: rate.rate,
16
- easy_post_shipment_id: rate.shipment_id,
17
- easy_post_rate_id: rate.id,
18
- shipping_method: find_or_create_shipping_method(rate)
19
- )
20
-
21
- shipping_rates << spree_rate if spree_rate.shipping_method.available_to_users?
22
- end
23
-
24
- # Sets cheapest rate to be selected by default
25
- if shipping_rates.any?
26
- shipping_rates.min_by(&:cost).selected = true
27
- end
28
-
29
- shipping_rates
30
- else
31
- []
32
- end
33
- end
34
-
35
- private
36
-
37
- # Cartons require shipping methods to be present, This will lookup a
38
- # Shipping method based on the admin(internal)_name. This is not user facing
39
- # and should not be changed in the admin.
40
- def find_or_create_shipping_method(rate)
41
- method_name = "#{rate.carrier} #{rate.service}"
42
- ::Spree::ShippingMethod.find_or_create_by(admin_name: method_name) do |r|
43
- r.name = method_name
44
- r.available_to_users = false
45
- r.code = rate.service
46
- r.calculator = ::Spree::Calculator::Shipping::FlatRate.create
47
- r.shipping_categories = [::Spree::ShippingCategory.first]
48
- end
49
- end
50
- end
51
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- FactoryBot.define do
4
- end
5
-
6
- FactoryBot.modify do
7
- factory :address do
8
- lastname { 'Doe' }
9
- end
10
-
11
- factory :variant do
12
- weight { 10.0 }
13
- end
14
-
15
- factory :shipment do
16
- transient do
17
- inventory_units { 1 }
18
- end
19
-
20
- after(:create) do |shipment, e|
21
- create_list(:inventory_unit, e.inventory_units, shipment: shipment)
22
- end
23
- end
24
- end
@@ -1,271 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://api.easypost.com/v2/addresses
6
- body:
7
- encoding: UTF-8
8
- string: address[street1]=131%20S%208th%20Ave&address[city]=Manville&address[zip]=08835&address[phone]=(202)%20456-1111&address[name]=NY%20Warehouse&address[company]=NY%20Warehouse&address[state]=NJ&address[country]=US
9
- headers:
10
- Accept:
11
- - "*/*"
12
- User-Agent:
13
- - EasyPost/v2 RubyClient/3.0.1
14
- Authorization:
15
- - Bearer CvzYtuda6KRI9JjG7SAHbA
16
- Content-Type:
17
- - application/x-www-form-urlencoded
18
- Content-Length:
19
- - '209'
20
- Accept-Encoding:
21
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
22
- Host:
23
- - api.easypost.com
24
- response:
25
- status:
26
- code: 201
27
- message: Created
28
- headers:
29
- X-Frame-Options:
30
- - SAMEORIGIN
31
- X-Xss-Protection:
32
- - 1; mode=block
33
- X-Content-Type-Options:
34
- - nosniff
35
- X-Ep-Request-Uuid:
36
- - 43c6543d5dca6f29ee725c2600010f57
37
- Cache-Control:
38
- - no-cache, no-store, must-revalidate, private
39
- Pragma:
40
- - no-cache
41
- Expires:
42
- - '0'
43
- Location:
44
- - "/api/v2/addresses/adr_4347da93674b453dbfd47c8e10f78a86"
45
- Content-Type:
46
- - application/json; charset=utf-8
47
- X-Runtime:
48
- - '0.031533'
49
- Transfer-Encoding:
50
- - chunked
51
- X-Node:
52
- - bigweb9sj
53
- X-Version-Label:
54
- - easypost-201911120131-f5c72b1880-master
55
- X-Backend:
56
- - easypost
57
- X-Proxied:
58
- - extlb2wdc 2744487620
59
- - intlb2sj ff5a2958df
60
- - intlb2wdc ff5a2958df
61
- Strict-Transport-Security:
62
- - max-age=15768000; includeSubDomains; preload
63
- body:
64
- encoding: ASCII-8BIT
65
- string: '{"id":"adr_4347da93674b453dbfd47c8e10f78a86","object":"Address","created_at":"2019-11-12T08:36:57Z","updated_at":"2019-11-12T08:36:57Z","name":"NY
66
- Warehouse","company":"NY Warehouse","street1":"131 S 8th Ave","street2":null,"city":"Manville","state":"NJ","zip":"08835","country":"US","phone":"2024561111","email":null,"mode":"test","carrier_facility":null,"residential":null,"federal_tax_id":null,"state_tax_id":null,"verifications":{}}'
67
- http_version:
68
- recorded_at: Tue, 12 Nov 2019 08:36:57 GMT
69
- - request:
70
- method: post
71
- uri: https://api.easypost.com/v2/addresses
72
- body:
73
- encoding: UTF-8
74
- string: address[street1]=A%20Different%20Road&address[street2]=Northwest&address[city]=Manville&address[zip]=08835&address[phone]=555-555-0199&address[company]=Company&address[name]=John%20Doe&address[state]=NJ&address[country]=US
75
- headers:
76
- Accept:
77
- - "*/*"
78
- User-Agent:
79
- - EasyPost/v2 RubyClient/3.0.1
80
- Authorization:
81
- - Bearer CvzYtuda6KRI9JjG7SAHbA
82
- Content-Type:
83
- - application/x-www-form-urlencoded
84
- Content-Length:
85
- - '222'
86
- Accept-Encoding:
87
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
88
- Host:
89
- - api.easypost.com
90
- response:
91
- status:
92
- code: 201
93
- message: Created
94
- headers:
95
- X-Frame-Options:
96
- - SAMEORIGIN
97
- X-Xss-Protection:
98
- - 1; mode=block
99
- X-Content-Type-Options:
100
- - nosniff
101
- X-Ep-Request-Uuid:
102
- - 43c6543d5dca6f2aee71ee3500010f65
103
- Cache-Control:
104
- - no-cache, no-store, must-revalidate, private
105
- Pragma:
106
- - no-cache
107
- Expires:
108
- - '0'
109
- Location:
110
- - "/api/v2/addresses/adr_ded65acf0a9844c5943001953bd7212b"
111
- Content-Type:
112
- - application/json; charset=utf-8
113
- X-Runtime:
114
- - '0.027587'
115
- Transfer-Encoding:
116
- - chunked
117
- X-Node:
118
- - bigweb10sj
119
- X-Version-Label:
120
- - easypost-201911120131-f5c72b1880-master
121
- X-Backend:
122
- - easypost
123
- X-Proxied:
124
- - extlb2wdc 2744487620
125
- - intlb2sj ff5a2958df
126
- - intlb2wdc ff5a2958df
127
- Strict-Transport-Security:
128
- - max-age=15768000; includeSubDomains; preload
129
- body:
130
- encoding: ASCII-8BIT
131
- string: '{"id":"adr_ded65acf0a9844c5943001953bd7212b","object":"Address","created_at":"2019-11-12T08:36:58Z","updated_at":"2019-11-12T08:36:58Z","name":"John
132
- Doe","company":"Company","street1":"A Different Road","street2":"Northwest","city":"Manville","state":"NJ","zip":"08835","country":"US","phone":"5555550199","email":null,"mode":"test","carrier_facility":null,"residential":null,"federal_tax_id":null,"state_tax_id":null,"verifications":{}}'
133
- http_version:
134
- recorded_at: Tue, 12 Nov 2019 08:36:58 GMT
135
- - request:
136
- method: post
137
- uri: https://api.easypost.com/v2/parcels
138
- body:
139
- encoding: UTF-8
140
- string: parcel[weight]=10
141
- headers:
142
- Accept:
143
- - "*/*"
144
- User-Agent:
145
- - EasyPost/v2 RubyClient/3.0.1
146
- Authorization:
147
- - Bearer CvzYtuda6KRI9JjG7SAHbA
148
- Content-Type:
149
- - application/x-www-form-urlencoded
150
- Content-Length:
151
- - '17'
152
- Accept-Encoding:
153
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
154
- Host:
155
- - api.easypost.com
156
- response:
157
- status:
158
- code: 201
159
- message: Created
160
- headers:
161
- X-Frame-Options:
162
- - SAMEORIGIN
163
- X-Xss-Protection:
164
- - 1; mode=block
165
- X-Content-Type-Options:
166
- - nosniff
167
- X-Ep-Request-Uuid:
168
- - 43c6543d5dca6f2bee72f56700010f6e
169
- Cache-Control:
170
- - no-cache, no-store, must-revalidate, private
171
- Pragma:
172
- - no-cache
173
- Expires:
174
- - '0'
175
- Location:
176
- - "/api/v2/parcels/prcl_403d962cbc904247897aa52f3290d5cd"
177
- Content-Type:
178
- - application/json; charset=utf-8
179
- X-Runtime:
180
- - '0.026987'
181
- Transfer-Encoding:
182
- - chunked
183
- X-Node:
184
- - bigweb2sj
185
- X-Version-Label:
186
- - easypost-201911120131-f5c72b1880-master
187
- X-Backend:
188
- - easypost
189
- X-Proxied:
190
- - extlb2wdc 2744487620
191
- - intlb2sj ff5a2958df
192
- - intlb2wdc ff5a2958df
193
- Strict-Transport-Security:
194
- - max-age=15768000; includeSubDomains; preload
195
- body:
196
- encoding: ASCII-8BIT
197
- string: '{"id":"prcl_403d962cbc904247897aa52f3290d5cd","object":"Parcel","created_at":"2019-11-12T08:36:59Z","updated_at":"2019-11-12T08:36:59Z","length":null,"width":null,"height":null,"predefined_package":null,"weight":10.0,"mode":"test"}'
198
- http_version:
199
- recorded_at: Tue, 12 Nov 2019 08:36:59 GMT
200
- - request:
201
- method: post
202
- uri: https://api.easypost.com/v2/shipments
203
- body:
204
- encoding: UTF-8
205
- string: shipment[from_address][id]=adr_4347da93674b453dbfd47c8e10f78a86&shipment[to_address][id]=adr_ded65acf0a9844c5943001953bd7212b&shipment[parcel][id]=prcl_403d962cbc904247897aa52f3290d5cd&shipment[is_return]=true
206
- headers:
207
- Accept:
208
- - "*/*"
209
- User-Agent:
210
- - EasyPost/v2 RubyClient/3.0.1
211
- Authorization:
212
- - Bearer CvzYtuda6KRI9JjG7SAHbA
213
- Content-Type:
214
- - application/x-www-form-urlencoded
215
- Content-Length:
216
- - '209'
217
- Accept-Encoding:
218
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
219
- Host:
220
- - api.easypost.com
221
- response:
222
- status:
223
- code: 201
224
- message: Created
225
- headers:
226
- X-Frame-Options:
227
- - SAMEORIGIN
228
- X-Xss-Protection:
229
- - 1; mode=block
230
- X-Content-Type-Options:
231
- - nosniff
232
- X-Ep-Request-Uuid:
233
- - 43c6543d5dca6f2bee73930e00010f7d
234
- Cache-Control:
235
- - no-cache, no-store, must-revalidate, private
236
- Pragma:
237
- - no-cache
238
- Expires:
239
- - '0'
240
- Location:
241
- - "/api/v2/shipments/shp_5fbb3a666bbd44b1a4972ee7a37a0264"
242
- Content-Type:
243
- - application/json; charset=utf-8
244
- X-Runtime:
245
- - '0.215479'
246
- Transfer-Encoding:
247
- - chunked
248
- X-Node:
249
- - bigweb7sj
250
- X-Version-Label:
251
- - easypost-201911120131-f5c72b1880-master
252
- X-Backend:
253
- - easypost
254
- X-Canary:
255
- - direct
256
- X-Proxied:
257
- - extlb2wdc 2744487620
258
- - intlb1wdc ff5a2958df
259
- - intlb2sj ff5a2958df
260
- Strict-Transport-Security:
261
- - max-age=15768000; includeSubDomains; preload
262
- body:
263
- encoding: ASCII-8BIT
264
- string: '{"created_at":"2019-11-12T08:37:00Z","is_return":true,"messages":[],"mode":"test","options":{"currency":"USD","payment":{"type":"SENDER"},"label_date":null,"date_advance":0},"reference":null,"status":"unknown","tracking_code":null,"updated_at":"2019-11-12T08:37:00Z","batch_id":null,"batch_status":null,"batch_message":null,"customs_info":null,"from_address":{"id":"adr_4347da93674b453dbfd47c8e10f78a86","object":"Address","created_at":"2019-11-12T08:36:57Z","updated_at":"2019-11-12T08:36:57Z","name":"NY
265
- Warehouse","company":"NY Warehouse","street1":"131 S 8th Ave","street2":null,"city":"Manville","state":"NJ","zip":"08835","country":"US","phone":"2024561111","email":null,"mode":"test","carrier_facility":null,"residential":null,"federal_tax_id":null,"state_tax_id":null,"verifications":{}},"insurance":null,"order_id":null,"parcel":{"id":"prcl_403d962cbc904247897aa52f3290d5cd","object":"Parcel","created_at":"2019-11-12T08:36:59Z","updated_at":"2019-11-12T08:36:59Z","length":null,"width":null,"height":null,"predefined_package":null,"weight":10.0,"mode":"test"},"postage_label":null,"rates":[{"id":"rate_a1b453f6679543eb8c19bb32ece72755","object":"Rate","created_at":"2019-11-12T08:37:00Z","updated_at":"2019-11-12T08:37:00Z","mode":"test","service":"First","carrier":"USPS","rate":"3.82","currency":"USD","retail_rate":"5.19","retail_currency":"USD","list_rate":"3.82","list_currency":"USD","delivery_days":2,"delivery_date":null,"delivery_date_guaranteed":false,"est_delivery_days":2,"shipment_id":"shp_5fbb3a666bbd44b1a4972ee7a37a0264","carrier_account_id":"ca_mtb51Ve0"},{"id":"rate_0d23fd665d9c4cbaa74c4fc015429afd","object":"Rate","created_at":"2019-11-12T08:37:00Z","updated_at":"2019-11-12T08:37:00Z","mode":"test","service":"ParcelSelect","carrier":"USPS","rate":"6.85","currency":"USD","retail_rate":"6.85","retail_currency":"USD","list_rate":"6.85","list_currency":"USD","delivery_days":2,"delivery_date":null,"delivery_date_guaranteed":false,"est_delivery_days":2,"shipment_id":"shp_5fbb3a666bbd44b1a4972ee7a37a0264","carrier_account_id":"ca_mtb51Ve0"},{"id":"rate_29230bc9a5734adb8eb8423120ad9212","object":"Rate","created_at":"2019-11-12T08:37:00Z","updated_at":"2019-11-12T08:37:00Z","mode":"test","service":"Express","carrier":"USPS","rate":"22.74","currency":"USD","retail_rate":"25.60","retail_currency":"USD","list_rate":"22.74","list_currency":"USD","delivery_days":null,"delivery_date":null,"delivery_date_guaranteed":false,"est_delivery_days":null,"shipment_id":"shp_5fbb3a666bbd44b1a4972ee7a37a0264","carrier_account_id":"ca_mtb51Ve0"},{"id":"rate_806baafbd52e45edaebc319a32ade00e","object":"Rate","created_at":"2019-11-12T08:37:00Z","updated_at":"2019-11-12T08:37:00Z","mode":"test","service":"Priority","carrier":"USPS","rate":"6.95","currency":"USD","retail_rate":"7.35","retail_currency":"USD","list_rate":"6.95","list_currency":"USD","delivery_days":1,"delivery_date":null,"delivery_date_guaranteed":false,"est_delivery_days":1,"shipment_id":"shp_5fbb3a666bbd44b1a4972ee7a37a0264","carrier_account_id":"ca_mtb51Ve0"}],"refund_status":null,"scan_form":null,"selected_rate":null,"tracker":null,"to_address":{"id":"adr_ded65acf0a9844c5943001953bd7212b","object":"Address","created_at":"2019-11-12T08:36:58Z","updated_at":"2019-11-12T08:36:58Z","name":"John
266
- Doe","company":"Company","street1":"A Different Road","street2":"Northwest","city":"Manville","state":"NJ","zip":"08835","country":"US","phone":"5555550199","email":null,"mode":"test","carrier_facility":null,"residential":null,"federal_tax_id":null,"state_tax_id":null,"verifications":{}},"usps_zone":1,"return_address":{"id":"adr_4347da93674b453dbfd47c8e10f78a86","object":"Address","created_at":"2019-11-12T08:36:57Z","updated_at":"2019-11-12T08:36:57Z","name":"NY
267
- Warehouse","company":"NY Warehouse","street1":"131 S 8th Ave","street2":null,"city":"Manville","state":"NJ","zip":"08835","country":"US","phone":"2024561111","email":null,"mode":"test","carrier_facility":null,"residential":null,"federal_tax_id":null,"state_tax_id":null,"verifications":{}},"buyer_address":{"id":"adr_ded65acf0a9844c5943001953bd7212b","object":"Address","created_at":"2019-11-12T08:36:58Z","updated_at":"2019-11-12T08:36:58Z","name":"John
268
- Doe","company":"Company","street1":"A Different Road","street2":"Northwest","city":"Manville","state":"NJ","zip":"08835","country":"US","phone":"5555550199","email":null,"mode":"test","carrier_facility":null,"residential":null,"federal_tax_id":null,"state_tax_id":null,"verifications":{}},"forms":[],"fees":[],"id":"shp_5fbb3a666bbd44b1a4972ee7a37a0264","object":"Shipment"}'
269
- http_version:
270
- recorded_at: Tue, 12 Nov 2019 08:37:00 GMT
271
- recorded_with: VCR 5.0.0