dhl-get_quote 0.4.27 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -127,18 +127,19 @@ You can also get the value directly:
127
127
 
128
128
  #### Setting Duty
129
129
 
130
- You can toggle whether or not a shipment is dutiable with the #dutiable!() and #not_dutiable!() methods.
130
+ ! Note, this a breaking change from 0.4.x
131
+
132
+ To set the duty on a shipment, use the dutiable!() method. It accepts the numeric value and an optional currency code. If not specified, the currency code default to US Dollars (USD).
131
133
 
132
134
  ```ruby
133
- request.dutiable!
134
- request.not_dutiable!
135
+ # set the dutiable value at $100 in US Dollars
136
+ request.dutiable!(100.00, 'USD')
135
137
  ```
136
138
 
137
- You can absolutely set the dutiable stage with the #dutiable() method:
139
+ To remove a previously set duty, use the not_dutiable!() method.
138
140
 
139
141
  ```ruby
140
- request.dutiable(true)
141
- request.dutiable(false)
142
+ request.not_dutiable!
142
143
  ```
143
144
 
144
145
  You can query the current state with #dutiable?:
@@ -24,6 +24,11 @@ Gem::Specification.new do |gem|
24
24
  gem.add_development_dependency 'rake', '10.0.4'
25
25
  gem.add_development_dependency 'rspec', '2.13.0'
26
26
  gem.add_development_dependency 'rspec-must', '0.0.1'
27
- gem.add_development_dependency 'debugger'
27
+ gem.add_development_dependency 'timecop', '~> 0.6.1'
28
+ # gem.add_development_dependency 'debugger'
29
+
30
+ if Dhl::GetQuote::PostInstallMessage
31
+ gem.post_install_message = Dhl::GetQuote::PostInstallMessage
32
+ end
28
33
 
29
34
  end
data/lib/dhl-get_quote.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'date'
2
+
1
3
  require "dhl/get_quote/version"
2
4
  require "dhl/get_quote/helper"
3
5
  require "dhl/get_quote/errors"
@@ -44,13 +46,25 @@ class Dhl
44
46
  end
45
47
  end
46
48
 
47
- def self.kilograms!
49
+ def self.metric_measurements!
48
50
  @@weight_unit = WEIGHT_UNIT_CODES[:kilograms]
51
+ @@dimensions_unit = DIMENSIONS_UNIT_CODES[:centimeters]
52
+ end
53
+
54
+ def self.us_measurements!
55
+ @@weight_unit = WEIGHT_UNIT_CODES[:pounds]
56
+ @@dimensions_unit = DIMENSIONS_UNIT_CODES[:inches]
57
+ end
58
+
59
+ def self.kilograms!
60
+ deprication_notice(:kilograms!, :metric)
61
+ metric_measurements!
49
62
  end
50
63
  def self.kilogrammes!; self.kilograms!; end
51
64
 
52
65
  def self.pounds!
53
- @@weight_unit = WEIGHT_UNIT_CODES[:pounds]
66
+ deprication_notice(:pounds!, :us)
67
+ us_measurements!
54
68
  end
55
69
 
56
70
  def self.weight_unit
@@ -58,30 +72,20 @@ class Dhl
58
72
  end
59
73
 
60
74
  def self.centimeters!
61
- @@dimensions_unit = DIMENSIONS_UNIT_CODES[:centimeters]
75
+ deprication_notice(:centimeters!, :metric)
76
+ metric_measurements!
62
77
  end
63
78
  def self.centimetres!; self.centimeters!; end
64
79
 
65
80
  def self.inches!
66
- @@dimensions_unit = DIMENSIONS_UNIT_CODES[:inches]
81
+ deprication_notice(:inches!, :us)
82
+ us_measurements!
67
83
  end
68
84
 
69
85
  def self.dimensions_unit
70
86
  @@dimensions_unit
71
87
  end
72
88
 
73
- def self.dutiable!
74
- @@dutiable = true
75
- end
76
-
77
- def self.not_dutiable!
78
- @@dutiable = false
79
- end
80
-
81
- def self.dutiable?
82
- !!@@dutiable
83
- end
84
-
85
89
  def self.set_defaults
