ontrac-web-services 0.9.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 24a06b1c019fcaf0f2cbef819a1e49a08ae3816c
4
+ data.tar.gz: 171990d6bf720583f218d2a98357d08f783ee04a
5
+ SHA512:
6
+ metadata.gz: 5628443f315087ab0867490564a284581288fcaacad9322341643addd542356341aad80d2cb561b3336c8e0756a109e0539ca208adb35d3298c0749d9d967f40
7
+ data.tar.gz: 817be89a68a55a9cea04402c06b6849b1894020c181df5ff45460dedcca9ba8a9ab3bb1f2d13b23443765bf743e75062bb57c9eb0870cd9d464059e7003978cc
data/README.md CHANGED
@@ -1,48 +1,68 @@
1
1
  # ontrac-web-services
2
2
  ## Description
3
- This gem provides an interface to the OnTrac web services API. It interfaces with its HTTP/POST API to generate labels (looking up shipping rates and tracking coming soon).
3
+ This gem provides an interface to the OnTrac web services API. It interfaces with its HTTP/POST API to generate labels.
4
4
 
5
5
  ## Examples
6
6
  ### Creating a shipment with multiple packages
7
7
 
8
8
  ```ruby
9
- require 'ontrac'
9
+ require 'logger'
10
+ require 'ontrac'
10
11
 
11
- include ::Ontrac::WebServices
12
- include ::Ontrac::WebServices::Definitions
12
+ include ::Ontrac::WebServices
13
+ include ::Ontrac::WebServices::Definitions
13
14
 
14
- credentials = Service::Credentials.new("ACCOUNT #", "PASSWORD", "production")
15
- service = Service.new(credentials)
15
+ logger = Logger.new($stderr)
16
+ credentials = Service::Credentials.new("37", "testpass", "test")
17
+ service = Service.new(credentials, StringIO.new(debug_output = ""))
16
18
 
17
- shipper = ShipperData.new
18
- shipper.name = "Fulfillment Circle"
19
- shipper.address = "343 third street"
20
- shipper.suite = "suite 17"
21
- shipper.city = "sparks"
22
- shipper.state = "nv"
23
- shipper.zip = "89434"
24
- shipper.phone = "(415) 350-2608"
19
+ requests = [ 10.1, 22, 15 ].map do |package_weight|
20
+ ShipmentRequest.new.tap do |request|
21
+ request.shipper = Shipper.new.tap do |shipper|
22
+ shipper.Name = "Fulfillment Circle"
23
+ shipper.Addr1 = "343 Third Street\nSuite 17"
24
+ shipper.City = "sparks"
25
+ shipper.State = "NV"
26
+ shipper.Zip = "89434"
27
+ shipper.Contact = "John D."
28
+ shipper.Phone = "(415) 350-2608"
29
+ end
30
+ request.consignee = Consignee.new.tap do |consignee|
31
+ consignee.Name = "Joe Shmoe"
32
+ consignee.Addr1 = "123 4th St"
33
+ consignee.Addr2 = "Suite 315"
34
+ consignee.City = "San Luis Obispo"
35
+ consignee.State = "CA"
36
+ consignee.Zip = "93401"
37
+ consignee.Phone = "(805) 555-1234"
38
+ end
39
+ request.Service = SERVICE_TYPE_GROUND
40
+ request.SignatureRequired = false
41
+ request.Residential = true
42
+ request.SaturdayDel = false
43
+ request.Declared = 0
44
+ request.Weight = package_weight
45
+ request.LabelType = LABEL_TYPE_PDF
46
+ request.ShipDate = Time.new.strftime("%Y-%m-%d")
47
+ end
48
+ end
25
49
 
26
- recipient = DeliveryData.new
27
- recipient.name = "Joe Shmoe"
28
- recipient.address = "123 4th St"
29
- recipient.address2 = "Suite 315"
30
- recipient.city = "San Luis Obispo"
31
- recipient.state = "CA"
32
- recipient.zip = "93401"
33
- recipient.phone = "(805) 555-1234"
34
-
35
- responses = service.request_shipment(SERVICE_TYPE_GROUND, shipper, recipient, LABEL_TYPE_PDF,
36
- [ 22.0, 15, 10 ]) do |package_data, package_num|
37
-
38
- package_data.package_detail.residential = false
39
- package_data.package_detail.reference = "order #1234"
40
- end
41
-
42
- tracking_numbers = responses.map do |(tracking_number, label, charge)|
43
- puts "tracking number: #{tracking_number}"
44
- puts "charge: #{charge.to_f}"
45
- File.open("#{tracking_number}.pdf", "w") { |f| f << label }
46
- tracking_number
47
- end
50
+ begin
51
+ service.post_shipments(requests).each do |(tracking_number, label, charge)|
52
+ File.open("#{tracking_number}.pdf", "w") { |f| f << label }
53
+ logger.info("label: ./#{tracking_number}.pdf, charge: #{charge}")
54
+ end
55
+ rescue ServiceException => err
56
+ logger.error("OnTrac Service Exception: #{err.message}")
57
+ logger.error("Root Error: #{err.root_error}") if (err.root_error && !err.root_error.empty?)
58
+ err.sub_errors.each do |uid, sub_error|
59
+ logger.error("Sub Error (#{uid}): #{sub_error}")
60
+ end
61
+ raise
62
+ ensure
63
+ if ($! && !debug_output.empty?)
64
+ logger.debug("OnTrac HTTP debug output")
65
+ debug_output.each_line.map(&:strip).each(&logger.method(:debug))
66
+ end
67
+ end
48
68
  ```
