module Shippinglogic
class FedEx
# An interface to the signature proof of delivery services provided by FedEx. Allows you to get an image
# of the signature, or you can tell fedex to fax it to a fax number.
#
# == Accessor methods / options
#
# * tracking_number - the tracking number
# * image_type - one of SIGNATURE_IMAGE_TYPES. (default: LETTER)
# * image_file_type - one of LABEL_FILE_TYPES. (default: PDF)
# * fax_number - if image_type is set to FAX you must provide a fax number here. (default: nil)
#
# === Simple Example
#
# Here is a very simple example:
#
# fedex = Shippinglogic::FedEx.new(key, password, account, meter)
# signature = fedex.signature(:tracking_number => "my number")
#
# signature.inspect
# # => #
#
# signature.image
# # => "a bunch of garble (write this to a file and save it)"
class Signature < Service
# Each tracking result is an object of this class
class Signature; attr_accessor :image; end
VERSION = {:major => 3, :intermediate => 0, :minor => 0}
attribute :image_type, :string, :default => "LETTER"
attribute :image_file_type, :string, :default => "PDF"
attribute :tracking_number, :string
attribute :fax_number, :string
private
# The parent class Service requires that we define this method. This is our kicker. This method is only
# called when we need to deal with information from FedEx. Notice the caching into the @target variable.
def target
@target ||= parse_response(request(build_request))
end
# Just building some XML to send off to FedEx. FedEx require this particualr format.
def build_request
b = builder
xml = b.SignatureProofOfDeliveryRequest(:xmlns => "http://fedex.com/ws/track/v#{VERSION[:major]}") do
build_authentication(b)
build_version(b, "trck", VERSION[:major], VERSION[:intermediate], VERSION[:minor])
b.Type image_type
b.TrackingNumber tracking_number
b.FaxDetail fax_number if fax_number
b.LetterFormat image_file_type
end
end
# Grabbing the response from FedEx and making sense of it. There is a lot of unneeded information
# in the response.
def parse_response(response)
signature = Signature.new
signature.image = Base64.decode64(response[:letter])
signature
end
end
end
end