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