@@ -1,3 +1,3 @@
1
1
  module Ontrac
2
- VERSION = "0.9.2"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -1,24 +1,95 @@
1
- module Ontrac::WebServices
2
- module Definitions
3
- SERVICE_TYPE_SUNRISE = 'S'
4
- SERVICE_TYPE_GOLD = 'G'
5
- SERVICE_TYPE_GROUND = 'C'
6
- SERVICE_TYPE_FREIGHT = 'H'
1
+ module Ontrac
2
+ module WebServices
3
+ module Definitions
4
+ class DefinitionBase < Struct
5
+ def initialize(*)
6
+ super
7
+ end
7
8
 
8
- LABEL_TYPE_PDF = 1
9
- LABEL_TYPE_JPG = 2
10
- LABEL_TYPE_BMP = 3
11
- LABEL_TYPE_GIF = 4
12
- LABEL_TYPE_EPL_4X3 = 5
13
- LABEL_TYPE_EPL_4X5 = 6
14
- LABEL_TYPE_ZPL_4X5 = 7
9
+ def to_xml(root_name = nil)
10
+ xml_builder = Nokogiri::XML::Builder.new
11
+ root_name ||= self.class.name.split("::").last
12
+
13
+ xml_builder.send(root_name) do |xml|
14
+ members.each do |field|
15
+ value = send(field)
16
+ if (DefinitionBase === value)
17
+ xml.doc.root << value.to_xml(field)
18
+ else
19
+ xml.send(field, value) unless (value.nil?)
20
+ end
21
+ end
22
+ end
23
+
24
+ xml_builder.doc.root
25
+ end
26
+ end
27
+
28
+ Shipper = DefinitionBase.new(
29
+ :Name,
30
+ :Addr1,
31
+ :City,
32
+ :State,
33
+ :Zip,
34
+ :Contact,
35
+ :Phone
36
+ )
37
+ Consignee = DefinitionBase.new(
38
+ :Name,
39
+ :Addr1,
40
+ :Addr2,
41
+ :Addr3,
42
+ :City,
43
+ :State,
44
+ :Zip,
45
+ :Contact,
46
+ :Phone
47
+ )
48
+ Dim = DefinitionBase.new(
49
+ :Length,
50
+ :Width,
51
+ :Height
52
+ )
53
+ ShipmentRequest = DefinitionBase.new(
54
+ :UID,
55
+ :shipper,
56
+ :consignee,
57
+ :Service,
58
+ :SignatureRequired,
59
+ :Residential,
60
+ :SaturdayDel,
61
+ :Declared,
62
+ :COD,
63
+ :CODType,
64
+ :Weight,
65
+ :Letter,
66
+ :BillTo,
67
+ :Instructions,
68
+ :Reference,
69
+ :Reference2,
70
+ :Reference3,
71
+ :Tracking,
72
+ :DIM,
73
+ :LabelType,
74
+ :ShipEmail,
75
+ :DelEmail,
76
+ :ShipDate,
77
+ :CargoType
78
+ )
79
+
80
+ SERVICE_TYPE_GROUND = "C"
81
+ SERVICE_TYPE_SUNRISE = "S"
82
+ SERVICE_TYPE_SUNRISE_GOLD = "G"
83
+ SERVICE_TYPE_PALLETIZED_FREIGHT = "H"
84
+
85
+ LABEL_TYPE_NONE = 0
86
+ LABEL_TYPE_PDF = 1
87
+ LABEL_TYPE_EPL_4_X_5 = 6
88
+ LABEL_TYPE_ZPL_4_X_5 = 7
89
+
90
+ COD_TYPE_NONE = "NONE"
91
+ COD_TYPE_UNSECURED = "UNSECURED "
92
+ COD_TYPE_SECURED = "SECURED"
93
+ end
15
94
  end
