Class: Caboose::ShippingCalculator

Inherits:
Object
  • Object
show all
Defined in:
app/models/caboose/shipping_calculator.rb

Class Method Summary collapse

Class Method Details

.rate(order) ⇒ Object



50
51
52
53
54
# File 'app/models/caboose/shipping_calculator.rb', line 50

def self.rate(order)
  return nil if !order.shipping_method_code
  self.rates(order).each { |rate| return rate if rate[:service_code] == order.shipping_method_code }
  return nil
end

.rates(order) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'app/models/caboose/shipping_calculator.rb', line 7

def self.rates(order)
  return [] if Caboose::store_shipping.nil?
  
  ss = Caboose::store_shipping
  origin = Location.new(
    :country => ss[:origin][:country],
    :state   => ss[:origin][:state],
    :city    => ss[:origin][:city],
    :zip     => ss[:origin][:zip]
  )      
  destination = Location.new(
    :country     => ss[:origin][:country],
    :state       => order.shipping_address.state,
    :city        => order.shipping_address.city,
    :postal_code => order.shipping_address.zip
  )      
  ups = ss[:ups] ? UPS.new(:key => ss[:ups][:key], :login => ss[:ups][:username], :password => ss[:ups][:password], :origin_account => ss[:ups][:origin_account]) : nil        
  usps = ss[:usps] ? USPS.new(:login => ss[:usps][:username]) : nil                        
              
  all_rates = []
  order.packages.each do |op|              
    sp = op.shipping_package
    package = op.activemerchant_package
    rates = []
    if ups                  
      resp = ups.find_rates(origin, destination, package)      
      resp.rates.sort_by(&:price).each do |rate|
        next if rate.service_code != sp.service_code            
        rates << { :carrier => 'UPS', :service_code => rate.service_code, :service_name => rate.service_name, :price => rate.total_price.to_d / 100 }
      end
    end
    if usps
      resp = usps.find_rates(origin, destination, package)
      resp.rates.sort_by(&:price).each do |rate|
        next if rate.service_code != sp.service_code            
        rates << { :carrier => 'USPS', :service_code => rate.service_code, :service_name => rate.service_name, :total_price  => rate.total_price.to_d / 100 }
      end
    end
    all_rates << [op, rates]
  end            
  return all_rates
end