peddler 0.3.1 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +3 -3
- data/README.md +42 -105
- data/lib/peddler/feeds.rb +4 -184
- data/lib/peddler/fulfillment_inbound_shipment.rb +11 -0
- data/lib/peddler/fulfillment_inventory.rb +10 -0
- data/lib/peddler/fulfillment_outbound_shipment.rb +10 -0
- data/lib/peddler/orders.rb +10 -0
- data/lib/peddler/products.rb +11 -0
- data/lib/peddler/reports.rb +4 -94
- data/lib/peddler/sellers.rb +9 -0
- data/lib/peddler/service.rb +106 -0
- data/lib/peddler/version.rb +1 -1
- data/lib/peddler.rb +5 -17
- metadata +61 -175
- data/.gitignore +0 -5
- data/.rspec +0 -1
- data/.rvmrc +0 -2
- data/Gemfile +0 -4
- data/Gemfile.lock +0 -47
- data/Rakefile +0 -12
- data/lib/peddler/client.rb +0 -229
- data/lib/peddler/handlers.rb +0 -38
- data/lib/peddler/inventory.rb +0 -140
- data/lib/peddler/legacy_reports.rb +0 -109
- data/lib/peddler/refunds.rb +0 -52
- data/lib/peddler/transport.rb +0 -135
- data/mussels.jpg +0 -0
- data/peddler.gemspec +0 -28
- data/spec/peddler/client_spec.rb +0 -45
- data/spec/peddler/feeds_spec.rb +0 -88
- data/spec/peddler/handlers_spec.rb +0 -12
- data/spec/peddler/inventory_spec.rb +0 -74
- data/spec/peddler/legacy_reports_spec.rb +0 -89
- data/spec/peddler/refunds_spec.rb +0 -42
- data/spec/peddler/reports_spec.rb +0 -26
- data/spec/peddler/transport_spec.rb +0 -65
- data/spec/spec_helper.rb +0 -7
- data/spec/support/amazon.yml.example +0 -2
- data/spec/support/amazon_credentials.rb +0 -3
- data/spec/support/vcr.rb +0 -13
- data/spec_rubies +0 -2
data/LICENSE
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
(The MIT License)
|
2
2
|
|
3
|
-
Copyright (c)
|
3
|
+
Copyright (c) 2012 Paper Cavalier
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining
|
6
6
|
a copy of this software and associated documentation files (the
|
7
|
-
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
8
|
without limitation the rights to use, copy, modify, merge, publish,
|
9
9
|
distribute, sublicense, and/or sell copies of the Software, and to
|
10
10
|
permit persons to whom the Software is furnished to do so, subject to
|
@@ -13,7 +13,7 @@ the following conditions:
|
|
13
13
|
The above copyright notice and this permission notice shall be
|
14
14
|
included in all copies or substantial portions of the Software.
|
15
15
|
|
16
|
-
THE SOFTWARE IS PROVIDED
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
17
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
18
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
19
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
data/README.md
CHANGED
@@ -1,128 +1,65 @@
|
|
1
|
-
Peddler
|
2
|
-
=======
|
1
|
+
# Peddler
|
3
2
|
|
4
|
-
|
3
|
+
[![travis][1]][2]
|
5
4
|
|
6
|
-
![Peddler]
|
5
|
+
![Peddler][3]
|
7
6
|
|
8
|
-
|
9
|
-
-------------
|
7
|
+
Peddler wraps the [Amazon Marketplace Web Service (MWS) APIs][4].
|
10
8
|
|
11
|
-
|
9
|
+
```ruby
|
10
|
+
service = Peddler.new 'US'
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
:region => :us)
|
12
|
+
service.configure key: 'key',
|
13
|
+
secret: 'secret',
|
14
|
+
seller: 'seller'
|
17
15
|
|
18
|
-
|
16
|
+
service.status # => "GREEN"
|
17
|
+
```
|
19
18
|
|
20
|
-
|
21
|
-
item = client.new_inventory_item(
|
22
|
-
:product_id => '1234567890',
|
23
|
-
:price => 100.00,
|
24
|
-
:sku => 'SKU-123',
|
25
|
-
:quantity => 10)
|
26
|
-
batch << item
|
19
|
+
## Feeds
|
27
20
|
|
28
|
-
|
21
|
+
The Feeds API lets you upload inventory and order data to Amazon.
|
29
22
|
|
30
|
-
|
23
|
+
## Fulfillment Inbound Shipment
|
31
24
|
|
32
|
-
|
25
|
+
With the Fulfillment Inbound Shipment API, you can create and update inbound
|
26
|
+
shipments of inventory in the Amazon Fulfillment Network. You can also request
|
27
|
+
lists of inbound shipments or inbound shipment items based on criteria that you
|
28
|
+
specify.
|
33
29
|
|
34
|
-
|
35
|
-
:upload,
|
36
|
-
:id => batch.id)
|
37
|
-
upload_log.body
|
38
|
-
=> "Feed Processing Summary:\n\tNumber of records processed\t\t1\n\tNumber of records successful\t\t1\n\n"
|
30
|
+
## Fulfillment Inventory
|
39
31
|
|
40
|
-
|
32
|
+
The Fulfillment Inventory API lets you see what is available in your inventory.
|
33
|
+
It's a real-time reporting mechanism that returns your current or
|
34
|
+
recently-changed inventory supply in the Amazon fulfillment network.
|
41
35
|
|
42
|
-
|
43
|
-
orders = client.detab(orders_report.body)
|
44
|
-
p orders.size
|
45
|
-
=> 1500
|
46
|
-
p orders[0].item_name
|
47
|
-
=> "A Thousand Plateaus: Capitalism and Schizophrenia (Paperback) by Gilles Deleuze"
|
36
|
+
## Fulfillment Outbound Shipment
|
48
37
|
|
49
|
-
|
38
|
+
The Fulfillment Outbound Shipment API is designed to help you integrate
|
39
|
+
Fulfillment by Amazon with any payment processing application or inventory
|
40
|
+
management system currently in use.
|
50
41
|
|
51
|
-
|
52
|
-
fulfilled_order = client.new_fulfilled_order(
|
53
|
-
:order_id => '123-1234567-1234567',
|
54
|
-
:order_date => '2009-08-01',
|
55
|
-
:carrier_code => 'USPS',
|
56
|
-
:tracking_number => '0308 0330 0000 0000 0000')
|
57
|
-
feed << fulfilled_order
|
42
|
+
## Orders
|
58
43
|
|
59
|
-
|
44
|
+
The Orders API helps you build simple applications that retrieve only the order
|
45
|
+
information that you need.
|
60
46
|
|
61
|
-
|
47
|
+
## Products
|
62
48
|
|
63
|
-
|
49
|
+
The Products API helps you get information to match your products to existing
|
50
|
+
product listings on Amazon Marketplace websites and to make sourcing and
|
51
|
+
pricing decisions for listing those products on Amazon Marketplace websites.
|
64
52
|
|
65
|
-
|
66
|
-
=> "_SUBMITTED_"
|
53
|
+
## Reports
|
67
54
|
|
68
|
-
|
55
|
+
The Reports API lets you request reports about your inventory and orders.
|
69
56
|
|
70
|
-
|
71
|
-
=> "_DONE_"
|
57
|
+
## Sellers
|
72
58
|
|
73
|
-
|
59
|
+
The Sellers API lets sellers retrieve information about their seller account,
|
60
|
+
such as the marketplaces they participate in.
|
74
61
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
feed = client.new_order_cancellation_feed
|
80
|
-
cancelled_order = client.new_cancelled_order(
|
81
|
-
:order_id => '123-1234567-1234567',
|
82
|
-
:cancellation_reason_code => 'NoInventory',
|
83
|
-
:amazon_order_item_code => '12341234567890')
|
84
|
-
feed << cancelled_order
|
85
|
-
feed.upload
|
86
|
-
sleep(60)
|
87
|
-
feed.status!
|
88
|
-
=> "_DONE_"
|
89
|
-
p feed.download.to_s
|
90
|
-
=> ...
|
91
|
-
|
92
|
-
To post a refund for an already-shipped item, you use the batch refund method:
|
93
|
-
|
94
|
-
refunds = client.new_refund_batch
|
95
|
-
refund = client.new_refund(
|
96
|
-
:order_id => '123-1234567-1234567',
|
97
|
-
:payments_transaction_id => '12341234567890',
|
98
|
-
:refund_amount => 1.00,
|
99
|
-
:reason => 'GeneralAdjustment',
|
100
|
-
:message => 'With our apologies.')
|
101
|
-
refunds << refund
|
102
|
-
refunds.upload
|
103
|
-
|
104
|
-
For a change, let's download something different from Amazon, like a preorder report:
|
105
|
-
|
106
|
-
preorder_report = client.new_report(
|
107
|
-
:preorder,
|
108
|
-
:product_line => 'Books',
|
109
|
-
:frequency => 2)
|
110
|
-
preorders = client.detab(preorder_report.body)
|
111
|
-
p preorders.size
|
112
|
-
=> 2000
|
113
|
-
p preorders[0].asin
|
114
|
-
=> "1234567890"
|
115
|
-
p preorders[0].average_asking_price
|
116
|
-
=> "100"
|
117
|
-
|
118
|
-
[Read source](http://gloss.papercavalier.com/peddler) for more info.
|
119
|
-
|
120
|
-
Todo
|
121
|
-
----
|
122
|
-
|
123
|
-
Switch to using the [Amazon Marketplace Web Service (Amazon MWS)](https://mws.amazon.com/index.html).
|
124
|
-
|
125
|
-
Compatibility
|
126
|
-
-------------
|
127
|
-
|
128
|
-
Specs pass against Ruby 1.8.7, Ruby 1.9.2, and Rubinius 1.1.
|
62
|
+
[1]: https://secure.travis-ci.org/papercavalier/peddler.png
|
63
|
+
[2]: http://travis-ci.org/papercavalier/peddler
|
64
|
+
[3]: http://f.cl.ly/items/0W3V0A1Z110Q0x461b3H/mussels.jpeg
|
65
|
+
[4]: https://developer.amazonservices.com/gp/mws/docs.html
|
data/lib/peddler/feeds.rb
CHANGED
@@ -1,187 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# This module includes functionality to handle the charge-when-ship-related
|
4
|
-
# feeds Amazon added to the API in 2009.
|
5
|
-
module Feeds
|
6
|
-
|
7
|
-
# This is a downloadable file. Outputs Amazon's response verbatim for now.
|
8
|
-
class Download
|
9
|
-
attr_accessor :id, :type, :related_reference_id, :available_at, :acknowledged
|
10
|
-
|
11
|
-
MAPPED_PARAMS = {
|
12
|
-
'DownloadId' => 'id',
|
13
|
-
'DownloadType' => 'type',
|
14
|
-
'RelatedReferenceId' => 'related_reference_id',
|
15
|
-
'AvailableDate' => 'available_at',
|
16
|
-
'Acknowledged' => 'acknowledged'}
|
17
|
-
|
18
|
-
def initialize(transport, params={})
|
19
|
-
@transport = transport
|
20
|
-
params.each_pair{ |k, v| self.send "#{MAPPED_PARAMS[k]}=", v }
|
21
|
-
end
|
22
|
-
|
23
|
-
# Retrieves and returns report.
|
24
|
-
def to_s
|
25
|
-
@body ||= download_report
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def download_report
|
31
|
-
return nil if @id.nil?
|
32
|
-
@transport.modernize_request
|
33
|
-
@transport.query_params.merge!({
|
34
|
-
'Action' => 'download',
|
35
|
-
'downloadId' => @id})
|
36
|
-
@transport.execute_request
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# This is the base class.
|
41
|
-
class Feed
|
42
|
-
attr_writer :file_content
|
43
|
-
attr_accessor :batch, :download, :status, :type, :id, :submitted_at, :started_processing_at, :completed_processing_at, :messages_processed, :messages_successful, :messages_with_errors, :messages_with_warnings
|
44
|
-
|
45
|
-
MAPPED_PARAMS = {
|
46
|
-
'UploadStatus' => 'status',
|
47
|
-
'UploadType' => 'type',
|
48
|
-
'UploadId' => 'id',
|
49
|
-
'SubmittedDate' => 'submitted_at',
|
50
|
-
'StartedProcessingDate' => 'started_processing_at',
|
51
|
-
'CompletedProcessingDate' => 'completed_processing_at',
|
52
|
-
'CompletedProcesssingDate' => 'completed_processing_at',
|
53
|
-
'MessagesProcessed' => 'messages_processed',
|
54
|
-
'MessagesSuccessful' => 'messages_successful',
|
55
|
-
'MessagesWithErrors' => 'messages_with_errors',
|
56
|
-
'MessagesWithWarnings' => 'messages_with_warnings'}
|
57
|
-
|
58
|
-
def initialize(transport)
|
59
|
-
@transport = transport
|
60
|
-
@batch = []
|
61
|
-
end
|
62
|
-
|
63
|
-
# Returns content of the upload file.
|
64
|
-
def file_content
|
65
|
-
return @file_content if @file_content
|
66
|
-
out = @file_header
|
67
|
-
@batch.each{ |item| out << item.to_s }
|
68
|
-
@file_content = out
|
69
|
-
end
|
70
|
-
|
71
|
-
# Returns status and will also refresh if not already "done."
|
72
|
-
def status!
|
73
|
-
return @status if @status.nil? || @status =~ /_DONE_/
|
74
|
-
refresh_status
|
75
|
-
@status
|
76
|
-
end
|
77
|
-
|
78
|
-
# Uploads batch.
|
79
|
-
def upload
|
80
|
-
raise PeddlerError.new('Batch already uploaded') unless @id.nil?
|
81
|
-
@transport.modernize_request
|
82
|
-
@transport.query_params.merge!({
|
83
|
-
'Action' => 'upload',
|
84
|
-
'uploadType' => @type})
|
85
|
-
@transport.body = file_content
|
86
|
-
res = @transport.execute_request
|
87
|
-
process_response(res)
|
88
|
-
@status
|
89
|
-
end
|
1
|
+
require 'peddler/service'
|
90
2
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
private
|
97
|
-
|
98
|
-
def refresh_status
|
99
|
-
@transport.modernize_request
|
100
|
-
@transport.query_params.merge!({
|
101
|
-
'Action' => 'uploadStatus',
|
102
|
-
'uploadId' => @id})
|
103
|
-
res = @transport.execute_request
|
104
|
-
process_response(res)
|
105
|
-
end
|
106
|
-
|
107
|
-
def process_response(res)
|
108
|
-
upload = Hash.from_xml(res)['Response']['Upload'] || Hash.from_xml(res)['Response']['UploadsStatusList']['Upload']
|
109
|
-
upload.each_pair do |key, value|
|
110
|
-
if key == 'RelatedDownloadsList'
|
111
|
-
@download = Peddler::Feeds::Download.new(@transport, value['Download'])
|
112
|
-
else
|
113
|
-
self.send "#{MAPPED_PARAMS[key]}=", value
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
module OrderFulfillment
|
120
|
-
# This class contains methods to upload order fulfillment info to Amazon.
|
121
|
-
# See sections 7.1 through 7.3 in the API documentation for more detail.
|
122
|
-
class Batch < Peddler::Feeds::Feed
|
123
|
-
def initialize(transport)
|
124
|
-
@file_header = "order-id\torder-item-id\tquantity\tship-date\tcarrier-code\tcarrier-name\ttracking-number\tship-method\r\n"
|
125
|
-
@type = '_POST_FLAT_FILE_FULFILLMENT_DATA_'
|
126
|
-
super(transport)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# This is an order fulfillment item.
|
131
|
-
class Item
|
132
|
-
attr_accessor :order_id, :order_item_id, :quantity, :ship_date, :carrier_name, :tracking_number, :ship_method
|
133
|
-
attr_reader :carrier_code
|
134
|
-
|
135
|
-
def initialize(params={})
|
136
|
-
params.each_pair{ |key, value| send("#{key}=", value) }
|
137
|
-
end
|
138
|
-
|
139
|
-
# Validates when setting carrier code.
|
140
|
-
def carrier_code=(carrier_code)
|
141
|
-
@carrier_code = carrier_code if %w{USPS UPS FedEx other}.include?(carrier_code)
|
142
|
-
end
|
143
|
-
|
144
|
-
# Outputs a formatted line for the tab-delimited upload file.
|
145
|
-
def to_s
|
146
|
-
"#{@order_id}\t#{@order_item_id}\t#{@quantity}\t#{@ship_date}\t#{@carrier_code}\t#{@carrier_name}\t#{@tracking_number}\t#{@ship_method}\r\n"
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
# This module contains methods to upload cancelled orders to Amazon.
|
152
|
-
# See section 7.4 in the API documentation for more detail.
|
153
|
-
module OrderCancellation
|
154
|
-
class Batch < Peddler::Feeds::Feed
|
155
|
-
def initialize(transport)
|
156
|
-
@file_header = "TemplateType=OrderCancellation Version=1.0/1.0.3 This row for Amazon.com use only. Do not modify or delete.\r\n" +
|
157
|
-
"order-id\tcancellation-reason-code\tamazon-order-item-code\r\n"
|
158
|
-
@type = '_POST_FLAT_FILE_ORDER_ACKNOWLEDGEMENT_DATA_'
|
159
|
-
super(transport)
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
# This is a cancelled order item.
|
164
|
-
class Item
|
165
|
-
attr_accessor :order_id, :amazon_order_item_code
|
166
|
-
attr_reader :cancellation_reason_code
|
167
|
-
|
168
|
-
def initialize(params={})
|
169
|
-
params.each_pair{ |key, value| send("#{key}=", value) }
|
170
|
-
end
|
171
|
-
|
172
|
-
# Validates when setting cancellation reason code.
|
173
|
-
def cancellation_reason_code=(cancellation_reason_code)
|
174
|
-
@cancellation_reason_code = cancellation_reason_code if %w{ BuyerCanceled CustomerExchange CustomerReturn GeneralAdjustment MerchandiseNotReceived NoInventory ShippingAddressUndeliverable }.include?(cancellation_reason_code)
|
175
|
-
end
|
176
|
-
|
177
|
-
# Outputs a formatted line for the tab-delimited upload file.
|
178
|
-
def to_s
|
179
|
-
if @cancellation_reason_code.nil? != @amazon_order_item_code.nil?
|
180
|
-
raise PeddlerError.new('Provide codes for both cancellation reason and Amazon order item (or omit both).')
|
181
|
-
end
|
182
|
-
"#{@order_id}\t#{@cancellation_reason_code}\t#{@amazon_order_item_code}\r\n"
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
3
|
+
module Peddler
|
4
|
+
# The Feeds API lets you upload inventory and order data to Amazon.
|
5
|
+
class Feeds < Service
|
186
6
|
end
|
187
7
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'peddler/service'
|
2
|
+
|
3
|
+
# With the Fulfillment Inbound Shipment API, you can create and update inbound
|
4
|
+
# shipments of inventory in the Amazon Fulfillment Network. You can also
|
5
|
+
# request lists of inbound shipments or inbound shipment items based on
|
6
|
+
# criteria that you specify.
|
7
|
+
module Peddler
|
8
|
+
class FulfillmentInboundShipment < Service
|
9
|
+
path 'FulfillmentInboundShipment/2010-10-01'
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'peddler/service'
|
2
|
+
|
3
|
+
module Peddler
|
4
|
+
# The Fulfillment Inventory API lets you see what is available in your
|
5
|
+
# inventory. It's a real-time reporting mechanism that returns your current
|
6
|
+
# or recently-changed inventory supply in the Amazon fulfillment network.
|
7
|
+
class FulfillmentInventory < Service
|
8
|
+
path 'FulfillmentInventory/2010-10-01'
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'peddler/service'
|
2
|
+
|
3
|
+
module Peddler
|
4
|
+
# The Fulfillment Outbound Shipment API is designed to help you integrate
|
5
|
+
# Fulfillment by Amazon with any payment processing application or inventory
|
6
|
+
# management system currently in use.
|
7
|
+
class FulfillmentOutboundShipment < Service
|
8
|
+
path 'FulfillmentOutboundShipment/2010-10-01'
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'peddler/service'
|
2
|
+
|
3
|
+
module Peddler
|
4
|
+
# The Products API helps you get information to match your products to
|
5
|
+
# existing product listings on Amazon Marketplace websites and to make
|
6
|
+
# sourcing and pricing decisions for listing those products on Amazon
|
7
|
+
# Marketplace websites.
|
8
|
+
class Products < Service
|
9
|
+
path 'Products/2011-10-01'
|
10
|
+
end
|
11
|
+
end
|
data/lib/peddler/reports.rb
CHANGED
@@ -1,97 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# This module generates and downloads unshipped order reports.
|
4
|
-
# I decided to keep this out of Peddler::LegacyReports because the API is
|
5
|
-
# quite different.
|
6
|
-
module Reports
|
7
|
-
|
8
|
-
# This is an unshipped orders report. It is very similar to the feed
|
9
|
-
# objects, so I'm just porting over the class.
|
10
|
-
class UnshippedOrdersReport < Peddler::Feeds::Feed
|
11
|
-
alias :unshipped_orders :batch
|
12
|
-
attr_accessor :starts_at, :ends_at, :scheduled
|
13
|
-
|
14
|
-
MAPPED_PARAMS = {
|
15
|
-
'ReportID' => 'id',
|
16
|
-
'StartDate' => 'starts_at',
|
17
|
-
'EndDate' => 'ends_at',
|
18
|
-
'DownloadType' => 'type',
|
19
|
-
'Scheduled' => 'scheduled',
|
20
|
-
'ReportStatus' => 'status',
|
21
|
-
'SubmittedDate' => 'submitted_at',
|
22
|
-
'StartedProcessingDate' => 'started_processing_at',
|
23
|
-
'CompletedProcessingDate' => 'completed_processing_at',
|
24
|
-
'CompletedProcesssingDate' => 'completed_processing_at'}
|
25
|
-
|
26
|
-
# Creates new unshipped order report. It will send a request to
|
27
|
-
# Amazon to generate the report if the report ID is not already set.
|
28
|
-
def initialize(transport, params={})
|
29
|
-
super(transport)
|
30
|
-
params.each_pair{ |key, value| self.send "#{key}=", value }
|
31
|
-
@starts_at ||= (Date.today - 7).strftime("%Y-%m-%dT00:00:00-00:00")
|
32
|
-
@ends_at ||= (Date.today + 1).strftime("%Y-%m-%dT00:00:00-00:00")
|
33
|
-
#@type ||= "_GET_CONVERGED_FLAT_FILE_ACTIONABLE_ORDER_DATA_"
|
34
|
-
@type ||= "_GET_FLAT_FILE_ACTIONABLE_ORDER_DATA_"
|
35
|
-
if @id.nil?
|
36
|
-
generate_report
|
37
|
-
end
|
38
|
-
self
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def refresh_status
|
44
|
-
@transport.modernize_request
|
45
|
-
@transport.query_params.merge!({
|
46
|
-
"Action" => "reportStatus",
|
47
|
-
"reportId" => @id})
|
48
|
-
res = @transport.execute_request
|
49
|
-
process_response(res)
|
50
|
-
end
|
1
|
+
require 'peddler/service'
|
51
2
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
'Action' => 'generateReport',
|
56
|
-
'startDate' => @starts_at,
|
57
|
-
'endDate' => @ends_at,
|
58
|
-
'downloadType' => @type})
|
59
|
-
res = @transport.execute_request
|
60
|
-
process_response(res)
|
61
|
-
end
|
62
|
-
|
63
|
-
def process_response(res)
|
64
|
-
hash = Hash.from_xml(res)
|
65
|
-
report = Hash.from_xml(res)['Response']['Report'] || Hash.from_xml(res)['Response']['ReportsList']['Report']
|
66
|
-
report.each_pair do |key, value|
|
67
|
-
if key == "ListOfDownloads"
|
68
|
-
@download = Peddler::Feeds::Download.new(@transport, value['Download'])
|
69
|
-
@batch = Peddler::Handlers::TabDelimitedHandler.decode_response(@download.to_s)
|
70
|
-
else
|
71
|
-
self.send "#{MAPPED_PARAMS[key]}=", value
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
# This is an unshipped order.
|
78
|
-
class Item
|
79
|
-
attr_accessor :order_id, :order_item_id, :quantity, :ship_date, :carrier_name, :tracking_number, :ship_method
|
80
|
-
attr_reader :carrier_code
|
81
|
-
|
82
|
-
def initialize(params={})
|
83
|
-
params.each_pair{ |key, value| send("#{key}=", value) }
|
84
|
-
end
|
85
|
-
|
86
|
-
# Validates when setting carrier code.
|
87
|
-
def carrier_code=(carrier_code)
|
88
|
-
@carrier_code = carrier_code if %w{USPS UPS FedEx other}.include?(carrier_code)
|
89
|
-
end
|
90
|
-
|
91
|
-
# Outputs a formatted line for the tab-delimited upload file.
|
92
|
-
def to_s
|
93
|
-
"#{@order_id}\t#{@order_item_id}\t#{@quantity}\t#{@ship_date}\t#{@carrier_code}\t#{@carrier_name}\t#{@tracking_number}\t#{@ship_method}\r\n"
|
94
|
-
end
|
95
|
-
end
|
3
|
+
module Peddler
|
4
|
+
# The Reports API lets you request reports about your inventory and orders.
|
5
|
+
class Reports < Service
|
96
6
|
end
|
97
7
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'jeff'
|
2
|
+
|
3
|
+
module Peddler
|
4
|
+
BadLocale = Class.new ArgumentError
|
5
|
+
MissingSeller = Class.new ArgumentError
|
6
|
+
|
7
|
+
# A wrapper around a Marketplace Web Services (MWS) endpoint.
|
8
|
+
class Service
|
9
|
+
include Jeff
|
10
|
+
|
11
|
+
class << self
|
12
|
+
# Gets/Sets the path of the MWS endpoint.
|
13
|
+
#
|
14
|
+
# path - A String path (optional).
|
15
|
+
def path(path = nil)
|
16
|
+
@path = path if path
|
17
|
+
@path
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
params 'SellerId' => -> { seller }
|
22
|
+
|
23
|
+
# A list of MWS hosts.
|
24
|
+
HOSTS = {
|
25
|
+
'CA' => 'mws.amazonservices.ca',
|
26
|
+
'CN' => 'mws.amazonservices.com.cn',
|
27
|
+
'DE' => 'mws-eu.amazonservices.com',
|
28
|
+
'ES' => 'mws-eu.amazonservices.com',
|
29
|
+
'FR' => 'mws-eu.amazonservices.com',
|
30
|
+
'IN' => 'mws.amazonservices.in',
|
31
|
+
'IT' => 'mws-eu.amazonservices.com',
|
32
|
+
'JP' => 'mws.amazonservices.jp',
|
33
|
+
'UK' => 'mws-eu.amazonservices.com',
|
34
|
+
'US' => 'mws.amazonservices.com'
|
35
|
+
}
|
36
|
+
|
37
|
+
# A list of MWS marketplace ids.
|
38
|
+
MARKETPLACES = {
|
39
|
+
'CA' => 'A2EUQ1WTGCTBG2',
|
40
|
+
'CN' => nil,
|
41
|
+
'DE' => 'A1PA6795UKMFR9',
|
42
|
+
'ES' => 'A1RKKUPIHCS9HS',
|
43
|
+
'FR' => 'A13V1IB3VIYZZH',
|
44
|
+
'IN' => nil,
|
45
|
+
'IT' => 'APJ6JRA9NG5V4',
|
46
|
+
'JP' => 'A1VC38T7YXB528',
|
47
|
+
'UK' => 'A1F83G8C2ARO7P',
|
48
|
+
'US' => 'ATVPDKIKX0DER'
|
49
|
+
}
|
50
|
+
|
51
|
+
def self.inherited(base)
|
52
|
+
base.params params
|
53
|
+
end
|
54
|
+
|
55
|
+
# Creates a new service endpoint for given locale.
|
56
|
+
#
|
57
|
+
# locale - The String MWS API locale.
|
58
|
+
#
|
59
|
+
# Raises a Bad Locale error if locale is not valid.
|
60
|
+
def initialize(locale)
|
61
|
+
@host = HOSTS[@locale = locale] or raise BadLocale
|
62
|
+
end
|
63
|
+
|
64
|
+
# Configures the MWS endpoint.
|
65
|
+
#
|
66
|
+
# credentials - The Hash credentials.
|
67
|
+
# :key - The String Amazon Web Services (AWS) key.
|
68
|
+
# :secret - The String AWS secret.
|
69
|
+
# :seller - The String MWS Seller Id.
|
70
|
+
#
|
71
|
+
# Returns nothing.
|
72
|
+
def configure(credentials)
|
73
|
+
credentials.each { |key, val| self.send "#{key}=", val }
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns the String MWS endpoint.
|
77
|
+
def endpoint
|
78
|
+
"https://#{@host}/#{self.class.path}"
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns a String Marketplace id.
|
82
|
+
#
|
83
|
+
# locale - The String MWS API locale (default: the locale of the service
|
84
|
+
# endpoint).
|
85
|
+
def marketplace(locale = nil)
|
86
|
+
MARKETPLACES[locale || @locale] or raise BadLocale
|
87
|
+
end
|
88
|
+
|
89
|
+
# Gets the String MWS seller id.
|
90
|
+
#
|
91
|
+
# Raises a Missing Seller error if seller id is missing.
|
92
|
+
def seller
|
93
|
+
@seller or raise MissingSeller
|
94
|
+
end
|
95
|
+
|
96
|
+
# Sets the String MWS seller id.
|
97
|
+
attr_writer :seller
|
98
|
+
|
99
|
+
# Gets the String service status.
|
100
|
+
def status
|
101
|
+
get(query: { 'Action' => 'GetServiceStatus' })
|
102
|
+
.body
|
103
|
+
.match(/GREEN_?I?|YELLOW|RED/)[0]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/lib/peddler/version.rb
CHANGED