class ActiveShipping::Kunaki

Constants

CARRIERS
COUNTRIES
URL

Public Instance Methods

find_rates(origin, destination, packages, options = {}) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 66
def find_rates(origin, destination, packages, options = {})
  requires!(options, :items)
  commit(origin, destination, options)
end
valid_credentials?() click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 71
def valid_credentials?
  true
end

Private Instance Methods

build_rate_estimates(response, origin, destination) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 109
def build_rate_estimates(response, origin, destination)
  response["Options"].collect do |quote|
    RateEstimate.new(origin, destination, carrier_for(quote["Description"]), quote["Description"],
                     :total_price  => quote["Price"],
                     :currency     => "USD"
    )
  end
end
build_request(destination, options) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 77
def build_request(destination, options)
  country = COUNTRIES[destination.country_code]
  state_province = %w(US CA).include?(destination.country_code.to_s) ? destination.state : ''

  builder = Nokogiri::XML::Builder.new do |xml|
    xml.ShippingOptions do
      xml.AddressInfo do
        xml.Country(country)
        xml.State_Province(state_province)
        xml.PostalCode(destination.zip)
      end

      options[:items].each do |item|
        xml.Product do
          xml.ProductId(item[:sku])
          xml.Quantity(item[:quantity])
        end
      end
    end
  end
  builder.to_xml
end
carrier_for(service) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 118
def carrier_for(service)
  CARRIERS.dup.find { |carrier| service.to_s =~ /^#{carrier}/i } || service.to_s.split(" ").first
end
commit(origin, destination, options) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 100
def commit(origin, destination, options)
  request = build_request(destination, options)
  response = parse( ssl_post(URL, request, "Content-Type" => "text/xml") )

  RateResponse.new(success?(response), message_from(response), response,
                   :rates => build_rate_estimates(response, origin, destination)
  )
end
message_from(response) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 151
def message_from(response)
  response["ErrorText"]
end
parse(xml) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 122
def parse(xml)
  response = {}
  response["Options"] = []

  document = Nokogiri.XML(sanitize(xml))

  response["ErrorCode"] = document.at('/Response/ErrorCode').text
  response["ErrorText"] = document.at('/Response/ErrorText').text

  document.xpath("Response/Option").each do |node|
    rate = {}
    rate["Description"] = node.at("Description").text
    rate["Price"]       = node.at("Price").text
    response["Options"] << rate
  end
  response
end
sanitize(response) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 140
def sanitize(response)
  result = response.to_s
  result.gsub!("\r\n", "")
  result.gsub!(/<(\/)?(BODY|HTML)>/, '')
  result
end
success?(response) click to toggle source
# File lib/active_shipping/carriers/kunaki.rb, line 147
def success?(response)
  response["ErrorCode"] == "0"
end