ship_compliant 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +8 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +50 -0
- data/Rakefile +47 -0
- data/cucumber.yml +9 -0
- data/features/add_update_brand.feature +20 -0
- data/features/add_update_product.feature +24 -0
- data/features/check_compliance_of_sales_order_with_address_validations.feature +18 -0
- data/features/commit_sales_order.feature +6 -0
- data/features/get_inventory_details.feature +7 -0
- data/features/get_sales_order_extended.feature +15 -0
- data/features/search_sales_orders.feature +13 -0
- data/features/step_definitions/brand_steps.rb +73 -0
- data/features/step_definitions/commit_sales_order/all_shipments.rb +15 -0
- data/features/step_definitions/compliance_check/available_product_steps.rb +175 -0
- data/features/step_definitions/compliance_check/missing_product_steps.rb +102 -0
- data/features/step_definitions/compliance_check/noncompliant_product.rb +102 -0
- data/features/step_definitions/credential_steps.rb +8 -0
- data/features/step_definitions/inventory_steps.rb +36 -0
- data/features/step_definitions/product_steps.rb +140 -0
- data/features/step_definitions/sales_order_extended_steps.rb +79 -0
- data/features/step_definitions/search_order_steps.rb +87 -0
- data/features/step_definitions/void_order_steps.rb +27 -0
- data/features/support/env.rb +14 -0
- data/features/void_sales_order.feature +11 -0
- data/fixtures/vcr_cassettes/brand_already_exists.yml +1038 -0
- data/fixtures/vcr_cassettes/brand_ignore_existing.yml +1037 -0
- data/fixtures/vcr_cassettes/brand_update_existing.yml +1037 -0
- data/fixtures/vcr_cassettes/brand_valid.yml +1037 -0
- data/fixtures/vcr_cassettes/commit_salesorder_all_shipments.yml +1034 -0
- data/fixtures/vcr_cassettes/compliance_available_product.yml +1075 -0
- data/fixtures/vcr_cassettes/compliance_missing_product.yml +1046 -0
- data/fixtures/vcr_cassettes/compliance_noncompliant_product.yml +1082 -0
- data/fixtures/vcr_cassettes/ignore_existing_product.yml +1035 -0
- data/fixtures/vcr_cassettes/invalid_search_sales_orders.yml +1038 -0
- data/fixtures/vcr_cassettes/inventory_details_for_everything.yml +1037 -0
- data/fixtures/vcr_cassettes/product_already_exists.yml +1036 -0
- data/fixtures/vcr_cassettes/product_invalid_brand.yml +1036 -0
- data/fixtures/vcr_cassettes/product_valid_brand.yml +1035 -0
- data/fixtures/vcr_cassettes/sales_order_extended.yml +1042 -0
- data/fixtures/vcr_cassettes/sales_order_missing.yml +1034 -0
- data/fixtures/vcr_cassettes/search_sales_orders.yml +1039 -0
- data/fixtures/vcr_cassettes/update_product.yml +1035 -0
- data/fixtures/vcr_cassettes/void_order.yml +1033 -0
- data/fixtures/vcr_cassettes/void_voided_order.yml +1034 -0
- data/lib/ship_compliant.rb +62 -0
- data/lib/ship_compliant/add_update_brand.rb +50 -0
- data/lib/ship_compliant/add_update_brand_result.rb +6 -0
- data/lib/ship_compliant/add_update_product.rb +66 -0
- data/lib/ship_compliant/add_update_product_result.rb +6 -0
- data/lib/ship_compliant/address.rb +87 -0
- data/lib/ship_compliant/address/suggested_address.rb +37 -0
- data/lib/ship_compliant/base_result.rb +43 -0
- data/lib/ship_compliant/channel_details.rb +31 -0
- data/lib/ship_compliant/check_compliance.rb +41 -0
- data/lib/ship_compliant/check_compliance_result.rb +95 -0
- data/lib/ship_compliant/client.rb +54 -0
- data/lib/ship_compliant/commit_sales_order.rb +48 -0
- data/lib/ship_compliant/commit_sales_order_result.rb +30 -0
- data/lib/ship_compliant/compliance_rule.rb +30 -0
- data/lib/ship_compliant/configuration.rb +46 -0
- data/lib/ship_compliant/error_result.rb +41 -0
- data/lib/ship_compliant/freight_sales_tax_rate.rb +8 -0
- data/lib/ship_compliant/get_inventory_details.rb +31 -0
- data/lib/ship_compliant/get_inventory_details_result.rb +41 -0
- data/lib/ship_compliant/get_sales_order_extended.rb +23 -0
- data/lib/ship_compliant/get_sales_order_extended_result.rb +65 -0
- data/lib/ship_compliant/inventory_product.rb +95 -0
- data/lib/ship_compliant/order_search.rb +92 -0
- data/lib/ship_compliant/package.rb +13 -0
- data/lib/ship_compliant/product_attributes.rb +98 -0
- data/lib/ship_compliant/product_sales_tax_rate.rb +23 -0
- data/lib/ship_compliant/sales_tax_rate.rb +22 -0
- data/lib/ship_compliant/search_sales_order_summary.rb +30 -0
- data/lib/ship_compliant/search_sales_orders.rb +53 -0
- data/lib/ship_compliant/search_sales_orders_result.rb +106 -0
- data/lib/ship_compliant/shipment.rb +59 -0
- data/lib/ship_compliant/shipment_compliance.rb +28 -0
- data/lib/ship_compliant/shipment_sales_tax_rate.rb +15 -0
- data/lib/ship_compliant/version.rb +3 -0
- data/lib/ship_compliant/void_sales_order.rb +42 -0
- data/lib/ship_compliant/void_sales_order_result.rb +20 -0
- data/ship_compliant.gemspec +33 -0
- data/spec/fixtures/add_update_product.xml +22 -0
- data/spec/fixtures/check_compliance.xml +125 -0
- data/spec/fixtures/coreservice.wsdl +1341 -0
- data/spec/fixtures/search_sales_orders.xml +52 -0
- data/spec/fixtures/void_order_failure.xml +31 -0
- data/spec/fixtures/void_order_success.xml +22 -0
- data/spec/lib/ship_compliant/add_update_brand_result_spec.rb +7 -0
- data/spec/lib/ship_compliant/add_update_brand_spec.rb +58 -0
- data/spec/lib/ship_compliant/add_update_product_result_spec.rb +7 -0
- data/spec/lib/ship_compliant/add_update_product_spec.rb +52 -0
- data/spec/lib/ship_compliant/address/suggested_address_spec.rb +28 -0
- data/spec/lib/ship_compliant/address_spec.rb +123 -0
- data/spec/lib/ship_compliant/base_result_spec.rb +127 -0
- data/spec/lib/ship_compliant/channel_details_spec.rb +40 -0
- data/spec/lib/ship_compliant/check_compliance_result_spec.rb +135 -0
- data/spec/lib/ship_compliant/check_compliance_spec.rb +43 -0
- data/spec/lib/ship_compliant/client_spec.rb +73 -0
- data/spec/lib/ship_compliant/commit_sales_order_result_spec.rb +32 -0
- data/spec/lib/ship_compliant/commit_sales_order_spec.rb +38 -0
- data/spec/lib/ship_compliant/compliance_rule_spec.rb +47 -0
- data/spec/lib/ship_compliant/configuration_spec.rb +47 -0
- data/spec/lib/ship_compliant/error_result_spec.rb +47 -0
- data/spec/lib/ship_compliant/freight_sales_tax_rate_spec.rb +7 -0
- data/spec/lib/ship_compliant/get_inventory_details_result_spec.rb +87 -0
- data/spec/lib/ship_compliant/get_inventory_details_spec.rb +35 -0
- data/spec/lib/ship_compliant/get_sales_order_extended_result_spec.rb +84 -0
- data/spec/lib/ship_compliant/get_sales_order_extended_spec.rb +39 -0
- data/spec/lib/ship_compliant/inventory_product_spec.rb +116 -0
- data/spec/lib/ship_compliant/order_search_spec.rb +21 -0
- data/spec/lib/ship_compliant/package_spec.rb +26 -0
- data/spec/lib/ship_compliant/product_attributes_spec.rb +36 -0
- data/spec/lib/ship_compliant/product_sales_tax_rate_spec.rb +22 -0
- data/spec/lib/ship_compliant/sales_tax_rate_spec.rb +21 -0
- data/spec/lib/ship_compliant/search_sales_order_summary_spec.rb +56 -0
- data/spec/lib/ship_compliant/search_sales_orders_result_spec.rb +121 -0
- data/spec/lib/ship_compliant/search_sales_orders_spec.rb +42 -0
- data/spec/lib/ship_compliant/shipment_compliance_spec.rb +46 -0
- data/spec/lib/ship_compliant/shipment_sales_tax_rate_spec.rb +20 -0
- data/spec/lib/ship_compliant/shipment_spec.rb +106 -0
- data/spec/lib/ship_compliant/void_sales_order_result_spec.rb +7 -0
- data/spec/lib/ship_compliant/void_sales_order_spec.rb +41 -0
- data/spec/spec_helper.rb +50 -0
- metadata +366 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
module ShipCompliant
|
2
|
+
# === ShipCompliant::OrderSearch
|
3
|
+
#
|
4
|
+
# Acts as a hash for adding search criteria to the +SearchSalesOrders+
|
5
|
+
# API endpoint. It removes invalid keys when converting to a Hash.
|
6
|
+
#
|
7
|
+
# query = ShipCompliant::OrderSearch({
|
8
|
+
# invalid: 'lolz',
|
9
|
+
# requested_ship_date_max: DateTime.new(2014, 1, 1)
|
10
|
+
# })
|
11
|
+
#
|
12
|
+
# query.to_h #=> {
|
13
|
+
# 'RequestedShipDateMax' => DateTime
|
14
|
+
# }
|
15
|
+
class OrderSearch < Struct.new(:details)
|
16
|
+
|
17
|
+
# == Available Search Methods
|
18
|
+
#
|
19
|
+
# * +channel+
|
20
|
+
# * +compliance_status+
|
21
|
+
# * +external_club_key+
|
22
|
+
# * +external_offer_key+
|
23
|
+
# * +external_sales_order_key_max+
|
24
|
+
# * +external_sales_order_keys+
|
25
|
+
# * +fulfillment_house+
|
26
|
+
# * +fulfillment_status+
|
27
|
+
# * +fulfillment_account+
|
28
|
+
# * +fulfillment_exception_type+
|
29
|
+
# * +license_relationship_type+
|
30
|
+
# * +not_tag+
|
31
|
+
# * +purchase_date_max+
|
32
|
+
# * +purchase_date_min+
|
33
|
+
# * +requested_ship_date_max+
|
34
|
+
# * +requested_ship_date_min+
|
35
|
+
# * +sale_type+
|
36
|
+
# * +sales_order_keys+
|
37
|
+
# * +sales_order_key_min+
|
38
|
+
# * +sales_order_key_max+
|
39
|
+
# * +settlement_batch_number+
|
40
|
+
# * +shipment_status+
|
41
|
+
# * +ship_date_max+
|
42
|
+
# * +ship_date_min+
|
43
|
+
# * +ship_to_state+
|
44
|
+
# * +tag+
|
45
|
+
# * +tracking_existence+
|
46
|
+
KEYS = [
|
47
|
+
:channel,
|
48
|
+
:compliance_status,
|
49
|
+
|
50
|
+
:external_club_key,
|
51
|
+
:external_offer_key,
|
52
|
+
:external_sales_order_key_max,
|
53
|
+
:external_sales_order_keys,
|
54
|
+
|
55
|
+
:fulfillment_house,
|
56
|
+
:fulfillment_status,
|
57
|
+
:fulfillment_account,
|
58
|
+
:fulfillment_exception_type,
|
59
|
+
|
60
|
+
:license_relationship_type,
|
61
|
+
:not_tag,
|
62
|
+
:purchase_date_max,
|
63
|
+
:purchase_date_min,
|
64
|
+
|
65
|
+
:requested_ship_date_max,
|
66
|
+
:requested_ship_date_min,
|
67
|
+
|
68
|
+
:sale_type,
|
69
|
+
:sales_order_keys,
|
70
|
+
:sales_order_key_min,
|
71
|
+
:sales_order_key_max,
|
72
|
+
|
73
|
+
:settlement_batch_number,
|
74
|
+
:shipment_status,
|
75
|
+
:ship_date_max,
|
76
|
+
:ship_date_min,
|
77
|
+
:ship_to_state,
|
78
|
+
|
79
|
+
:tag,
|
80
|
+
:tracking_existence,
|
81
|
+
]
|
82
|
+
|
83
|
+
# Converts hash keys to Pascal case and rejects invalid keys.
|
84
|
+
#
|
85
|
+
# :sales_order_keys #=> 'SalesOrderKeys'
|
86
|
+
def to_h
|
87
|
+
details.reject do |key|
|
88
|
+
!KEYS.include?(key)
|
89
|
+
end.deep_transform_keys { |key| key.to_s.camelize }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module ShipCompliant
|
2
|
+
# === ShipCompliant::ProductAttributes
|
3
|
+
#
|
4
|
+
# Acts as a hash for working with the +AddUpdateProduct+ API endpoint.
|
5
|
+
#
|
6
|
+
# attributes = ShipCompliant::ProductAttributes({
|
7
|
+
# bottle_size_ml: 750,
|
8
|
+
# gtin: 'value',
|
9
|
+
# product_description: 'It's great!'
|
10
|
+
# })
|
11
|
+
#
|
12
|
+
# attributes.to_h #=> {
|
13
|
+
# 'BottleSizeML' => 750,
|
14
|
+
# 'GTIN' => 'value',
|
15
|
+
# 'ProductDescription' => 'It's great!'
|
16
|
+
# }
|
17
|
+
class ProductAttributes < Struct.new(:details)
|
18
|
+
# == Available Product Attributes
|
19
|
+
#
|
20
|
+
# * +age+
|
21
|
+
# * +bottle_size_ml+
|
22
|
+
# * +brand_key+
|
23
|
+
# * +default_case+
|
24
|
+
# * +default_retail_unit_price+
|
25
|
+
# * +default_retail_case_price+
|
26
|
+
# * +description+
|
27
|
+
# * +flavor+
|
28
|
+
# * +gtin+
|
29
|
+
# * +label+
|
30
|
+
# * +percent_alcohol+
|
31
|
+
# * +product_key+
|
32
|
+
# * +product_type+
|
33
|
+
# * +product_description+
|
34
|
+
# * +nabca+
|
35
|
+
# * +scc+
|
36
|
+
# * +upc+
|
37
|
+
# * +unimerc+
|
38
|
+
# * +unit_price+
|
39
|
+
# * +varietal+
|
40
|
+
# * +vintage+
|
41
|
+
# * +volume_amount+
|
42
|
+
# * +volume_unit+
|
43
|
+
KEYS = [
|
44
|
+
:age,
|
45
|
+
:bottle_size_ml,
|
46
|
+
:brand_key,
|
47
|
+
|
48
|
+
:default_case,
|
49
|
+
:default_retail_unit_price,
|
50
|
+
:default_retail_case_price,
|
51
|
+
:description,
|
52
|
+
|
53
|
+
:flavor,
|
54
|
+
:gtin,
|
55
|
+
:label,
|
56
|
+
|
57
|
+
:percent_alcohol,
|
58
|
+
:product_key,
|
59
|
+
:product_type,
|
60
|
+
:product_description,
|
61
|
+
|
62
|
+
:nabca,
|
63
|
+
:scc,
|
64
|
+
:upc,
|
65
|
+
:unimerc,
|
66
|
+
:unit_price,
|
67
|
+
|
68
|
+
:varietal,
|
69
|
+
:vintage,
|
70
|
+
:volume_amount,
|
71
|
+
:volume_unit
|
72
|
+
]
|
73
|
+
|
74
|
+
SPECIAL_CASES = {
|
75
|
+
gtin: 'GTIN',
|
76
|
+
nabca: 'NABCA',
|
77
|
+
scc: 'SCC',
|
78
|
+
unimerc: 'UNIMERC',
|
79
|
+
upc: 'UPC',
|
80
|
+
bottle_size_ml: 'BottleSizeML'
|
81
|
+
}
|
82
|
+
|
83
|
+
# Converts hash keys to Pascal case and handles special cases.
|
84
|
+
#
|
85
|
+
# :bottle_size_ml #=> 'BottleSizeML'
|
86
|
+
def to_h
|
87
|
+
details.deep_transform_keys do |key|
|
88
|
+
# handle special cases
|
89
|
+
pascal_key = key.to_s.camelize
|
90
|
+
if SPECIAL_CASES.has_key?(key)
|
91
|
+
pascal_key = SPECIAL_CASES[key]
|
92
|
+
end
|
93
|
+
|
94
|
+
pascal_key
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ShipCompliant
|
2
|
+
# == ShipCompliant::ProductSalesTaxRate
|
3
|
+
#
|
4
|
+
# ProductSalesTaxRate wraps the SalesTaxRate value object. It provides methods
|
5
|
+
# to easily access various attributes about each product.
|
6
|
+
class ProductSalesTaxRate < SalesTaxRate
|
7
|
+
|
8
|
+
# Returns the product's key.
|
9
|
+
#
|
10
|
+
# product_tax_rate.product_key #=> 'ProductKey123'
|
11
|
+
def product_key
|
12
|
+
sales_tax[:product_key]
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns the product's brand key.
|
16
|
+
#
|
17
|
+
# product_tax_rate.brand_key #=> 'BrandKey123'
|
18
|
+
def brand_key
|
19
|
+
sales_tax[:brand_key]
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ShipCompliant
|
2
|
+
# == ShipCompliant::SalesTaxRate
|
3
|
+
#
|
4
|
+
# SalesTaxRate is a value object to store sales tax information for freight
|
5
|
+
# and products.
|
6
|
+
#
|
7
|
+
# tax_rate = SalesTaxRate.new(sales_tax_due: '123.45')
|
8
|
+
# puts tax_rate.sales_tax_due #=> 123.45
|
9
|
+
class SalesTaxRate < Struct.new(:sales_tax)
|
10
|
+
|
11
|
+
# Returns the +sales_tax_due+ as a float.
|
12
|
+
def sales_tax_due
|
13
|
+
sales_tax[:sales_tax_due].to_f
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the +sales_tax_rate+ as a float.
|
17
|
+
def sales_tax_rate
|
18
|
+
sales_tax[:sales_tax_rate].to_f
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ShipCompliant
|
2
|
+
# === ShipCompliant::SearchSalesOrderSummary
|
3
|
+
#
|
4
|
+
# Wraps the +SalesOrderSummary+ hash with a simple DSL
|
5
|
+
# to provide easy access to various keys.
|
6
|
+
class SearchSalesOrderSummary < Struct.new(:data)
|
7
|
+
|
8
|
+
# Returns a +DateTime+ from the order +purchase_date+
|
9
|
+
def purchase_date
|
10
|
+
data[:purchase_date]
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns the +sales_order_key+
|
14
|
+
def order_key
|
15
|
+
data[:sales_order_key]
|
16
|
+
end
|
17
|
+
alias_method :sales_order_key, :order_key
|
18
|
+
|
19
|
+
# Returns the parsed hash from the +ShipmentSummary+ element.
|
20
|
+
#
|
21
|
+
# {
|
22
|
+
# compliance: 'ValueHere',
|
23
|
+
# requested_ship_date: DateTime,
|
24
|
+
# # etc...
|
25
|
+
# }
|
26
|
+
def shipment_summary
|
27
|
+
data[:shipments][:shipment_summary]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module ShipCompliant
|
2
|
+
# == ShipCompliant::SearchSalesOrders
|
3
|
+
#
|
4
|
+
# Search orders in the ShipCompliant database on a number of different
|
5
|
+
# criteria such as date ranges, order number range, order list, status, etc...
|
6
|
+
#
|
7
|
+
# Summary details, including tracking numbers, of Sales Orders and
|
8
|
+
# Shipments are returned for the first 100 orders that meet the search criteria.
|
9
|
+
#
|
10
|
+
# Use this method to get tracking numbers for a collection of orders,
|
11
|
+
# check shipping status, check compliance status, or check fulfillment status.
|
12
|
+
#
|
13
|
+
# Results are paged, and only the first 100 results are returned with this method.
|
14
|
+
# Use the ShipCompliant::SearchSalesOrdersResult#remaining_orders_length method in
|
15
|
+
# conjunction with this method to page through the result set.
|
16
|
+
#
|
17
|
+
# _You must specify at least one of the date range options or an invoice number range in this request._
|
18
|
+
#
|
19
|
+
# orders = ShipCompliant::SearchSalesOrders.find_by({
|
20
|
+
# purchase_date_min: DateTime.new(2014, 3, 10),
|
21
|
+
# purchase_date_max: DateTime.new(2014, 3, 12)
|
22
|
+
# })
|
23
|
+
class SearchSalesOrders
|
24
|
+
|
25
|
+
# +query+ must be a Hash with the keys relating to each search criteria.
|
26
|
+
#
|
27
|
+
# To see a list of available keys take a look at OrderSearch::KEYS
|
28
|
+
#
|
29
|
+
# # find orders place within date
|
30
|
+
# orders = ShipCompliant::SearchSalesOrders.find_by({
|
31
|
+
# purchase_date_min: DateTime.new(2014, 3, 10),
|
32
|
+
# purchase_date_max: DateTime.new(2014, 3, 12)
|
33
|
+
# })
|
34
|
+
#
|
35
|
+
# # find orders by compliance_status
|
36
|
+
# orders = ShipCompliant::SearchSalesOrders.find_by({
|
37
|
+
# compliance_status: 'NotCompliant' # possible values are "Compliant", "NotCompliant", or "Any". Any is default.
|
38
|
+
# })
|
39
|
+
def self.find_by(query)
|
40
|
+
order_query = OrderSearch.new(query).to_h
|
41
|
+
|
42
|
+
sales = search_sales(order_query)
|
43
|
+
SearchSalesOrdersResult.new(sales.to_hash)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def self.search_sales(order_query)
|
49
|
+
ShipCompliant.client.call(:search_sales_orders, order_query)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module ShipCompliant
|
2
|
+
# === An API wrapper for +SearchSalesOrders+ response.
|
3
|
+
#
|
4
|
+
# Converts fields into integers and ensures +order_summaries+
|
5
|
+
# is an array.
|
6
|
+
#
|
7
|
+
# orders = ShipCompliant::SearchSalesOrders.find_by({
|
8
|
+
# purchase_date_min: DateTime.new(2014, 3, 10),
|
9
|
+
# purchase_date_max: DateTime.new(2014, 3, 12)
|
10
|
+
# })
|
11
|
+
#
|
12
|
+
# puts orders.length #=> 2
|
13
|
+
#
|
14
|
+
# orders.summaries.each do |summary|
|
15
|
+
# puts summary.purchase_date #=> DateTime
|
16
|
+
# end
|
17
|
+
class SearchSalesOrdersResult
|
18
|
+
include BaseResult
|
19
|
+
attr_reader :raw
|
20
|
+
alias_method :response, :raw # for BaseResult
|
21
|
+
|
22
|
+
def initialize(data)
|
23
|
+
@raw = data
|
24
|
+
parse!
|
25
|
+
end
|
26
|
+
|
27
|
+
# The number of orders returned the current response.
|
28
|
+
def length
|
29
|
+
raw.fetch(:count_sales_orders_returned, 0)
|
30
|
+
end
|
31
|
+
|
32
|
+
# The number of orders waiting to be returned.
|
33
|
+
# Use this for paging results.
|
34
|
+
def remaining_orders_length
|
35
|
+
raw.fetch(:count_more_sales_orders_available, 0)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns an array of ShipCompliant::SearchSalesOrderSummary.
|
39
|
+
# Use this to get information about each order.
|
40
|
+
#
|
41
|
+
# orders.summaries.each do |summary|
|
42
|
+
# puts summary.purchase_date #=> DateTime
|
43
|
+
# end
|
44
|
+
def summaries
|
45
|
+
raw[:sales_orders][:sales_order_summary].reject(&:blank?).map do |summary|
|
46
|
+
SearchSalesOrderSummary.new(summary)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns the +PagingCookie+ node.
|
51
|
+
def paging_cookie
|
52
|
+
response[:paging_cookie]
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the +PagingCookieExpires+ node as DateTime.
|
56
|
+
def paging_cookie_expires
|
57
|
+
response[:paging_cookie_expires]
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
# Standardizes the XML response by converting fields to integers
|
63
|
+
# and forcing the order summaries into an array.
|
64
|
+
def parse!
|
65
|
+
unless raw.has_key?(:sales_orders)
|
66
|
+
raw[:sales_orders] = {}
|
67
|
+
end
|
68
|
+
|
69
|
+
# force orders to be an array
|
70
|
+
orders = raw[:sales_orders].fetch(:sales_order_summary, {})
|
71
|
+
unless orders.kind_of?(Array)
|
72
|
+
raw[:sales_orders][:sales_order_summary] = [orders]
|
73
|
+
end
|
74
|
+
|
75
|
+
# typecast :count_more_sales_orders_available to integer
|
76
|
+
if raw.has_key?(:count_more_sales_orders_available)
|
77
|
+
convert_to_integer!(:count_more_sales_orders_available, raw)
|
78
|
+
end
|
79
|
+
|
80
|
+
# typecast :count_sales_orders_returned to integer
|
81
|
+
if raw.has_key?(:count_sales_orders_returned)
|
82
|
+
convert_to_integer!(:count_sales_orders_returned, raw)
|
83
|
+
end
|
84
|
+
|
85
|
+
raw[:sales_orders][:sales_order_summary].each do |summary|
|
86
|
+
|
87
|
+
# typecast :shipment_key to integer
|
88
|
+
if summary.fetch(:shipments, {}).fetch(:shipment_summary, {}).has_key?(:shipment_key)
|
89
|
+
convert_to_integer!(:shipment_key, summary[:shipments][:shipment_summary])
|
90
|
+
end
|
91
|
+
|
92
|
+
# typecast :zip1 to integer
|
93
|
+
if summary.fetch(:shipments, {}).fetch(:shipment_summary, {}).fetch(:ship_to, {}).has_key?(:zip1)
|
94
|
+
convert_to_integer!(:zip1, summary[:shipments][:shipment_summary][:ship_to])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Typecasts an object key into to an integer.
|
100
|
+
#
|
101
|
+
# convert_to_integer(:shipment_key, order_summary[:shipments][:shipment_summary])
|
102
|
+
def convert_to_integer!(key, object)
|
103
|
+
object[key] = object[key].to_i
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module ShipCompliant
|
2
|
+
class Shipment < Struct.new(:shipment)
|
3
|
+
|
4
|
+
def fulfillment_house
|
5
|
+
shipment[:fulfillment_house]
|
6
|
+
end
|
7
|
+
|
8
|
+
def fulfillment_exception_reason
|
9
|
+
shipment[:fulfillment_exception_reason]
|
10
|
+
end
|
11
|
+
|
12
|
+
def fulfillment_exception_type
|
13
|
+
shipment[:fulfillment_exception_type]
|
14
|
+
end
|
15
|
+
|
16
|
+
def fulfillment_status
|
17
|
+
shipment[:fulfillment_status]
|
18
|
+
end
|
19
|
+
|
20
|
+
def handling
|
21
|
+
shipment[:handling].to_f
|
22
|
+
end
|
23
|
+
|
24
|
+
def insured_amount
|
25
|
+
shipment[:insured_amount].to_f
|
26
|
+
end
|
27
|
+
|
28
|
+
def shipping
|
29
|
+
shipment[:shipping].to_f
|
30
|
+
end
|
31
|
+
|
32
|
+
def ship_date
|
33
|
+
shipment[:ship_date]
|
34
|
+
end
|
35
|
+
|
36
|
+
def shipment_status
|
37
|
+
shipment[:shipment_status]
|
38
|
+
end
|
39
|
+
|
40
|
+
def shipping_service
|
41
|
+
shipment[:shipping_service]
|
42
|
+
end
|
43
|
+
|
44
|
+
def special_instructions
|
45
|
+
shipment[:special_instructions]
|
46
|
+
end
|
47
|
+
|
48
|
+
def packages
|
49
|
+
Array.wrap(shipment[:packages]).map do |package|
|
50
|
+
Package.new(package[:package])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def ship_to
|
55
|
+
Address.new(shipment[:ship_to])
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|