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.
Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -3
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -1
  5. data/Gemfile +0 -1
  6. data/README.md +53 -29
  7. data/Rakefile +2 -3
  8. data/lib/generators/shipwire/install/install_generator.rb +13 -0
  9. data/lib/generators/shipwire/install/templates/config/initializers/shipwire.rb +27 -0
  10. data/lib/shipwire.rb +26 -33
  11. data/lib/shipwire/api.rb +7 -0
  12. data/lib/shipwire/configuration.rb +13 -3
  13. data/lib/shipwire/orders.rb +39 -0
  14. data/lib/shipwire/param_converter.rb +39 -0
  15. data/lib/shipwire/products.rb +53 -0
  16. data/lib/shipwire/products/base.rb +9 -0
  17. data/lib/shipwire/products/insert.rb +9 -0
  18. data/lib/shipwire/products/kit.rb +9 -0
  19. data/lib/shipwire/products/virtual_kit.rb +9 -0
  20. data/lib/shipwire/rate.rb +7 -0
  21. data/lib/shipwire/receivings.rb +50 -0
  22. data/lib/shipwire/request.rb +73 -0
  23. data/lib/shipwire/response.rb +79 -0
  24. data/lib/shipwire/returns.rb +35 -0
  25. data/lib/shipwire/secret.rb +20 -0
  26. data/lib/shipwire/stock.rb +7 -0
  27. data/lib/shipwire/utility.rb +22 -0
  28. data/lib/shipwire/version.rb +1 -1
  29. data/lib/shipwire/webhooks.rb +24 -0
  30. data/shipwire.gemspec +12 -15
  31. data/spec/features/access_spec.rb +61 -0
  32. data/spec/features/orders_spec.rb +280 -0
  33. data/spec/features/product_types_spec.rb +219 -0
  34. data/spec/features/products_spec.rb +282 -0
  35. data/spec/features/rate_spec.rb +50 -0
  36. data/spec/features/receivings_spec.rb +333 -0
  37. data/spec/features/returns_spec.rb +239 -0
  38. data/spec/features/secret_spec.rb +57 -0
  39. data/spec/features/stock_spec.rb +41 -0
  40. data/spec/features/webhooks_spec.rb +106 -0
  41. data/spec/spec_helper.rb +33 -12
  42. data/spec/support/shipwire.rb +10 -0
  43. data/spec/support/vcr.rb +9 -0
  44. data/spec/support/vcr_cassettes/credentials_incorrect.yml +47 -0
  45. data/spec/support/vcr_cassettes/credentials_missing.yml +47 -0
  46. data/spec/support/vcr_cassettes/order.yml +48 -0
  47. data/spec/support/vcr_cassettes/order_cancel.yml +54 -0
  48. data/spec/support/vcr_cassettes/order_cancel_fail.yml +47 -0
  49. data/spec/support/vcr_cassettes/order_find.yml +45 -0
  50. data/spec/support/vcr_cassettes/order_find_fail.yml +45 -0
  51. data/spec/support/vcr_cassettes/order_find_with_params.yml +45 -0
  52. data/spec/support/vcr_cassettes/order_holds.yml +50 -0
  53. data/spec/support/vcr_cassettes/order_holds_fail.yml +45 -0
  54. data/spec/support/vcr_cassettes/order_holds_with_params.yml +50 -0
  55. data/spec/support/vcr_cassettes/order_items.yml +45 -0
  56. data/spec/support/vcr_cassettes/order_items_fail.yml +45 -0
  57. data/spec/support/vcr_cassettes/order_returns.yml +47 -0
  58. data/spec/support/vcr_cassettes/order_returns_fail.yml +47 -0
  59. data/spec/support/vcr_cassettes/order_trackings.yml +45 -0
  60. data/spec/support/vcr_cassettes/order_trackings_fail.yml +45 -0
  61. data/spec/support/vcr_cassettes/order_update.yml +48 -0
  62. data/spec/support/vcr_cassettes/order_update_fail.yml +50 -0
  63. data/spec/support/vcr_cassettes/order_update_with_params.yml +48 -0
  64. data/spec/support/vcr_cassettes/order_with_warnings.yml +96 -0
  65. data/spec/support/vcr_cassettes/orders_list.yml +47 -0
  66. data/spec/support/vcr_cassettes/orders_list_with_params.yml +47 -0
  67. data/spec/support/vcr_cassettes/product.yml +48 -0
  68. data/spec/support/vcr_cassettes/product_base.yml +48 -0
  69. data/spec/support/vcr_cassettes/product_base_find.yml +48 -0
  70. data/spec/support/vcr_cassettes/product_base_find_fail.yml +47 -0
  71. data/spec/support/vcr_cassettes/product_base_retire_id.yml +47 -0
  72. data/spec/support/vcr_cassettes/product_base_retire_nonexistent.yml +47 -0
  73. data/spec/support/vcr_cassettes/product_base_update.yml +48 -0
  74. data/spec/support/vcr_cassettes/product_base_update_fail.yml +48 -0
  75. data/spec/support/vcr_cassettes/product_create_fail_with_invalid_classification.yml +51 -0
  76. data/spec/support/vcr_cassettes/product_find.yml +48 -0
  77. data/spec/support/vcr_cassettes/product_find_fail.yml +47 -0
  78. data/spec/support/vcr_cassettes/product_insert.yml +50 -0
  79. data/spec/support/vcr_cassettes/product_insert_find.yml +48 -0
  80. data/spec/support/vcr_cassettes/product_insert_find_fail.yml +47 -0
  81. data/spec/support/vcr_cassettes/product_insert_retire_id.yml +47 -0
  82. data/spec/support/vcr_cassettes/product_insert_retire_nonexistent.yml +47 -0
  83. data/spec/support/vcr_cassettes/product_insert_update.yml +49 -0
  84. data/spec/support/vcr_cassettes/product_insert_update_fail.yml +48 -0
  85. data/spec/support/vcr_cassettes/product_kit.yml +48 -0
  86. data/spec/support/vcr_cassettes/product_kit_find.yml +48 -0
  87. data/spec/support/vcr_cassettes/product_kit_find_fail.yml +47 -0
  88. data/spec/support/vcr_cassettes/product_kit_retire_id.yml +47 -0
  89. data/spec/support/vcr_cassettes/product_kit_retire_nonexistent.yml +47 -0
  90. data/spec/support/vcr_cassettes/product_kit_update.yml +48 -0
  91. data/spec/support/vcr_cassettes/product_kit_update_fail.yml +47 -0
  92. data/spec/support/vcr_cassettes/product_multiple_create_fail.yml +102 -0
  93. data/spec/support/vcr_cassettes/product_multiple_create_success.yml +100 -0
  94. data/spec/support/vcr_cassettes/product_retire_id.yml +47 -0
  95. data/spec/support/vcr_cassettes/product_retire_nonexistent.yml +47 -0
  96. data/spec/support/vcr_cassettes/product_update.yml +48 -0
  97. data/spec/support/vcr_cassettes/product_update_fail.yml +48 -0
  98. data/spec/support/vcr_cassettes/product_virtual_kit.yml +48 -0
  99. data/spec/support/vcr_cassettes/product_virtual_kit_find.yml +48 -0
  100. data/spec/support/vcr_cassettes/product_virtual_kit_find_fail.yml +47 -0
  101. data/spec/support/vcr_cassettes/product_virtual_kit_retire_id.yml +47 -0
  102. data/spec/support/vcr_cassettes/product_virtual_kit_retire_nonexistent.yml +47 -0
  103. data/spec/support/vcr_cassettes/product_virtual_kit_update.yml +49 -0
  104. data/spec/support/vcr_cassettes/product_virtual_kit_update_fail.yml +47 -0
  105. data/spec/support/vcr_cassettes/products_base_list.yml +49 -0
  106. data/spec/support/vcr_cassettes/products_base_list_with_params.yml +49 -0
  107. data/spec/support/vcr_cassettes/products_insert_list.yml +47 -0
  108. data/spec/support/vcr_cassettes/products_insert_list_with_params.yml +47 -0
  109. data/spec/support/vcr_cassettes/products_kit_list.yml +47 -0
  110. data/spec/support/vcr_cassettes/products_kit_list_with_params.yml +47 -0
  111. data/spec/support/vcr_cassettes/products_list.yml +49 -0
  112. data/spec/support/vcr_cassettes/products_list_with_params.yml +49 -0
  113. data/spec/support/vcr_cassettes/products_virtual_kit_list.yml +47 -0
  114. data/spec/support/vcr_cassettes/products_virtual_kit_list_with_params.yml +47 -0
  115. data/spec/support/vcr_cassettes/rate_find.yml +53 -0
  116. data/spec/support/vcr_cassettes/rate_find_fail.yml +50 -0
  117. data/spec/support/vcr_cassettes/receiving.yml +53 -0
  118. data/spec/support/vcr_cassettes/receiving_cancel.yml +98 -0
  119. data/spec/support/vcr_cassettes/receiving_cancel_label.yml +47 -0
  120. data/spec/support/vcr_cassettes/receiving_cancel_label_nonexistent.yml +47 -0
  121. data/spec/support/vcr_cassettes/receiving_find.yml +46 -0
  122. data/spec/support/vcr_cassettes/receiving_find_fail.yml +45 -0
  123. data/spec/support/vcr_cassettes/receiving_find_with_params.yml +48 -0
  124. data/spec/support/vcr_cassettes/receiving_holds.yml +47 -0
  125. data/spec/support/vcr_cassettes/receiving_holds_fail.yml +45 -0
  126. data/spec/support/vcr_cassettes/receiving_holds_with_params.yml +47 -0
  127. data/spec/support/vcr_cassettes/receiving_instructions_recipients.yml +45 -0
  128. data/spec/support/vcr_cassettes/receiving_instructions_recipients_fail.yml +45 -0
  129. data/spec/support/vcr_cassettes/receiving_items.yml +45 -0
  130. data/spec/support/vcr_cassettes/receiving_items_fail.yml +45 -0
  131. data/spec/support/vcr_cassettes/receiving_shipments.yml +45 -0
  132. data/spec/support/vcr_cassettes/receiving_shipments_fail.yml +45 -0
  133. data/spec/support/vcr_cassettes/receiving_tracking.yml +45 -0
  134. data/spec/support/vcr_cassettes/receiving_tracking_fail.yml +45 -0
  135. data/spec/support/vcr_cassettes/receiving_update.yml +53 -0
  136. data/spec/support/vcr_cassettes/receiving_update_fail.yml +49 -0
  137. data/spec/support/vcr_cassettes/receiving_update_with_params.yml +55 -0
  138. data/spec/support/vcr_cassettes/receivings_list.yml +53 -0
  139. data/spec/support/vcr_cassettes/receivings_list_with_params.yml +46 -0
  140. data/spec/support/vcr_cassettes/return.yml +98 -0
  141. data/spec/support/vcr_cassettes/return_cancel.yml +55 -0
  142. data/spec/support/vcr_cassettes/return_cancel_fail.yml +47 -0
  143. data/spec/support/vcr_cassettes/return_find.yml +47 -0
  144. data/spec/support/vcr_cassettes/return_find_fail.yml +45 -0
  145. data/spec/support/vcr_cassettes/return_find_with_params.yml +47 -0
  146. data/spec/support/vcr_cassettes/return_holds.yml +45 -0
  147. data/spec/support/vcr_cassettes/return_holds_fail.yml +45 -0
  148. data/spec/support/vcr_cassettes/return_holds_with_params.yml +45 -0
  149. data/spec/support/vcr_cassettes/return_items.yml +45 -0
  150. data/spec/support/vcr_cassettes/return_items_fail.yml +45 -0
  151. data/spec/support/vcr_cassettes/return_labels.yml +45 -0
  152. data/spec/support/vcr_cassettes/return_labels_fail.yml +45 -0
  153. data/spec/support/vcr_cassettes/return_trackings.yml +45 -0
  154. data/spec/support/vcr_cassettes/return_trackings_fail.yml +45 -0
  155. data/spec/support/vcr_cassettes/returns_list.yml +47 -0
  156. data/spec/support/vcr_cassettes/returns_list_with_params.yml +47 -0
  157. data/spec/support/vcr_cassettes/secret.yml +47 -0
  158. data/spec/support/vcr_cassettes/secret_find.yml +45 -0
  159. data/spec/support/vcr_cassettes/secret_find_fail.yml +43 -0
  160. data/spec/support/vcr_cassettes/secret_list.yml +45 -0
  161. data/spec/support/vcr_cassettes/secret_remove.yml +45 -0
  162. data/spec/support/vcr_cassettes/stock_with_params.yml +45 -0
  163. data/spec/support/vcr_cassettes/stock_with_params_no_sku.yml +45 -0
  164. data/spec/support/vcr_cassettes/stock_without_params.yml +45 -0
  165. data/spec/support/vcr_cassettes/webhook.yml +47 -0
  166. data/spec/support/vcr_cassettes/webhooks_create_insecure.yml +50 -0
  167. data/spec/support/vcr_cassettes/webhooks_find.yml +47 -0
  168. data/spec/support/vcr_cassettes/webhooks_find_fail.yml +47 -0
  169. data/spec/support/vcr_cassettes/webhooks_list.yml +47 -0
  170. data/spec/support/vcr_cassettes/webhooks_remove.yml +47 -0
  171. data/spec/support/vcr_cassettes/webhooks_update.yml +47 -0
  172. data/spec/support/vcr_cassettes/webhooks_update_fail.yml +49 -0
  173. data/spec/unit/shipwire/response_spec.rb +46 -0
  174. metadata +354 -80
  175. data/.env +0 -4
  176. data/.env.example +0 -4
  177. data/Gemfile.lock +0 -69
  178. data/lib/shipwire/fulfillment.rb +0 -100
  179. data/lib/shipwire/inventory.rb +0 -72
  180. data/lib/shipwire/service_request.rb +0 -42
  181. data/lib/shipwire/shipping_rate.rb +0 -121
  182. data/lib/shipwire/tracking.rb +0 -101
  183. data/spec/shipwire/fulfillment_spec.rb +0 -36
  184. data/spec/shipwire/inventory_spec.rb +0 -25
  185. data/spec/shipwire/shipping_rate_spec.rb +0 -62
  186. data/spec/shipwire/tracking_spec.rb +0 -20
data/.env DELETED
@@ -1,4 +0,0 @@
1
- export SHIPWIRE_ENDPOINT='https://api.beta.shipwire.com/exec/'
2
- export SHIPWIRE_SERVER='Test'
3
- export SHIPWIRE_USERNAME='billr578@gmail.com'
4
- export SHIPWIRE_PASSWORD='black.cat!17'
@@ -1,4 +0,0 @@
1
- SHIPWIRE_ENDPOINT=
2
- SHIPWIRE_SERVER=
3
- SHIPWIRE_USERNAME=
4
- SHIPWIRE_PASSWORD=
@@ -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
@@ -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
@@ -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
@@ -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