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