friendly_shipping 0.3.4 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.env.template +1 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +13 -4
- data/Gemfile +1 -0
- data/README.md +21 -2
- data/friendly_shipping.gemspec +1 -1
- data/lib/friendly_shipping/api_failure.rb +3 -0
- data/lib/friendly_shipping/api_result.rb +3 -0
- data/lib/friendly_shipping/carrier.rb +6 -0
- data/lib/friendly_shipping/http_client.rb +1 -0
- data/lib/friendly_shipping/item_options.rb +11 -0
- data/lib/friendly_shipping/label.rb +17 -9
- data/lib/friendly_shipping/package_options.rb +28 -0
- data/lib/friendly_shipping/rate.rb +9 -8
- data/lib/friendly_shipping/request.rb +4 -0
- data/lib/friendly_shipping/response.rb +3 -0
- data/lib/friendly_shipping/services/ship_engine.rb +10 -11
- data/lib/friendly_shipping/services/ship_engine/label_options.rb +34 -0
- data/lib/friendly_shipping/services/ship_engine/label_package_options.rb +28 -0
- data/lib/friendly_shipping/services/ship_engine/parse_label_response.rb +6 -1
- data/lib/friendly_shipping/services/ship_engine/parse_rate_estimate_response.rb +7 -7
- data/lib/friendly_shipping/services/ship_engine/rate_estimates_options.rb +25 -0
- data/lib/friendly_shipping/services/ship_engine/serialize_label_shipment.rb +15 -14
- data/lib/friendly_shipping/services/ship_engine/serialize_rate_estimate_request.rb +2 -2
- data/lib/friendly_shipping/services/ups.rb +47 -2
- data/lib/friendly_shipping/services/ups/label_billing_options.rb +41 -0
- data/lib/friendly_shipping/services/ups/label_item_options.rb +74 -0
- data/lib/friendly_shipping/services/ups/label_options.rb +165 -0
- data/lib/friendly_shipping/services/ups/label_package_options.rb +43 -0
- data/lib/friendly_shipping/services/ups/parse_money_element.rb +128 -0
- data/lib/friendly_shipping/services/ups/parse_rate_response.rb +8 -7
- data/lib/friendly_shipping/services/ups/parse_shipment_accept_response.rb +75 -0
- data/lib/friendly_shipping/services/ups/parse_shipment_confirm_response.rb +22 -0
- data/lib/friendly_shipping/services/ups/parse_xml_response.rb +2 -1
- data/lib/friendly_shipping/services/ups/serialize_address_snippet.rb +11 -6
- data/lib/friendly_shipping/services/ups/serialize_package_node.rb +21 -6
- data/lib/friendly_shipping/services/ups/serialize_shipment_accept_request.rb +27 -0
- data/lib/friendly_shipping/services/ups/serialize_shipment_address_snippet.rb +21 -0
- data/lib/friendly_shipping/services/ups/serialize_shipment_confirm_request.rb +282 -0
- data/lib/friendly_shipping/services/ups_freight.rb +76 -0
- data/lib/friendly_shipping/services/ups_freight/generate_commodity_information.rb +33 -0
- data/lib/friendly_shipping/services/ups_freight/generate_freight_rate_request_hash.rb +72 -0
- data/lib/friendly_shipping/services/ups_freight/generate_location_hash.rb +39 -0
- data/lib/friendly_shipping/services/ups_freight/generate_ups_security_hash.rb +23 -0
- data/lib/friendly_shipping/services/ups_freight/parse_freight_rate_response.rb +53 -0
- data/lib/friendly_shipping/services/ups_freight/parse_json_response.rb +38 -0
- data/lib/friendly_shipping/services/ups_freight/rates_item_options.rb +72 -0
- data/lib/friendly_shipping/services/ups_freight/rates_options.rb +54 -0
- data/lib/friendly_shipping/services/ups_freight/rates_package_options.rb +38 -0
- data/lib/friendly_shipping/services/ups_freight/shipping_methods.rb +25 -0
- data/lib/friendly_shipping/services/usps.rb +1 -1
- data/lib/friendly_shipping/services/usps/parse_xml_response.rb +1 -1
- data/lib/friendly_shipping/services/usps/serialize_rate_request.rb +0 -4
- data/lib/friendly_shipping/shipment_options.rb +23 -0
- data/lib/friendly_shipping/shipping_method.rb +7 -0
- data/lib/friendly_shipping/version.rb +1 -1
- metadata +33 -6
@@ -19,6 +19,10 @@ module FriendlyShipping
|
|
19
19
|
label_url = label_uri_string
|
20
20
|
end
|
21
21
|
|
22
|
+
currency = parsed_json.dig('shipment_cost', 'currency')
|
23
|
+
cents = parsed_json.dig('shipment_cost', 'amount') * 100
|
24
|
+
shipment_cost = Money.new(cents, currency)
|
25
|
+
|
22
26
|
label = FriendlyShipping::Label.new(
|
23
27
|
id: parsed_json['label_id'],
|
24
28
|
shipment_id: parsed_json['shipment_id'],
|
@@ -27,7 +31,8 @@ module FriendlyShipping
|
|
27
31
|
label_href: label_url,
|
28
32
|
label_data: label_data,
|
29
33
|
label_format: parsed_json['label_format'].to_sym,
|
30
|
-
shipment_cost:
|
34
|
+
shipment_cost: shipment_cost,
|
35
|
+
cost: shipment_cost,
|
31
36
|
data: parsed_json
|
32
37
|
)
|
33
38
|
|
@@ -10,14 +10,16 @@ module FriendlyShipping
|
|
10
10
|
extend Dry::Monads::Result::Mixin
|
11
11
|
|
12
12
|
class << self
|
13
|
-
def call(response:,
|
13
|
+
def call(response:, request:, options:)
|
14
14
|
parsed_json = JSON.parse(response.body)
|
15
15
|
rates = parsed_json.map do |rate|
|
16
|
-
carrier = carriers.detect { |c| c.id == rate['carrier_id'] }
|
16
|
+
carrier = options.carriers.detect { |c| c.id == rate['carrier_id'] }
|
17
17
|
next unless carrier
|
18
18
|
|
19
|
-
shipping_method =
|
20
|
-
|
19
|
+
shipping_method = FriendlyShipping::ShippingMethod.new(
|
20
|
+
carrier: carrier,
|
21
|
+
service_code: rate['service_code']
|
22
|
+
)
|
21
23
|
|
22
24
|
amounts = get_amounts(rate)
|
23
25
|
FriendlyShipping::Rate.new(
|
@@ -26,9 +28,7 @@ module FriendlyShipping
|
|
26
28
|
remote_service_id: rate['rate_id'],
|
27
29
|
delivery_date: Time.parse(rate['estimated_delivery_date']),
|
28
30
|
warnings: rate['warning_messages'],
|
29
|
-
errors: rate['error_messages']
|
30
|
-
original_request: request,
|
31
|
-
original_response: response
|
31
|
+
errors: rate['error_messages']
|
32
32
|
)
|
33
33
|
end.compact
|
34
34
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'friendly_shipping/shipment_options'
|
4
|
+
|
5
|
+
module FriendlyShipping
|
6
|
+
module Services
|
7
|
+
class ShipEngine
|
8
|
+
# options for the rate estimates call
|
9
|
+
#
|
10
|
+
# @attribute carriers [Array<FriendlyShipping::Carrier] a list of the carriers we want to get IDs from.
|
11
|
+
class RateEstimatesOptions < ShipmentOptions
|
12
|
+
attr_reader :carriers
|
13
|
+
|
14
|
+
def initialize(carriers:, **kwargs)
|
15
|
+
@carriers = carriers
|
16
|
+
super kwargs
|
17
|
+
end
|
18
|
+
|
19
|
+
def carrier_ids
|
20
|
+
carriers.map(&:id)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -5,20 +5,20 @@ module FriendlyShipping
|
|
5
5
|
class ShipEngine
|
6
6
|
class SerializeLabelShipment
|
7
7
|
class << self
|
8
|
-
def call(shipment:,
|
8
|
+
def call(shipment:, options:, test:)
|
9
9
|
shipment_hash = {
|
10
|
-
label_format:
|
11
|
-
label_download_type:
|
10
|
+
label_format: options.label_format,
|
11
|
+
label_download_type: options.label_download_type,
|
12
12
|
shipment: {
|
13
|
-
service_code: shipping_method.service_code,
|
13
|
+
service_code: options.shipping_method.service_code,
|
14
14
|
ship_to: serialize_address(shipment.destination),
|
15
15
|
ship_from: serialize_address(shipment.origin),
|
16
|
-
packages: serialize_packages(shipment.packages)
|
16
|
+
packages: serialize_packages(shipment.packages, options)
|
17
17
|
}
|
18
18
|
}
|
19
19
|
# A carrier might not be necessary if the service code is unique within ShipEngine.
|
20
|
-
if shipping_method.carrier
|
21
|
-
shipment_hash[:shipment][:carrier_id] = shipping_method.carrier.id
|
20
|
+
if options.shipping_method.carrier
|
21
|
+
shipment_hash[:shipment][:carrier_id] = options.shipping_method.carrier.id
|
22
22
|
end
|
23
23
|
|
24
24
|
if test
|
@@ -45,15 +45,16 @@ module FriendlyShipping
|
|
45
45
|
}
|
46
46
|
end
|
47
47
|
|
48
|
-
def serialize_packages(packages)
|
48
|
+
def serialize_packages(packages, options)
|
49
49
|
packages.map do |package|
|
50
|
+
package_options = options.options_for_package(package)
|
50
51
|
package_hash = serialize_weight(package.weight)
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
if package_code
|
56
|
-
package_hash[:package_code] = package_code
|
52
|
+
package_hash[:label_messages] = package_options.messages.map.with_index do |message, index|
|
53
|
+
["reference#{index + 1}".to_sym, message]
|
54
|
+
end.to_h
|
55
|
+
|
56
|
+
if package_options.package_code
|
57
|
+
package_hash[:package_code] = package_options.package_code
|
57
58
|
else
|
58
59
|
package_hash[:dimensions] = {
|
59
60
|
unit: 'inch',
|
@@ -4,9 +4,9 @@ module FriendlyShipping
|
|
4
4
|
module Services
|
5
5
|
class ShipEngine
|
6
6
|
class SerializeRateEstimateRequest
|
7
|
-
def self.call(shipment:,
|
7
|
+
def self.call(shipment:, options:)
|
8
8
|
{
|
9
|
-
carrier_ids:
|
9
|
+
carrier_ids: options.carrier_ids,
|
10
10
|
from_country_code: shipment.origin.country.alpha_2_code,
|
11
11
|
from_postal_code: shipment.origin.zip,
|
12
12
|
to_country_code: shipment.destination.country.alpha_2_code,
|
@@ -6,11 +6,16 @@ require 'friendly_shipping/services/ups/serialize_access_request'
|
|
6
6
|
require 'friendly_shipping/services/ups/serialize_city_state_lookup_request'
|
7
7
|
require 'friendly_shipping/services/ups/serialize_address_validation_request'
|
8
8
|
require 'friendly_shipping/services/ups/serialize_rating_service_selection_request'
|
9
|
-
require 'friendly_shipping/services/ups/
|
9
|
+
require 'friendly_shipping/services/ups/serialize_shipment_accept_request'
|
10
|
+
require 'friendly_shipping/services/ups/serialize_shipment_confirm_request'
|
10
11
|
require 'friendly_shipping/services/ups/parse_address_validation_response'
|
12
|
+
require 'friendly_shipping/services/ups/parse_address_classification_response'
|
11
13
|
require 'friendly_shipping/services/ups/parse_city_state_lookup_response'
|
12
14
|
require 'friendly_shipping/services/ups/parse_rate_response'
|
15
|
+
require 'friendly_shipping/services/ups/parse_shipment_confirm_response'
|
16
|
+
require 'friendly_shipping/services/ups/parse_shipment_accept_response'
|
13
17
|
require 'friendly_shipping/services/ups/shipping_methods'
|
18
|
+
require 'friendly_shipping/services/ups/label_options'
|
14
19
|
|
15
20
|
module FriendlyShipping
|
16
21
|
module Services
|
@@ -32,7 +37,9 @@ module FriendlyShipping
|
|
32
37
|
RESOURCES = {
|
33
38
|
address_validation: '/ups.app/xml/XAV',
|
34
39
|
city_state_lookup: '/ups.app/xml/AV',
|
35
|
-
rates: '/ups.app/xml/Rate'
|
40
|
+
rates: '/ups.app/xml/Rate',
|
41
|
+
ship_confirm: '/ups.app/xml/ShipConfirm',
|
42
|
+
ship_accept: '/ups.app/xml/ShipAccept',
|
36
43
|
}.freeze
|
37
44
|
|
38
45
|
def initialize(key:, login:, password:, test: true, client: HttpClient.new)
|
@@ -65,6 +72,44 @@ module FriendlyShipping
|
|
65
72
|
end
|
66
73
|
end
|
67
74
|
|
75
|
+
def labels(shipment, options:, debug: false)
|
76
|
+
## Method body starts
|
77
|
+
ship_confirm_request_xml = SerializeShipmentConfirmRequest.call(
|
78
|
+
shipment: shipment,
|
79
|
+
options: options
|
80
|
+
)
|
81
|
+
ship_confirm_url = base_url + RESOURCES[:ship_confirm]
|
82
|
+
|
83
|
+
ship_confirm_request = FriendlyShipping::Request.new(
|
84
|
+
url: ship_confirm_url,
|
85
|
+
body: access_request_xml + ship_confirm_request_xml,
|
86
|
+
debug: debug
|
87
|
+
)
|
88
|
+
|
89
|
+
client.post(ship_confirm_request).bind do |ship_confirm_response|
|
90
|
+
ParseShipmentConfirmResponse.call(
|
91
|
+
request: ship_confirm_request,
|
92
|
+
response: ship_confirm_response
|
93
|
+
)
|
94
|
+
end.bind do |ship_confirm_result|
|
95
|
+
ship_accept_url = base_url + RESOURCES[:ship_accept]
|
96
|
+
ship_accept_request_xml = SerializeShipmentAcceptRequest.call(
|
97
|
+
digest: ship_confirm_result.data,
|
98
|
+
options: options
|
99
|
+
)
|
100
|
+
|
101
|
+
ship_accept_request = FriendlyShipping::Request.new(
|
102
|
+
url: ship_accept_url,
|
103
|
+
body: access_request_xml + ship_accept_request_xml,
|
104
|
+
debug: debug
|
105
|
+
)
|
106
|
+
|
107
|
+
client.post(ship_accept_request).bind do |ship_accept_response|
|
108
|
+
ParseShipmentAcceptResponse.call(request: ship_accept_request, response: ship_accept_response)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
68
113
|
# Validate an address.
|
69
114
|
# @param [Physical::Location] location The address we want to verify
|
70
115
|
# @return [Result<ApiResult<Array<Physical::Location>>>] The response data from UPS encoded in a
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FriendlyShipping
|
4
|
+
module Services
|
5
|
+
class Ups
|
6
|
+
# Represents billing-related options for obtaining shipment labels.
|
7
|
+
# @option bill_third_party [Boolean] When truthy, bill an account other than the shipper's.
|
8
|
+
# Specified by billing_(account, zip and country)
|
9
|
+
# @option bill_to_consignee [Boolean] If billing a third party, bill the consignee instead of the 3rd party shipper
|
10
|
+
# @option prepay [Boolean] If truthy the shipper will be bill immediately. Otherwise the shipper is billed
|
11
|
+
# when the label is used. Default: false
|
12
|
+
class LabelBillingOptions
|
13
|
+
attr_reader :bill_third_party,
|
14
|
+
:bill_to_consignee,
|
15
|
+
:prepay,
|
16
|
+
:billing_account,
|
17
|
+
:billing_zip,
|
18
|
+
:billing_country,
|
19
|
+
:currency
|
20
|
+
|
21
|
+
def initialize(
|
22
|
+
bill_third_party: false,
|
23
|
+
bill_to_consignee: false,
|
24
|
+
prepay: false,
|
25
|
+
billing_account: nil,
|
26
|
+
billing_zip: nil,
|
27
|
+
billing_country: nil,
|
28
|
+
currency: nil
|
29
|
+
)
|
30
|
+
@bill_third_party = bill_third_party
|
31
|
+
@bill_to_consignee = bill_to_consignee
|
32
|
+
@prepay = prepay
|
33
|
+
@billing_account = billing_account
|
34
|
+
@billing_zip = billing_zip
|
35
|
+
@billing_country = billing_country
|
36
|
+
@currency = currency
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'friendly_shipping/item_options'
|
4
|
+
|
5
|
+
module FriendlyShipping
|
6
|
+
module Services
|
7
|
+
class Ups
|
8
|
+
class LabelItemOptions < FriendlyShipping::ItemOptions
|
9
|
+
PRODUCT_UNIT_OF_MEASURE_CODES = {
|
10
|
+
barrel: 'BA',
|
11
|
+
bundle: 'BE',
|
12
|
+
bag: 'BG',
|
13
|
+
bunch: 'BH',
|
14
|
+
box: 'BOX',
|
15
|
+
bolt: 'BT',
|
16
|
+
butt: 'BU',
|
17
|
+
canister: 'CI',
|
18
|
+
centimeter: 'CM',
|
19
|
+
container: 'CON',
|
20
|
+
crate: 'CR',
|
21
|
+
case: 'CS',
|
22
|
+
carton: 'CT',
|
23
|
+
cylinder: 'CY',
|
24
|
+
dozen: 'DOZ',
|
25
|
+
each: 'EA',
|
26
|
+
envelope: 'EN',
|
27
|
+
feet: 'FT',
|
28
|
+
kilogram: 'KG',
|
29
|
+
kilograms: 'KGS',
|
30
|
+
pound: 'LB',
|
31
|
+
pounds: 'LBS',
|
32
|
+
liter: 'L',
|
33
|
+
meter: 'M',
|
34
|
+
number: 'NMB',
|
35
|
+
packet: 'PA',
|
36
|
+
pallet: 'PAL',
|
37
|
+
piece: 'PC',
|
38
|
+
pieces: 'PCS',
|
39
|
+
proof_liters: 'PF',
|
40
|
+
package: 'PKG',
|
41
|
+
pair: 'PR',
|
42
|
+
pairs: 'PRS',
|
43
|
+
roll: 'RL',
|
44
|
+
set: 'SET',
|
45
|
+
square_meters: 'SME',
|
46
|
+
square_yards: 'SYD',
|
47
|
+
tube: 'TU',
|
48
|
+
yard: 'YD',
|
49
|
+
other: 'OTH'
|
50
|
+
}.freeze
|
51
|
+
|
52
|
+
attr_reader :commodity_code
|
53
|
+
|
54
|
+
def initialize(
|
55
|
+
commodity_code: nil,
|
56
|
+
product_unit_of_measure: :number,
|
57
|
+
**kwargs
|
58
|
+
)
|
59
|
+
@commodity_code = commodity_code
|
60
|
+
@product_unit_of_measure = product_unit_of_measure
|
61
|
+
super kwargs
|
62
|
+
end
|
63
|
+
|
64
|
+
def product_unit_of_measure_code
|
65
|
+
PRODUCT_UNIT_OF_MEASURE_CODES[product_unit_of_measure]
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
attr_reader :product_unit_of_measure
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'friendly_shipping/services/ups/label_package_options'
|
4
|
+
require 'friendly_shipping/services/ups/label_billing_options'
|
5
|
+
|
6
|
+
module FriendlyShipping
|
7
|
+
module Services
|
8
|
+
# Option container for a generating UPS labels for a shipment
|
9
|
+
#
|
10
|
+
# Required:
|
11
|
+
#
|
12
|
+
# @param shipping_method [FriendlyShipping::ShippingMethod] The shipping method to use. We only need the
|
13
|
+
# service_code to be set.
|
14
|
+
# @param shipper_number [String] account number for the shipper
|
15
|
+
#
|
16
|
+
# Optional:
|
17
|
+
#
|
18
|
+
# @param shipper [Physical::Location] The company sending the shipment. Defaults to the shipment's origin.
|
19
|
+
# @param customer_context [String ] Optional element to identify transactions between client and server
|
20
|
+
# @param validate_address [Boolean] Validate the city field with ZIP code and state. If false, only ZIP code
|
21
|
+
# and state are validated. Default: true
|
22
|
+
# @param negotiated_rates [Boolean] if truthy negotiated rates will be requested from ups. Only valid if
|
23
|
+
# shipper account has negotiated rates. Default: false
|
24
|
+
# @option sold_to [Physical::Location] The person or company who imports and pays any duties due on the
|
25
|
+
# current shipment. Default: The shipment's destination
|
26
|
+
# @option saturday_delivery [Boolean] should we request Saturday delivery?. Default: false
|
27
|
+
# @option label_format [String] GIF, EPL, ZPL, STARPL and SPL
|
28
|
+
# @option label_size [Array<Integer>] Dimensions of the label. Default: [4, 6]
|
29
|
+
# @option delivery_confirmation [Symbol] Can be set to any key from SHIPMENT_DELIVERY_CONFIRMATION_CODES.
|
30
|
+
# Only possible for international shipments that are not between the US and Puerto Rico.
|
31
|
+
# @option carbon_neutral [Boolean] Ship with UPS' carbon neutral program
|
32
|
+
# @option return_service_code [Symbol] If present, marks this a return label. The kind
|
33
|
+
# of return label is specified by the symbol, one of the keys in RETURN_SERVICE_CODES. Default: nil
|
34
|
+
#
|
35
|
+
# Shipment options for international shipping:
|
36
|
+
#
|
37
|
+
# @option paperless_invoice [Boolean] set to truthy if using paperless invoice to ship internationally. Default false
|
38
|
+
# @option terms_of_shipment [Symbol] used with paperless invoice to specify who pays duties and taxes.
|
39
|
+
# See TERMS_OF_SHIPMENT constant for possible options.
|
40
|
+
# @option reason_for_export [String] A reason to export the current shipment. Possible values: 'SALE', 'GIFT', 'SAMPLE',
|
41
|
+
# 'RETURN', 'REPAIR', 'INTERCOMPANYDATA', Any other reason. Default: 'SALE'.
|
42
|
+
# @option invoice_date [Date] The invoice date for the shipment
|
43
|
+
#
|
44
|
+
class Ups
|
45
|
+
class LabelOptions < FriendlyShipping::ShipmentOptions
|
46
|
+
SHIPMENT_DELIVERY_CONFIRMATION_CODES = {
|
47
|
+
delivery_confirmation_signature_required: 1,
|
48
|
+
delivery_confirmation_adult_signature_required: 2
|
49
|
+
}.freeze
|
50
|
+
|
51
|
+
TERMS_OF_SHIPMENT_CODES = {
|
52
|
+
cost_and_freight: 'CFR',
|
53
|
+
cost_insurance_and_freight: 'CIF',
|
54
|
+
carriage_and_insurance_paid: 'CIP',
|
55
|
+
carriage_paid_to: 'CPT',
|
56
|
+
delivered_at_frontier: 'DAF',
|
57
|
+
delivery_duty_paid: 'DDP',
|
58
|
+
delivery_duty_unpaid: 'DDU',
|
59
|
+
delivered_ex_quay: 'DEQ',
|
60
|
+
delivered_ex_ship: 'DES',
|
61
|
+
ex_works: 'EXW',
|
62
|
+
free_alongside_ship: 'FAS',
|
63
|
+
free_carrier: 'FCA',
|
64
|
+
free_on_board: 'FOB'
|
65
|
+
}.freeze
|
66
|
+
|
67
|
+
RETURN_SERVICE_CODES = {
|
68
|
+
ups_print_and_mail: 2, # UPS Print and Mail (PNM)
|
69
|
+
ups_return_1_attempt: 3, # UPS Return Service 1-Attempt
|
70
|
+
ups_return_3_attempt: 5, # UPS Return Service 3-Attempt (RS3)
|
71
|
+
ups_electronic_return_label: 8, # UPS Electronic Return Label (ERL)
|
72
|
+
ups_print_return_label: 9, # UPS Print Return Label (PRL)
|
73
|
+
ups_exchange_print_return: 10, # UPS Exchange Print Return Label
|
74
|
+
ups_pack_collect_1_attemt_box_1: 11, # UPS Pack & Collect Service 1-Attempt Box 1
|
75
|
+
ups_pack_collect_1_attemt_box_2: 12, # UPS Pack & Collect Service 1-Attempt Box 2
|
76
|
+
ups_pack_collect_1_attemt_box_3: 13, # UPS Pack & Collect Service 1-Attempt Box 3
|
77
|
+
ups_pack_collect_1_attemt_box_4: 14, # UPS Pack & Collect Service 1-Attempt Box 4
|
78
|
+
ups_pack_collect_1_attemt_box_5: 15, # UPS Pack & Collect Service 1-Attempt Box 5
|
79
|
+
ups_pack_collect_3_attemt_box_1: 16, # UPS Pack & Collect Service 1-Attempt Box 1
|
80
|
+
ups_pack_collect_3_attemt_box_2: 17, # UPS Pack & Collect Service 1-Attempt Box 2
|
81
|
+
ups_pack_collect_3_attemt_box_3: 18, # UPS Pack & Collect Service 1-Attempt Box 3
|
82
|
+
ups_pack_collect_3_attemt_box_4: 19, # UPS Pack & Collect Service 1-Attempt Box 4
|
83
|
+
ups_pack_collect_3_attemt_box_5: 20 # UPS Pack & Collect Service 1-Attempt Box 5
|
84
|
+
}.freeze
|
85
|
+
|
86
|
+
attr_reader :shipping_method,
|
87
|
+
:shipper_number,
|
88
|
+
:shipper,
|
89
|
+
:customer_context,
|
90
|
+
:validate_address,
|
91
|
+
:negotiated_rates,
|
92
|
+
:billing_options,
|
93
|
+
:sold_to,
|
94
|
+
:saturday_delivery,
|
95
|
+
:label_format,
|
96
|
+
:label_size,
|
97
|
+
:carbon_neutral,
|
98
|
+
:paperless_invoice,
|
99
|
+
:reason_for_export,
|
100
|
+
:invoice_date
|
101
|
+
|
102
|
+
def initialize(
|
103
|
+
shipping_method:,
|
104
|
+
shipper_number:,
|
105
|
+
shipper: nil,
|
106
|
+
customer_context: nil,
|
107
|
+
validate_address: true,
|
108
|
+
negotiated_rates: false,
|
109
|
+
billing_options: LabelBillingOptions.new,
|
110
|
+
sold_to: nil,
|
111
|
+
saturday_delivery: false,
|
112
|
+
label_format: 'GIF',
|
113
|
+
label_size: [4, 6],
|
114
|
+
delivery_confirmation: nil,
|
115
|
+
carbon_neutral: true,
|
116
|
+
return_service: nil,
|
117
|
+
paperless_invoice: false,
|
118
|
+
terms_of_shipment: nil,
|
119
|
+
reason_for_export: 'SALE',
|
120
|
+
invoice_date: nil,
|
121
|
+
package_options_class: LabelPackageOptions,
|
122
|
+
**kwargs
|
123
|
+
)
|
124
|
+
@shipping_method = shipping_method
|
125
|
+
@shipper_number = shipper_number
|
126
|
+
@shipper = shipper
|
127
|
+
@customer_context = customer_context
|
128
|
+
@validate_address = validate_address
|
129
|
+
@negotiated_rates = negotiated_rates
|
130
|
+
@billing_options = billing_options
|
131
|
+
@sold_to = sold_to
|
132
|
+
@saturday_delivery = saturday_delivery
|
133
|
+
@label_format = label_format
|
134
|
+
@label_size = label_size
|
135
|
+
@delivery_confirmation = delivery_confirmation
|
136
|
+
@carbon_neutral = carbon_neutral
|
137
|
+
@return_service = return_service
|
138
|
+
@paperless_invoice = paperless_invoice
|
139
|
+
@terms_of_shipment = terms_of_shipment
|
140
|
+
@reason_for_export = reason_for_export
|
141
|
+
@invoice_date = invoice_date
|
142
|
+
super kwargs.merge(package_options_class: package_options_class)
|
143
|
+
end
|
144
|
+
|
145
|
+
def delivery_confirmation_code
|
146
|
+
SHIPMENT_DELIVERY_CONFIRMATION_CODES[delivery_confirmation]
|
147
|
+
end
|
148
|
+
|
149
|
+
def terms_of_shipment_code
|
150
|
+
TERMS_OF_SHIPMENT_CODES[terms_of_shipment]
|
151
|
+
end
|
152
|
+
|
153
|
+
def return_service_code
|
154
|
+
RETURN_SERVICE_CODES[return_service]
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
159
|
+
attr_reader :terms_of_shipment,
|
160
|
+
:return_service,
|
161
|
+
:delivery_confirmation
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|