channeladvisor 0.1.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.
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/.travis.yml +6 -0
- data/.yardopts +8 -0
- data/Gemfile +31 -0
- data/Guardfile +28 -0
- data/LICENSE +19 -0
- data/README.md +40 -0
- data/Rakefile +69 -0
- data/channeladvisor.gemspec +29 -0
- data/lib/channeladvisor.rb +27 -0
- data/lib/channeladvisor/account_authorization.rb +14 -0
- data/lib/channeladvisor/address.rb +39 -0
- data/lib/channeladvisor/admin.rb +75 -0
- data/lib/channeladvisor/base.rb +34 -0
- data/lib/channeladvisor/client.rb +3 -0
- data/lib/channeladvisor/configuration.rb +11 -0
- data/lib/channeladvisor/error.rb +30 -0
- data/lib/channeladvisor/line_item.rb +38 -0
- data/lib/channeladvisor/order.rb +179 -0
- data/lib/channeladvisor/order_status.rb +14 -0
- data/lib/channeladvisor/payment.rb +15 -0
- data/lib/channeladvisor/services.rb +11 -0
- data/lib/channeladvisor/services/admin_service.rb +47 -0
- data/lib/channeladvisor/services/base_service.rb +26 -0
- data/lib/channeladvisor/services/inventory_service.rb +90 -0
- data/lib/channeladvisor/services/order_service.rb +117 -0
- data/lib/channeladvisor/services/shipping_service.rb +164 -0
- data/lib/channeladvisor/shipment.rb +71 -0
- data/lib/channeladvisor/shopping_cart.rb +26 -0
- data/lib/channeladvisor/version.rb +3 -0
- data/spec/fixtures/requests/admin_service/get_authorization_list.xml +1 -0
- data/spec/fixtures/requests/admin_service/get_authorization_list_with_local_id.xml +1 -0
- data/spec/fixtures/requests/admin_service/ping.xml +1 -0
- data/spec/fixtures/requests/admin_service/request_access.xml +1 -0
- data/spec/fixtures/requests/inventory_service/ping.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/price_only.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/quantity_and_price.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/quantity_only.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/price_only.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/quantity_and_price.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/quantity_only.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_item_price.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_item_quantity.xml +1 -0
- data/spec/fixtures/requests/inventory_service/update_item_quantity_and_price.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_checkout_status_filter.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_created_from_date.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_created_to_date.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_detail_level.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_distribution_center_code.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_export_state.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_join_dates.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_one_client_order_id.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_one_order_id.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_order_state_filter.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_page_number_filter.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_page_size.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_payment_status_filter.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_refund_status_filter.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_shipping_status_filter.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_two_client_order_ids.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_two_order_ids.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_updated_from_date.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/with_updated_to_date.xml +1 -0
- data/spec/fixtures/requests/order_service/get_order_list/without_order_criteria.xml +1 -0
- data/spec/fixtures/requests/order_service/ping.xml +1 -0
- data/spec/fixtures/requests/order_service/set_orders_export_status/with_one_client_order_id.xml +1 -0
- data/spec/fixtures/requests/order_service/set_orders_export_status/with_two_client_order_ids.xml +1 -0
- data/spec/fixtures/requests/shipping_service/get_shipping_carrier_list.xml +1 -0
- data/spec/fixtures/requests/shipping_service/ping.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/with_one_shipment.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/with_two_shipments.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_carrier_code.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_class_code.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_client_order_id.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_seller_id.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/full_shipment/without_tracking_number.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/with_one_line_item.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/with_two_line_items.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/with_two_shipments.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/without_carrier_code.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/without_class_code.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/without_seller_id.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/partial_shipment/without_tracking_number.xml +1 -0
- data/spec/fixtures/requests/shipping_service/submit_order_shipment_list/with_partial_and_full_shipments.xml +1 -0
- data/spec/fixtures/responses/admin/get_authorization_list/failure.yml +50 -0
- data/spec/fixtures/responses/admin/get_authorization_list/no_authorizations.yml +49 -0
- data/spec/fixtures/responses/admin/get_authorization_list/one_authorization.yml +49 -0
- data/spec/fixtures/responses/admin/get_authorization_list/success.yml +49 -0
- data/spec/fixtures/responses/admin/get_authorization_list/two_authorizations.yml +49 -0
- data/spec/fixtures/responses/admin/ping/failure.yml +50 -0
- data/spec/fixtures/responses/admin/ping/success.yml +218 -0
- data/spec/fixtures/responses/admin/request_access/failure.yml +50 -0
- data/spec/fixtures/responses/admin/request_access/success.yml +49 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/with_invalid_local_id.yml +219 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/with_local_id/success.yml +218 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/with_valid_local_id/multiple_authorizations.yml +49 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/with_valid_local_id/no_authorizations.yml +49 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/with_valid_local_id/one_authorization.yml +49 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/with_valid_local_id/success.yml +218 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/without_local_id/multiple_authorizations.yml +49 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/without_local_id/no_authorizations.yml +49 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/without_local_id/one_authorization.yml +49 -0
- data/spec/fixtures/responses/admin_service/get_authorization_list/without_local_id/success.yml +218 -0
- data/spec/fixtures/responses/admin_service/ping/failure.yml +222 -0
- data/spec/fixtures/responses/admin_service/ping/success.yml +218 -0
- data/spec/fixtures/responses/admin_service/request_access/failure.yml +219 -0
- data/spec/fixtures/responses/admin_service/request_access/success.yml +218 -0
- data/spec/fixtures/responses/http_error.yml +48 -0
- data/spec/fixtures/responses/inventory_service/ping.yml +1356 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price.yml +1356 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price/price_only.yml +144 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price/quantity_and_price.yml +191 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price/quantity_only.yml +1403 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list.yml +243 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/price_only.yml +97 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/quantity_and_price.yml +144 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_one_item/quantity_only.yml +51 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/price_only.yml +238 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/quantity_and_price.yml +285 -0
- data/spec/fixtures/responses/inventory_service/update_inventory_item_quantity_and_price_list/with_two_items/quantity_only.yml +191 -0
- data/spec/fixtures/responses/order/instance_set_export_status.yml +51 -0
- data/spec/fixtures/responses/order/instance_set_export_status/failure.yml +51 -0
- data/spec/fixtures/responses/order/instance_set_export_status/success/result_false.yml +51 -0
- data/spec/fixtures/responses/order/instance_set_export_status/success/result_true.yml +51 -0
- data/spec/fixtures/responses/order/list.yml +58 -0
- data/spec/fixtures/responses/order/list/failure.yml +56 -0
- data/spec/fixtures/responses/order/list/no_matching_orders.yml +56 -0
- data/spec/fixtures/responses/order/list/one_matching_order.yml +57 -0
- data/spec/fixtures/responses/order/list/two_matching_orders.yml +59 -0
- data/spec/fixtures/responses/order/list/with_criteria.yml +52 -0
- data/spec/fixtures/responses/order/list/with_no_criteria.yml +58 -0
- data/spec/fixtures/responses/order/ping.yml +868 -0
- data/spec/fixtures/responses/order/ping/failure.yml +50 -0
- data/spec/fixtures/responses/order/ping/success.yml +867 -0
- data/spec/fixtures/responses/order/set_export_status/failure.yml +51 -0
- data/spec/fixtures/responses/order/set_export_status/success/with_one_client_order_id.yml +51 -0
- data/spec/fixtures/responses/order/set_export_status/success/with_two_client_order_ids.yml +51 -0
- data/spec/fixtures/responses/order_service/get_order_list/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_checkout_status_filter.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_created_from_date.yml +874 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_created_to_date.yml +874 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_detail_level.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_distribution_center_code.yml +872 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_export_state.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_join_dates.yml +869 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_one_client_order_id.yml +872 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_one_order_id.yml +873 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_order_state_filter.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_page_number_filter.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_page_size.yml +874 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_payment_status_filter.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_refund_status_filter.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_shipping_status_filter.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_two_client_order_ids.yml +872 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_two_order_ids.yml +875 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_updated_from_date.yml +874 -0
- data/spec/fixtures/responses/order_service/get_order_list/with_updated_to_date.yml +874 -0
- data/spec/fixtures/responses/order_service/get_order_list/without_order_criteria.yml +871 -0
- data/spec/fixtures/responses/order_service/get_order_refund_history/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/order_merge/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/order_split/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/ping/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/ping/failure.yml +871 -0
- data/spec/fixtures/responses/order_service/ping/success.yml +868 -0
- data/spec/fixtures/responses/order_service/set_orders_export_status/with_one_client_order_id.yml +867 -0
- data/spec/fixtures/responses/order_service/set_orders_export_status/with_two_client_order_id.yml +867 -0
- data/spec/fixtures/responses/order_service/set_seller_order_id/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/set_seller_order_item_id_list/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/submit_order/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/submit_order_refund/.gitkeep +0 -0
- data/spec/fixtures/responses/order_service/update_order_list/.gitkeep +0 -0
- data/spec/fixtures/responses/shipment/get_carriers.yml +53 -0
- data/spec/fixtures/responses/shipment/get_carriers/failure.yml +52 -0
- data/spec/fixtures/responses/shipment/submit.yml +464 -0
- data/spec/fixtures/responses/shipment/submit/failure.yml +462 -0
- data/spec/fixtures/responses/shipment/submit/one_shipment.yml +464 -0
- data/spec/fixtures/responses/shipment/submit/two_shipments.yml +56 -0
- data/spec/fixtures/responses/shipping_service/get_shipping_carrier_list.yml +953 -0
- data/spec/fixtures/responses/shipping_service/ping/failure.yml +55 -0
- data/spec/fixtures/responses/shipping_service/ping/success.yml +460 -0
- data/spec/fixtures/responses/shipping_service/submit_order_shipment_list.yml +55 -0
- data/spec/fixtures/responses/soap_fault.yml +53 -0
- data/spec/lib/channeladvisor/address_spec.rb +107 -0
- data/spec/lib/channeladvisor/admin_spec.rb +216 -0
- data/spec/lib/channeladvisor/line_item_spec.rb +147 -0
- data/spec/lib/channeladvisor/order_spec.rb +623 -0
- data/spec/lib/channeladvisor/order_status_spec.rb +36 -0
- data/spec/lib/channeladvisor/payment_spec.rb +38 -0
- data/spec/lib/channeladvisor/services/admin_service_spec.rb +65 -0
- data/spec/lib/channeladvisor/services/base_service_spec.rb +11 -0
- data/spec/lib/channeladvisor/services/inventory_service_spec.rb +214 -0
- data/spec/lib/channeladvisor/services/order_service_spec.rb +267 -0
- data/spec/lib/channeladvisor/services/shipping_service_spec.rb +288 -0
- data/spec/lib/channeladvisor/shipment_spec.rb +257 -0
- data/spec/lib/channeladvisor/shopping_cart_spec.rb +173 -0
- data/spec/lib/channeladvisor_spec.rb +18 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/support/credentials.rb +15 -0
- data/spec/support/matchers/boolean.rb +17 -0
- data/spec/support/matchers/markup.rb +50 -0
- data/spec/support/rr.rb +38 -0
- data/spec/support/shared_examples.rb +4 -0
- data/spec/support/vcr.rb +38 -0
- metadata +501 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module ChannelAdvisor
|
|
2
|
+
class Error < StandardError; end
|
|
3
|
+
|
|
4
|
+
class SOAPFault < Error
|
|
5
|
+
attr_reader :code
|
|
6
|
+
|
|
7
|
+
def initialize(fault_obj)
|
|
8
|
+
fault = fault_obj.to_hash[:fault]
|
|
9
|
+
@code = fault[:faultcode]
|
|
10
|
+
message = fault[:faultstring]
|
|
11
|
+
|
|
12
|
+
super(message)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class HTTPError < Error
|
|
17
|
+
attr_reader :code
|
|
18
|
+
|
|
19
|
+
def initialize(error_obj)
|
|
20
|
+
error = error_obj.to_hash
|
|
21
|
+
@code = error[:code]
|
|
22
|
+
message = "Failed with HTTP error #{@code}"
|
|
23
|
+
|
|
24
|
+
super(message)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class ServiceFailure < Error; end
|
|
29
|
+
end
|
|
30
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module ChannelAdvisor
|
|
2
|
+
class LineItem
|
|
3
|
+
attr_accessor :id, :type, :sku, :title, :unit_price, :quantity, :allow_negative_quantity, :sale_source, :buyer_user_id,
|
|
4
|
+
:buyer_feedback_rating, :sales_source_id, :vat_rate, :tax_cost, :shipping_cost, :shipping_tax_cost, :gift_wrap_cost,
|
|
5
|
+
:gift_wrap_tax_cost, :gift_message, :gift_wrap_level, :recycling_fee, :unit_weight, :unit_of_measure, :warehouse_location,
|
|
6
|
+
:user_name, :distribution_center, :is_fba, :promo_code
|
|
7
|
+
|
|
8
|
+
def initialize(attrs={})
|
|
9
|
+
@id = attrs[:line_item_id]
|
|
10
|
+
@type = attrs[:line_item_type]
|
|
11
|
+
@sku = attrs[:sku]
|
|
12
|
+
@title = attrs[:title]
|
|
13
|
+
@unit_price = attrs[:unit_price].to_f
|
|
14
|
+
@quantity = attrs[:quantity].to_i
|
|
15
|
+
@allow_negative_quantity = attrs[:allow_negative_quantity]
|
|
16
|
+
@sale_source = attrs[:item_sale_source]
|
|
17
|
+
@buyer_user_id = attrs[:buyer_user_id]
|
|
18
|
+
@buyer_feedback_rating = attrs[:buyer_feedback_rating]
|
|
19
|
+
@sales_source_id = attrs[:sales_source_id]
|
|
20
|
+
@vat_rate = attrs[:vat_rate].to_f
|
|
21
|
+
@tax_cost = attrs[:tax_cost].to_f
|
|
22
|
+
@shipping_cost = attrs[:shipping_cost].to_f
|
|
23
|
+
@shipping_tax_cost = attrs[:shipping_tax_cost].to_f
|
|
24
|
+
@gift_wrap_cost = attrs[:gift_wrap_cost].to_f
|
|
25
|
+
@gift_wrap_tax_cost = attrs[:gift_wrap_tax_cost].to_f
|
|
26
|
+
@gift_message = attrs[:gift_message]
|
|
27
|
+
@gift_wrap_level = attrs[:gift_wrap_level]
|
|
28
|
+
@recycling_fee = attrs[:recycling_fee].to_f
|
|
29
|
+
@unit_weight = attrs[:unit_weight].to_f
|
|
30
|
+
@unit_of_measure = attrs[:unit_of_measure]
|
|
31
|
+
@warehouse_location = attrs[:warehouse_location]
|
|
32
|
+
@user_name = attrs[:user_name]
|
|
33
|
+
@distribution_center = attrs[:distribution_center_code]
|
|
34
|
+
@is_fba = attrs[:is_fba]
|
|
35
|
+
@promo_code = attrs[:promo_code]
|
|
36
|
+
end # initialize
|
|
37
|
+
end # LineItem
|
|
38
|
+
end # ChannelAdvisor
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
module ChannelAdvisor
|
|
2
|
+
class Order < Base
|
|
3
|
+
attr_accessor :id, :client_id, :seller_id, :state, :created_at, :updated_at, :total, :cancelled_on, :flag_description,
|
|
4
|
+
:reseller_id, :buyer_email, :buyer_ip_address, :email_opt_in, :shipping_instructions, :delivery_date, :estimated_ship_date,
|
|
5
|
+
:transaction_notes, :status, :billing_address, :shipping_address, :payment, :shipments, :shopping_cart, :custom_values
|
|
6
|
+
|
|
7
|
+
def initialize(attrs={})
|
|
8
|
+
@id = attrs[:order_id].to_i
|
|
9
|
+
@client_id = attrs[:client_order_identifier]
|
|
10
|
+
@seller_id = attrs[:seller_order_id]
|
|
11
|
+
@state = attrs[:order_state]
|
|
12
|
+
@created_at = attrs[:order_time_gmt]
|
|
13
|
+
@updated_at = attrs[:last_update_date]
|
|
14
|
+
@cancelled_on = attrs[:date_cancelled_gmt]
|
|
15
|
+
@total = attrs[:total_order_amount].to_f
|
|
16
|
+
@reseller_id = attrs[:reseller_id]
|
|
17
|
+
@flag_description = attrs[:flag_description]
|
|
18
|
+
@buyer_email = attrs[:buyer_email_address]
|
|
19
|
+
@email_opt_in = attrs[:email_opt_in]
|
|
20
|
+
@buyer_ip_address = attrs[:buyer_ip_address]
|
|
21
|
+
@transaction_notes = attrs[:transaction_notes]
|
|
22
|
+
@custom_values = attrs[:custom_value_list]
|
|
23
|
+
@status = OrderStatus.new(attrs[:order_status]) if attrs[:order_status]
|
|
24
|
+
@payment = Payment.new(attrs[:payment_info]) if attrs[:payment_info]
|
|
25
|
+
@billing_address = Address.new(attrs[:billing_info]) if attrs[:billing_info]
|
|
26
|
+
@shipping_address = Address.new(attrs[:shipping_info]) if attrs[:shipping_info]
|
|
27
|
+
@shopping_cart = ShoppingCart.new(attrs[:shopping_cart]) if attrs[:shopping_cart]
|
|
28
|
+
|
|
29
|
+
if shipping_info = attrs[:shipping_info]
|
|
30
|
+
@shipping_instructions = shipping_info[:shipping_instructions]
|
|
31
|
+
@estimated_ship_date = shipping_info[:estimated_ship_date]
|
|
32
|
+
@delivery_date = shipping_info[:delivery_date]
|
|
33
|
+
|
|
34
|
+
if shipment_list = shipping_info[:shipment_list]
|
|
35
|
+
@shipments = arrayify(shipment_list[:shipment]).map { |s| Shipment.new(s) }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end # initialize
|
|
39
|
+
|
|
40
|
+
# Set the export status for a given order instance
|
|
41
|
+
#
|
|
42
|
+
# @param [Boolean] mark_as_exported `true` (`Exported`) or `false` (`NotExported`)
|
|
43
|
+
#
|
|
44
|
+
# @raise [ServiceFailure] If the service returns a Failure status
|
|
45
|
+
# @raise [SOAPFault] If the service responds with a SOAP fault
|
|
46
|
+
# @raise [HTTPError] If the service responds with an HTTP error
|
|
47
|
+
#
|
|
48
|
+
# @return [Boolean] Returns the boolean result for changing the export status
|
|
49
|
+
def set_export_status(mark_as_exported)
|
|
50
|
+
handle_errors do
|
|
51
|
+
response = Services::OrderService.set_orders_export_status([@client_id], mark_as_exported)
|
|
52
|
+
result = response[:set_orders_export_status_response][:set_orders_export_status_result]
|
|
53
|
+
check_status_of result
|
|
54
|
+
return result[:result_data][:boolean]
|
|
55
|
+
end
|
|
56
|
+
end # set_export_status
|
|
57
|
+
|
|
58
|
+
def total_ship_cost
|
|
59
|
+
invoice_ship_cost || items_ship_cost
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def invoice_ship_cost
|
|
63
|
+
shopping_cart.invoices.select { |i| i.type == "Shipping" }.first.unit_price.nonzero?
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def items_ship_cost
|
|
67
|
+
shopping_cart.items.collect { |i| i.shipping_cost }.inject(:+)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
class << self
|
|
71
|
+
# Check authorization for and availability of the order service
|
|
72
|
+
#
|
|
73
|
+
# @raise [ServiceFailure] If the service returns a Failure status
|
|
74
|
+
# @raise [SOAPFault] If the service responds with a SOAP fault
|
|
75
|
+
# @raise [HTTPError] If the service responds with an HTTP error
|
|
76
|
+
#
|
|
77
|
+
# @return [Boolean] Returns `true` if SOAP response status is `Success`
|
|
78
|
+
def ping
|
|
79
|
+
handle_errors do
|
|
80
|
+
response = Services::OrderService.ping
|
|
81
|
+
result = response[:ping_response][:ping_result]
|
|
82
|
+
check_status_of result
|
|
83
|
+
end
|
|
84
|
+
end # ping
|
|
85
|
+
|
|
86
|
+
# Retrieve a list of orders, restricted by the provided criteria
|
|
87
|
+
#
|
|
88
|
+
# @example List orders created between 11/11/2011 and 11/15/2011
|
|
89
|
+
# ChannelAdvisor::Order.list(:created_between => DateTime.new(2011,11,11)..DateTime.new(2011,11,15))
|
|
90
|
+
#
|
|
91
|
+
# @param [Hash] criteria Criteria used to filter the order list
|
|
92
|
+
# @option criteria [Range<DateTime>] :created_between Range of order creation date-times in UTC (instead of `created_from` and `created_to`)
|
|
93
|
+
# @option criteria [Range<DateTime>] :updated_between Range of order update date-times in UTC (instead of `updated_from` and `updated_to`)
|
|
94
|
+
# @option criteria [DateTime] :created_from Order creation begin time in UTC
|
|
95
|
+
# @option criteria [DateTime] :created_to Order creation end time in UTC
|
|
96
|
+
# @option criteria [DateTime] :updated_from Order update begin time in UTC
|
|
97
|
+
# @option criteria [DateTime] :updated_to Order update end time in UTC
|
|
98
|
+
# @option criteria [Boolean] :join_dates `true` indicates that orders can satisfy either
|
|
99
|
+
# the created date range or the updated date range
|
|
100
|
+
# @option criteria [String] :detail_level `Low`, `Medium`, `High` or `Complete`
|
|
101
|
+
# @option criteria [String] :export_state `Unknown`, `NotExported` or `Exported`
|
|
102
|
+
# @option criteria [Array<Integer>] :order_ids Array of order IDs
|
|
103
|
+
# @option criteria [Array<String>] :client_order_ids Array of client order IDs
|
|
104
|
+
# @option criteria [String] :state `Active`, `Archived`, or `Cancelled`
|
|
105
|
+
# @option criteria [String] :payment_status `NoChange`, `NotSubmitted`, `Cleared`, `Submitted`, `Failed`, or `Deposited`
|
|
106
|
+
# @option criteria [String] :checkout_status `NoChange`, `NotVisited`, `Completed`, `Visited`, `Cancelled`, `CompletedOffline`, or `OnHold`
|
|
107
|
+
# @option criteria [String] :shipping_status `NoChange`, `Unshipped`, `PendingShipment`, `PartiallyShipped`, or `Shipped`
|
|
108
|
+
# @option criteria [String] :refund_status `NoRefunds`, `OrderLevel`, `LineItemLevel`, `OrderAndLineItemLevel`, or `FailedAttemptsOnly`
|
|
109
|
+
# @option criteria [String] :distribution_center Only orders containing at least one item from the specified distribution center
|
|
110
|
+
# @option criteria [Integer] :page_number Page number of result set
|
|
111
|
+
# @option criteria [Integer] :page_size Size of each page in result set
|
|
112
|
+
#
|
|
113
|
+
# @raise [ServiceFailure] If the service returns a Failure status
|
|
114
|
+
# @raise [SOAPFault] If the service responds with a SOAP fault
|
|
115
|
+
# @raise [HTTPError] If the service responds with an HTTP error
|
|
116
|
+
#
|
|
117
|
+
# @return [Array<Order>] Returns an array of {Order} objects or an empty array
|
|
118
|
+
def list(criteria = {})
|
|
119
|
+
handle_errors do
|
|
120
|
+
if created_between = criteria.delete(:created_between)
|
|
121
|
+
criteria[:created_from] = created_between.first
|
|
122
|
+
criteria[:created_to] = created_between.last
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
if updated_between = criteria.delete(:updated_between)
|
|
126
|
+
criteria[:updated_from] = updated_between.first
|
|
127
|
+
criteria[:updated_to] = updated_between.last
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
response = Services::OrderService.get_order_list(criteria)
|
|
131
|
+
result = response[:get_order_list_response][:get_order_list_result]
|
|
132
|
+
check_status_of result
|
|
133
|
+
orders = []
|
|
134
|
+
|
|
135
|
+
if data = result[:result_data]
|
|
136
|
+
arrayify(data[:order_response_item]).each { |o| orders << new(o) }
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
return orders
|
|
140
|
+
end
|
|
141
|
+
end # list
|
|
142
|
+
|
|
143
|
+
# Set the export status for the provided client order identifiers
|
|
144
|
+
#
|
|
145
|
+
# @param client_order_ids [String, Array<String>] An client order ID or array of client order IDs
|
|
146
|
+
# @param mark_as_exported [boolean] `true` (`Exported`) or `false` (`NotExported`)
|
|
147
|
+
#
|
|
148
|
+
# @raise [ServiceFailure] If the service returns a Failure status
|
|
149
|
+
# @raise [SOAPFault] If the service responds with a SOAP fault
|
|
150
|
+
# @raise [HTTPError] If the service responds with an HTTP error
|
|
151
|
+
#
|
|
152
|
+
# @return [boolean, Hash] Returns a boolean result or hash of client order IDs and their corresponding boolean results
|
|
153
|
+
def set_export_status(client_order_ids, mark_as_exported)
|
|
154
|
+
handle_errors do
|
|
155
|
+
client_order_id_list = arrayify client_order_ids
|
|
156
|
+
response = Services::OrderService.set_orders_export_status(client_order_id_list, mark_as_exported)
|
|
157
|
+
result = response[:set_orders_export_status_response][:set_orders_export_status_result]
|
|
158
|
+
check_status_of result
|
|
159
|
+
|
|
160
|
+
bools = arrayify result[:result_data][:boolean]
|
|
161
|
+
|
|
162
|
+
if bools.count == 1
|
|
163
|
+
return bools.first
|
|
164
|
+
else
|
|
165
|
+
result_hash = {}
|
|
166
|
+
|
|
167
|
+
bools.each do |bool|
|
|
168
|
+
client_order_ids.each do |client_order_id|
|
|
169
|
+
result_hash[client_order_id] = bool
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
return result_hash
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end # set_export_status
|
|
177
|
+
end # self
|
|
178
|
+
end # Order
|
|
179
|
+
end # ChannelAdvisor
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module ChannelAdvisor
|
|
2
|
+
class OrderStatus
|
|
3
|
+
attr_accessor :checkout, :payment, :shipping, :refund
|
|
4
|
+
|
|
5
|
+
def initialize(attrs={})
|
|
6
|
+
unless attrs.nil?
|
|
7
|
+
@checkout = [attrs[:checkout_status], attrs[:checkout_date_gmt]]
|
|
8
|
+
@payment = [attrs[:payment], attrs[:payment_date_gmt]]
|
|
9
|
+
@shipping = [attrs[:shipping], attrs[:shipping_date_gmt]]
|
|
10
|
+
@refund = attrs[:order_refund_status]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ChannelAdvisor
|
|
2
|
+
class Payment
|
|
3
|
+
attr_accessor :type, :credit_card_number, :paypal_id, :merchant_reference_number, :transaction_id
|
|
4
|
+
|
|
5
|
+
def initialize(attrs={})
|
|
6
|
+
unless attrs.nil?
|
|
7
|
+
@type = attrs[:payment_type]
|
|
8
|
+
@credit_card_number = attrs[:credit_card_last4]
|
|
9
|
+
@paypal_id = attrs[:pay_pal_id]
|
|
10
|
+
@merchant_reference_number = attrs[:merchant_reference_number]
|
|
11
|
+
@transaction_id = attrs[:payment_transaction_id]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'channeladvisor/services/base_service'
|
|
2
|
+
require 'channeladvisor/services/admin_service'
|
|
3
|
+
require 'channeladvisor/services/order_service'
|
|
4
|
+
require 'channeladvisor/services/shipping_service'
|
|
5
|
+
require 'channeladvisor/services/inventory_service'
|
|
6
|
+
|
|
7
|
+
module ChannelAdvisor
|
|
8
|
+
module Services
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module ChannelAdvisor
|
|
2
|
+
module Services
|
|
3
|
+
class AdminService < BaseService
|
|
4
|
+
document "https://api.channeladvisor.com/ChannelAdvisorAPI/v6/AdminService.asmx?WSDL"
|
|
5
|
+
|
|
6
|
+
class << self
|
|
7
|
+
# Check authorization for and availability of the admin service
|
|
8
|
+
#
|
|
9
|
+
# @return [HTTPI::Response] HTTP response object containing the SOAP XML response
|
|
10
|
+
def ping
|
|
11
|
+
soap_response = client.request :ping do
|
|
12
|
+
soap.header = soap_header
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
@last_request = client.http
|
|
16
|
+
@last_response = soap_response
|
|
17
|
+
end # ping
|
|
18
|
+
|
|
19
|
+
# Request access to a ChannelAdvisor account
|
|
20
|
+
#
|
|
21
|
+
# @return [HTTPI::Response] HTTP response object containing the SOAP XML response
|
|
22
|
+
def request_access(local_id)
|
|
23
|
+
soap_response = client.request :request_access do
|
|
24
|
+
soap.header = soap_header
|
|
25
|
+
soap.body = {"localID" => local_id}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
@last_request = client.http
|
|
29
|
+
@last_response = soap_response
|
|
30
|
+
end # request_access
|
|
31
|
+
|
|
32
|
+
# Retrieve a list of account authorizations for the given developer key
|
|
33
|
+
#
|
|
34
|
+
# @return [HTTPI::Response] HTTP response object containing the SOAP XML response
|
|
35
|
+
def get_authorization_list(local_id=nil)
|
|
36
|
+
soap_response = client.request :get_authorization_list do
|
|
37
|
+
soap.header = soap_header
|
|
38
|
+
soap.body = {"localID" => local_id} if local_id
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
@last_request = client.http
|
|
42
|
+
@last_response = soap_response
|
|
43
|
+
end # get_authorization_list
|
|
44
|
+
end # self
|
|
45
|
+
end # AdminService
|
|
46
|
+
end # Services
|
|
47
|
+
end # ChannelAdvisor
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module ChannelAdvisor
|
|
2
|
+
module Services
|
|
3
|
+
class BaseService
|
|
4
|
+
extend Savon::Model
|
|
5
|
+
|
|
6
|
+
class << self
|
|
7
|
+
attr_reader :last_request, :last_response
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def soap_header
|
|
12
|
+
{
|
|
13
|
+
"ins0:APICredentials" => {
|
|
14
|
+
"ins0:DeveloperKey" => creds(:developer_key),
|
|
15
|
+
"ins0:Password" => creds(:password)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def creds(attribute)
|
|
21
|
+
ChannelAdvisor.configuration.send(attribute.to_sym)
|
|
22
|
+
end
|
|
23
|
+
end # self
|
|
24
|
+
end # BaseService
|
|
25
|
+
end # Services
|
|
26
|
+
end # ChannelAdvisor
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module ChannelAdvisor
|
|
2
|
+
module Services
|
|
3
|
+
class InventoryService < BaseService
|
|
4
|
+
document "https://api.channeladvisor.com/ChannelAdvisorAPI/v6/InventoryService.asmx?WSDL"
|
|
5
|
+
|
|
6
|
+
class << self
|
|
7
|
+
def ping
|
|
8
|
+
client.request :ping do
|
|
9
|
+
soap.header = soap_header
|
|
10
|
+
end
|
|
11
|
+
end # ping
|
|
12
|
+
|
|
13
|
+
def update_inventory_item_quantity_and_price(sku, quantity_and_price_info)
|
|
14
|
+
soap_body = {
|
|
15
|
+
"ins0:accountID" => creds(:account_id),
|
|
16
|
+
"ins0:itemQuantityAndPrice" => {
|
|
17
|
+
"ins0:Sku" => sku
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
item_quantity_and_price = soap_body["ins0:itemQuantityAndPrice"]
|
|
22
|
+
|
|
23
|
+
if quantity_info = quantity_and_price_info[:quantity_info]
|
|
24
|
+
item_quantity_and_price["ins0:QuantityInfo"] = {
|
|
25
|
+
"ins0:UpdateType" => quantity_info[:update_type],
|
|
26
|
+
"ins0:Total" => quantity_info[:total]
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
if price_info = quantity_and_price_info[:price_info]
|
|
31
|
+
item_quantity_and_price["ins0:PriceInfo"] = {
|
|
32
|
+
"ins0:Cost" => price_info[:cost],
|
|
33
|
+
"ins0:RetailPrice" => price_info[:retail_price],
|
|
34
|
+
"ins0:StartingPrice" => price_info[:starting_price],
|
|
35
|
+
"ins0:ReservePrice" => price_info[:reserve_price],
|
|
36
|
+
"ins0:TakeItPrice" => price_info[:take_it_price],
|
|
37
|
+
"ins0:SecondChanceOfferPrice" => price_info[:second_chance_offer_price],
|
|
38
|
+
"ins0:StorePrice" => price_info[:store_price]
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
client.request :update_inventory_item_quantity_and_price do
|
|
43
|
+
soap.header = soap_header
|
|
44
|
+
soap.body = soap_body
|
|
45
|
+
end
|
|
46
|
+
end # update_inventory_item_quantity_and_price
|
|
47
|
+
|
|
48
|
+
def update_inventory_item_quantity_and_price_list(quantity_and_price_list)
|
|
49
|
+
soap_body = {
|
|
50
|
+
"ins0:accountID" => creds(:account_id),
|
|
51
|
+
"ins0:itemQuantityAndPriceList" => {
|
|
52
|
+
"ins0:InventoryItemQuantityAndPrice" => []
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
quantity_and_price_list.each do |item|
|
|
57
|
+
item_quantity_and_price = {"ins0:Sku" => item[:sku]}
|
|
58
|
+
|
|
59
|
+
if quantity_info = item[:quantity_info]
|
|
60
|
+
item_quantity_and_price["ins0:QuantityInfo"] = {
|
|
61
|
+
"ins0:UpdateType" => item[:quantity_info][:update_type],
|
|
62
|
+
"ins0:Total" => item[:quantity_info][:total]
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
if price_info = item[:price_info]
|
|
67
|
+
item_quantity_and_price["ins0:PriceInfo"] = {
|
|
68
|
+
"ins0:Cost" => price_info[:cost],
|
|
69
|
+
"ins0:RetailPrice" => price_info[:retail_price],
|
|
70
|
+
"ins0:StartingPrice" => price_info[:starting_price],
|
|
71
|
+
"ins0:ReservePrice" => price_info[:reserve_price],
|
|
72
|
+
"ins0:TakeItPrice" => price_info[:take_it_price],
|
|
73
|
+
"ins0:SecondChanceOfferPrice" => price_info[:second_chance_offer_price],
|
|
74
|
+
"ins0:StorePrice" => price_info[:store_price]
|
|
75
|
+
}
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
soap_body["ins0:itemQuantityAndPriceList"]["ins0:InventoryItemQuantityAndPrice"] << item_quantity_and_price
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
client.request :update_inventory_item_quantity_and_price_list do
|
|
83
|
+
soap.header = soap_header
|
|
84
|
+
soap.body = soap_body
|
|
85
|
+
end
|
|
86
|
+
end # update_inventory_item_quantity_and_price_list
|
|
87
|
+
end # self
|
|
88
|
+
end # InventoryService
|
|
89
|
+
end # Services
|
|
90
|
+
end # ChannelAdvisor
|