16
95
  end
17
-
18
- require 'ontrac/web_services/definitions/base'
19
- require 'ontrac/web_services/definitions/delivery_data'
20
- require 'ontrac/web_services/definitions/package'
21
- require 'ontrac/web_services/definitions/package_data'
22
- require 'ontrac/web_services/definitions/package_detail'
23
- require 'ontrac/web_services/definitions/shipment_request'
24
- require 'ontrac/web_services/definitions/shipper_data'
@@ -1,121 +1,123 @@
1
1
  require 'net/https'
2
2
  require 'nokogiri'
3
3
  require 'base64'
4
+ require 'cgi'
5
+ require 'securerandom'
4
6
 
5
7
  module Ontrac::WebServices
6
- class ServiceException < RuntimeError
7
- attr_accessor :details
8
+ class ServiceException < Exception
9
+ attr_accessor :root_error, :sub_errors
8
10
  end
9
11
 
10
12
  class Service
11
- Credentials = Struct.new(:account, :password, :environment)
13
+ class Credentials
14
+ attr_reader :account, :password, :environment
15
+
16
+ def initialize(account, password, environment)
17
+ @account = account or
18
+ raise ArgumentError.new("Missing OnTrac credential: account")
19
+ @password = password or
20
+ raise ArgumentError.new("Missing OnTrac credential: account")
21
+ @environment = environment or
22
+ raise ArgumentError.new("Missing OnTrac credential: environment")
23
+ end
24
+ end
25
+
26
+ attr_accessor :debug_output
12
27
 
13
- def initialize(credentials)
28
+ def initialize(credentials, debug_output = nil)
14
29
  @credentials = credentials
30
+ self.debug_output = debug_output
15
31
  end
16
32
 
17
- def service_url(request_name)
18
- (@credentials.environment.to_sym == :production) ?
19
- "https://www.shipontrac.net/OnTracAPI/#{request_name}.ashx" :
20
- "https://www.shipontrac.net/OnTracAPItest/#{request_name}.ashx"
21
- end
33
+ def service_url(service_name)
34
+ url_base = (@credentials.environment.to_sym == :production) ?
35
+ "https://www.shipontrac.net/OnTracWebServices/OnTracServices.svc/V2" :
36
+ "https://www.shipontrac.net/OnTracTestWebServices/OnTracServices.svc/V2"
22
37
 
