class Bodega::ShippingMethod::Base

Attributes

order[RW]

Public Class Methods

new(order) click to toggle source
# File lib/bodega/shipping_method/base.rb, line 11
def initialize(order)
  self.order = order
end

Public Instance Methods

rates() click to toggle source
# File lib/bodega/shipping_method/base.rb, line 15
def rates
  return {} unless packages.any?
  @rates ||= {}.tap do |rates|
    response = client.find_rates(origin, destination, packages)
    response.rates.sort_by(&:price).each do |rate|
      rates[rate.service_code] = {
        name: rate.service_name,
        price: rate.price
      }
    end
  end
end

Private Instance Methods

client() click to toggle source
# File lib/bodega/shipping_method/base.rb, line 29
def client
  raise "Implement #{self.class}#client to return an instance of an ActiveMerchant::Shipping method"
end
destination() click to toggle source
# File lib/bodega/shipping_method/base.rb, line 33
def destination
  @destination ||= location_for(order)
end
location_for(location_object) click to toggle source
# File lib/bodega/shipping_method/base.rb, line 37
def location_for(location_object)
  Location.new(country: Bodega.config.shipping.origin.country, zip: location_object.postal_code)
end
origin() click to toggle source
# File lib/bodega/shipping_method/base.rb, line 41
def origin
  @origin ||= location_for(Bodega.config.shipping.origin)
end
packages() click to toggle source
# File lib/bodega/shipping_method/base.rb, line 45
def packages
  @packages ||= [].tap do |packages|
    order.order_products.each do |order_product|
      packages.push(*packages_for(order_product)) if shippable?(order_product.product)
    end
  end
end
packages_for(order_product) click to toggle source
# File lib/bodega/shipping_method/base.rb, line 53
def packages_for(order_product)
  product = order_product.product
  packages = []
  order_product.quantity.times do
    packages.push(Package.new(product.weight, product.dimensions, units: Bodega.config.shipping.units))
  end
  packages
end
shippable?(product) click to toggle source
# File lib/bodega/shipping_method/base.rb, line 62
def shippable?(product)
  product.respond_to?(:weight) && product.respond_to?(:dimensions)
end