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