23
- def request_shipment(service, shipper_data, delivery_data,
24
- label_type, package_weights, &process_contents)
25
-
26
- label_base64_encoded =
27
- label_type != Definitions::LABEL_TYPE_EPL_4X3 &&
28
- label_type != Definitions::LABEL_TYPE_EPL_4X5
29
-
30
- request = Definitions::ShipmentRequest.new
31
- request.account = @credentials.account
32
- request.password = @credentials.password
33
-
34
- request.packages = package_weights.map.with_index do |weight, ndx|
35
- Definitions::Package.new.tap do |package|
36
- package.package_data = Definitions::PackageData.new.tap do |data|
37
- data.shipper_data = shipper_data
38
- data.delivery_data = delivery_data
39
-
40
- data.package_detail = Definitions::PackageDetail.new.tap do |detail|
41
- detail.service = service
42
- detail.weight = weight
43
- detail.ship_email = ""
44
- detail.del_email = ""
45
- detail.label_type = label_type
46
- end
47
- end
38
+ "%s/%s/%s?pw=%s" % [
39
+ url_base, @credentials.account, service_name, CGI.escape(@credentials.password)
40
+ ]
41
+ end
48
42
 
49
- process_contents.call(package.package_data, ndx) if (process_contents)
50
- end
43
+ def post_shipments(shipment_requests)
44
+ shipment_requests.map do |shipment_request|
45
+ shipment_request.shipper.Contact ||= ""
46
+ shipment_request.shipper.Phone ||= ""
47
+
48
+ shipment_request.consignee.Addr2 ||= ""
49
+ shipment_request.consignee.Addr3 ||= ""
50
+ shipment_request.consignee.Contact ||= ""
51
+ shipment_request.consignee.Phone ||= ""
52
+
53
+ shipment_request.UID = SecureRandom.hex(16)
54
+ shipment_request.COD ||= 0
55
+ shipment_request.CODType ||= Definitions::COD_TYPE_NONE
56
+ shipment_request.BillTo ||= 0
57
+ shipment_request.Instructions ||= ""
58
+ shipment_request.Reference ||= ""
59
+ shipment_request.Reference2 ||= ""
60
+ shipment_request.Reference3 ||= ""
61
+ shipment_request.Tracking ||= ""
62
+ shipment_request.DIM ||= Definitions::Dim.new(0, 0, 0)
63
+ shipment_request.ShipEmail ||= ""
64
+ shipment_request.DelEmail ||= ""
51
65
  end
52
66
 
53
- package_data_path = "/OnTracShipmentResponse/Package/PackageData"
54
- num_packages = package_weights.size
55
-
56
- request_xml = Nokogiri::XML::Document.new
57
- request_xml << request.to_xml
58
-
59
- issue_request("ShipmentRequest", request_xml) do |response_xml|
60
- %w(Label Tracking Charges/TotalCharge).each do |node_name|
61
- count = response_xml.xpath("count(#{package_data_path}/#{node_name})")
62
- if (response_xml.xpath("count(#{package_data_path}/#{node_name})") != num_packages)
63
- raise "Expected #{num_packages} #{node_name} response(s), received #{count}"
67
+ xml_builder = Nokogiri::XML::Builder.new
68
+ xml_builder.OnTracShipmentRequest do |xml|
69
+ xml.Shipments do |xml|
70
+ shipment_requests.each do |shipment_request|
71
+ xml.parent << shipment_request.to_xml("Shipment")
64
72
  end
65
73
  end
74
+ end
66
75
 
