trackerific 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +6 -0
- data/Gemfile.lock +43 -1
- data/README.rdoc +58 -60
- data/lib/trackerific.rb +17 -20
- data/lib/trackerific/builders/base/soap.rb +21 -0
- data/lib/trackerific/builders/base/xml.rb +38 -0
- data/lib/trackerific/builders/fedex.rb +46 -0
- data/lib/trackerific/builders/ups.rb +32 -0
- data/lib/trackerific/builders/usps.rb +19 -0
- data/lib/trackerific/environment.rb +11 -0
- data/lib/trackerific/error.rb +3 -1
- data/lib/trackerific/parsers/base.rb +35 -0
- data/lib/trackerific/parsers/fedex.rb +59 -0
- data/lib/trackerific/parsers/ups.rb +66 -0
- data/lib/trackerific/parsers/usps.rb +51 -0
- data/lib/trackerific/services/base.rb +23 -10
- data/lib/trackerific/services/concerns/soap.rb +45 -0
- data/lib/trackerific/services/concerns/xml.rb +44 -0
- data/lib/trackerific/services/fedex.rb +9 -79
- data/lib/trackerific/services/mock_service.rb +4 -12
- data/lib/trackerific/services/ups.rb +11 -95
- data/lib/trackerific/services/usps.rb +21 -181
- data/lib/trackerific/soap/wsdl.rb +17 -0
- data/lib/trackerific/version.rb +1 -1
- data/spec/fixtures/fedex/error.xml +1 -10
- data/spec/fixtures/fedex/success.xml +1 -74
- data/spec/fixtures/ups/malformed.xml +10 -0
- data/spec/fixtures/ups/request.xml +1 -0
- data/spec/fixtures/usps/malformed.xml +2 -0
- data/spec/fixtures/usps/request.xml +1 -0
- data/spec/lib/trackerific/builders/base/soap_spec.rb +29 -0
- data/spec/lib/trackerific/builders/base/xml_spec.rb +35 -0
- data/spec/lib/trackerific/builders/fedex_spec.rb +70 -0
- data/spec/lib/trackerific/builders/ups_spec.rb +11 -0
- data/spec/lib/trackerific/builders/usps_spec.rb +11 -0
- data/spec/lib/trackerific/environment_spec.rb +45 -0
- data/spec/lib/trackerific/parsers/base_spec.rb +62 -0
- data/spec/lib/trackerific/parsers/ups_spec.rb +71 -0
- data/spec/lib/trackerific/parsers/usps_spec.rb +77 -0
- data/spec/lib/trackerific/services/base_spec.rb +56 -0
- data/spec/lib/trackerific/services/concerns/soap_spec.rb +71 -0
- data/spec/lib/trackerific/services/concerns/xml_spec.rb +65 -0
- data/spec/lib/trackerific/services/fedex_spec.rb +43 -45
- data/spec/lib/trackerific/services/ups_spec.rb +23 -2
- data/spec/lib/trackerific/services/usps_spec.rb +44 -34
- data/spec/lib/trackerific/services_spec.rb +7 -0
- data/spec/lib/trackerific/soap/wsdl_spec.rb +29 -0
- data/spec/lib/trackerific/version_spec.rb +1 -1
- data/spec/lib/trackerific_spec.rb +2 -11
- data/spec/spec_helper.rb +17 -1
- data/spec/support/reload.rb +6 -0
- data/spec/support/trackerific.rb +7 -0
- data/trackerific.gemspec +2 -0
- data/vendor/wsdl/fedex/TrackService_v8.wsdl +2284 -0
- metadata +81 -7
- data/lib/trackerific/configuration.rb +0 -7
- data/spec/fixtures/usps/city_state_lookup.xml +0 -8
- data/spec/lib/trackerific/configuration_spec.rb +0 -13
@@ -6,22 +6,14 @@ module Trackerific
|
|
6
6
|
|
7
7
|
self.register :mock_service
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
def self.credentials
|
10
|
+
{}
|
11
|
+
end
|
12
|
+
|
12
13
|
def self.package_id_matchers
|
13
14
|
[ /XXXXXXXXXX/, /XXXxxxxxxx/ ]
|
14
15
|
end
|
15
16
|
|
16
|
-
# Sets up a mocked package details
|
17
|
-
# @param [String] package_id the package identifier
|
18
|
-
# @return [Trackerific::Details] the tracking details
|
19
|
-
# @raise [Trackerific::Error] raised when the server returns an error
|
20
|
-
# @example Track a package
|
21
|
-
# service = Trackerific::Services::MockedService.new
|
22
|
-
# details = service.track("XXXXXXXXXX") # => valid response
|
23
|
-
# details = service.track("XXXxxxxxxx") # => throws a Trackerific::Error exception
|
24
|
-
# @api public
|
25
17
|
def track(id)
|
26
18
|
if id == "XXXXXXXXXX"
|
27
19
|
Trackerific::Details.new(id, "Your package was delivered.",
|
@@ -1,111 +1,27 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
require 'builder'
|
3
|
-
require 'date'
|
4
|
-
|
5
1
|
module Trackerific
|
6
2
|
module Services
|
7
|
-
# Provides package tracking support for UPS.
|
8
3
|
class UPS < Base
|
9
|
-
|
4
|
+
require 'trackerific/builders/ups'
|
5
|
+
require 'trackerific/parsers/ups'
|
6
|
+
|
7
|
+
include Concerns::XML, HTTParty
|
8
|
+
|
9
|
+
register :ups
|
10
|
+
|
11
|
+
self.xml_endpoint = '/Track'
|
12
|
+
self.xml_parser = Parsers::UPS
|
13
|
+
self.xml_builder = Builders::UPS
|
10
14
|
|
11
|
-
include ::HTTParty
|
12
15
|
format :xml
|
13
16
|
|
14
|
-
base_uri case
|
17
|
+
base_uri case Trackerific.env
|
15
18
|
when 'production' then 'https://www.ups.com/ups.app/xml'
|
16
19
|
else 'https://wwwcie.ups.com/ups.app/xml'
|
17
20
|
end
|
18
21
|
|
19
|
-
def initialize(options={})
|
20
|
-
@options = options
|
21
|
-
end
|
22
|
-
|
23
|
-
# An Array of Regexp that matches valid UPS package IDs
|
24
|
-
# @return [Array, Regexp] the regular expression
|
25
|
-
# @api private
|
26
22
|
def self.package_id_matchers
|
27
23
|
[ /^.Z/, /^[HK].{10}$/ ]
|
28
24
|
end
|
29
|
-
|
30
|
-
# Tracks a UPS package
|
31
|
-
# @param [String] package_id the package identifier
|
32
|
-
# @return [Trackerific::Details] the tracking details
|
33
|
-
# @raise [Trackerific::Error] raised when the server returns an error (invalid credentials, tracking package, etc.)
|
34
|
-
# @example Track a package
|
35
|
-
# ups = Trackerific::UPS.new key: 'api key', user_id: 'user', password: 'secret'
|
36
|
-
# details = ups.track_package("1Z12345E0291980793")
|
37
|
-
# @api public
|
38
|
-
def track(id)
|
39
|
-
@package_id = id
|
40
|
-
# connect to UPS via HTTParty
|
41
|
-
http_response = self.class.post('/Track', body: build_xml_request)
|
42
|
-
# throw any HTTP errors
|
43
|
-
http_response.error! unless http_response.code == 200
|
44
|
-
# Check the response for errors, return a Trackerific::Error, or parse
|
45
|
-
# the response from UPS and return a Trackerific::Details
|
46
|
-
case http_response['TrackResponse']['Response']['ResponseStatusCode']
|
47
|
-
when "0" then raise Trackerific::Error, parse_error_response(http_response)
|
48
|
-
when "1" then return parse_success_response(http_response)
|
49
|
-
else raise Trackerific::Error, "Invalid response code returned from server."
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
protected
|
54
|
-
|
55
|
-
# Parses the response from UPS
|
56
|
-
# @return [Trackerific::Details]
|
57
|
-
# @api private
|
58
|
-
def parse_success_response(http_response)
|
59
|
-
# get the activity from the UPS response
|
60
|
-
activity = http_response['TrackResponse']['Shipment']['Package']['Activity']
|
61
|
-
# if there's only one activity in the list, we need to put it in an array
|
62
|
-
activity = [activity] if activity.is_a? Hash
|
63
|
-
# UPS does not provide a summary, so we'll just use the last tracking status
|
64
|
-
summary = activity.first['Status']['StatusType']['Description']
|
65
|
-
events = []
|
66
|
-
activity.each do |a|
|
67
|
-
# the time format from UPS is HHMMSS, which cannot be directly converted
|
68
|
-
# to a Ruby time.
|
69
|
-
hours = a['Time'][0..1]
|
70
|
-
minutes = a['Time'][2..3]
|
71
|
-
seconds = a['Time'][4..5]
|
72
|
-
date = Date.parse(a['Date'])
|
73
|
-
date = DateTime.parse("#{date} #{hours}:#{minutes}:#{seconds}")
|
74
|
-
desc = a['Status']['StatusType']['Description']
|
75
|
-
loc = a['ActivityLocation']['Address'].map {|k,v| v}.join(" ")
|
76
|
-
events << Trackerific::Event.new(date, desc, loc)
|
77
|
-
end
|
78
|
-
|
79
|
-
Trackerific::Details.new(@package_id, summary, events)
|
80
|
-
end
|
81
|
-
|
82
|
-
# Parses a UPS tracking response, and returns any errors
|
83
|
-
# @return [String] the UPS tracking error
|
84
|
-
# @api private
|
85
|
-
def parse_error_response(http_response)
|
86
|
-
http_response['TrackResponse']['Response']['Error']['ErrorDescription']
|
87
|
-
end
|
88
|
-
|
89
|
-
# Builds the XML request to send to UPS for tracking a package
|
90
|
-
# @return [String] the XML request
|
91
|
-
# @api private
|
92
|
-
def build_xml_request
|
93
|
-
xml = ""
|
94
|
-
builder = ::Builder::XmlMarkup.new(:target => xml)
|
95
|
-
builder.AccessRequest do |ar|
|
96
|
-
ar.AccessLicenseNumber @options[:key]
|
97
|
-
ar.UserId @options[:user_id]
|
98
|
-
ar.Password @options[:password]
|
99
|
-
end
|
100
|
-
builder.TrackRequest do |tr|
|
101
|
-
tr.Request do |r|
|
102
|
-
r.RequestAction 'Track'
|
103
|
-
r.RequestOption 'activity'
|
104
|
-
end
|
105
|
-
tr.TrackingNumber @package_id
|
106
|
-
end
|
107
|
-
return xml
|
108
|
-
end
|
109
25
|
end
|
110
26
|
end
|
111
27
|
end
|
@@ -1,200 +1,40 @@
|
|
1
|
-
require 'active_support/core_ext/object/to_query'
|
2
|
-
require 'httparty'
|
3
|
-
require 'builder'
|
4
|
-
require 'date'
|
5
|
-
|
6
1
|
module Trackerific
|
7
2
|
module Services
|
8
|
-
# Provides package tracking support for USPS.
|
9
3
|
class USPS < Base
|
10
|
-
|
11
|
-
|
4
|
+
require 'trackerific/builders/usps'
|
5
|
+
require 'trackerific/parsers/usps'
|
12
6
|
|
13
|
-
|
14
|
-
when 'production' then "http://production.shippingapis.com"
|
15
|
-
else "http://testing.shippingapis.com"
|
16
|
-
end
|
7
|
+
include Concerns::XML, HTTParty
|
17
8
|
|
18
|
-
|
19
|
-
@options = options
|
20
|
-
end
|
9
|
+
register :usps
|
21
10
|
|
22
|
-
|
23
|
-
|
24
|
-
# @api private
|
25
|
-
def self.package_id_matchers
|
26
|
-
[ /^E\D{1}\d{9}\D{2}$|^9\d{15,21}$/ ]
|
27
|
-
end
|
28
|
-
|
29
|
-
# Tracks a USPS package
|
30
|
-
# @param [String] package_id the package identifier
|
31
|
-
# @return [Trackerific::Details] the tracking details
|
32
|
-
# @raise [Trackerific::Error] raised when the server returns an error (invalid credentials, tracking package, etc.)
|
33
|
-
# @example Track a package
|
34
|
-
# usps = Trackerific::USPS.new user_id: 'user'
|
35
|
-
# details = ups.track_package("EJ958083578US")
|
36
|
-
# @api public
|
37
|
-
def track(id)
|
38
|
-
@package_id = id
|
39
|
-
# connect to the USPS shipping API via HTTParty
|
40
|
-
response = self.class.get(
|
41
|
-
env == 'production' ? "/ShippingAPI.dll" : "/ShippingAPITest.dll",
|
42
|
-
query: { :API => 'TrackV2', :XML => build_tracking_xml_request }.to_query
|
43
|
-
)
|
44
|
-
# raise any errors
|
45
|
-
error = check_response_for_errors(response, :TrackV2)
|
46
|
-
raise error unless error.nil?
|
47
|
-
# get the tracking information from the response
|
48
|
-
tracking_info = response['TrackResponse']['TrackInfo']
|
49
|
-
events = []
|
50
|
-
# parse the tracking events out of the USPS tracking info
|
51
|
-
tracking_info['TrackDetail'].each do |d|
|
52
|
-
events << Trackerific::Event.new(
|
53
|
-
date_of_event(d),
|
54
|
-
description_of_event(d),
|
55
|
-
location_of_event(d)
|
56
|
-
)
|
57
|
-
end unless tracking_info['TrackDetail'].nil?
|
58
|
-
# return the details
|
59
|
-
Trackerific::Details.new(
|
60
|
-
tracking_info['ID'],
|
61
|
-
tracking_info['TrackSummary'],
|
62
|
-
events
|
63
|
-
)
|
64
|
-
end
|
11
|
+
self.xml_parser = Parsers::USPS
|
12
|
+
self.xml_builder = Builders::USPS
|
65
13
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
# city_state[:state] # => CA
|
74
|
-
# city_state[:zip] # => 90210
|
75
|
-
# @api public
|
76
|
-
def city_state_lookup(zipcode)
|
77
|
-
response = self.class.get(
|
78
|
-
env == 'production' ? "/ShippingAPI.dll" : "/ShippingAPITest.dll",
|
79
|
-
query: {
|
80
|
-
:API => 'CityStateLookup',
|
81
|
-
:XML => build_city_state_xml_request(zipcode)
|
82
|
-
}.to_query
|
83
|
-
)
|
84
|
-
# raise any errors
|
85
|
-
error = check_response_for_errors(response, :CityStateLookup)
|
86
|
-
raise error unless error.nil?
|
87
|
-
# return the city, state, and zip
|
88
|
-
response = response['CityStateLookupResponse']['ZipCode']
|
89
|
-
{
|
90
|
-
:city => response['City'],
|
91
|
-
:state => response['State'],
|
92
|
-
:zip => response['Zip5']
|
93
|
-
}
|
14
|
+
case Trackerific.env
|
15
|
+
when 'production'
|
16
|
+
self.xml_endpoint = '/ShippingAPI.dll'
|
17
|
+
base_uri 'http://production.shippingapis.com'
|
18
|
+
else
|
19
|
+
self.xml_endpoint = '/ShippingAPITest.dll'
|
20
|
+
base_uri 'http://testing.shippingapis.com'
|
94
21
|
end
|
95
22
|
|
96
|
-
|
97
|
-
|
98
|
-
def env
|
99
|
-
@rails_env ||= ENV['RAILS_ENV'] || 'production'
|
100
|
-
end
|
101
|
-
|
102
|
-
# Parses a USPS tracking event, and returns its date
|
103
|
-
# @param [String] event The tracking event to parse
|
104
|
-
# @return [DateTime] The date / time of the event
|
105
|
-
# @api private
|
106
|
-
def date_of_event(event)
|
107
|
-
# get the date out of
|
108
|
-
# Mon DD HH:MM am/pm THE DESCRIPTION CITY STATE ZIP.
|
109
|
-
d = event.split(" ")
|
110
|
-
DateTime.parse(d[0..3].join(" "))
|
111
|
-
end
|
112
|
-
|
113
|
-
# Parses a USPS tracking event, and returns its description
|
114
|
-
# @param [String] event The tracking event to parse
|
115
|
-
# @return [DateTime] The description of the event
|
116
|
-
# @api private
|
117
|
-
def description_of_event(event)
|
118
|
-
# get the description out of
|
119
|
-
# Mon DD HH:MM am/pm THE DESCRIPTION CITY STATE ZIP.
|
120
|
-
d = event.split(" ")
|
121
|
-
d[4..d.length-4].join(" ").capitalize
|
122
|
-
end
|
23
|
+
format :xml
|
123
24
|
|
124
|
-
|
125
|
-
|
126
|
-
# @return The location of the event
|
127
|
-
# @api private
|
128
|
-
def location_of_event(event)
|
129
|
-
# remove periods, and split by spaces
|
130
|
-
d = event.gsub(".", "").split(" ")
|
131
|
-
l = d[d.length-3, d.length] # => ['city', 'state', 'zip']
|
132
|
-
# this is the location from the USPS tracking XML. it is not guaranteed
|
133
|
-
# to be completely accurate, since there's no way to know if it will
|
134
|
-
# always be the last 3 words.
|
135
|
-
city = l[0]
|
136
|
-
state = l[1]
|
137
|
-
zip = l[2]
|
138
|
-
# for greater accuracy, we can use the city/state lookup API from USPS
|
139
|
-
if @options[:use_city_state_lookup]
|
140
|
-
l = city_state_lookup(zip)
|
141
|
-
# these will be nil if USPS does not have the zipcode in their database
|
142
|
-
city = l[:city] unless l[:city].nil?
|
143
|
-
state = l[:state] unless l[:state].nil?
|
144
|
-
zip = l[:zip] unless l[:zip].nil?
|
145
|
-
end
|
146
|
-
"#{city}, #{state} #{zip}"
|
25
|
+
def self.package_id_matchers
|
26
|
+
[ /^E\D{1}\d{9}\D{2}$|^9\d{15,21}$/ ]
|
147
27
|
end
|
148
28
|
|
149
|
-
|
150
|
-
# @param [HTTParty::Response] response The HTTParty response to check
|
151
|
-
# @return The exception to raise, or nil
|
152
|
-
# @api private
|
153
|
-
def check_response_for_errors(response, api)
|
154
|
-
# return any HTTP errors
|
155
|
-
return response.error unless response.code == 200
|
156
|
-
# return a Trackerific::Error if there is an error in the response, or if
|
157
|
-
# the tracking response is malformed
|
158
|
-
return Trackerific::Error.new(response['Error']['Description']) unless response['Error'].nil?
|
159
|
-
return Trackerific::Error.new("Tracking information not found in response from server.") if response['TrackResponse'].nil? && api == :TrackV2
|
160
|
-
return Trackerific::Error.new("City / state information not found in response from server.") if response['CityStateLookupResponse'].nil? && api == :CityStateLookup
|
161
|
-
return nil # no errors to report
|
162
|
-
end
|
29
|
+
protected
|
163
30
|
|
164
|
-
|
165
|
-
|
166
|
-
# @return [String] the xml request
|
167
|
-
# @api private
|
168
|
-
def build_city_state_xml_request(zipcode)
|
169
|
-
xml = ""
|
170
|
-
# set up the Builder
|
171
|
-
builder = ::Builder::XmlMarkup.new(:target => xml)
|
172
|
-
# add the XML header
|
173
|
-
builder.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
|
174
|
-
# build the request
|
175
|
-
builder.CityStateLookupRequest(:USERID => @options[:user_id]) do |request|
|
176
|
-
request.ZipCode(:ID => "5") do |zip|
|
177
|
-
zip.Zip5 zipcode
|
178
|
-
end
|
179
|
-
end
|
31
|
+
def http_response(id)
|
32
|
+
http_response = self.class.get(self.class.xml_endpoint, http_query(id))
|
180
33
|
end
|
181
34
|
|
182
|
-
|
183
|
-
|
184
|
-
# @api private
|
185
|
-
def build_tracking_xml_request
|
186
|
-
xml = ""
|
187
|
-
# set up the Builder
|
188
|
-
builder = ::Builder::XmlMarkup.new(:target => xml)
|
189
|
-
# build the request
|
190
|
-
builder.TrackRequest(:USERID => @options[:user_id]) do |t|
|
191
|
-
t.TrackID(:ID => @package_id)
|
192
|
-
end
|
193
|
-
# return the XML
|
194
|
-
xml
|
35
|
+
def http_query(id)
|
36
|
+
{ query: { :API => 'TrackV2', :XML => builder(id).xml }.to_query }
|
195
37
|
end
|
196
|
-
|
197
38
|
end
|
198
|
-
|
199
39
|
end
|
200
40
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Trackerific
|
2
|
+
module SOAP
|
3
|
+
module WSDL
|
4
|
+
ROOT = File.expand_path("../../../../vendor/wsdl", __FILE__)
|
5
|
+
|
6
|
+
def self.path(name)
|
7
|
+
path = File.join(ROOT, "#{name}.wsdl")
|
8
|
+
|
9
|
+
unless File.exists?(path)
|
10
|
+
raise IOError, "WSDL not found #{name}", caller
|
11
|
+
end
|
12
|
+
|
13
|
+
path
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/trackerific/version.rb
CHANGED
@@ -1,10 +1 @@
|
|
1
|
-
|
2
|
-
<FDXTrack2Reply xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
3
|
-
<Error>
|
4
|
-
<Code>6035</Code>
|
5
|
-
<Message>Invalid tracking numbers. Please check the following numbers and resubmit.</Message>
|
6
|
-
<LocalLanguageMessage>Invalid tracking numbers. Please check the following numbers and resubmit.</LocalLanguageMessage>
|
7
|
-
</Error>
|
8
|
-
<DuplicateWaybill>false</DuplicateWaybill>
|
9
|
-
<MoreData>false</MoreData>
|
10
|
-
</FDXTrack2Reply>
|
1
|
+
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'><SOAP-ENV:Header/><SOAP-ENV:Body><TrackReply xmlns='http://fedex.com/ws/track/v8'><HighestSeverity>ERROR</HighestSeverity><Notifications><Severity>ERROR</Severity><Source>trck</Source><Code>5508</Code><Message>Invalid tracking number.</Message><LocalizedMessage>Invalid tracking number.</LocalizedMessage></Notifications><TransactionDetail><CustomerTransactionId>7fe240d748c68b6e</CustomerTransactionId></TransactionDetail><Version><ServiceId>trck</ServiceId><Major>8</Major><Intermediate>0</Intermediate><Minor>0</Minor></Version></TrackReply></SOAP-ENV:Body></SOAP-ENV:Envelope>
|
@@ -1,74 +1 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<FDXTrack2Reply xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
3
|
-
<DuplicateWaybill>false</DuplicateWaybill>
|
4
|
-
<MoreData>false</MoreData>
|
5
|
-
<Package>
|
6
|
-
<TrackingNumber>183689015000001</TrackingNumber>
|
7
|
-
<TrackingNumberUniqueIdentifier>12010~183689015000001</TrackingNumberUniqueIdentifier>
|
8
|
-
<StatusCode>DL</StatusCode>
|
9
|
-
<StatusDescription>Delivered</StatusDescription>
|
10
|
-
<CarrierCode>FDXG</CarrierCode>
|
11
|
-
<OtherIdentifier>
|
12
|
-
<Value>770-886-6395</Value>
|
13
|
-
<Type>CUR</Type>
|
14
|
-
</OtherIdentifier>
|
15
|
-
<Service>FedEx Home Delivery</Service>
|
16
|
-
<Weight>19.8</Weight>
|
17
|
-
<WeightUnits>LBS</WeightUnits>
|
18
|
-
<PackagingDescription>Package</PackagingDescription>
|
19
|
-
<PackageSequenceNumber>1</PackageSequenceNumber>
|
20
|
-
<PackageCount>1</PackageCount>
|
21
|
-
<OriginLocationAddress>
|
22
|
-
<City>ANAHEIM</City>
|
23
|
-
<StateOrProvinceCode>CA</StateOrProvinceCode>
|
24
|
-
<CountryCode>US</CountryCode>
|
25
|
-
</OriginLocationAddress>
|
26
|
-
<ShipDate>2010-06-25</ShipDate>
|
27
|
-
<DestinationAddress>
|
28
|
-
<City>Gainesville</City>
|
29
|
-
<StateOrProvinceCode>GA</StateOrProvinceCode>
|
30
|
-
<CountryCode>US</CountryCode>
|
31
|
-
</DestinationAddress>
|
32
|
-
<DeliveredDate>2010-07-01</DeliveredDate>
|
33
|
-
<DeliveredTime>10:43:51</DeliveredTime>
|
34
|
-
<SignatureProofOfDeliveryAvailable>false</SignatureProofOfDeliveryAvailable>
|
35
|
-
<Event>
|
36
|
-
<Date>2010-07-01</Date>
|
37
|
-
<Time>10:43:51</Time>
|
38
|
-
<Type>DL</Type>
|
39
|
-
<Description>Delivered</Description>
|
40
|
-
<StatusExceptionCode>014</StatusExceptionCode>
|
41
|
-
<StatusExceptionDescription>Left at garage. Signature Service not requested.</StatusExceptionDescription>
|
42
|
-
<Address>
|
43
|
-
<City>Gainesville</City>
|
44
|
-
<StateOrProvinceCode>GA</StateOrProvinceCode>
|
45
|
-
<PostalCode>30506</PostalCode>
|
46
|
-
<CountryCode>US</CountryCode>
|
47
|
-
</Address>
|
48
|
-
</Event>
|
49
|
-
<Event>
|
50
|
-
<Date>2010-07-01</Date>
|
51
|
-
<Time>08:48:00</Time>
|
52
|
-
<Type>OD</Type>
|
53
|
-
<Description>On FedEx vehicle for delivery</Description>
|
54
|
-
<Address>
|
55
|
-
<City>ATHENS</City>
|
56
|
-
<StateOrProvinceCode>GA</StateOrProvinceCode>
|
57
|
-
<PostalCode>30601</PostalCode>
|
58
|
-
<CountryCode>US</CountryCode>
|
59
|
-
</Address>
|
60
|
-
</Event>
|
61
|
-
<Event>
|
62
|
-
<Date>2010-07-01</Date>
|
63
|
-
<Time>05:07:00</Time>
|
64
|
-
<Type>AR</Type>
|
65
|
-
<Description>At local FedEx facility</Description>
|
66
|
-
<Address>
|
67
|
-
<City>ATHENS</City>
|
68
|
-
<StateOrProvinceCode>GA</StateOrProvinceCode>
|
69
|
-
<PostalCode>30601</PostalCode>
|
70
|
-
<CountryCode>US</CountryCode>
|
71
|
-
</Address>
|
72
|
-
</Event>
|
73
|
-
</Package>
|
74
|
-
</FDXTrack2Reply>
|
1
|
+
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'><SOAP-ENV:Header/><SOAP-ENV:Body><TrackReply xmlns='http://fedex.com/ws/track/v8'><HighestSeverity>SUCCESS</HighestSeverity><Notifications><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notifications><TransactionDetail><CustomerTransactionId>d7200b02a2d97651</CustomerTransactionId></TransactionDetail><Version><ServiceId>trck</ServiceId><Major>8</Major><Intermediate>0</Intermediate><Minor>0</Minor></Version><CompletedTrackDetails><HighestSeverity>SUCCESS</HighestSeverity><DuplicateWaybill>true</DuplicateWaybill><MoreData>false</MoreData><TrackDetailsCount>0</TrackDetailsCount><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>22013~123456789012~FDEG</TrackingNumberUniqueIdentifier><CarrierCode>FDXG</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Ground</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456464000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-06-25T00:00:00</ShipTimestamp><DestinationAddress><City>new york</City><StateOrProvinceCode>NY</StateOrProvinceCode><CountryCode>US</CountryCode><CountryName>United States</CountryName><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456470000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-06-27T00:00:00</ShipTimestamp><DestinationAddress><City>Memphis</City><StateOrProvinceCode>TN</StateOrProvinceCode><CountryCode>US</CountryCode><CountryName>United States</CountryName><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456490000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-07-16T00:00:00</ShipTimestamp><DestinationAddress><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456492000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-07-17T00:00:00</ShipTimestamp><DestinationAddress><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456493000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-07-19T00:00:00</ShipTimestamp><DestinationAddress><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456514000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-08-09T00:00:00</ShipTimestamp><DestinationAddress><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456525000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-08-20T00:00:00</ShipTimestamp><DestinationAddress><City>CITY OF INDUSTRY</City><StateOrProvinceCode>CA</StateOrProvinceCode><CountryCode>US</CountryCode><CountryName>United States</CountryName><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456539000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-09-03T00:00:00</ShipTimestamp><DestinationAddress><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456540000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-08-24T00:00:00</ShipTimestamp><DestinationAddress><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456560000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-10-10T00:00:00</ShipTimestamp><DestinationAddress><City>ST JACKSON</City><StateOrProvinceCode>MS</StateOrProvinceCode><CountryCode>US</CountryCode><CountryName>United States</CountryName><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails><TrackDetails><Notification><Severity>SUCCESS</Severity><Source>trck</Source><Code>0</Code><Message>Request was successfully processed.</Message><LocalizedMessage>Request was successfully processed.</LocalizedMessage></Notification><TrackingNumber>123456789012</TrackingNumber><TrackingNumberUniqueIdentifier>2456570000~123456789012~FX</TrackingNumberUniqueIdentifier><CarrierCode>FDXE</CarrierCode><OperatingCompanyOrCarrierDescription>FedEx Express</OperatingCompanyOrCarrierDescription><PackageSequenceNumber>0</PackageSequenceNumber><PackageCount>0</PackageCount><ShipTimestamp>2013-10-03T00:00:00</ShipTimestamp><DestinationAddress><City>Ontonagon</City><StateOrProvinceCode>MI</StateOrProvinceCode><CountryCode>US</CountryCode><CountryName>United States</CountryName><Residential>false</Residential></DestinationAddress><DeliveryAttempts>0</DeliveryAttempts><TotalUniqueAddressCountInConsolidation>0</TotalUniqueAddressCountInConsolidation></TrackDetails></CompletedTrackDetails></TrackReply></SOAP-ENV:Body></SOAP-ENV:Envelope>
|