shipwire 0.0.5 → 2.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.
- checksums.yaml +4 -4
- data/.gitignore +3 -3
- data/.rspec +2 -0
- data/.ruby-version +1 -1
- data/Gemfile +0 -1
- data/README.md +53 -29
- data/Rakefile +2 -3
- data/lib/generators/shipwire/install/install_generator.rb +13 -0
- data/lib/generators/shipwire/install/templates/config/initializers/shipwire.rb +27 -0
- data/lib/shipwire.rb +26 -33
- data/lib/shipwire/api.rb +7 -0
- data/lib/shipwire/configuration.rb +13 -3
- data/lib/shipwire/orders.rb +39 -0
- data/lib/shipwire/param_converter.rb +39 -0
- data/lib/shipwire/products.rb +53 -0
- data/lib/shipwire/products/base.rb +9 -0
- data/lib/shipwire/products/insert.rb +9 -0
- data/lib/shipwire/products/kit.rb +9 -0
- data/lib/shipwire/products/virtual_kit.rb +9 -0
- data/lib/shipwire/rate.rb +7 -0
- data/lib/shipwire/receivings.rb +50 -0
- data/lib/shipwire/request.rb +73 -0
- data/lib/shipwire/response.rb +79 -0
- data/lib/shipwire/returns.rb +35 -0
- data/lib/shipwire/secret.rb +20 -0
- data/lib/shipwire/stock.rb +7 -0
- data/lib/shipwire/utility.rb +22 -0
- data/lib/shipwire/version.rb +1 -1
- data/lib/shipwire/webhooks.rb +24 -0
- data/shipwire.gemspec +12 -15
- data/spec/features/access_spec.rb +61 -0
- data/spec/features/orders_spec.rb +280 -0
- data/spec/features/product_types_spec.rb +219 -0
- data/spec/features/products_spec.rb +282 -0
- data/spec/features/rate_spec.rb +50 -0
- data/spec/features/receivings_spec.rb +333 -0
- data/spec/features/returns_spec.rb +239 -0
- data/spec/features/secret_spec.rb +57 -0
- data/spec/features/stock_spec.rb +41 -0
- data/spec/features/webhooks_spec.rb +106 -0
- data/spec/spec_helper.rb +33 -12
- data/spec/support/shipwire.rb +10 -0
- data/spec/support/vcr.rb +9 -0
- data/spec/support/vcr_cassettes/credentials_incorrect.yml +47 -0
- data/spec/support/vcr_cassettes/credentials_missing.yml +47 -0
- data/spec/support/vcr_cassettes/order.yml +48 -0
- data/spec/support/vcr_cassettes/order_cancel.yml +54 -0
- data/spec/support/vcr_cassettes/order_cancel_fail.yml +47 -0
- data/spec/support/vcr_cassettes/order_find.yml +45 -0
- data/spec/support/vcr_cassettes/order_find_fail.yml +45 -0
- data/spec/support/vcr_cassettes/order_find_with_params.yml +45 -0
- data/spec/support/vcr_cassettes/order_holds.yml +50 -0
- data/spec/support/vcr_cassettes/order_holds_fail.yml +45 -0
- data/spec/support/vcr_cassettes/order_holds_with_params.yml +50 -0
- data/spec/support/vcr_cassettes/order_items.yml +45 -0
- data/spec/support/vcr_cassettes/order_items_fail.yml +45 -0
- data/spec/support/vcr_cassettes/order_returns.yml +47 -0
- data/spec/support/vcr_cassettes/order_returns_fail.yml +47 -0
- data/spec/support/vcr_cassettes/order_trackings.yml +45 -0
- data/spec/support/vcr_cassettes/order_trackings_fail.yml +45 -0
- data/spec/support/vcr_cassettes/order_update.yml +48 -0
- data/spec/support/vcr_cassettes/order_update_fail.yml +50 -0
- data/spec/support/vcr_cassettes/order_update_with_params.yml +48 -0
- data/spec/support/vcr_cassettes/order_with_warnings.yml +96 -0
- data/spec/support/vcr_cassettes/orders_list.yml +47 -0
- data/spec/support/vcr_cassettes/orders_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/product.yml +48 -0
- data/spec/support/vcr_cassettes/product_base.yml +48 -0
- data/spec/support/vcr_cassettes/product_base_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_base_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_base_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_base_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_base_update.yml +48 -0
- data/spec/support/vcr_cassettes/product_base_update_fail.yml +48 -0
- data/spec/support/vcr_cassettes/product_create_fail_with_invalid_classification.yml +51 -0
- data/spec/support/vcr_cassettes/product_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_insert.yml +50 -0
- data/spec/support/vcr_cassettes/product_insert_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_insert_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_insert_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_insert_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_insert_update.yml +49 -0
- data/spec/support/vcr_cassettes/product_insert_update_fail.yml +48 -0
- data/spec/support/vcr_cassettes/product_kit.yml +48 -0
- data/spec/support/vcr_cassettes/product_kit_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_kit_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_kit_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_kit_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_kit_update.yml +48 -0
- data/spec/support/vcr_cassettes/product_kit_update_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_multiple_create_fail.yml +102 -0
- data/spec/support/vcr_cassettes/product_multiple_create_success.yml +100 -0
- data/spec/support/vcr_cassettes/product_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_update.yml +48 -0
- data/spec/support/vcr_cassettes/product_update_fail.yml +48 -0
- data/spec/support/vcr_cassettes/product_virtual_kit.yml +48 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_update.yml +49 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_update_fail.yml +47 -0
- data/spec/support/vcr_cassettes/products_base_list.yml +49 -0
- data/spec/support/vcr_cassettes/products_base_list_with_params.yml +49 -0
- data/spec/support/vcr_cassettes/products_insert_list.yml +47 -0
- data/spec/support/vcr_cassettes/products_insert_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/products_kit_list.yml +47 -0
- data/spec/support/vcr_cassettes/products_kit_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/products_list.yml +49 -0
- data/spec/support/vcr_cassettes/products_list_with_params.yml +49 -0
- data/spec/support/vcr_cassettes/products_virtual_kit_list.yml +47 -0
- data/spec/support/vcr_cassettes/products_virtual_kit_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/rate_find.yml +53 -0
- data/spec/support/vcr_cassettes/rate_find_fail.yml +50 -0
- data/spec/support/vcr_cassettes/receiving.yml +53 -0
- data/spec/support/vcr_cassettes/receiving_cancel.yml +98 -0
- data/spec/support/vcr_cassettes/receiving_cancel_label.yml +47 -0
- data/spec/support/vcr_cassettes/receiving_cancel_label_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/receiving_find.yml +46 -0
- data/spec/support/vcr_cassettes/receiving_find_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_find_with_params.yml +48 -0
- data/spec/support/vcr_cassettes/receiving_holds.yml +47 -0
- data/spec/support/vcr_cassettes/receiving_holds_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_holds_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/receiving_instructions_recipients.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_instructions_recipients_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_items.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_items_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_shipments.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_shipments_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_tracking.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_tracking_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_update.yml +53 -0
- data/spec/support/vcr_cassettes/receiving_update_fail.yml +49 -0
- data/spec/support/vcr_cassettes/receiving_update_with_params.yml +55 -0
- data/spec/support/vcr_cassettes/receivings_list.yml +53 -0
- data/spec/support/vcr_cassettes/receivings_list_with_params.yml +46 -0
- data/spec/support/vcr_cassettes/return.yml +98 -0
- data/spec/support/vcr_cassettes/return_cancel.yml +55 -0
- data/spec/support/vcr_cassettes/return_cancel_fail.yml +47 -0
- data/spec/support/vcr_cassettes/return_find.yml +47 -0
- data/spec/support/vcr_cassettes/return_find_fail.yml +45 -0
- data/spec/support/vcr_cassettes/return_find_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/return_holds.yml +45 -0
- data/spec/support/vcr_cassettes/return_holds_fail.yml +45 -0
- data/spec/support/vcr_cassettes/return_holds_with_params.yml +45 -0
- data/spec/support/vcr_cassettes/return_items.yml +45 -0
- data/spec/support/vcr_cassettes/return_items_fail.yml +45 -0
- data/spec/support/vcr_cassettes/return_labels.yml +45 -0
- data/spec/support/vcr_cassettes/return_labels_fail.yml +45 -0
- data/spec/support/vcr_cassettes/return_trackings.yml +45 -0
- data/spec/support/vcr_cassettes/return_trackings_fail.yml +45 -0
- data/spec/support/vcr_cassettes/returns_list.yml +47 -0
- data/spec/support/vcr_cassettes/returns_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/secret.yml +47 -0
- data/spec/support/vcr_cassettes/secret_find.yml +45 -0
- data/spec/support/vcr_cassettes/secret_find_fail.yml +43 -0
- data/spec/support/vcr_cassettes/secret_list.yml +45 -0
- data/spec/support/vcr_cassettes/secret_remove.yml +45 -0
- data/spec/support/vcr_cassettes/stock_with_params.yml +45 -0
- data/spec/support/vcr_cassettes/stock_with_params_no_sku.yml +45 -0
- data/spec/support/vcr_cassettes/stock_without_params.yml +45 -0
- data/spec/support/vcr_cassettes/webhook.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_create_insecure.yml +50 -0
- data/spec/support/vcr_cassettes/webhooks_find.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_list.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_remove.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_update.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_update_fail.yml +49 -0
- data/spec/unit/shipwire/response_spec.rb +46 -0
- metadata +354 -80
- data/.env +0 -4
- data/.env.example +0 -4
- data/Gemfile.lock +0 -69
- data/lib/shipwire/fulfillment.rb +0 -100
- data/lib/shipwire/inventory.rb +0 -72
- data/lib/shipwire/service_request.rb +0 -42
- data/lib/shipwire/shipping_rate.rb +0 -121
- data/lib/shipwire/tracking.rb +0 -101
- data/spec/shipwire/fulfillment_spec.rb +0 -36
- data/spec/shipwire/inventory_spec.rb +0 -25
- data/spec/shipwire/shipping_rate_spec.rb +0 -62
- data/spec/shipwire/tracking_spec.rb +0 -20
data/.env
DELETED
data/.env.example
DELETED
data/Gemfile.lock
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: .
|
|
3
|
-
specs:
|
|
4
|
-
shipwire (0.0.4)
|
|
5
|
-
faraday
|
|
6
|
-
nokogiri
|
|
7
|
-
|
|
8
|
-
GEM
|
|
9
|
-
remote: https://rubygems.org/
|
|
10
|
-
specs:
|
|
11
|
-
addressable (2.3.6)
|
|
12
|
-
coderay (1.1.0)
|
|
13
|
-
crack (0.4.2)
|
|
14
|
-
safe_yaml (~> 1.0.0)
|
|
15
|
-
diff-lcs (1.2.5)
|
|
16
|
-
dotenv (0.11.1)
|
|
17
|
-
dotenv-deployment (~> 0.0.2)
|
|
18
|
-
dotenv-deployment (0.0.2)
|
|
19
|
-
faraday (0.9.0)
|
|
20
|
-
multipart-post (>= 1.2, < 3)
|
|
21
|
-
metaclass (0.0.4)
|
|
22
|
-
method_source (0.8.2)
|
|
23
|
-
mini_portile (0.6.0)
|
|
24
|
-
mocha (1.1.0)
|
|
25
|
-
metaclass (~> 0.0.1)
|
|
26
|
-
multipart-post (2.0.0)
|
|
27
|
-
nokogiri (1.6.3.1)
|
|
28
|
-
mini_portile (= 0.6.0)
|
|
29
|
-
pry (0.10.0)
|
|
30
|
-
coderay (~> 1.1.0)
|
|
31
|
-
method_source (~> 0.8.1)
|
|
32
|
-
slop (~> 3.4)
|
|
33
|
-
rack (1.5.2)
|
|
34
|
-
rack-test (0.6.2)
|
|
35
|
-
rack (>= 1.0)
|
|
36
|
-
rake (10.3.2)
|
|
37
|
-
rspec (3.0.0)
|
|
38
|
-
rspec-core (~> 3.0.0)
|
|
39
|
-
rspec-expectations (~> 3.0.0)
|
|
40
|
-
rspec-mocks (~> 3.0.0)
|
|
41
|
-
rspec-core (3.0.3)
|
|
42
|
-
rspec-support (~> 3.0.0)
|
|
43
|
-
rspec-expectations (3.0.3)
|
|
44
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
45
|
-
rspec-support (~> 3.0.0)
|
|
46
|
-
rspec-mocks (3.0.3)
|
|
47
|
-
rspec-support (~> 3.0.0)
|
|
48
|
-
rspec-support (3.0.3)
|
|
49
|
-
safe_yaml (1.0.3)
|
|
50
|
-
slop (3.6.0)
|
|
51
|
-
vcr (2.9.2)
|
|
52
|
-
webmock (1.18.0)
|
|
53
|
-
addressable (>= 2.3.6)
|
|
54
|
-
crack (>= 0.3.2)
|
|
55
|
-
|
|
56
|
-
PLATFORMS
|
|
57
|
-
ruby
|
|
58
|
-
|
|
59
|
-
DEPENDENCIES
|
|
60
|
-
bundler (~> 1.6)
|
|
61
|
-
dotenv
|
|
62
|
-
mocha
|
|
63
|
-
pry
|
|
64
|
-
rack-test
|
|
65
|
-
rake
|
|
66
|
-
rspec
|
|
67
|
-
shipwire!
|
|
68
|
-
vcr
|
|
69
|
-
webmock
|
data/lib/shipwire/fulfillment.rb
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
require 'nokogiri'
|
|
2
|
-
|
|
3
|
-
module Shipwire
|
|
4
|
-
class Fulfillment < Shipwire::ServiceRequest
|
|
5
|
-
attr_reader :order_responses
|
|
6
|
-
|
|
7
|
-
API_PATH = 'FulfillmentServices.php'
|
|
8
|
-
|
|
9
|
-
def initialize(params={})
|
|
10
|
-
super
|
|
11
|
-
|
|
12
|
-
@order_responses = []
|
|
13
|
-
@api_path = Fulfillment::API_PATH
|
|
14
|
-
@orders = params[:orders]
|
|
15
|
-
|
|
16
|
-
self.build_payload
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def parse_response
|
|
20
|
-
if @response != nil
|
|
21
|
-
xml = Nokogiri::XML(@response.body)
|
|
22
|
-
@fulfillment_response = xml.xpath('//SubmitOrderResponse')
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
if @fulfillment_response != nil
|
|
26
|
-
if is_ok?(@fulfillment_response)
|
|
27
|
-
orders = @fulfillment_response.xpath('//Order')
|
|
28
|
-
|
|
29
|
-
orders.each do |order|
|
|
30
|
-
order_number = order.attributes['number'].value
|
|
31
|
-
fulfillment_id = order.attributes['id'].value
|
|
32
|
-
status = order.attributes['status'].value
|
|
33
|
-
|
|
34
|
-
shipping = order.xpath('Shipping')
|
|
35
|
-
|
|
36
|
-
shipping_cost = shipping.xpath('Cost').text
|
|
37
|
-
shipping_service = shipping.xpath('Service').text
|
|
38
|
-
|
|
39
|
-
@order_responses << {
|
|
40
|
-
order_number: order_number,
|
|
41
|
-
fulfillment_id: fulfillment_id,
|
|
42
|
-
status: status,
|
|
43
|
-
shipping: {
|
|
44
|
-
service: shipping_service,
|
|
45
|
-
cost: shipping_cost
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
end
|
|
49
|
-
else
|
|
50
|
-
@errors << 'Unsuccessful request'
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
protected
|
|
56
|
-
def build_payload
|
|
57
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
|
58
|
-
xml.OrderList {
|
|
59
|
-
xml.Username Shipwire.username
|
|
60
|
-
xml.Password Shipwire.password
|
|
61
|
-
xml.Server Shipwire.server
|
|
62
|
-
|
|
63
|
-
@orders.each do |order|
|
|
64
|
-
xml.Order(id: order[:order_number]) {
|
|
65
|
-
xml.Warehouse '00'
|
|
66
|
-
|
|
67
|
-
xml.AddressInfo(type: 'ship') {
|
|
68
|
-
xml.Name {
|
|
69
|
-
xml.Full "#{order[:address][:first_name]} #{order[:address][:last_name]}"
|
|
70
|
-
}
|
|
71
|
-
xml.Address1 order[:address][:address1]
|
|
72
|
-
xml.Address2 order[:address][:address2]
|
|
73
|
-
xml.City order[:address][:city]
|
|
74
|
-
xml.State order[:address][:state]
|
|
75
|
-
xml.Country order[:address][:country]
|
|
76
|
-
xml.Zip order[:address][:zip]
|
|
77
|
-
xml.Phone order[:address][:phone]
|
|
78
|
-
xml.Email order[:email]
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
xml.Shipping order[:shipping]
|
|
82
|
-
|
|
83
|
-
count = 0
|
|
84
|
-
order[:items].each do |item|
|
|
85
|
-
xml.Item(num: count) {
|
|
86
|
-
xml.Code item[:code]
|
|
87
|
-
xml.Quantity item[:quantity]
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
count += 1
|
|
91
|
-
end
|
|
92
|
-
}
|
|
93
|
-
end
|
|
94
|
-
}
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
self.payload = builder.to_xml
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
data/lib/shipwire/inventory.rb
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
require 'nokogiri'
|
|
2
|
-
|
|
3
|
-
module Shipwire
|
|
4
|
-
class Inventory < Shipwire::ServiceRequest
|
|
5
|
-
attr_reader :inventory_responses
|
|
6
|
-
|
|
7
|
-
API_PATH = 'InventoryServices.php'
|
|
8
|
-
|
|
9
|
-
def initialize(params={})
|
|
10
|
-
super
|
|
11
|
-
|
|
12
|
-
@inventory_responses = []
|
|
13
|
-
@api_path = Inventory::API_PATH
|
|
14
|
-
|
|
15
|
-
@product_code = params[:product_code] || nil
|
|
16
|
-
|
|
17
|
-
self.build_payload
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def parse_response
|
|
21
|
-
if @response != nil
|
|
22
|
-
xml = Nokogiri::XML(@response.body)
|
|
23
|
-
@inventory_response = xml.xpath('//InventoryUpdateResponse')
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
if @inventory_response != nil
|
|
27
|
-
if is_ok?(@inventory_response)
|
|
28
|
-
|
|
29
|
-
products = @inventory_response.xpath('//Product')
|
|
30
|
-
|
|
31
|
-
products.each do |product|
|
|
32
|
-
code = product.attributes['code'].value
|
|
33
|
-
quantity = product.attributes['quantity'].value
|
|
34
|
-
good = product.attributes['good'].value
|
|
35
|
-
pending = product.attributes['pending'].value
|
|
36
|
-
backordered = product.attributes['backordered'].value
|
|
37
|
-
|
|
38
|
-
@inventory_responses << {
|
|
39
|
-
code: code,
|
|
40
|
-
inventory: {
|
|
41
|
-
quantity: quantity,
|
|
42
|
-
good: good,
|
|
43
|
-
pending: pending,
|
|
44
|
-
backordered: backordered
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
else
|
|
50
|
-
@errors << 'Unsuccessful request'
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
protected
|
|
55
|
-
def build_payload
|
|
56
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
|
57
|
-
xml.InventoryUpdate {
|
|
58
|
-
xml.Username Shipwire.username
|
|
59
|
-
xml.Password Shipwire.password
|
|
60
|
-
xml.Server Shipwire.server
|
|
61
|
-
|
|
62
|
-
if @product_code != nil
|
|
63
|
-
xml.ProductCode @product_code
|
|
64
|
-
end
|
|
65
|
-
}
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
self.payload = builder.to_xml
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
end
|
|
72
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
require 'faraday'
|
|
2
|
-
|
|
3
|
-
module Shipwire
|
|
4
|
-
class ServiceRequest
|
|
5
|
-
attr_accessor :payload, :api_path
|
|
6
|
-
attr_reader :response, :errors
|
|
7
|
-
|
|
8
|
-
def initialize(params={})
|
|
9
|
-
@errors = []
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def send
|
|
13
|
-
begin
|
|
14
|
-
connection = Faraday.new(url: Shipwire.endpoint) do |faraday|
|
|
15
|
-
faraday.request :url_encoded
|
|
16
|
-
faraday.adapter Faraday.default_adapter
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
@response = connection.post @api_path, @payload
|
|
20
|
-
rescue Faraday::ConnectionFailed
|
|
21
|
-
@errors << 'Unable to connect to Shipwire'
|
|
22
|
-
rescue
|
|
23
|
-
@errors << 'Unknown error'
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def is_ok?(element)
|
|
28
|
-
status = element.xpath('//Status').text
|
|
29
|
-
|
|
30
|
-
return status == 'OK' || status == "0" || status == "Test"
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def parse_response
|
|
34
|
-
raise 'Override this'
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
protected
|
|
38
|
-
def build_payload
|
|
39
|
-
raise 'Override this'
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
require 'nokogiri'
|
|
2
|
-
|
|
3
|
-
module Shipwire
|
|
4
|
-
class ShippingRate < Shipwire::ServiceRequest
|
|
5
|
-
attr_reader :shipping_quotes
|
|
6
|
-
|
|
7
|
-
API_PATH = 'RateServices.php'
|
|
8
|
-
|
|
9
|
-
def initialize(params={})
|
|
10
|
-
super
|
|
11
|
-
|
|
12
|
-
@shipping_quotes = []
|
|
13
|
-
@api_path = ShippingRate::API_PATH
|
|
14
|
-
@address = params[:address]
|
|
15
|
-
@items = params[:items] || [] # [ { code: '123456', quantity: 1 } ]
|
|
16
|
-
|
|
17
|
-
self.build_payload
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def parse_response
|
|
21
|
-
if @response != nil
|
|
22
|
-
xml = Nokogiri::XML(@response.body)
|
|
23
|
-
@rate_response = xml.xpath('//RateResponse')
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
if @rate_response != nil
|
|
27
|
-
if is_ok?(@rate_response)
|
|
28
|
-
quotes = @rate_response.xpath('//Quote')
|
|
29
|
-
quotes.each do |quote|
|
|
30
|
-
service = quote.xpath('Service').text
|
|
31
|
-
carrier_code = quote.xpath('CarrierCode').text
|
|
32
|
-
cost = quote.xpath('Cost').text.to_f
|
|
33
|
-
subtotals = quote.xpath('Subtotals')
|
|
34
|
-
delivery_estimate = quote.xpath('DeliveryEstimate')
|
|
35
|
-
|
|
36
|
-
freight = 0.0
|
|
37
|
-
insurance = 0.0
|
|
38
|
-
packaging = 0.0
|
|
39
|
-
handling = 0.0
|
|
40
|
-
|
|
41
|
-
subtotals.xpath('Subtotal').each do |subtotal|
|
|
42
|
-
case subtotal.attributes['type'].text
|
|
43
|
-
when 'Freight'
|
|
44
|
-
freight = subtotal.xpath('Cost').text.to_f
|
|
45
|
-
when 'Insurance'
|
|
46
|
-
insurance = subtotal.xpath('Cost').text.to_f
|
|
47
|
-
when 'Packaging'
|
|
48
|
-
packaging = subtotal.xpath('Cost').text.to_f
|
|
49
|
-
when 'Handling'
|
|
50
|
-
handling = subtotal.xpath('Cost').text.to_f
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
if delivery_estimate != nil
|
|
55
|
-
minimum = delivery_estimate.xpath('Minimum')
|
|
56
|
-
maximum = delivery_estimate.xpath('Maximum')
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
@shipping_quotes << {
|
|
60
|
-
service: service,
|
|
61
|
-
carrier_code: carrier_code,
|
|
62
|
-
code: quote.attributes['method'].value,
|
|
63
|
-
cost: cost,
|
|
64
|
-
subtotals: {
|
|
65
|
-
freight: freight,
|
|
66
|
-
insurance: insurance,
|
|
67
|
-
packaging: packaging,
|
|
68
|
-
handling: handling
|
|
69
|
-
},
|
|
70
|
-
delivery_estimate: {
|
|
71
|
-
minimum: minimum == nil ? '' : minimum.text,
|
|
72
|
-
maximum: maximum == nil ? '' : maximum.text
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
end
|
|
76
|
-
else
|
|
77
|
-
@errors << 'Unsuccessful request'
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
if @shipping_quotes.count <= 0
|
|
82
|
-
@errors << 'Unable to get shipping rates from Shipwire'
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
protected
|
|
87
|
-
def build_payload
|
|
88
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
|
89
|
-
xml.RateRequest {
|
|
90
|
-
xml.Username Shipwire.username
|
|
91
|
-
xml.Password Shipwire.password
|
|
92
|
-
|
|
93
|
-
xml.Order {
|
|
94
|
-
xml.Warehouse '00'
|
|
95
|
-
|
|
96
|
-
xml.AddressInfo(type: 'ship') {
|
|
97
|
-
xml.Address1 @address[:address1]
|
|
98
|
-
xml.Address2 @address[:address2]
|
|
99
|
-
xml.City @address[:city]
|
|
100
|
-
xml.State @address[:state]
|
|
101
|
-
xml.Country @address[:country]
|
|
102
|
-
xml.Zip @address[:zip]
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
count = 0
|
|
106
|
-
@items.each do |item|
|
|
107
|
-
xml.Item(num: count) {
|
|
108
|
-
xml.Code item[:code]
|
|
109
|
-
xml.Quantity item[:quantity]
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
count += 1
|
|
113
|
-
end
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
self.payload = builder.to_xml
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
end
|
data/lib/shipwire/tracking.rb
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
require 'nokogiri'
|
|
2
|
-
|
|
3
|
-
module Shipwire
|
|
4
|
-
class Tracking < Shipwire::ServiceRequest
|
|
5
|
-
attr_reader :order_responses
|
|
6
|
-
|
|
7
|
-
API_PATH = 'TrackingServices.php'
|
|
8
|
-
|
|
9
|
-
def initialize(params={})
|
|
10
|
-
super
|
|
11
|
-
|
|
12
|
-
@order_responses = []
|
|
13
|
-
@api_path = Tracking::API_PATH
|
|
14
|
-
|
|
15
|
-
@bookmark = params[:bookmark]
|
|
16
|
-
if @bookmark == '1'
|
|
17
|
-
raise Shipwire::TrackingError.new('Ability to return all orders has been deprecated')
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
@order_number = params[:order_number]
|
|
21
|
-
@shipwire_id = params[:shipwire_id]
|
|
22
|
-
|
|
23
|
-
# Default to since last bookmark
|
|
24
|
-
if (@bookmark == nil || @bookmark == '') &&
|
|
25
|
-
(@order_number == nil || @order_number == '') &&
|
|
26
|
-
(@shipwire_id == nil || @shipwire_id == '')
|
|
27
|
-
@bookmark = '2'
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
self.build_payload
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def parse_response
|
|
34
|
-
if @response != nil
|
|
35
|
-
xml = Nokogiri::XML(@response.body)
|
|
36
|
-
tracking_update_response = xml.xpath('//TrackingUpdateResponse')
|
|
37
|
-
|
|
38
|
-
if tracking_update_response != nil
|
|
39
|
-
if is_ok?(tracking_update_response)
|
|
40
|
-
|
|
41
|
-
orders = tracking_update_response.xpath('//Order')
|
|
42
|
-
|
|
43
|
-
orders.each do |order|
|
|
44
|
-
tracking_numbers = order.xpath('TrackingNumber')
|
|
45
|
-
|
|
46
|
-
tracking_data = []
|
|
47
|
-
tracking_numbers.each do |number|
|
|
48
|
-
tracking_data << {
|
|
49
|
-
carrier: number.attributes['carrier'].value,
|
|
50
|
-
tracking_link: number.attributes['href'].value,
|
|
51
|
-
tracking_number: number.text
|
|
52
|
-
}
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
@order_responses << {
|
|
56
|
-
order_number: order.attributes['id'].value,
|
|
57
|
-
shipped: order.attributes['shipped'].value,
|
|
58
|
-
ship_date: (order.attributes['shipDate'] != nil ? order.attributes['shipDate'].value : ''),
|
|
59
|
-
delivered: (order.attributes['delivered'] != nil ? order.attributes['delivered'].value : ''),
|
|
60
|
-
expected_delivery_date: (order.attributes['expectedDeliveryDate'] != nil ? order.attributes['expectedDeliveryDate'].value : ''),
|
|
61
|
-
fulfillment_data: {
|
|
62
|
-
handling: (order.attributes['handling'] != nil ? order.attributes['handling'].value : '0'),
|
|
63
|
-
shipping: (order.attributes['shipping'] != nil ? order.attributes['shipping'].value : '0'),
|
|
64
|
-
packaging: (order.attributes['packaging'] != nil ? order.attributes['packaging'].value : '0')
|
|
65
|
-
},
|
|
66
|
-
tracking_numbers: tracking_data
|
|
67
|
-
}
|
|
68
|
-
end
|
|
69
|
-
else
|
|
70
|
-
@errors << 'Unsuccessful request'
|
|
71
|
-
end
|
|
72
|
-
else
|
|
73
|
-
@errors << 'Unsuccessful request'
|
|
74
|
-
end
|
|
75
|
-
else
|
|
76
|
-
@errors << 'Unsuccessful request'
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
protected
|
|
81
|
-
def build_payload
|
|
82
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
|
83
|
-
xml.TrackingUpdate {
|
|
84
|
-
xml.Username Shipwire.username
|
|
85
|
-
xml.Password Shipwire.password
|
|
86
|
-
xml.Server Shipwire.server
|
|
87
|
-
|
|
88
|
-
if @bookmark != '' && @bookmark != nil
|
|
89
|
-
xml.Bookmark @bookmark
|
|
90
|
-
elsif @shipwire_id != '' && @shipwire_id != nil
|
|
91
|
-
xml.ShipwireId @shipwire_id
|
|
92
|
-
else
|
|
93
|
-
xml.OrderNo @order_number
|
|
94
|
-
end
|
|
95
|
-
}
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
self.payload = builder.to_xml
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|