67
- response_xml.xpath("/OnTracShipmentResponse/Package/PackageData").map do |xml|
68
- label_img = xml.xpath("Label").text
69
- label_img = Base64.decode64(label_img) if (label_base64_encoded)
70
-
71
- [
72
- xml.xpath("Tracking").text,
73
- label_img,
74
- Float(xml.xpath("Charges/TotalCharge").text),
75
- xml
76
- ]
77
- end
76
+ response_xml = issue_request('shipments', xml_builder.doc)
77
+ shipment_requests.map do |request|
78
+ uid = request.UID
79
+ shipment_response = response_xml.xpath(
80
+ "/OnTracShipmentResponse/Shipments/Shipment[./UID = '#{uid}']"
81
+ ).first or raise ServiceException.new("Missing package response for #{uid}")
82
+
83
+ label = shipment_response.xpath("Label").text
84
+ label = Base64.decode64(label) if (request.LabelType == Definitions::LABEL_TYPE_PDF)
85
+ [
86
+ shipment_response.xpath("Tracking").text,
87
+ label,
88
+ Float(shipment_response.xpath("TotalChrg").text)
89
+ ]
78
90
  end
79
91
  end
80
92
 
81
93
  private
82
- def issue_request(request_type, request_xml, &process_response)
83
- uri = URI.parse(service_url(request_type))
94
+ def issue_request(service_name, request_xml)
95
+ uri = URI.parse(service_url(service_name))
84
96
  http = Net::HTTP.new(uri.host, uri.port)
97
+ http.set_debug_output(debug_output) if (debug_output)
85
98
  http.use_ssl = true
86
99
 
87
100
  response = http.request_post(uri.request_uri, request_xml.to_s)
88
101
  response_xml = Nokogiri::XML(response.body)
89
102
 
90
103
  check_response(response_xml)
91
- process_response.call(response_xml)
92
- rescue Timeout::Error, SocketError => root_exception
93
- err = ServiceException.new("Network communication error")
94
- err.set_backtrace([ "#{__FILE__}:#{__LINE__ + 1}", *root_exception.backtrace ])
95
- raise err
96
- rescue Exception => root_exception
97
- err = ServiceException.new(root_exception.message)
98
- err.details = { request: request_xml.to_s, response: response.body }
99
- err.set_backtrace([ "#{__FILE__}:#{__LINE__ + 1}", *root_exception.backtrace ])
100
- raise err
104
+ response_xml
101
105
  end
102
106
 
103
107
  def check_response(response_xml)
104
- status = response_xml.xpath("/OnTracShipmentResponse/Status").text
105
- message = response_xml.xpath("/OnTracShipmentResponse/Message").text
106
- package_messages = response_xml.xpath("//PackageData/Message")
107
-
108
- if (status.empty? || status != "1" || response_xml.xpath("//PackageData/Status != 1"))
109
- if (status.empty? && message.empty?)
110
- msg = "OnTrac's label system returned an invalid response"
111
- else
112
- msg = "No status information was returned for the request" if (status.empty?)
113
- msg = message || "The request returned a status of #{status}" if (status != "1")
114
- msg << " -- " + [ *package_messages.to_a ] * " ; " if (!package_messages.empty?)
115
- end
108
+ root_error = response_xml.xpath("/OnTracShipmentResponse/Error").text
109
+ erred_shipments = response_xml.xpath("//Shipment[./Error != '']")
116
110
 
117
- raise msg
118
- end
111
+ return if (root_error.empty? && erred_shipments.empty?)
112
+
113
+ err = ServiceException.new("OnTrac responded with an error")
114
+ err.root_error = root_error
115
+ err.sub_errors = Hash[
116
+ erred_shipments.map do |shipment_response|
117
+ [ shipment_response.xpath("./UID").text, shipment_response.xpath("./Error").text ]
118
+ end
119
+ ]
120
+ raise err
119
121
  end
120
122
  end
121
123
  end
@@ -7,6 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.description = %q{Provides an interface to the OnTrac web services API}
8
8
  gem.summary = %q{Interfaces with the OnTrac web services API to look up shipping rates, generate labels, and track shipments}