86
90
  @@site_id = nil
87
91
  @@password = nil
@@ -90,6 +94,16 @@ class Dhl
90
94
  @@dutiable = false
91
95
  @@test_mode = false
92
96
  end
97
+
98
+ private
99
+
100
+ def self.deprication_notice(meth, m)
101
+ messages = {
102
+ :metric => "Method replaced by Dhl::GetQuote#metic_measurements!(). I am now setting your measurements to metric",
103
+ :us => "Method replaced by Dhl::GetQuote#us_measurements!(). I am now setting your measurements to US customary",
104
+ }
105
+ puts "!!!! Method \"##{meth}()\" is depricated. #{messages[m.to_sym]}."
106
+ end
93
107
  end
94
108
  end
95
109
 
@@ -9,5 +9,16 @@ class Dhl::GetQuote
9
9
  class Upstream < StandardError
10
10
  class UnknownError < Upstream; end
11
11
  class ValidationFailureError < Upstream; end
12
+ class ConditionError < Upstream
13
+ attr_reader :code, :message
14
+ def initialize(code, message)
15
+ @code = code
16
+ @message = message
17
+ end
18
+
19
+ def to_s
20
+ "#{code}: #{message}"
21
+ end
22
+ end
12
23
  end
13
24
  end
@@ -4,7 +4,7 @@ require 'erb'
4
4
  require 'set'
5
5
 
6
6
  class Dhl::GetQuote::Request
7
- attr_reader :site_id, :password, :from_country_code, :from_postal_code, :to_country_code, :to_postal_code
7
+ attr_reader :site_id, :password, :from_country_code, :from_postal_code, :to_country_code, :to_postal_code, :duty
8
8
  attr_accessor :pieces
9
9
 
