active_fulfillment 3.0.0.pre6 → 3.0.0.pre7
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.
- checksums.yaml +4 -4
- data/lib/active_fulfillment/services/amazon_mws.rb +46 -81
- data/lib/active_fulfillment/version.rb +1 -1
- data/lib/active_fulfillment.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29a4fec3de142f490e9532546920f1badabb155f
|
4
|
+
data.tar.gz: 3a603f15f239767db8ca8bb3749f0501a64ab44d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7775f6ec5b95a3750097587b34a73fba8ec83905167826aea18d355f099e717f7fb31eeb610ab8895d487e8d626c1c148f792e06e8baf331d2ba087a19ec6ee2
|
7
|
+
data.tar.gz: f3d6f781d3b23b7fb81a093c586855ed4f4bdd0a6a24b42fa4f88c6fffe4017e8bd388fdfed31927f0c0892984c86ea1a73f82dd65439859438d1b0c8b167454
|
@@ -16,25 +16,6 @@ module ActiveFulfillment
|
|
16
16
|
|
17
17
|
SUCCESS, FAILURE, ERROR = 'Accepted', 'Failure', 'Error'
|
18
18
|
|
19
|
-
MESSAGES = {
|
20
|
-
:status => {
|
21
|
-
'Accepted' => 'Success',
|
22
|
-
'Failure' => 'Failed',
|
23
|
-
'Error' => 'An error occurred'
|
24
|
-
},
|
25
|
-
:create => {
|
26
|
-
'Accepted' => 'Successfully submitted the order',
|
27
|
-
'Failure' => 'Failed to submit the order',
|
28
|
-
'Error' => 'An error occurred while submitting the order'
|
29
|
-
},
|
30
|
-
:list => {
|
31
|
-
'Accepted' => 'Successfully submitted request',
|
32
|
-
'Failure' => 'Failed to submit request',
|
33
|
-
'Error' => 'An error occurred while submitting request'
|
34
|
-
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
19
|
ENDPOINTS = {
|
39
20
|
:ca => 'mws.amazonservices.ca',
|
40
21
|
:cn => 'mws.amazonservices.com.cn',
|
@@ -74,25 +55,6 @@ module ActiveFulfillment
|
|
74
55
|
}
|
75
56
|
}
|
76
57
|
|
77
|
-
ACTIONS = {
|
78
|
-
:outbound => "FulfillmentOutboundShipment",
|
79
|
-
:inventory => "FulfillmentInventory"
|
80
|
-
}
|
81
|
-
|
82
|
-
OPERATIONS = {
|
83
|
-
:outbound => {
|
84
|
-
:status => 'GetServiceStatus',
|
85
|
-
:create => 'CreateFulfillmentOrder',
|
86
|
-
:list => 'ListAllFulfillmentOrders',
|
87
|
-
:tracking => 'GetFulfillmentOrder'
|
88
|
-
},
|
89
|
-
:inventory => {
|
90
|
-
:get => 'ListInventorySupply',
|
91
|
-
:list => 'ListInventorySupply',
|
92
|
-
:list_next => 'ListInventorySupplyByNextToken'
|
93
|
-
}
|
94
|
-
}
|
95
|
-
|
96
58
|
# The first is the label, and the last is the code
|
97
59
|
# Standard: 3-5 business days
|
98
60
|
# Expedited: 2 business days
|
@@ -122,23 +84,37 @@ module ActiveFulfillment
|
|
122
84
|
|
123
85
|
def fulfill(order_id, shipping_address, line_items, options = {})
|
124
86
|
requires!(options, :order_date, :shipping_method)
|
125
|
-
|
87
|
+
with_error_handling do
|
88
|
+
data = commit :post, 'CreateFulfillmentOrder', build_fulfillment_request(order_id, shipping_address, line_items, options)
|
89
|
+
parse_fulfillment_response(parse_document(data), 'Successfully submitted the order')
|
90
|
+
end
|
126
91
|
end
|
127
92
|
|
128
93
|
def status
|
129
|
-
|
94
|
+
with_error_handling do
|
95
|
+
data = commit :post, 'GetServiceStatus', build_basic_api_query({ :Action => 'GetServiceStatus' })
|
96
|
+
parse_tracking_response(parse_document(data))
|
97
|
+
end
|
130
98
|
end
|
131
99
|
|
132
100
|
def fetch_current_orders
|
133
|
-
|
101
|
+
with_error_handling do
|
102
|
+
data = commit :post, 'GetServiceStatus', build_get_current_fulfillment_orders_request
|
103
|
+
parse_tracking_response(parse_document(data))
|
104
|
+
end
|
134
105
|
end
|
135
106
|
|
136
107
|
def fetch_stock_levels(options = {})
|
137
108
|
options[:skus] = [options.delete(:sku)] if options.include?(:sku)
|
138
|
-
response =
|
139
|
-
|
109
|
+
response = with_error_handling do
|
110
|
+
data = commit :post, 'ListInventorySupply', build_inventory_list_request(options)
|
111
|
+
parse_inventory_response(parse_document(data))
|
112
|
+
end
|
140
113
|
while token = response.params['next_token'] do
|
141
|
-
next_page =
|
114
|
+
next_page = with_error_handling do
|
115
|
+
data = commit :post, 'ListInventorySupplyByNextToken', build_next_inventory_list_request(token)
|
116
|
+
parse_inventory_response(parse_document(data))
|
117
|
+
end
|
142
118
|
|
143
119
|
# if we fail during the stock-level-via-token gathering, fail the whole request
|
144
120
|
return next_page if next_page.params['response_status'] != SUCCESS
|
@@ -153,7 +129,11 @@ module ActiveFulfillment
|
|
153
129
|
index = 0
|
154
130
|
order_ids.reduce(nil) do |previous, order_id|
|
155
131
|
index += 1
|
156
|
-
response =
|
132
|
+
response = with_error_handling do
|
133
|
+
data = commit :post, 'GetFulfillmentOrder', build_tracking_request(order_id, options)
|
134
|
+
parse_tracking_response(parse_document(data))
|
135
|
+
end
|
136
|
+
|
157
137
|
return response if !response.success?
|
158
138
|
|
159
139
|
if previous
|
@@ -180,21 +160,17 @@ module ActiveFulfillment
|
|
180
160
|
build_query(params) + "&Signature=#{signature}"
|
181
161
|
end
|
182
162
|
|
183
|
-
def commit(verb,
|
184
|
-
uri = URI.parse("https://#{endpoint}/#{
|
163
|
+
def commit(verb, action, params)
|
164
|
+
uri = URI.parse("https://#{endpoint}/#{action}/#{VERSION}")
|
185
165
|
query = build_full_query(verb, uri, params)
|
186
166
|
headers = build_headers(query)
|
187
167
|
log_query = query.dup
|
188
168
|
[@options[:login], @options[:app_id], @mws_auth_token].each { |key| log_query.gsub!(/#{key}/, '[filtered]') if key.present? }
|
189
169
|
|
190
|
-
logger.info "[#{self.class}][#{
|
170
|
+
logger.info "[#{self.class}][#{action}] query=#{log_query}"
|
191
171
|
data = ssl_post(uri.to_s, query, headers)
|
192
|
-
logger.info "[#{self.class}][#{
|
193
|
-
|
194
|
-
response = parse_response(service, op, data)
|
195
|
-
Response.new(success?(response), message_from(response), response)
|
196
|
-
rescue ActiveUtils::ResponseError => e
|
197
|
-
handle_error(e)
|
172
|
+
logger.info "[#{self.class}][#{action}] response=#{data}"
|
173
|
+
data
|
198
174
|
end
|
199
175
|
|
200
176
|
def handle_error(e)
|
@@ -217,26 +193,12 @@ module ActiveFulfillment
|
|
217
193
|
|
218
194
|
## PARSING
|
219
195
|
|
220
|
-
def
|
196
|
+
def parse_document(xml)
|
221
197
|
begin
|
222
198
|
document = REXML::Document.new(xml)
|
223
199
|
rescue REXML::ParseException
|
224
200
|
return { :success => FAILURE }
|
225
201
|
end
|
226
|
-
|
227
|
-
case service
|
228
|
-
when :outbound
|
229
|
-
case op
|
230
|
-
when :tracking
|
231
|
-
parse_tracking_response(document)
|
232
|
-
else
|
233
|
-
parse_fulfillment_response(op, document)
|
234
|
-
end
|
235
|
-
when :inventory
|
236
|
-
parse_inventory_response(document)
|
237
|
-
else
|
238
|
-
raise ArgumentError, "Unknown service #{service}"
|
239
|
-
end
|
240
202
|
end
|
241
203
|
|
242
204
|
def parse_tracking_response(document)
|
@@ -258,11 +220,11 @@ module ActiveFulfillment
|
|
258
220
|
end
|
259
221
|
|
260
222
|
response[:response_status] = SUCCESS
|
261
|
-
response
|
223
|
+
Response.new(success?(response), message_from(response), response)
|
262
224
|
end
|
263
225
|
|
264
|
-
def parse_fulfillment_response(
|
265
|
-
{ :response_status => SUCCESS, :response_comment =>
|
226
|
+
def parse_fulfillment_response(document, message)
|
227
|
+
Response.new(true, message, { :response_status => SUCCESS, :response_comment => message })
|
266
228
|
end
|
267
229
|
|
268
230
|
def parse_inventory_response(document)
|
@@ -280,6 +242,7 @@ module ActiveFulfillment
|
|
280
242
|
|
281
243
|
response[:response_status] = SUCCESS
|
282
244
|
response
|
245
|
+
Response.new(success?(response), message_from(response), response)
|
283
246
|
end
|
284
247
|
|
285
248
|
def parse_error(http_response)
|
@@ -366,7 +329,7 @@ module ActiveFulfillment
|
|
366
329
|
|
367
330
|
def build_fulfillment_request(order_id, shipping_address, line_items, options)
|
368
331
|
params = {
|
369
|
-
:Action =>
|
332
|
+
:Action => 'CreateFulfillmentOrder',
|
370
333
|
:SellerFulfillmentOrderId => order_id.to_s,
|
371
334
|
:DisplayableOrderId => order_id.to_s,
|
372
335
|
:DisplayableOrderDateTime => options[:order_date].utc.iso8601,
|
@@ -384,7 +347,7 @@ module ActiveFulfillment
|
|
384
347
|
def build_get_current_fulfillment_orders_request(options = {})
|
385
348
|
start_time = options.delete(:start_time) || 1.day.ago.utc
|
386
349
|
params = {
|
387
|
-
:Action =>
|
350
|
+
:Action => 'ListAllFulfillmentOrders',
|
388
351
|
:QueryStartDateTime => start_time.strftime("%Y-%m-%dT%H:%M:%SZ")
|
389
352
|
}
|
390
353
|
|
@@ -394,7 +357,7 @@ module ActiveFulfillment
|
|
394
357
|
def build_inventory_list_request(options = {})
|
395
358
|
response_group = options.delete(:response_group) || "Basic"
|
396
359
|
params = {
|
397
|
-
:Action =>
|
360
|
+
:Action => 'ListInventorySupply',
|
398
361
|
:ResponseGroup => response_group
|
399
362
|
}
|
400
363
|
if skus = options.delete(:skus)
|
@@ -412,14 +375,14 @@ module ActiveFulfillment
|
|
412
375
|
def build_next_inventory_list_request(token)
|
413
376
|
params = {
|
414
377
|
:NextToken => token,
|
415
|
-
:Action =>
|
378
|
+
:Action => 'ListInventorySupplyByNextToken'
|
416
379
|
}
|
417
380
|
|
418
381
|
build_basic_api_query(params)
|
419
382
|
end
|
420
383
|
|
421
384
|
def build_tracking_request(order_id, options)
|
422
|
-
params = {:Action =>
|
385
|
+
params = {:Action => 'GetFulfillmentOrder', :SellerFulfillmentOrderId => order_id}
|
423
386
|
|
424
387
|
build_basic_api_query(params.merge(options))
|
425
388
|
end
|
@@ -456,16 +419,18 @@ module ActiveFulfillment
|
|
456
419
|
end
|
457
420
|
end
|
458
421
|
|
459
|
-
def build_status_request
|
460
|
-
build_basic_api_query({ :Action => OPERATIONS[:outbound][:status] })
|
461
|
-
end
|
462
|
-
|
463
422
|
def escape(str)
|
464
423
|
CGI.escape(str.to_s).gsub('+', '%20')
|
465
424
|
end
|
466
425
|
|
467
426
|
private
|
468
427
|
|
428
|
+
def with_error_handling
|
429
|
+
yield
|
430
|
+
rescue ActiveUtils::ResponseError => e
|
431
|
+
handle_error(e)
|
432
|
+
end
|
433
|
+
|
469
434
|
def sleep_for_throttle_options(throttle_options, index)
|
470
435
|
return unless interval = throttle_options.try(:[], :interval)
|
471
436
|
sleep(throttle_options[:sleep_time]) if (index % interval).zero?
|
data/lib/active_fulfillment.rb
CHANGED
@@ -24,7 +24,6 @@
|
|
24
24
|
require 'active_support'
|
25
25
|
require 'active_support/core_ext/class/attribute'
|
26
26
|
require 'active_support/core_ext/module/attribute_accessors'
|
27
|
-
require 'active_support/core_ext/class/delegating_attributes'
|
28
27
|
require 'active_support/core_ext/time/calculations'
|
29
28
|
require 'active_support/core_ext/date/calculations'
|
30
29
|
require 'active_support/core_ext/numeric/time'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_fulfillment
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.
|
4
|
+
version: 3.0.0.pre7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Fauser
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-12-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|