9
9
  gem.homepage = "https://github.com/brewski/ontrac-web-services"
10
+ gem.license = "MIT"
10
11
 
11
12
  gem.files = `git ls-files`.split($\)
12
13
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -16,6 +17,5 @@ Gem::Specification.new do |gem|
16
17
  gem.version = Ontrac::VERSION
17
18
 
18
19
  gem.required_ruby_version = '>= 1.9.0'
19
- gem.add_dependency("activesupport")
20
- gem.add_dependency("nokogiri")
20
+ gem.add_dependency("nokogiri", "~> 1.0")
21
21
  end
metadata CHANGED
@@ -1,48 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ontrac-web-services
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Brian Abreu
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-07 00:00:00.000000000 Z
11
+ date: 2015-08-15 00:00:00.000000000 Z
13
12
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
13
  - !ruby/object:Gem::Dependency
31
14
  name: nokogiri
32
15
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
16
  requirements:
35
- - - ! '>='
17
+ - - "~>"
36
18
  - !ruby/object:Gem::Version
37
- version: '0'
19
+ version: '1.0'
38
20
  type: :runtime
39
21
  prerelease: false
40
22
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
23
  requirements:
43
- - - ! '>='
24
+ - - "~>"
44
25
  - !ruby/object:Gem::Version
45
- version: '0'
26
+ version: '1.0'
46
27
  description: Provides an interface to the OnTrac web services API
47
28
  email:
48
29
  - brian@nuts.com
@@ -50,7 +31,7 @@ executables: []
50
31
  extensions: []
51
32
  extra_rdoc_files: []
52
33
  files:
53
- - .gitignore
34
+ - ".gitignore"
54
35
  - Gemfile
55
36
  - LICENSE
56
37
  - README.md
@@ -59,38 +40,31 @@ files:
59
40
  - lib/ontrac/version.rb
60
41
  - lib/ontrac/web_services.rb
61
42
  - lib/ontrac/web_services/definitions.rb
62
- - lib/ontrac/web_services/definitions/base.rb
63
- - lib/ontrac/web_services/definitions/delivery_data.rb
64
- - lib/ontrac/web_services/definitions/package.rb
65
- - lib/ontrac/web_services/definitions/package_data.rb
66
- - lib/ontrac/web_services/definitions/package_detail.rb
67
- - lib/ontrac/web_services/definitions/shipment_request.rb
68
- - lib/ontrac/web_services/definitions/shipper_data.rb
69
43
  - lib/ontrac/web_services/service.rb
70
44
  - ontrac-web-services.gemspec
71
45
  homepage: https://github.com/brewski/ontrac-web-services
72
- licenses: []
46
+ licenses:
47
+ - MIT
48
+ metadata: {}
73
49
  post_install_message:
74
50
  rdoc_options: []
75
51
  require_paths:
76
52
  - lib
77
53
  required_ruby_version: !ruby/object:Gem::Requirement
78
- none: false
79
54
  requirements:
80
- - - ! '>='
55
+ - - ">="
81
56
  - !ruby/object:Gem::Version
82
57
  version: 1.9.0
83
58
  required_rubygems_version: !ruby/object:Gem::Requirement
84
- none: false
85
59
  requirements:
86
- - - ! '>='
60
+ - - ">="
87
61
  - !ruby/object:Gem::Version
88
62
  version: '0'
89
63
  requirements: []
90
64
  rubyforge_project:
91
- rubygems_version: 1.8.23
65
+ rubygems_version: 2.2.3
92
66
  signing_key:
93
- specification_version: 3
67
+ specification_version: 4
94
68
  summary: Interfaces with the OnTrac web services API to look up shipping rates, generate
95
69
  labels, and track shipments
96
70
  test_files: []
