class CanadaPost::Request::Rate

Attributes

package[RW]
recipient[RW]
shipper[RW]

Public Class Methods

new(credentials, options={}) click to toggle source
Calls superclass method CanadaPost::Request::Base::new
# File lib/canada_post/request/rate.rb, line 7
def initialize(credentials, options={})
  requires!(options, :shipper, :recipient, :package)
  @credentials = credentials
  @shipper, @recipient, @package, @service_type = options[:shipper], options[:recipient], options[:package], options[:service_type]
  super(credentials)
end

Public Instance Methods

process_request() click to toggle source
# File lib/canada_post/request/rate.rb, line 14
def process_request
  api_response = client(rate_url, build_xml, rate_headers)
  response = parse_response(api_response)

  if success?(response)
    rate_reply_details = response[:price_quotes][:price_quote] || []
    rate_reply_details = [rate_reply_details] if rate_reply_details.is_a? Hash
    rate_reply_details.map do |rate_reply|
      CanadaPost::Rate.new(rate_reply)
    end
  else
    error_message =
      if response[:messages]
        response[:messages][:message][:description]
      else
        'api_response.response'
      end
    raise RateError, error_message
  end
end

Private Instance Methods

add_destination(xml) click to toggle source
# File lib/canada_post/request/rate.rb, line 92
def add_destination(xml)
  if @recipient[:country_code] == "CA"
    xml.domestic {
      xml.send(:"postal-code", @recipient[:postal_code])
    }
  elsif @recipient[:country_code] == "US"
    xml.send(:"united-states") {
      xml.send(:"zip-code", @recipient[:postal_code])
    }
  else
    xml.international {
      xml.send(:"country-code", @recipient[:country_code])
    }
  end
end
add_package(xml) click to toggle source
# File lib/canada_post/request/rate.rb, line 76
def add_package(xml)
  xml.send(:"parcel-characteristics") {
    xml.weight @package[:weight][:value]
    if @package[:dimensions]
      xml.dimensions {
        xml.height @package[:dimensions][:height].round(1)
        xml.width @package[:dimensions][:width].round(1)
        xml.length @package[:dimensions][:length].round(1)
      }
    end
    if @package[:cylinder]
      xml.send(:"mailing-tube", @package[:cylinder])
    end
  }
end
add_recipient(xml) click to toggle source
# File lib/canada_post/request/rate.rb, line 70
def add_recipient(xml)
  xml.destination {
    add_destination(xml)
  }
end
add_requested_shipment(xml) click to toggle source
# File lib/canada_post/request/rate.rb, line 58
def add_requested_shipment(xml)
  xml.send(:"customer-number", @customer_number)
  add_package(xml)
  add_services(xml)
  add_shipper(xml)
  add_recipient(xml)
end
add_services(xml) click to toggle source
# File lib/canada_post/request/rate.rb, line 108
def add_services(xml)
  if @service_type
    xml.services {
      xml.send(:"service-code", @service_type)
    }
  end
end
add_shipper(xml) click to toggle source
# File lib/canada_post/request/rate.rb, line 66
def add_shipper(xml)
  xml.send(:"origin-postal-code", @shipper[:postal_code])
end
build_xml() click to toggle source
# File lib/canada_post/request/rate.rb, line 48
def build_xml
  ns = "http://www.canadapost.ca/ws/ship/rate-v3"
  builder = Nokogiri::XML::Builder.new do |xml|
    xml.send(:"mailing-scenario", xmlns: ns) {
      add_requested_shipment(xml)
    }
  end
  builder.doc.root.to_xml
end
rate_headers() click to toggle source
# File lib/canada_post/request/rate.rb, line 41
def rate_headers
  {
    'Content-type' => 'application/vnd.cpc.ship.rate-v3+xml',
    'Accept' => 'application/vnd.cpc.ship.rate-v3+xml'
  }
end
rate_url() click to toggle source
# File lib/canada_post/request/rate.rb, line 37
def rate_url
  api_url + "/rs/ship/price"
end
success?(response) click to toggle source
# File lib/canada_post/request/rate.rb, line 116
def success?(response)
  response[:price_quotes]
end