Class: Shipping::Container
- Inherits:
-
Object
- Object
- Shipping::Container
show all
- Includes:
- ActiveModel::API, ActiveModel::Attributes
- Defined in:
- app/services/shipping/container.rb
Overview
Defined Under Namespace
Classes: InvalidPackageDimensions
Constant Summary
collapse
- DIM_WEIGHT_DIVISOR =
Choose UPS's dimensional weight divisor (also Purolator's ground divisor) which can represent the generic/standard value
139
- LARGE_PACKAGE_THRESHOLD =
Choose UPS's threshold (also Purolator's threshold) which can represent the generic/standard value
130
- LARGE_PACKAGE_MIN_WEIGHT =
Choose UPS's minimum weight for large packages which can represent the generic/standard value
90
- CLOSE_TO_PERCENT_THRESHOLD =
Default percentage to use to decide if one package is close to another in terms of dimensions and weight
20.0
- CLOSE_TO_MIN_DIM_DELTA =
Minimum absolute difference (inches) to count as a real discrepancy
2.0
- CLOSE_TO_MIN_WEIGHT_DELTA =
Minimum absolute difference (lbs) to count as a real discrepancy
2.0
Instance Method Summary
collapse
Constructor Details
#initialize(length:, width:, height:, weight: nil, container_type: Shipment.container_types.keys.first, flat_rate_package_type: nil) ⇒ Container
Returns a new instance of Container.
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'app/services/shipping/container.rb', line 25
def initialize(length:, width:, height:, weight: nil, container_type: Shipment.container_types.keys.first, flat_rate_package_type: nil)
super()
raise InvalidPackageDimensions unless length && width && height
self.length, self.width, self.height = *[length, width, height].sort.reverse
self.weight = weight.to_f.positive? ? weight : 0.1 self.length = 1 if self.length < 1
self.width = 1 if self.width < 1
self.height = 1 if self.height < 1
self.container_type = container_type
self.flat_rate_package_type = flat_rate_package_type
end
|
Instance Method Details
#add_content(item_id, quantity) ⇒ Object
40
41
42
|
# File 'app/services/shipping/container.rb', line 40
def add_content(item_id, quantity)
contents << Shipping::PackageContent.new(item_id: item_id, quantity: quantity)
end
|
#billable_weight ⇒ Object
72
73
74
75
76
|
# File 'app/services/shipping/container.rb', line 72
def billable_weight
weights = [dimensional_weight, weight]
weights << LARGE_PACKAGE_MIN_WEIGHT if large_package_surcharge?
weights.max.ceil
end
|
#close_to?(package_to_compare:, percent_threshold: nil, exclude_weight: false) ⇒ Boolean
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
# File 'app/services/shipping/container.rb', line 82
def close_to?(package_to_compare:, percent_threshold: nil, exclude_weight: false)
res = true
percent_threshold ||= CLOSE_TO_PERCENT_THRESHOLD
dim_syms_to_check = %i[length width height]
dim_syms_to_check += [:weight] unless exclude_weight
dim_syms_to_check.each do |dim_sym|
dim = send(dim_sym)
compare_dim = package_to_compare.send(dim_sym)
abs_delta = (dim - compare_dim).abs
min_delta = dim_sym == :weight ? CLOSE_TO_MIN_WEIGHT_DELTA : CLOSE_TO_MIN_DIM_DELTA
next if abs_delta < min_delta
discrepancy_percent = dim.zero? ? 100.0 : 100.0 * abs_delta / dim
Rails.logger.debug { "Shipping::Container close_to? percent_threshold: #{percent_threshold}%, compare_dim: #{compare_dim}, discrepancy_percent: #{discrepancy_percent}%" }
res = false if discrepancy_percent > percent_threshold
end
res
end
|
#cubic_size ⇒ Object
56
57
58
|
# File 'app/services/shipping/container.rb', line 56
def cubic_size
length * width * height
end
|
#cubic_size_in_ft ⇒ Object
60
61
62
|
# File 'app/services/shipping/container.rb', line 60
def cubic_size_in_ft
cubic_size / 1728.0
end
|
#dimensional_weight ⇒ Object
68
69
70
|
# File 'app/services/shipping/container.rb', line 68
def dimensional_weight
(rounded_cubic_size / DIM_WEIGHT_DIVISOR).ceil end
|
#girth ⇒ Object
44
45
46
|
# File 'app/services/shipping/container.rb', line 44
def girth
2.0 * (width + height)
end
|
#large_package_surcharge? ⇒ Boolean
78
79
80
|
# File 'app/services/shipping/container.rb', line 78
def large_package_surcharge?
length_plus_girth > LARGE_PACKAGE_THRESHOLD
end
|
#length_plus_girth ⇒ Object
48
49
50
|
# File 'app/services/shipping/container.rb', line 48
def length_plus_girth
(length + girth).ceil
end
|
#rounded_cubic_size ⇒ Object
52
53
54
|
# File 'app/services/shipping/container.rb', line 52
def rounded_cubic_size
length.round * width.round * height.round
end
|
#surface ⇒ Object
64
65
66
|
# File 'app/services/shipping/container.rb', line 64
def surface
2 * ((length * height) + (width * height))
end
|