@@ -1,43 +0,0 @@
1
- require 'active_support'
2
- require 'nokogiri'
3
-
4
- module Ontrac::WebServices::Definitions
5
- class Base
6
- include Nokogiri
7
-
8
- def self.attr_accessor(*args)
9
- (@attributes ||= []).concat(args)
10
- super
11
- end
12
-
13
- def self.attributes
14
- return (@attributes ||= [])
15
- end
16
-
17
- def self.basename
18
- ActiveSupport::Inflector.camelize(self.name.gsub(/^.*::/, ''))
19
- end
20
-
21
- def to_xml
22
- xml_builder = Nokogiri::XML::Builder.new
23
-
24
- xml_builder.send(self.class.basename) do |xml|
25
- self.class.attributes.each do |attribute_name|
26
- (values = *self.send(attribute_name)).each do |attribute_value|
27
- xml_attr_name = respond_to?("#{attribute_name}_to_xml_name") ?
28
- send("#{attribute_name}_to_xml_name") :
29
- ActiveSupport::Inflector.camelize(attribute_name, false)
30
-
31
- if (attribute_value.is_a?(Base))
32
- xml.doc.root << attribute_value.to_xml
33
- else
34
- xml.send(xml_attr_name, attribute_value)
35
- end
36
- end
37
- end
38
- end
39
-
40
- xml_builder.doc.root
41
- end
42
- end
43
- end
@@ -1,32 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class DeliveryData < Base
5
- attr_accessor :name
6
- attr_accessor :address
7
- attr_accessor :address2
8
- attr_accessor :address3
9
- attr_accessor :city
10
- attr_accessor :state
11
- attr_accessor :zip
12
- attr_accessor :phone
13
- attr_accessor :contact
14
- end
15
- end
16
- end
17
- end
18
-
19
- # [ DeliveryData, Package, PackageData, PackageDetail, ShipmentRequest, ShipperData ].map do |cls|
20
- # accessors = cls.attributes.map { |a| " attr_accessor :#{a.to_s.underscore}" }
21
- # <<-CLSDEF
22
- # module Ontrac
23
- # module WebServices
24
- # module Definitions
25
- # class #{cls.name.split("::").last} < Base
26
- # #{accessors * "\n"}
27
- # end
28
- # end
29
- # end
30
- # end
31
- # CLSDEF
32
- # end
@@ -1,9 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class Package < Base
5
- attr_accessor :package_data
6
- end
7
- end
8
- end
9
- end
@@ -1,16 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class PackageData < Base
5
- attr_accessor :uid
6
- attr_accessor :shipper_data
7
- attr_accessor :delivery_data
8
- attr_accessor :package_detail
9
-
10
- def uid_to_xml_name
11
- "UID"
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,29 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class PackageDetail < Base
5
- attr_accessor :ship_date
6
- attr_accessor :reference
7
- attr_accessor :tracking
8
- attr_accessor :service
9
- attr_accessor :declared
10
- attr_accessor :cod
11
- attr_accessor :cod_type
12
- attr_accessor :saturday_delivery
13
- attr_accessor :signature_rqd
14
- attr_accessor :type
15
- attr_accessor :weight
16
- attr_accessor :bill_to
17
- attr_accessor :instructions
18
- attr_accessor :ship_email
19
- attr_accessor :del_email
20
- attr_accessor :label_type
21
- attr_accessor :residential
22
-
23
- def cod_type_to_xml_name
24
- "cod_Type"
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,16 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class ShipmentRequest < Base
5
- attr_accessor :account
6
- attr_accessor :password
7
- attr_accessor :request_reference
8
- attr_accessor :packages
9
-
10
- def self.basename
11
- "OntracShipmentRequest"
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,16 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class ShipperData < Base
5
- attr_accessor :name
6
- attr_accessor :address
7
- attr_accessor :suite
8
- attr_accessor :city
9
- attr_accessor :state
10
- attr_accessor :zip
11
- attr_accessor :phone
12
- attr_accessor :contact
13
- end
14
- end
15
- end
16
- end