Class: Shipping::FreightPalletCalculator

Inherits:
Object
  • Object
show all
Defined in:
app/services/shipping/freight_pallet_calculator.rb

Overview

Calculates LTL freight pallet packages from a list of goods line items.

Extracted from Packaging.get_freight_pallet_packages_hash_from so it can be
called directly by Shipping::DeterminePackaging without going through the
legacy Packaging model at runtime.

Returns a hash: { weights: Array, dimensions: Array, container_types: Array }
Each index corresponds to one pallet/crate in the shipment.

== Crate items
Items with Item#ships_via_crate? == true are grouped into crates and
mounted on pallets. Multiple crates are created when stacking would exceed
72" in width.

== Standard pallet items
Remaining items use a density-weighted pallet volume formula.
Pallet footprint is 48×40" (standard) or 72×40" when any item exceeds 50".
Maximum pallet height is 5 ft; orders needing more height get extra pallets
with even weight distribution.

Constant Summary collapse

CRATE_PADDING =

Pallet/crate physical limits — mirrors Packaging model constants.

Packaging::CRATE_PADDING
LTL_FREIGHT_WASTED_SPACE_FACTOR =
Packaging::LTL_FREIGHT_WASTED_SPACE_IN_PALLETS_FACTOR
LTL_FREIGHT_MAX_PALLET_HEIGHT_IN_FT =
Packaging::LTL_FREIGHT_MAX_PALLET_HEIGHT_IN_FT
LTL_FREIGHT_MIN_PALLET_HEIGHT_IN_INCHES =
Packaging::LTL_FREIGHT_MIN_PALLET_HEIGHT_IN_INCHES

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(line_items) ⇒ FreightPalletCalculator

Returns a new instance of FreightPalletCalculator.



36
37
38
# File 'app/services/shipping/freight_pallet_calculator.rb', line 36

def initialize(line_items)
  @line_items = line_items
end

Class Method Details

.call(line_items) ⇒ Hash

Returns { weights: [], dimensions: [], container_types: [] }.

Parameters:

  • line_items (Array<LineItem>)

    goods-only line items (already filtered)

Returns:

  • (Hash)

    { weights: [], dimensions: [], container_types: [] }



32
33
34
# File 'app/services/shipping/freight_pallet_calculator.rb', line 32

def self.call(line_items)
  new(line_items).call
end

Instance Method Details

#callObject



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'app/services/shipping/freight_pallet_calculator.rb', line 40

def call
  weights        = []
  dimensions     = []
  container_types = []

  crate_line_items  = @line_items.select { |li| li.item.ships_via_crate? }
  pallet_line_items = @line_items - crate_line_items

  build_crates(crate_line_items, weights, dimensions, container_types) if crate_line_items.any?
  build_pallets(pallet_line_items, weights, dimensions, container_types) if pallet_line_items.any?

  { weights: weights, dimensions: dimensions, container_types: container_types }
end