friendly_shipping 0.6.4 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +18 -5
- data/.env.template +1 -1
- data/.rubocop.yml +4 -1
- data/CHANGELOG.md +14 -3
- data/README.md +1 -1
- data/friendly_shipping.gemspec +6 -7
- data/lib/friendly_shipping/api_error.rb +14 -0
- data/lib/friendly_shipping/api_error_handler.rb +30 -0
- data/lib/friendly_shipping/http_client.rb +9 -27
- data/lib/friendly_shipping/request.rb +5 -3
- data/lib/friendly_shipping/response.rb +27 -1
- data/lib/friendly_shipping/services/ship_engine/parse_label_response.rb +8 -2
- data/lib/friendly_shipping/services/ship_engine/parse_rate_estimate_response.rb +28 -6
- data/lib/friendly_shipping/services/ship_engine.rb +9 -5
- data/lib/friendly_shipping/services/ups/parse_shipment_accept_response.rb +1 -1
- data/lib/friendly_shipping/services/ups/parse_shipment_confirm_response.rb +1 -1
- data/lib/friendly_shipping/services/ups/parse_void_shipment_response.rb +1 -1
- data/lib/friendly_shipping/services/ups/rate_estimate_options.rb +1 -1
- data/lib/friendly_shipping/services/ups/rate_estimate_package_options.rb +1 -1
- data/lib/friendly_shipping/services/ups/shipping_methods.rb +4 -0
- data/lib/friendly_shipping/services/ups.rb +10 -2
- data/lib/friendly_shipping/services/ups_freight/api_error.rb +36 -0
- data/lib/friendly_shipping/services/ups_freight/generate_delivery_options_hash.rb +6 -4
- data/lib/friendly_shipping/services/ups_freight/generate_freight_ship_request_hash.rb +5 -2
- data/lib/friendly_shipping/services/ups_freight/generate_location_hash.rb +6 -9
- data/lib/friendly_shipping/services/ups_freight/generate_pickup_options_hash.rb +4 -3
- data/lib/friendly_shipping/services/ups_freight/generate_reference_hash.rb +27 -0
- data/lib/friendly_shipping/services/ups_freight/label_delivery_options.rb +7 -1
- data/lib/friendly_shipping/services/ups_freight/label_options.rb +28 -2
- data/lib/friendly_shipping/services/ups_freight/label_pickup_options.rb +3 -0
- data/lib/friendly_shipping/services/ups_freight/parse_freight_label_response.rb +27 -8
- data/lib/friendly_shipping/services/ups_freight/parse_shipment_document.rb +1 -1
- data/lib/friendly_shipping/services/ups_freight/shipment_information.rb +5 -2
- data/lib/friendly_shipping/services/ups_freight.rb +8 -5
- data/lib/friendly_shipping/services/usps/parse_package_rate.rb +16 -1
- data/lib/friendly_shipping/services/usps/rate_estimate_options.rb +1 -1
- data/lib/friendly_shipping/services/usps/rate_estimate_package_options.rb +23 -19
- data/lib/friendly_shipping/services/usps/serialize_rate_request.rb +2 -0
- data/lib/friendly_shipping/services/usps.rb +2 -1
- data/lib/friendly_shipping/version.rb +1 -1
- data/lib/friendly_shipping.rb +1 -0
- metadata +18 -35
- data/lib/friendly_shipping/services/ups_freight/restful_api_error_handler.rb +0 -30
@@ -7,11 +7,13 @@ module FriendlyShipping
|
|
7
7
|
def self.call(delivery_options:)
|
8
8
|
{
|
9
9
|
DeliveryOptions: {
|
10
|
+
CallBeforeDeliveryIndicator: delivery_options.call_before_delivery ? "" : nil,
|
11
|
+
HolidayDeliveryIndicator: delivery_options.holiday_delivery ? "" : nil,
|
12
|
+
InsideDeliveryIndicator: delivery_options.inside_delivery ? "" : nil,
|
13
|
+
ResidentialDeliveryIndicator: delivery_options.residential_delivery ? "" : nil,
|
14
|
+
WeekendDeliveryIndicator: delivery_options.weekend_delivery ? "" : nil,
|
10
15
|
LiftGateRequiredIndicator: delivery_options.lift_gate_required ? "" : nil,
|
11
|
-
|
12
|
-
InsidePickupIndicator: delivery_options.inside_delivery ? "" : nil,
|
13
|
-
HolidayPickupIndicator: delivery_options.holiday_delivery ? "" : nil,
|
14
|
-
LimitedAccessPickupIndicator: delivery_options.limited_access_delivery ? "" : nil
|
16
|
+
LimitedAccessDeliveryIndicator: delivery_options.limited_access_delivery ? "" : nil
|
15
17
|
}.compact.presence
|
16
18
|
}.compact.presence
|
17
19
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'friendly_shipping/services/ups_freight/generate_location_hash'
|
4
|
+
require 'friendly_shipping/services/ups_freight/generate_reference_hash'
|
4
5
|
require 'friendly_shipping/services/ups_freight/generate_document_options_hash'
|
5
6
|
require 'friendly_shipping/services/ups_freight/generate_email_options_hash'
|
6
7
|
require 'friendly_shipping/services/ups_freight/generate_pickup_options_hash'
|
@@ -30,8 +31,10 @@ module FriendlyShipping
|
|
30
31
|
HandlingInstructions: options.handling_instructions,
|
31
32
|
PickupInstructions: options.pickup_instructions,
|
32
33
|
DeliveryInstructions: options.delivery_instructions,
|
33
|
-
PickupRequest: GeneratePickupRequestHash.call(pickup_request_options: options.pickup_request_options)
|
34
|
-
}.compact.
|
34
|
+
PickupRequest: GeneratePickupRequestHash.call(pickup_request_options: options.pickup_request_options),
|
35
|
+
}.compact.
|
36
|
+
merge(handling_units(shipment, options).reduce(&:merge).to_h).
|
37
|
+
merge(GenerateReferenceHash.call(reference_numbers: options.reference_numbers))
|
35
38
|
}
|
36
39
|
}
|
37
40
|
end
|
@@ -6,16 +6,14 @@ module FriendlyShipping
|
|
6
6
|
class GenerateLocationHash
|
7
7
|
class << self
|
8
8
|
def call(location:)
|
9
|
-
# We ship freight here, which will mostly be used for businesses.
|
10
|
-
# If a personal name is given, treat is as the contact person ("AttentionName")
|
11
9
|
{
|
12
|
-
Name: location.company_name,
|
10
|
+
Name: location.company_name.presence || location.name,
|
13
11
|
Address: {
|
14
12
|
AddressLine: address_line(location),
|
15
13
|
City: location.city,
|
16
|
-
StateProvinceCode: location.region
|
14
|
+
StateProvinceCode: location.region&.code,
|
17
15
|
PostalCode: location.zip,
|
18
|
-
CountryCode: location.country
|
16
|
+
CountryCode: location.country&.code
|
19
17
|
},
|
20
18
|
AttentionName: location.name,
|
21
19
|
Phone: {
|
@@ -27,13 +25,12 @@ module FriendlyShipping
|
|
27
25
|
private
|
28
26
|
|
29
27
|
def address_line(location)
|
30
|
-
[
|
28
|
+
address_lines = [
|
31
29
|
location.address1,
|
32
30
|
location.address2,
|
33
31
|
location.address3
|
34
|
-
].compact.
|
35
|
-
|
36
|
-
join(", ")
|
32
|
+
].compact.reject(&:empty?)
|
33
|
+
address_lines.size > 1 ? address_lines : address_lines.first
|
37
34
|
end
|
38
35
|
end
|
39
36
|
end
|
@@ -7,10 +7,11 @@ module FriendlyShipping
|
|
7
7
|
def self.call(pickup_options:)
|
8
8
|
{
|
9
9
|
PickupOptions: {
|
10
|
-
LiftGateRequiredIndicator: pickup_options.lift_gate_required ? "" : nil,
|
11
|
-
WeekendPickupIndicator: pickup_options.weekend_pickup ? "" : nil,
|
12
|
-
InsidePickupIndicator: pickup_options.inside_pickup ? "" : nil,
|
13
10
|
HolidayPickupIndicator: pickup_options.holiday_pickup ? "" : nil,
|
11
|
+
InsidePickupIndicator: pickup_options.inside_pickup ? "" : nil,
|
12
|
+
ResidentialPickupIndicator: pickup_options.residential_pickup ? "" : nil,
|
13
|
+
WeekendPickupIndicator: pickup_options.weekend_pickup ? "" : nil,
|
14
|
+
LiftGateRequiredIndicator: pickup_options.lift_gate_required ? "" : nil,
|
14
15
|
LimitedAccessPickupIndicator: pickup_options.limited_access_pickup ? "" : nil
|
15
16
|
}.compact.presence
|
16
17
|
}.compact.presence
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FriendlyShipping
|
4
|
+
module Services
|
5
|
+
class UpsFreight
|
6
|
+
class GenerateReferenceHash
|
7
|
+
class << self
|
8
|
+
# @param [Array] reference_numbers Reference numbers for the Bill of Lading
|
9
|
+
# @return [Hash] Reference hash suitable for JSON request
|
10
|
+
def call(reference_numbers:)
|
11
|
+
return {} unless reference_numbers
|
12
|
+
|
13
|
+
references = reference_numbers.map do |reference_number|
|
14
|
+
{
|
15
|
+
Number: {
|
16
|
+
Code: reference_number[:code],
|
17
|
+
Value: reference_number[:value]
|
18
|
+
}
|
19
|
+
}
|
20
|
+
end
|
21
|
+
references.any? ? { Reference: references } : {}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -4,21 +4,27 @@ module FriendlyShipping
|
|
4
4
|
module Services
|
5
5
|
class UpsFreight
|
6
6
|
class LabelDeliveryOptions
|
7
|
-
attr_reader :
|
7
|
+
attr_reader :call_before_delivery,
|
8
|
+
:holiday_delivery,
|
8
9
|
:inside_delivery,
|
10
|
+
:residential_delivery,
|
9
11
|
:weekend_delivery,
|
10
12
|
:lift_gate_required,
|
11
13
|
:limited_access_delivery
|
12
14
|
|
13
15
|
def initialize(
|
16
|
+
call_before_delivery: nil,
|
14
17
|
holiday_delivery: nil,
|
15
18
|
inside_delivery: nil,
|
19
|
+
residential_delivery: nil,
|
16
20
|
weekend_delivery: nil,
|
17
21
|
lift_gate_required: nil,
|
18
22
|
limited_access_delivery: nil
|
19
23
|
)
|
24
|
+
@call_before_delivery = call_before_delivery
|
20
25
|
@holiday_delivery = holiday_delivery
|
21
26
|
@inside_delivery = inside_delivery
|
27
|
+
@residential_delivery = residential_delivery
|
22
28
|
@weekend_delivery = weekend_delivery
|
23
29
|
@lift_gate_required = lift_gate_required
|
24
30
|
@limited_access_delivery = limited_access_delivery
|
@@ -4,14 +4,30 @@ module FriendlyShipping
|
|
4
4
|
module Services
|
5
5
|
class UpsFreight
|
6
6
|
class LabelOptions < RatesOptions
|
7
|
+
REFERENCE_NUMBER_CODES = {
|
8
|
+
bill_of_lading_number: "57",
|
9
|
+
purchase_order_number: "28",
|
10
|
+
shipper_reference: "SH",
|
11
|
+
consignee_reference: "CO",
|
12
|
+
pm: "PM",
|
13
|
+
proj: "PROJ",
|
14
|
+
quote: "QUOTE",
|
15
|
+
sid: "SID",
|
16
|
+
task: "TASK",
|
17
|
+
vprc: "VPRC",
|
18
|
+
other: "OTHER"
|
19
|
+
}.freeze
|
20
|
+
|
7
21
|
attr_reader :document_options,
|
8
22
|
:email_options,
|
9
23
|
:pickup_options,
|
10
24
|
:delivery_options,
|
11
25
|
:pickup_instructions,
|
12
26
|
:delivery_instructions,
|
13
|
-
:handling_instructions
|
27
|
+
:handling_instructions,
|
28
|
+
:reference_numbers
|
14
29
|
|
30
|
+
# @param [Array] reference_numbers Reference numbers for the Bill of Lading
|
15
31
|
def initialize(
|
16
32
|
document_options: [],
|
17
33
|
email_options: [],
|
@@ -20,6 +36,7 @@ module FriendlyShipping
|
|
20
36
|
pickup_instructions: nil,
|
21
37
|
delivery_instructions: nil,
|
22
38
|
handling_instructions: nil,
|
39
|
+
reference_numbers: [],
|
23
40
|
**kwargs
|
24
41
|
)
|
25
42
|
@pickup_options = pickup_options
|
@@ -29,7 +46,16 @@ module FriendlyShipping
|
|
29
46
|
@pickup_instructions = pickup_instructions
|
30
47
|
@delivery_instructions = delivery_instructions
|
31
48
|
@handling_instructions = handling_instructions
|
32
|
-
|
49
|
+
@reference_numbers = fill_codes(reference_numbers)
|
50
|
+
super(**kwargs)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def fill_codes(reference_numbers)
|
56
|
+
reference_numbers.each do |reference_number|
|
57
|
+
reference_number[:code] = REFERENCE_NUMBER_CODES.fetch(reference_number[:code])
|
58
|
+
end
|
33
59
|
end
|
34
60
|
end
|
35
61
|
end
|
@@ -6,6 +6,7 @@ module FriendlyShipping
|
|
6
6
|
class LabelPickupOptions
|
7
7
|
attr_reader :holiday_pickup,
|
8
8
|
:inside_pickup,
|
9
|
+
:residential_pickup,
|
9
10
|
:weekend_pickup,
|
10
11
|
:lift_gate_required,
|
11
12
|
:limited_access_pickup
|
@@ -13,12 +14,14 @@ module FriendlyShipping
|
|
13
14
|
def initialize(
|
14
15
|
holiday_pickup: nil,
|
15
16
|
inside_pickup: nil,
|
17
|
+
residential_pickup: nil,
|
16
18
|
weekend_pickup: nil,
|
17
19
|
lift_gate_required: nil,
|
18
20
|
limited_access_pickup: nil
|
19
21
|
)
|
20
22
|
@holiday_pickup = holiday_pickup
|
21
23
|
@inside_pickup = inside_pickup
|
24
|
+
@residential_pickup = residential_pickup
|
22
25
|
@weekend_pickup = weekend_pickup
|
23
26
|
@lift_gate_required = lift_gate_required
|
24
27
|
@limited_access_pickup = limited_access_pickup
|
@@ -23,19 +23,23 @@ module FriendlyShipping
|
|
23
23
|
service_code = shipment_results.dig("Service", "Code")
|
24
24
|
shipping_method = SHIPPING_METHODS.detect { |sm| sm.service_code == service_code }
|
25
25
|
|
26
|
-
total_shipment_charge = shipment_results
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
total_shipment_charge = shipment_results["TotalShipmentCharge"]
|
27
|
+
if total_shipment_charge
|
28
|
+
currency = Money::Currency.new(total_shipment_charge['CurrencyCode'])
|
29
|
+
amount = total_shipment_charge['MonetaryValue'].to_f
|
30
|
+
total_money = Money.new(amount * currency.subunit_to_unit, currency)
|
31
|
+
end
|
30
32
|
|
31
33
|
images_data = Array.wrap(shipment_results.dig("Documents", "Image"))
|
32
34
|
|
33
|
-
bol_id = shipment_results
|
34
|
-
shipment_number = shipment_results
|
35
|
-
pickup_request_number = shipment_results
|
35
|
+
bol_id = shipment_results["BOLID"]
|
36
|
+
shipment_number = shipment_results["ShipmentNumber"]
|
37
|
+
pickup_request_number = shipment_results["PickupRequestConfirmationNumber"]
|
36
38
|
|
37
39
|
documents = images_data.map { |image_data| ParseShipmentDocument.call(image_data: image_data) }
|
38
40
|
|
41
|
+
cost_breakdown = build_cost_breakdown(shipment_results)
|
42
|
+
|
39
43
|
FriendlyShipping::ApiResult.new(
|
40
44
|
ShipmentInformation.new(
|
41
45
|
total: total_money,
|
@@ -44,12 +48,27 @@ module FriendlyShipping
|
|
44
48
|
pickup_request_number: pickup_request_number,
|
45
49
|
shipping_method: shipping_method,
|
46
50
|
warnings: warnings,
|
47
|
-
documents: documents
|
51
|
+
documents: documents,
|
52
|
+
data: {
|
53
|
+
cost_breakdown: cost_breakdown
|
54
|
+
}
|
48
55
|
),
|
49
56
|
original_request: request,
|
50
57
|
original_response: response
|
51
58
|
)
|
52
59
|
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def build_cost_breakdown(shipment_results)
|
64
|
+
{
|
65
|
+
"Rates" => shipment_results.fetch("Rate", []).each_with_object({}) do |rate, hash|
|
66
|
+
hash[rate.dig("Type", "Code")] = rate.dig("Factor", "Value")
|
67
|
+
end,
|
68
|
+
"TotalShipmentCharge" => shipment_results.dig("TotalShipmentCharge", "MonetaryValue"),
|
69
|
+
"BillableShipmentWeight" => shipment_results.dig("BillableShipmentWeight", "Value")
|
70
|
+
}.compact
|
71
|
+
end
|
53
72
|
end
|
54
73
|
end
|
55
74
|
end
|
@@ -10,7 +10,7 @@ module FriendlyShipping
|
|
10
10
|
|
11
11
|
def self.call(image_data:)
|
12
12
|
format_code = image_data.dig("Type", "Code")
|
13
|
-
graphic_image_b64 = image_data
|
13
|
+
graphic_image_b64 = image_data["GraphicImage"]
|
14
14
|
|
15
15
|
ShipmentDocument.new(
|
16
16
|
format: image_data.dig("Format", "Code").downcase.to_sym,
|
@@ -10,7 +10,8 @@ module FriendlyShipping
|
|
10
10
|
:total,
|
11
11
|
:bol_id,
|
12
12
|
:shipping_method,
|
13
|
-
:warnings
|
13
|
+
:warnings,
|
14
|
+
:data
|
14
15
|
|
15
16
|
def initialize(
|
16
17
|
total:,
|
@@ -19,7 +20,8 @@ module FriendlyShipping
|
|
19
20
|
pickup_request_number: nil,
|
20
21
|
documents: [],
|
21
22
|
shipping_method: nil,
|
22
|
-
warnings: nil
|
23
|
+
warnings: nil,
|
24
|
+
data: {}
|
23
25
|
)
|
24
26
|
@total = total
|
25
27
|
@bol_id = bol_id
|
@@ -28,6 +30,7 @@ module FriendlyShipping
|
|
28
30
|
@documents = documents
|
29
31
|
@shipping_method = shipping_method
|
30
32
|
@warnings = warnings
|
33
|
+
@data = data
|
31
34
|
end
|
32
35
|
end
|
33
36
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'dry/monads
|
3
|
+
require 'dry/monads'
|
4
4
|
require 'friendly_shipping/http_client'
|
5
5
|
require 'friendly_shipping/services/ups_freight/shipping_methods'
|
6
6
|
require 'friendly_shipping/services/ups_freight/rates_options'
|
@@ -18,12 +18,12 @@ require 'friendly_shipping/services/ups_freight/parse_freight_label_response'
|
|
18
18
|
require 'friendly_shipping/services/ups_freight/parse_freight_rate_response'
|
19
19
|
require 'friendly_shipping/services/ups_freight/generate_freight_rate_request_hash'
|
20
20
|
require 'friendly_shipping/services/ups_freight/generate_freight_ship_request_hash'
|
21
|
-
require 'friendly_shipping/services/ups_freight/
|
21
|
+
require 'friendly_shipping/services/ups_freight/api_error'
|
22
22
|
|
23
23
|
module FriendlyShipping
|
24
24
|
module Services
|
25
25
|
class UpsFreight
|
26
|
-
include Dry::Monads
|
26
|
+
include Dry::Monads[:result]
|
27
27
|
|
28
28
|
attr_reader :test, :key, :login, :password, :client
|
29
29
|
|
@@ -42,12 +42,14 @@ module FriendlyShipping
|
|
42
42
|
labels: '/ship/v1607/freight/shipments/Ground'
|
43
43
|
}.freeze
|
44
44
|
|
45
|
-
def initialize(key:, login:, password:, test: true, client:
|
45
|
+
def initialize(key:, login:, password:, test: true, client: nil)
|
46
46
|
@key = key
|
47
47
|
@login = login
|
48
48
|
@password = password
|
49
49
|
@test = test
|
50
|
-
|
50
|
+
|
51
|
+
error_handler = ApiErrorHandler.new(api_error_class: UpsFreight::ApiError)
|
52
|
+
@client = client || HttpClient.new(error_handler: error_handler)
|
51
53
|
end
|
52
54
|
|
53
55
|
def carriers
|
@@ -87,6 +89,7 @@ module FriendlyShipping
|
|
87
89
|
url = base_url + RESOURCES[action]
|
88
90
|
FriendlyShipping::Request.new(
|
89
91
|
url: url,
|
92
|
+
http_method: "POST",
|
90
93
|
body: payload.to_json,
|
91
94
|
headers: {
|
92
95
|
Content_Type: 'application/json',
|
@@ -55,6 +55,8 @@ module FriendlyShipping
|
|
55
55
|
RATE_TAG = 'Rate'
|
56
56
|
COMMERCIAL_RATE_TAG = 'CommercialRate'
|
57
57
|
COMMERCIAL_PLUS_RATE_TAG = 'CommercialPlusRate'
|
58
|
+
DIMENSIONAL_WEIGHT_RATE = 'DimensionalWeightRate'
|
59
|
+
FEES = './/Fees/Fee'
|
58
60
|
CURRENCY = Money::Currency.new('USD').freeze
|
59
61
|
|
60
62
|
class << self
|
@@ -119,6 +121,17 @@ module FriendlyShipping
|
|
119
121
|
box_name_match = service_name.match(/#{BOX_REGEX}/)
|
120
122
|
box_name = box_name_match ? box_name_match.named_captures.compact.keys.last.to_sym : :variable
|
121
123
|
|
124
|
+
dimensional_weight_rate = rate_node.at(DIMENSIONAL_WEIGHT_RATE)&.text&.to_i
|
125
|
+
|
126
|
+
fees = rate_node.xpath(FEES).map do |fee_node|
|
127
|
+
type = fee_node.at('FeeType').text
|
128
|
+
price = fee_node.at('FeePrice').text.to_d
|
129
|
+
{
|
130
|
+
type: type,
|
131
|
+
price: Money.new(price * CURRENCY.subunit_to_unit, CURRENCY)
|
132
|
+
}
|
133
|
+
end
|
134
|
+
|
122
135
|
# Combine all the gathered information in a FriendlyShipping::Rate object.
|
123
136
|
# Careful: This rate is only for one package within the shipment, and we get multiple
|
124
137
|
# rates per package for the different shipping method/box/hold for pickup combinations.
|
@@ -132,7 +145,9 @@ module FriendlyShipping
|
|
132
145
|
days_to_delivery: days_to_delivery,
|
133
146
|
military: military,
|
134
147
|
full_mail_service: service_name,
|
135
|
-
service_code: service_code
|
148
|
+
service_code: service_code,
|
149
|
+
dimensional_weight_rate: dimensional_weight_rate,
|
150
|
+
fees: fees
|
136
151
|
}
|
137
152
|
)
|
138
153
|
end
|
@@ -20,7 +20,7 @@ module FriendlyShipping
|
|
20
20
|
package_options_class: FriendlyShipping::Services::Usps::RateEstimatePackageOptions,
|
21
21
|
**kwargs
|
22
22
|
)
|
23
|
-
super
|
23
|
+
super(**kwargs.merge(package_options_class: package_options_class))
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -8,6 +8,8 @@ module FriendlyShipping
|
|
8
8
|
#
|
9
9
|
# @param [Symbol] box_name The type of box we want to get rates for. Has to be one of the keys
|
10
10
|
# of FriendlyShipping::Services::Usps::CONTAINERS.
|
11
|
+
# @param [Symbol] return_dimensional_weight Boolean indicating whether the response should include dimensional weight.
|
12
|
+
# @param [Symbol] return_fees Boolean indicating whether the response should include fees.
|
11
13
|
class Usps
|
12
14
|
class RateEstimatePackageOptions < FriendlyShipping::PackageOptions
|
13
15
|
attr_reader :box_name,
|
@@ -16,26 +18,22 @@ module FriendlyShipping
|
|
16
18
|
:hold_for_pickup,
|
17
19
|
:shipping_method,
|
18
20
|
:transmit_dimensions,
|
19
|
-
:rectangular
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
hold_for_pickup: false,
|
26
|
-
shipping_method: nil,
|
27
|
-
transmit_dimensions: true,
|
28
|
-
rectangular: true,
|
29
|
-
**kwargs
|
30
|
-
)
|
21
|
+
:rectangular,
|
22
|
+
:return_dimensional_weight,
|
23
|
+
:return_fees
|
24
|
+
|
25
|
+
def initialize(**kwargs)
|
26
|
+
box_name = value_or_default(:box_name, :variable, kwargs)
|
31
27
|
@box_name = CONTAINERS.key?(box_name) ? box_name : :variable
|
32
|
-
@commercial_pricing = commercial_pricing
|
33
|
-
@first_class_mail_type = first_class_mail_type
|
34
|
-
@hold_for_pickup = hold_for_pickup
|
35
|
-
@shipping_method = shipping_method
|
36
|
-
@transmit_dimensions = transmit_dimensions
|
37
|
-
@rectangular = rectangular
|
38
|
-
|
28
|
+
@commercial_pricing = value_or_default(:commercial_pricing, false, kwargs)
|
29
|
+
@first_class_mail_type = kwargs.delete(:first_class_mail_type)
|
30
|
+
@hold_for_pickup = value_or_default(:hold_for_pickup, false, kwargs)
|
31
|
+
@shipping_method = kwargs.delete(:shipping_method)
|
32
|
+
@transmit_dimensions = value_or_default(:transmit_dimensions, true, kwargs)
|
33
|
+
@rectangular = value_or_default(:rectangular, true, kwargs)
|
34
|
+
@return_dimensional_weight = value_or_default(:return_dimensional_weight, true, kwargs)
|
35
|
+
@return_fees = value_or_default(:return_fees, false, kwargs)
|
36
|
+
super(**kwargs)
|
39
37
|
end
|
40
38
|
|
41
39
|
def container_code
|
@@ -57,6 +55,12 @@ module FriendlyShipping
|
|
57
55
|
service_code << 'COMMERCIAL' if commercial_pricing
|
58
56
|
service_code.join(' ')
|
59
57
|
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def value_or_default(key, default, kwargs)
|
62
|
+
kwargs.key?(key) ? kwargs.delete(key) : default
|
63
|
+
end
|
60
64
|
end
|
61
65
|
end
|
62
66
|
end
|
@@ -16,7 +16,7 @@ require 'friendly_shipping/services/usps/rate_estimate_options'
|
|
16
16
|
module FriendlyShipping
|
17
17
|
module Services
|
18
18
|
class Usps
|
19
|
-
include Dry::Monads
|
19
|
+
include Dry::Monads[:result]
|
20
20
|
|
21
21
|
attr_reader :test, :login, :client
|
22
22
|
|
@@ -111,6 +111,7 @@ module FriendlyShipping
|
|
111
111
|
def build_request(api:, xml:, debug:)
|
112
112
|
FriendlyShipping::Request.new(
|
113
113
|
url: base_url,
|
114
|
+
http_method: "POST",
|
114
115
|
body: "API=#{RESOURCES[api]}&XML=#{CGI.escape xml}",
|
115
116
|
readable_body: xml,
|
116
117
|
debug: debug
|
data/lib/friendly_shipping.rb
CHANGED
@@ -18,6 +18,7 @@ require "friendly_shipping/api_failure"
|
|
18
18
|
|
19
19
|
require "friendly_shipping/services/ship_engine"
|
20
20
|
require "friendly_shipping/services/ups"
|
21
|
+
require "friendly_shipping/services/ups_freight"
|
21
22
|
require "friendly_shipping/services/usps"
|
22
23
|
|
23
24
|
module FriendlyShipping
|