lib/fedex/request/base.rb in fedex-2.0.1 vs lib/fedex/request/base.rb in fedex-2.2.0

- old
+ new

@@ -15,13 +15,10 @@ TEST_URL = "https://gatewaybeta.fedex.com:443/xml/" # Fedex Production URL PRODUCTION_URL = "https://gateway.fedex.com:443/xml/" - # Fedex Version number for the Fedex service used - VERSION = 10 - # List of available Service Types SERVICE_TYPES = %w(EUROPE_FIRST_INTERNATIONAL_PRIORITY FEDEX_1_DAY_FREIGHT FEDEX_2_DAY FEDEX_2_DAY_AM FEDEX_2_DAY_FREIGHT FEDEX_3_DAY_FREIGHT FEDEX_EXPRESS_SAVER FEDEX_FIRST_FREIGHT FEDEX_FREIGHT_ECONOMY FEDEX_FREIGHT_PRIORITY FEDEX_GROUND FIRST_OVERNIGHT GROUND_HOME_DELIVERY INTERNATIONAL_ECONOMY INTERNATIONAL_ECONOMY_FREIGHT INTERNATIONAL_FIRST INTERNATIONAL_PRIORITY INTERNATIONAL_PRIORITY_FREIGHT PRIORITY_OVERNIGHT SMART_POST STANDARD_OVERNIGHT) # List of available Packaging Type PACKAGING_TYPES = %w(FEDEX_10KG_BOX FEDEX_25KG_BOX FEDEX_BOX FEDEX_ENVELOPE FEDEX_PAK FEDEX_TUBE YOUR_PACKAGING) @@ -46,10 +43,11 @@ # return a Fedex::Request::Base object def initialize(credentials, options={}) requires!(options, :shipper, :recipient, :packages, :service_type) @credentials = credentials @shipper, @recipient, @packages, @service_type, @customs_clearance, @debug = options[:shipper], options[:recipient], options[:packages], options[:service_type], options[:customs_clearance], options[:debug] + @debug = ENV['DEBUG'] == 'true' @shipping_options = options[:shipping_options] ||={} end # Sends post request to Fedex web service and parse the response. # Implemented by each subclass @@ -71,18 +69,22 @@ # Add Client Detail information(account_number and meter_number) to xml request def add_client_detail(xml) xml.ClientDetail{ xml.AccountNumber @credentials.account_number xml.MeterNumber @credentials.meter + xml.Localization{ + xml.LanguageCode 'en' # English + xml.LocaleCode 'us' # United States + } } end # Add Version to xml request, using the latest version V10 Sept/2011 def add_version(xml) xml.Version{ - xml.ServiceId service_id - xml.Major VERSION + xml.ServiceId service[:id] + xml.Major service[:version] xml.Intermediate 0 xml.Minor 0 } end @@ -162,24 +164,34 @@ xml.GroupPackageCount 1 xml.Weight{ xml.Units package[:weight][:units] xml.Value package[:weight][:value] } - xml.Dimensions{ - xml.Length package[:dimensions][:length] - xml.Width package[:dimensions][:width] - xml.Height package[:dimensions][:height] - xml.Units package[:dimensions][:units] - } + if package[:dimensions] + xml.Dimensions{ + xml.Length package[:dimensions][:length] + xml.Width package[:dimensions][:width] + xml.Height package[:dimensions][:height] + xml.Units package[:dimensions][:units] + } + end + if package[:customer_refrences] + xml.CustomerReferences{ + package[:customer_refrences].each do |value| + xml.CustomerReferenceType 'CUSTOMER_REFERENCE' + xml.Value value + end + } + end } end end # Add customs clearance(for international shipments) def add_customs_clearance(xml) xml.CustomsClearanceDetail{ - customs_to_xml(xml, @customs_clearance) + hash_to_xml(xml, @customs_clearance) } end # Fedex Web Service Api def api_url @@ -190,48 +202,49 @@ # Implemented by each subclass def build_xml raise NotImplementedError, "Override build_xml in subclass" end - # Build nodes dinamically from the provided customs clearance hash - def customs_to_xml(xml, hash) + # Build xml nodes dynamically from the hash keys and values + def hash_to_xml(xml, hash) hash.each do |key, value| + element = camelize(key) if value.is_a?(Hash) - xml.send "#{camelize(key.to_s)}" do |x| - customs_to_xml(x, value) + xml.send element do |x| + hash_to_xml(x, value) end elsif value.is_a?(Array) - node = key value.each do |v| - xml.send "#{camelize(node.to_s)}" do |x| - customs_to_xml(x, v) - end - end + xml.send element do |x| + hash_to_xml(x, v) + end + end else - xml.send "#{camelize(key.to_s)}", value unless key.is_a?(Hash) + xml.send element, value end end end # Parse response, convert keys to underscore symbols def parse_response(response) response = sanitize_response_keys(response) end - # Recursively sanitizes the response object by clenaing up any hash keys. + # Recursively sanitizes the response object by cleaning up any hash keys. def sanitize_response_keys(response) if response.is_a?(Hash) response.inject({}) { |result, (key, value)| result[underscorize(key).to_sym] = sanitize_response_keys(value); result } elsif response.is_a?(Array) response.collect { |result| sanitize_response_keys(result) } else response end end - def service_id - 'crs' + def service + raise NotImplementedError, + "Override service in subclass: {:id => 'service', :version => 1}" end # Use GROUND_HOME_DELIVERY for shipments going to a residential address within the US. def service_type if @recipient[:residential].to_s =~ /true/i and @service_type =~ /GROUND/i and @recipient[:country_code] =~ /US/i @@ -246,6 +259,6 @@ (!response[:rate_reply].nil? and %w{SUCCESS WARNING NOTE}.include? response[:rate_reply][:highest_severity]) end end end -end \ No newline at end of file +end