class Dhl::Client

Public Class Methods

new(options) click to toggle source
# File lib/dhl/client.rb, line 19
def initialize(options)
  config.username ||= options[:username]
  raise 'Provide a username (e.g.: `export DHL_USERNAME=dhlusername`).' if !config.username

  config.password ||= options[:password]
  raise 'Provide a password (e.g.: `export DHL_PASSWORD=dhlpassword`).' if !config.password

  config.account ||= options[:account]
  raise 'Provide a DHL account number (e.g.: `export DHL_ACCOUNT=123456789`).' if !config.account

  @requests_soap_client = Savon.client(client_options.merge(wsdl: "https://wsbuat.dhl.com:8300/amer/GEeuExpressRateBook?WSDL"))
  @tracking_soap_client = Savon.client(client_options.merge(wsdl: "https://wsbuat.dhl.com:8300/gbl/glDHLExpressTrack?WSDL"))
end

Public Instance Methods

client_options() click to toggle source
# File lib/dhl/client.rb, line 8
def client_options
  {
    wsse_auth: [config.username, config.password],
    wsse_timestamp: true,
    convert_request_keys_to: :camelcase,
    namespaces: {
      "xmlns:dhl" => "http://www.dhl.com"
    }
  }
end
config() click to toggle source
# File lib/dhl/client.rb, line 4
def config
  Dhl.config
end
request_shipment(shipment_request) click to toggle source
# File lib/dhl/client.rb, line 46
def request_shipment(shipment_request)
  response = requests_soap_client.call(:create_shipment_request, message: shipment_request.to_hash )

  data = response.body[:shipment_response][:notification]
  notification = data.include?(:@code) ? data : data.first

  raise Dhl::Error::Generic.new(notification[:@code], notification[:message]) unless notification[:@code] == '0'

  result = {}

  image_format = response.body[:shipment_response][:label_image][:label_image_format]
  shipment_identification_number = response.body[:shipment_response][:shipment_identification_number]
  shipping_label_filename = "#{shipment_identification_number}.#{image_format.downcase}"
  Dir.mkdir('labels') unless File.exists?('labels')
  File.open("labels/#{shipping_label_filename}", 'wb') do |f|
    f.write( Base64.decode64( response.body[:shipment_response][:label_image][:graphic_image]) )
    result[:shipping_label] = File.absolute_path(f)
  end

  package_result = response.body[:shipment_response][:packages_result][:package_result]
  result[:tracking_number] = shipment_identification_number

  result
end
requests_soap_client() click to toggle source
# File lib/dhl/client.rb, line 33
def requests_soap_client
  # SOAP Client operations:
  # => [:get_rate_request, :create_shipment_request, :delete_shipment_request]
  @requests_soap_client
end
track(number) click to toggle source
# File lib/dhl/client.rb, line 71
def track(number)
  request = Tracking::Request.new(number)
  response = tracking_soap_client.call(:track_shipment_request, message: request.to_hash)
  Tracking::Response.new(response.body)
end
tracking_soap_client() click to toggle source
# File lib/dhl/client.rb, line 39
def tracking_soap_client
  # SOAP Client operations:
  # => [:track_shipment_request]
  @tracking_soap_client
end