10
10
  URLS = {
@@ -26,7 +26,7 @@ class Dhl::GetQuote::Request
26
26
 
27
27
  @special_services_list = Set.new
28
28
 
29
- @is_dutiable = Dhl::GetQuote.dutiable?
29
+ @duty = false
30
30
 
31
31
  @pieces = []
32
32
  end
@@ -56,19 +56,27 @@ class Dhl::GetQuote::Request
56
56
  end
57
57
 
58
58
  def dutiable?
59
- !!@is_dutiable
59
+ !!@duty
60
60
  end
61
61
 
62
- def dutiable(val)
63
- @is_dutiable = !!val
62
+ def dutiable(value, currency_code="USD")
63
+ @duty = {
64
+ :declared_value => value.to_f,
65
+ :declared_currency => currency_code.slice(0,3).upcase
66
+ }
64
67
  end
68
+ alias_method :dutiable!, :dutiable
65
69
 
66
- def dutiable!
67
- dutiable(true)
70
+ def not_dutiable!
71
+ @duty = false
68
72
  end
69
73
 
70
- def not_dutiable!
71
- dutiable(false)
74
+ def payment_account_number(pac = nil)
75
+ if pac.to_s.size > 0
76
+ @payment_account_number = pac
77
+ else
78
+ @payment_account_number
79
+ end
72
80
  end
73
81
 
74
82
  def dimensions_unit
@@ -79,13 +87,33 @@ class Dhl::GetQuote::Request
79
87
  @weight_unit ||= Dhl::GetQuote.weight_unit
80
88
  end
81
89
 
82
- def centimeters!
90
+ def metric_measurements!
91
+ @weight_unit = Dhl::GetQuote::WEIGHT_UNIT_CODES[:kilograms]
83
92
  @dimensions_unit = Dhl::GetQuote::DIMENSIONS_UNIT_CODES[:centimeters]
84
93
  end
94
+
95
+ def us_measurements!
96
+ @weight_unit = Dhl::GetQuote::WEIGHT_UNIT_CODES[:pounds]
97
+ @dimensions_unit = Dhl::GetQuote::DIMENSIONS_UNIT_CODES[:inches]
98
+ end
99
+
100
+ def centimeters!
101
+ deprication_notice(:centimeters!, :metric)
102
+ metric_measurements!
103
+ end
85
104
  alias :centimetres! :centimeters!
86
105
 
87
106
  def inches!
88
- @dimensions_unit = Dhl::GetQuote::DIMENSIONS_UNIT_CODES[:inches]
107
+ deprication_notice(:inches!, :us)
108
+ us_measurements!
109
+ end
110
+
111
+ def metric_measurements?
112
+ centimeters? && kilograms?
113
+ end
114
+
115
+ def us_measurements?
116
+ pounds? && inches?
89
117
  end
90
118
 
91
119
  def centimeters?
@@ -98,12 +126,14 @@ class Dhl::GetQuote::Request
98
126
  end
99
127
 
100
128
  def kilograms!
101
- @weight_unit = Dhl::GetQuote::WEIGHT_UNIT_CODES[:kilograms]
129
+ deprication_notice(:kilograms!, :metric)
130
+ metric_measurements!
102
131
  end
103
132
  alias :kilogrammes! :kilograms!
104
133
 
105
134
  def pounds!
106
- @weight_unit = Dhl::GetQuote::WEIGHT_UNIT_CODES[:pounds]
135
+ deprication_notice(:pounds!, :us)
136
+ us_measurements!
107
137
  end
108
138
 
109
139
  def pounds?
@@ -120,8 +150,23 @@ class Dhl::GetQuote::Request
120
150
  ERB.new(File.new(xml_template_path).read, nil,'%<>-').result(binding)
121
151
  end
122
152
 
153
+ # ready times are only 8a-5p(17h)
123
154
  def ready_time(time=Time.now)
124
- time.strftime("PT%HH%MM")
155
+ if time.hour >= 17 || time.hour < 8
156
+ time.strftime("PT08H00M")
157
+ else
158
+ time.strftime("PT%HH%MM")
159
+ end
160
+ end
161
+
162
+ # ready dates are only mon-fri
163
+ def ready_date(t=Time.now)
164
+ date = Date.parse(t.to_s)
165
+ if date.wday >= 5 && t.hour >= 17
166
+ date.send(:next_day, (8-date.wday))
167
+ else
168
+ date
169
+ end.strftime("%Y-%m-%d")
125
170
  end
126
171
 
127
172
  def post
@@ -180,4 +225,14 @@ protected
180
225
  gem_root = spec.gem_dir
181
226
  gem_root + "/tpl/request.xml.erb"
182
227
  end
228
+
229
+ private
230
+
231
+ def deprication_notice(meth, m)
232
+ messages = {
233
+ :metric => "Method replaced by Dhl::GetQuote::Request#metic_measurements!(). I am now setting your measurements to metric",
234
+ :us => "Method replaced by Dhl::GetQuote::Request#us_measurements!(). I am now setting your measurements to US customary",
235
+ }
236
+ puts "!!!! Method \"##{meth}()\" is depricated. #{messages[m.to_sym]}."
237
+ end
183
238
  end
@@ -23,6 +23,8 @@ class Dhl::GetQuote::Response
23
23
  else
24
24
  Dhl::GetQuote::Upstream::UnknownError.new(response_error_condition_data)
25
25
  end
26
+ elsif condition_indicates_error?
27
+ @error = Dhl::GetQuote::Upstream::ConditionError.new(condition_error_code, condition_error_message)
26
28
  else
27
29
  load_costs(DEFAULT_CURRENCY_ROLE_TYPE_CODE)
28
30
  end
@@ -90,6 +92,20 @@ protected
90
92
  @response_error_condition_data ||= response_error_status_condition['ConditionData']
91
93
  end
92
94
 
95
+ def condition_indicates_error?
96
+ @parsed_xml["DCTResponse"]["GetQuoteResponse"] &&
97
+ @parsed_xml["DCTResponse"]["GetQuoteResponse"]["Note"] &&
98
+ @parsed_xml["DCTResponse"]["GetQuoteResponse"]["Note"]["Condition"].is_a?(Hash)
99
+ end
100
+
101
+ def condition_error_code
102
+ @parsed_xml["DCTResponse"]["GetQuoteResponse"]["Note"]["Condition"]["ConditionCode"]
103
+ end
104
+
105
+ def condition_error_message
106
+ @parsed_xml["DCTResponse"]["GetQuoteResponse"]["Note"]["Condition"]["ConditionData"].strip
107
+ end
108
+
93
109
  def market_services
94
110
  @market_services ||= begin
95
111
  srv = @parsed_xml["DCTResponse"]["GetQuoteResponse"]["Srvs"]["Srv"]
@@ -1,5 +1,18 @@
1
1
  class Dhl
2
2
  class GetQuote
3
- VERSION = "0.4.27"
3
+ VERSION = "0.5.0"
4
+
5
+ PostInstallMessage = <<EOS
6
+
7
+ *** NOTE Dhl-GetQuote ***
8
+
9
+ This version introduces the following changes from 0.4.x:
10
+
11
+ * #inches!, #pounds!, #kilograms! and #centimeters have been depricated.
12
+ Please use #us_measurements! or #metric_measurements!.
13
+
14
+ * dutiable() replaces dutiable! now requires arguments (dutiable value and currency).
15
+
16
+ EOS
4
17
  end
5
18
  end
@@ -94,83 +94,74 @@ describe Dhl::GetQuote do
94
94
  end
95
95
 
96
96
  describe "kilograms!" do
97
- before(:each) { klass.configure { |c| c.kilograms! } }
97
+ # silence deprication notices in tests
98
+ before(:each) { klass.stub!(:puts) }
98
99
 
99
- it "must set class weight_unit to KG" do
100
- klass.weight_unit.must == "KG"
101
- end
102
-
103
- it "Dhl::GetQuote::Request must honor this" do
104
- valid_request.weight_unit.must == "KG"
100
+ it "must call #metric_measurements!" do
101
+ klass.must_receive(:metric_measurements!)
102
+ klass.kilograms!
105
103
  end
106
104
  end
107
105
 
108
106
  describe "pounds!" do
109
- before(:each) { klass.configure { |c| c.pounds! } }
107
+ # silence deprication notices in tests
108
+ before(:each) { klass.stub!(:puts) }
110
109
 
111
- it "must set class weight_unit to LB" do
112
- klass.weight_unit.must == "LB"
113
- end
114
-
115
- it "Dhl::GetQuote::Request must honor this" do
116
- valid_request.weight_unit.must == "LB"
110
+ it "must call #us_measurements!" do
111
+ klass.must_receive(:us_measurements!)
112
+ klass.pounds!
117
113
  end
118
114
  end
119
115
 
120
116
  describe "centimeters!" do
121
- before(:each) { klass.configure { |c| c.centimeters! } }
117
+ # silence deprication notices in tests
118
+ before(:each) { klass.stub!(:puts) }
122
119
 
123
- it "must set class weight_unit to CM" do
124
- klass.dimensions_unit.must == "CM"
125
- end
126
-
127
- it "Dhl::GetQuote::Request must honor this" do
128
- valid_request.dimensions_unit.must == "CM"
120
+ it "must call #metric_measurements!" do
121
+ klass.must_receive(:metric_measurements!)
122
+ klass.centimeters!
129
123
  end
130
124
  end
131
125
 
132
126
  describe "inches!" do
133
- before(:each) { klass.configure { |c| c.inches! } }
134
-
135
- it "must set class weight_unit to IN" do
136
- klass.dimensions_unit.must == "IN"
137
- end
127
+ # silence deprication notices in tests
128
+ before(:each) { klass.stub!(:puts) }
138
129
 
139
- it "Dhl::GetQuote::Request must honor this" do
140
- valid_request.dimensions_unit.must == "IN"
130
+ it "must call #us_measurements!" do
131
+ klass.must_receive(:us_measurements!)
132
+ klass.inches!
141
133
  end
142
134
  end
143
135
 
144
- describe ".dutiable!" do
145
- before(:each) do
146
- klass.configure { |c| c.dutiable! }
147
- end
148
-
149
- it "must set the class dutiable to true" do
150
- klass.dutiable?.must be_true
136
+ describe "us_measurements!" do
137
+ before(:each) { klass.metric_measurements! }
138
+ it "must set the weight and dimensions to LB and IN" do
139
+ klass.us_measurements!
140
+ klass.dimensions_unit.must == "IN"
141
+ klass.weight_unit.must == "LB"
151
142
  end
152
143
 
153
- it "Dhl::GetQuote::Request must honor this test mode" do
154
- request = Dhl::GetQuote::Request.new(valid_request_options)
155
- request.dutiable?.must be_true
144
+ it "Dhl::GetQuote::Request must honor this" do
145
+ klass.us_measurements!
146
+ valid_request.dimensions_unit.must == "IN"
147
+ valid_request.weight_unit.must == "LB"
156
148
  end
157
149
  end
158
150
 
159
- describe ".not_dutiable!" do
160
- before(:each) do
161
- klass.configure { |c| c.not_dutiable! }
162
- end
163
-
164
- it "must set the classvar test_mode to false" do
165
- klass.dutiable?.must be_false
151
+ describe "metric_measurements!" do
152
+ before(:each) { klass.us_measurements! }
153
+ it "must set the weight and dimensions to KG and CM" do
154
+ klass.metric_measurements!
155
+ klass.dimensions_unit.must == "CM"
156
+ klass.weight_unit.must == "KG"
166
157
  end
167
158
 
168
- it "Dhl::GetQuote::Request must honor this test mode" do
169
- request = Dhl::GetQuote::Request.new(valid_request_options)
170
- request.dutiable?.must be_false
159
+ it "Dhl::GetQuote::Request must honor this" do
160
+ klass.metric_measurements!
161
+ valid_request.dimensions_unit.must == "CM"
162
+ valid_request.weight_unit.must == "KG"
171
163
  end
172
164
  end
173
-
174
165
  end
175
166
  end
176
167
 
@@ -98,12 +98,12 @@ describe Dhl::GetQuote::Request do
98
98
 
99
99
  describe "#dutiable?" do
100
100
  it "must be true if dutiable set to yes" do
101
- subject.instance_variable_set(:@is_dutiable, true)
101
+ subject.dutiable!(1.0, 'USD')
102
102
  subject.dutiable?.must be_true
103
103
  end
104
104
 
105
105
  it "must be false if dutiable set to no" do
106
- subject.instance_variable_set(:@is_dutiable, false)
106
+ subject.not_dutiable!
107
107
  subject.dutiable?.must be_false
108
108
  end
109
109
 
@@ -112,30 +112,41 @@ describe Dhl::GetQuote::Request do
112
112
  end
113
113
  end
114
114
 
115
- describe "#dutiable" do
116
- it "must set dutiable to true if passed a true value" do
117
- subject.dutiable(true)
115
+ describe "#dutiable!" do
116
+ it "must accept a value and currency code" do
117
+ subject.dutiable?.must be_false #sanity
118
+
119
+ subject.dutiable!(1.0, 'CAD')
120
+
118
121
  subject.dutiable?.must be_true
122
+
123
+ subject.duty.must be_an_instance_of Hash
124
+ subject.duty[:declared_currency].must == 'CAD'
125
+ subject.duty[:declared_value].must == 1.0
119
126
  end
120
127
 
121
- it "must set dutiable to false if passed a false value" do
122
- subject.dutiable(false)
123
- subject.dutiable?.must be_false
128
+ it "must use USD as the default currency code" do
129
+ subject.dutiable!(1.0)
130
+
131
+ subject.duty[:declared_currency].must == 'USD'
124
132
  end
125
- end
126
133
 
127
- describe "#dutiable!" do
128
- it "must set dutiable() to true" do
129
- subject.dutiable?.must be_false #sanity
134
+ it "must upcase and truncate currency codes" do
135
+ subject.dutiable!(1.0, 'MxPe')
130
136
 
131
- subject.dutiable!
132
- subject.dutiable?.must be_true
137
+ subject.duty[:declared_currency].must == 'MXP'
138
+ end
139
+
140
+ it "must cast value to float" do
141
+ subject.dutiable!(1)
142
+
143
+ subject.duty[:declared_value].must == 1.0
133
144
  end
134
145
  end
135
146
 
136
147
  describe "#not_dutiable!" do
137
148
  it "must set dutiable() to false" do
138
- subject.instance_variable_set(:@is_dutiable, true)
149
+ subject.instance_variable_set(:@duty, {})
139
150
  subject.dutiable?.must be_true #sanity
140
151
 
141
152
  subject.not_dutiable!
@@ -167,21 +178,75 @@ describe Dhl::GetQuote::Request do
167
178
  end
168
179
  end
169
180
 
181
+ describe "#us_measurements!" do
182
+ it "should set the measurement units to us" do
183
+ subject.instance_variable_set(:@dimensions_unit, "CM")
184
+ subject.instance_variable_set(:@weight_unit, "KG")
185
+
186
+ subject.us_measurements!
187
+
188
+ subject.dimensions_unit.must == "IN"
189
+ subject.weight_unit.must == "LB"
190
+ end
191
+ end
192
+
193
+ describe "#metric_measurements!" do
194
+ it "must set the measurement units to metric" do
195
+ subject.instance_variable_set(:@dimensions_unit, "IN")
196
+ subject.instance_variable_set(:@weight_unit, "LB")
197
+
198
+ subject.metric_measurements!
199
+
200
+ subject.dimensions_unit.must == "CM"
201
+ subject.weight_unit.must == "KG"
202
+ end
203
+ end
204
+
205
+ describe "#metric_measurements?" do
206
+ it "must be true if measurements are in kg and cm" do
207
+ subject.metric_measurements!
208
+
209
+ subject.metric_measurements?.must be_true
210
+ end
211
+
212
+ it "must be false if measurements are not in kg and cm" do
213
+ subject.us_measurements!
214
+
215
+ subject.metric_measurements?.must be_false
216
+ end
217
+ end
218
+
219
+ describe "#us_measurements?" do
220
+ it "must be true if measurements are in ln and in" do
221
+ subject.us_measurements!
222
+
223
+ subject.us_measurements?.must be_true
224
+ end
225
+
226
+ it "must be false if measurements are not in lb and in" do
227
+ subject.metric_measurements!
228
+
229
+ subject.us_measurements?.must be_false
230
+ end
231
+ end
232
+
170
233
  describe "#centimeters!" do
171
- it "must set the dimensions_unit to centimeters" do
172
- subject.instance_variable_set(:@dimensions_unit, nil)
234
+ # silence deprication notices in tests
235
+ before(:each) { subject.stub!(:puts) }
173
236
 
237
+ it "must call #metric_measurements!" do
238
+ subject.must_receive(:metric_measurements!)
174
239
  subject.centimeters!
175
- subject.dimensions_unit.must == "CM"
176
240
  end
177
241
  end
178
242
 
179
243
  describe "#inches!" do
180
- it "must set the dimensions_unit to inches" do
181
- subject.instance_variable_set(:@dimensions_unit, nil)
244
+ # silence deprication notices in tests
245
+ before(:each) { subject.stub!(:puts) }
182
246
 
247
+ it "must call #us_measurements!" do
248
+ subject.must_receive(:us_measurements!)
183
249
  subject.inches!
184
- subject.dimensions_unit.must == "IN"
185
250
  end
186
251
  end
187
252
 
@@ -210,20 +275,22 @@ describe Dhl::GetQuote::Request do
210
275
  end
211
276
 
212
277
  describe "#kilograms!" do
213
- it "must set the weight unit to kilograms" do
214
- subject.instance_variable_set(:@weight_unit, nil)
278
+ # silence deprication notices in tests
279
+ before(:each) { subject.stub!(:puts) }
215
280
 
281
+ it "must call #metric_measurements!" do
282
+ subject.must_receive(:metric_measurements!)
216
283
  subject.kilograms!
217
- subject.weight_unit.must == "KG"
218
284
  end
219
285
  end
220
286
 
221
287
  describe "#pounds!" do
222
- it "must set the weight unit to pounds" do
223
- subject.instance_variable_set(:@weight_unit, nil)
288
+ # silence deprication notices in tests
289
+ before(:each) { subject.stub!(:puts) }
224
290
 
291
+ it "must call #us_measurements!" do
292
+ subject.must_receive(:us_measurements!)
225
293
  subject.pounds!
226
- subject.weight_unit.must == "LB"
227
294
  end
228
295
  end
229
296
 
@@ -255,6 +322,12 @@ describe Dhl::GetQuote::Request do
255
322
  before(:each) do
256
323
  subject.from('US', 84010)
257
324
  subject.to('CA', 'T1H 0A1')
325
+
326
+ Timecop.freeze(Time.local(2013, 5, 15, 10, 5, 0))
327
+ end
328
+
329
+ after(:each) do
330
+ Timecop.return
258
331
  end
259
332
 
260
333
  let(:time) { Time.now }
@@ -479,4 +552,82 @@ eos
479
552
  subject.instance_variable_get(:@test_mode).must be_false
480
553
  end
481
554
  end
555
+
556
+ describe "#ready_time" do
557
+ after(:each) do
558
+ Timecop.return
559
+ end
560
+
561
+ it "should conver the current time into a DHL timestamp" do
562
+ Timecop.freeze(Time.local(2013, 5, 15, 10, 5, 0))
563
+
564
+ subject.ready_time.must == 'PT10H05M'
565
+ end
566
+
567
+ context "the time is after 5pm" do
568
+ it "should provide a stamp for the 8am" do
569
+ Timecop.freeze(Time.local(2013, 5, 15, 19, 5, 0))
570
+
571
+ subject.ready_time.must == 'PT08H00M'
572
+ end
573
+ end
574
+
575
+ context "the time is before 8am" do
576
+ it "should provide a stamp for the 8am" do
577
+ Timecop.freeze(Time.local(2013, 5, 15, 6, 5, 0))
578
+
579
+ subject.ready_time.must == 'PT08H00M'
580
+ end
581
+ end
582
+ end
583
+
584
+
585
+ describe "#ready_date" do
586
+ after(:each) do
587
+ Timecop.return
588
+ end
589
+
590
+ it 'should provide an ISO date of the current or next business day' do
591
+ Timecop.freeze(Time.local(2013, 5, 15, 10, 5, 0))
592
+
593
+ subject.ready_date.must == '2013-05-15'
594
+ end
595
+
596
+ context 'the date is friday' do
597
+ context 'the time is before 5pm' do
598
+ it 'should return todays date' do
599
+ Timecop.freeze(Time.local(2013, 5, 31, 10, 4, 0))
600
+
601
+ subject.ready_date.must == '2013-05-31'
602
+ end
603
+ end
604
+ context 'the time is after 5pm' do
605
+ it 'should return todays date' do
606
+ Timecop.freeze(Time.local(2013, 5, 31, 19, 4, 0))
607
+
608
+ subject.ready_date.must == '2013-06-03'
609
+ end
610
+ end
611
+ end
612
+ end
613
+
614
+ describe "#payment_account_number" do
615
+ context "payment account number is passed" do
616
+ it "must set the pac to be the passed number" do
617
+ subject.payment_account_number('abc123')
618
+
619
+ subject.instance_variable_get(:@payment_account_number).must == 'abc123'
620
+ end
621
+ end
622
+ context "payment account number is not passes" do
623
+ it "must be nil if no pac is recorded" do
624
+ subject.payment_account_number.must be_nil
625
+ end
626
+ it "must return the pac if one was set previously" do
627
+ subject.instance_variable_set(:@payment_account_number, '123abc')
628
+
629
+ subject.payment_account_number.must == '123abc'
630
+ end
631
+ end
632
+ end
482
633
  end
@@ -96,6 +96,23 @@ describe Dhl::GetQuote::Response do
96
96
 
97
97
  end
98
98
 
99
+ context "Condition error" do
100
+ let(:r) { klass.new(conditon_error_response) }
101
+ it "must return a valid object" do
102
+ r.must be_an_instance_of(klass)
103
+ end
104
+
105
+ it "must indicater an error" do
106
+ r.error?.must be_true
107
+ end
108
+
109
+ it "must set the error value appropriately" do
110
+ r.error.must be_an_instance_of Dhl::GetQuote::Upstream::ConditionError
111
+ r.error.message.must == "The declared value is missing."
112
+ r.error.code.must == "5021"
113
+ end
114
+ end
115
+
99
116
  end
100
117
 
101
118
  describe "#error?" do
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'rspec'
2
2
  require 'rspec/must'
3
3
 
4
+ require 'timecop'
5
+
4
6
  RSpec.configure do |config|
5
7
  config.treat_symbols_as_metadata_keys_with_true_values = true
6
8
  config.run_all_when_everything_filtered = true
@@ -505,4 +507,8 @@ def mkt_srv_response
505
507
  </Srvs>
506
508
  </GetQuoteResponse>
507
509
  </res:DCTResponse>'
510
+ end
511
+
512
+ def conditon_error_response
513
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?><res:DCTResponse xmlns:res='http://www.dhl.com' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation= 'http://www.dhl.com DCT-Response.xsd'><GetQuoteResponse><Response><ServiceHeader><MessageTime>2013-05-31T22:49:42.138+01:00</MessageTime><SiteID>Desere</SiteID></ServiceHeader></Response><Note><Condition><ConditionCode>5021</ConditionCode><ConditionData>The declared value is missing. </ConditionData></Condition></Note></GetQuoteResponse></res:DCTResponse>\n"
508
514
  end
data/tpl/request.xml.erb CHANGED
@@ -13,7 +13,7 @@
13
13
  </From>
14
14
  <BkgDetails>
15
15
  <PaymentCountryCode><%= @from_country_code %></PaymentCountryCode>
16
- <Date><%= Time.now.strftime("%Y-%m-%d") %></Date>
16
+ <Date><%= ready_date %></Date>
17
17
  <ReadyTime><%= ready_time %></ReadyTime>
18
18
  <ReadyTimeGMTOffset>+00:00</ReadyTimeGMTOffset>
19
19
  <DimensionUnit><%= dimensions_unit %></DimensionUnit>
@@ -21,6 +21,9 @@
21
21
  <Pieces>
22
22
  <% pieces.each_with_index do |piece,i| %><%= piece.piece_id = i+1; piece.to_xml %><% end %>
23
23
  </Pieces>
24
+ <% if @payment_account_number -%>
25
+ <PaymentAccountNumber><%= @payment_account_number %></PaymentAccountNumber>
26
+ <% end -%>
24
27
  <IsDutiable><%= dutiable? ? "Y" : "N" %></IsDutiable>
25
28
  <% if special_services.size>0 -%>
26
29
  <QtdShp>
@@ -36,5 +39,11 @@
36
39
  <CountryCode><%= @to_country_code %></CountryCode>
37
40
  <Postalcode><%= @to_postal_code %></Postalcode>
38
41
  </To>
42
+ <%- if dutiable? %>
43
+ <Dutiable>
44
+ <DeclaredCurrency><%= @duty[:declared_currency] %></DeclaredCurrency>
45
+ <DeclaredValue><%= @duty[:declared_value] %></DeclaredValue>
46
+ </Dutiable>
47
+ <% end %>
39
48
  </GetQuote>
40
49
  </p:DCTRequest>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dhl-get_quote
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.27
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-05-30 00:00:00.000000000 Z
13
+ date: 2013-06-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -109,21 +109,21 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.0.1
111
111
  - !ruby/object:Gem::Dependency
112
- name: debugger
112
+ name: timecop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  none: false
115
115
  requirements:
116
- - - ! '>='
116
+ - - ~>
117
117
  - !ruby/object:Gem::Version
118
- version: '0'
118
+ version: 0.6.1
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  none: false
123
123
  requirements:
124
- - - ! '>='
124
+ - - ~>
125
125
  - !ruby/object:Gem::Version
126
- version: '0'
126
+ version: 0.6.1
127
127
  description: Get shipping quotes from DHL
128
128
  email:
129
129
  - mnielsen@deseretbook.com
@@ -157,7 +157,10 @@ files:
157
157
  - tpl/request.xml.erb
158
158
  homepage: https://github.com/deseretbook/dhl-get_quote
159
159
  licenses: []
160
- post_install_message:
160
+ post_install_message: ! "\n*** NOTE Dhl-GetQuote ***\n\nThis version introduces the
161
+ following changes from 0.4.x:\n\n* #inches!, #pounds!, #kilograms! and #centimeters
162
+ have been depricated.\n Please use #us_measurements! or #metric_measurements!.\n\n*
163
+ dutiable() replaces dutiable! now requires arguments (dutiable value and currency).\n\n"
161
164
  rdoc_options: []
162
165
  require_paths:
163
166
  - lib