spree_delivery_options 2.2.8 → 2.2.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 632e270bb1dff806503365bb70f806b2ebe304b4
4
- data.tar.gz: 2656de02711cbcf5177606224145b6c18ca6ac2f
3
+ metadata.gz: 4f5a03d996f7cadc0ca14c68db26a316930675b2
4
+ data.tar.gz: 937419643b561f2e352ffe2f4d77d00528722f85
5
5
  SHA512:
6
- metadata.gz: cde0b744c696b162fbfa4fdd6f0f6e7df8c75dafac7052992ce3093ca97232ed936e6c52975fddbb3f08e9599d5bfd7f576f86d2da1aecd0585c6e5641b29d06
7
- data.tar.gz: 8fdfc598b17bfd9e78857f05636023e34948e7c78e873251b288bf73b80bfff9477dc5587459659e69f4cfd343184644a1a4bf8485edd664d5a1b959c9d4b8be
6
+ metadata.gz: 98a2fb5a4c6423a9f8757fbb068e0192bf77fa3c0470f797c6872d1ee29628673f7d1c906cd3cd8e953b13a654f7bb5ebd074b93f639b3a900841f12b19e7cf2
7
+ data.tar.gz: cb798df4efe3417f322e4a4eb89c1d93ad01f520d849832b0a2506f6df34019586e74c437a84cb6396e7dc61c3ca87cd87eaa983b1a21f1c4bb6dad06d947fb3
data/README.md CHANGED
@@ -44,17 +44,25 @@ Configuration
44
44
  Both the delivery cut off hour and the delivery time options can be configured in your application.rb file
45
45
 
46
46
  config.after_initialize do
47
- delivery_time_options = {
48
- monday: ["Before 6am", "9-12 am"],
49
- tuesday: ["Before 6am", "9-12 am"]
50
- }.to_json
47
+ delivery_time_options = [
48
+ { 13:00 =>
49
+ {
50
+ monday: ["Before 6am", "9-12 am"],
51
+ tuesday: ["Before 6am", "9-12 am"]
52
+ }
53
+ }
54
+ ].to_json
51
55
  SpreeDeliveryOptions::Config.delivery_time_options = delivery_time_options
52
- SpreeDeliveryOptions::Config.delivery_cut_off_hour = 12
53
56
  end
54
57
 
55
58
  The delivery options for any weekday can be overriden by specifying a date in dd/mm/yyyy format (i.e. for different times in public holidays).
56
59
 
57
- delivery_time_options = {
58
- '02/02/2014' => ["Before 6am", "9-12 am"],
59
- tuesday: ["Before 6am", "9-12 am"]
60
- }.to_json
60
+ delivery_time_options = [
61
+ { 13:00 =>
62
+ {
63
+ "12/02/2014" => ["9-12am"],
64
+ monday: ["Before 6am", "9-12 am"],
65
+ tuesday: ["Before 6am", "9-12 am"]
66
+ }
67
+ }
68
+ ].to_json
@@ -12,20 +12,35 @@ function SpreeDeliveryOptions() {
12
12
  }
13
13
  };
14
14
 
15
+ this.parseDeliveryOptions = function(deliveryDate) {
16
+ var deliveryTimeGroups = $.parseJSON($('.delivery-time-options').attr("data"));
17
+ var result;
18
+ var baselineTime = "00:01";
19
+
20
+ $.each(deliveryTimeGroups[0], function(index, value) {
21
+ if (baselineTime < index)
22
+ {
23
+ result = value;
24
+ return false;
25
+ }
26
+ });
27
+ return result;
28
+ };
29
+
15
30
  this.update_delivery_time_options = function() {
16
- var deliveryTimeOptions = $.parseJSON($('.delivery-time-options').attr("data"));
31
+ var dateParts = []
32
+ if ($('#order_delivery_date').val().indexOf('/') !== -1) {
33
+ dateParts = $('#order_delivery_date').val().split('/')
34
+ } else {
35
+ dateParts = $('#order_delivery_date').val().split('-')
36
+ }
37
+ var deliveryDate = this.convertDateFormat(dateParts);
38
+ var deliveryTimeOptions = this.parseDeliveryOptions(deliveryDate);
17
39
 
18
40
  if (deliveryTimeOptions){
19
41
  weekdays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
20
42
 
21
- var dateParts = []
22
- if ($('#order_delivery_date').val().indexOf('/') !== -1) {
23
- dateParts = $('#order_delivery_date').val().split('/')
24
- } else {
25
- dateParts = $('#order_delivery_date').val().split('-')
26
- }
27
43
 
28
- var deliveryDate = this.convertDateFormat(dateParts);
29
44
  var dayOptions = [];
30
45
  if (deliveryTimeOptions[deliveryDate]) {
31
46
  dayOptions = deliveryTimeOptions[deliveryDate];
@@ -1,2 +1,3 @@
1
1
  //= require jquery
2
+ //= require moment_js/moment.min
2
3
  //= require spree/backend/delivery_time_options
@@ -17,14 +17,35 @@ function SpreeDeliveryOptions() {
17
17
  });
18
18
  };
19
19
 
20
+ this.parseDeliveryOptions = function(deliveryDate) {
21
+ var deliveryTimeGroups = $.parseJSON($('.delivery-time-options').attr("data"));
22
+ var result;
23
+
24
+ var baselineTime = moment().format('H:mm');
25
+
26
+ var tomorrow = moment().add('days', 1);
27
+ if (moment(deliveryDate, "DD-MM-YYYY").isAfter(tomorrow)) {
28
+ baselineTime = "00:01";
29
+ }
30
+
31
+ $.each(deliveryTimeGroups[0], function(index, value) {
32
+ if (baselineTime < index)
33
+ {
34
+ result = value;
35
+ return false;
36
+ }
37
+ });
38
+ return result;
39
+ };
40
+
20
41
  this.update_delivery_time_options = function() {
21
- deliveryTimeOptions = $.parseJSON($('.delivery-time-options').attr("data"));
42
+ var deliveryDate = $('#order_delivery_date').val();
43
+ var deliveryTimeOptions = this.parseDeliveryOptions(deliveryDate);
22
44
 
23
- if (deliveryTimeOptions){
45
+ if (deliveryTimeOptions) {
24
46
  weekdays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
25
-
47
+
26
48
  var dayOptions = [];
27
- var deliveryDate = $('#order_delivery_date').val();
28
49
 
29
50
  if (deliveryTimeOptions[deliveryDate]) {
30
51
  dayOptions = deliveryTimeOptions[deliveryDate];
@@ -1,4 +1,5 @@
1
1
  //= require jquery
2
+ //= require moment_js/moment.min
2
3
  //= require spree/frontend/delivery_time_options
3
4
  //= require spree/frontend/delivery_options_form
4
5
  //= require spree/frontend/jquery-ui-1.10.4.custom
@@ -1,41 +1,40 @@
1
1
  module SpreeDeliveryOptions
2
2
  module BaseHelper
3
3
 
4
+ include ::SpreeDeliveryOptions::DeliveryOptionsService
5
+
4
6
  def current_order_cutoff_time
5
- return nil unless (current_order && current_order.delivery_date)
7
+ return nil unless (current_order && current_order.delivery_date && current_order.delivery_time)
6
8
 
7
- cutoff_time = Time.zone.now.change(hour: SpreeDeliveryOptions::Config.delivery_cut_off_hour)
8
9
  cutoff_date = current_order.delivery_date - 1.day
9
- "#{cutoff_date.strftime('%A, %d %b')} before #{cutoff_time.strftime("%l%P")}"
10
- end
10
+ all_delivery_options = all_delivery_options_for_date(current_order.delivery_date)
11
11
 
12
- def next_delivery_slot
13
- delivery_options = JSON.parse(SpreeDeliveryOptions::Config.delivery_time_options)
12
+ possible_cutoff_times = all_delivery_options.select{ |opt|
13
+ opt.values.flatten.include?(current_order.delivery_time)
14
+ }.map{ |opt| opt.keys}.flatten rescue nil
14
15
 
15
- delivery_day = next_delivery_day
16
- return "" unless delivery_day
16
+ return nil if possible_cutoff_times.empty?
17
17
 
18
- "#{delivery_day.strftime('%A').titleize} between #{delivery_options[delivery_day.strftime('%A').downcase].first}"
18
+ cutoff_time = DateTime.strptime(possible_cutoff_times.sort.last, "%H:%M").strftime("%l%P").strip
19
+ "#{cutoff_date.strftime('%A, %d %b')} before #{cutoff_time}"
19
20
  end
20
21
 
21
- def next_delivery_day
22
- delivery_options = JSON.parse(SpreeDeliveryOptions::Config.delivery_time_options)
22
+ def next_delivery_slot
23
+ current_time_string = Time.zone.now.strftime("%H:%M")
24
+ possible_delivery_day = Date.current + 1.day
23
25
 
24
- cutoff_time = Time.zone.now.change(hour: SpreeDeliveryOptions::Config.delivery_cut_off_hour)
26
+ next_delivery_slot_for(possible_delivery_day, current_time_string)
27
+ end
25
28
 
26
- current_day = Time.zone.now > cutoff_time ? (Date.current + 2.days) : (Date.current + 1.day)
27
- next_available_day = nil
28
- counter = 0
29
+ def next_delivery_slot_for(delivery_date, time_string, counter=0)
30
+ return "" if counter == 7 #break after cycling through the week
29
31
 
30
- until next_available_day || counter > 7 do
31
- if delivery_options[current_day.strftime('%A').downcase]
32
- next_available_day = current_day
33
- else
34
- current_day = current_day + 1.day
35
- counter = counter + 1
36
- end
32
+ possible_delivery_options = delivery_options_for_date_and_time(delivery_date, time_string)
33
+ unless possible_delivery_options.empty?
34
+ return "#{delivery_date.strftime('%A').titleize} between #{possible_delivery_options.first}"
37
35
  end
38
- next_available_day
36
+
37
+ next_delivery_slot_for(delivery_date + 1.day, "00:01", counter + 1)
39
38
  end
40
39
 
41
40
  end
@@ -2,8 +2,9 @@ Spree::Order.class_eval do
2
2
  require 'date'
3
3
  require 'spree/order/checkout'
4
4
 
5
- validate :valid_delivery_date?
6
- validate :valid_delivery_time?
5
+ include SpreeDeliveryOptions::DeliveryOptionsService
6
+
7
+ validate :valid_delivery_options?
7
8
 
8
9
  def valid_delivery_instructions?
9
10
  if self.delivery_instructions && self.delivery_instructions.length > 500
@@ -18,53 +19,24 @@ Spree::Order.class_eval do
18
19
  self.errors[:delivery_date].empty? ? true : false
19
20
  end
20
21
 
21
- def valid_delivery_date?
22
- if self.delivery_date && self.delivery_date_changed?
23
- self.errors[:delivery_date] << 'cannot be today or in the past' if self.delivery_date <= Date.current
24
-
25
- options = delivery_time_options(self.delivery_date)
26
- unless options && !options.empty?
27
- self.errors[:delivery_date] << "is not available on the selected date."
28
- end
29
-
30
- cutoff_time = Time.zone.now.change(hour: SpreeDeliveryOptions::Config.delivery_cut_off_hour)
31
- if self.delivery_date == (Date.current + 1.day) && Time.zone.now > (cutoff_time + 15.minutes)
32
- self.errors[:delivery_date] << "cannot be tomorrow if the order is created after 1pm"
33
- end
34
- end
35
-
36
- self.errors[:delivery_date].empty? ? true : false
37
- end
38
-
39
22
  def delivery_time_present?
40
23
  self.errors[:delivery_time] << 'cannot be blank' unless self.delivery_time
41
24
  self.errors[:delivery_time].empty? ? true : false
42
25
  end
43
26
 
44
- def valid_delivery_time?
45
- return unless self.delivery_date
46
-
47
- self.errors[:delivery_time] << 'cannot be blank' unless self.delivery_time
27
+ def valid_delivery_options?
28
+ if (self.delivery_date && self.delivery_date_changed?) && (self.delivery_time && self.delivery_time_changed?)
29
+ self.errors[:delivery_date] << 'cannot be today or in the past' if self.delivery_date <= Date.current
48
30
 
49
- if self.delivery_time
50
- self.errors[:delivery_time] << 'is invalid' unless (delivery_time_options(self.delivery_date) && delivery_time_options(self.delivery_date).include?(self.delivery_time))
31
+ options = current_delivery_options_for_date(self.delivery_date)
32
+ if options && !options.empty?
33
+ self.errors[:delivery_time] << 'is invalid' unless options.include?(self.delivery_time)
34
+ else
35
+ self.errors[:delivery_date] << "is not available on the selected date."
36
+ end
51
37
  end
52
38
 
53
- self.errors[:delivery_time].empty? ? true : false
54
- end
55
-
56
- private
57
-
58
- def delivery_time_options(date)
59
- date_string = date.strftime("%d/%m/%Y")
60
- return delivery_options[date_string] if delivery_options[date_string]
61
-
62
- week_day = date.strftime("%A")
63
- delivery_options[week_day.downcase]
64
- end
65
-
66
- def delivery_options
67
- @delivery_options ||= JSON.parse(SpreeDeliveryOptions::Config.delivery_time_options)
39
+ (self.errors[:delivery_date].empty? && self.errors[:delivery_time].empty?) ? true : false
68
40
  end
69
41
 
70
42
  end
@@ -76,8 +48,5 @@ Spree::PermittedAttributes.checkout_attributes << :delivery_instructions
76
48
  Spree::Order.state_machine.before_transition :to => :payment, :do => :valid_delivery_instructions?
77
49
 
78
50
  Spree::Order.state_machine.before_transition :to => :payment, :do => :delivery_date_present?
79
- Spree::Order.state_machine.before_transition :to => :payment, :do => :valid_delivery_date?
80
-
81
51
  Spree::Order.state_machine.before_transition :to => :payment, :do => :delivery_time_present?
82
- Spree::Order.state_machine.before_transition :to => :payment, :do => :valid_delivery_time?
83
-
52
+ Spree::Order.state_machine.before_transition :to => :payment, :do => :valid_delivery_options?
@@ -23,10 +23,10 @@
23
23
  = f.label :delivery_date, "Delivery Date"
24
24
  = f.text_field :delivery_date, class: "datepicker"
25
25
  .field
26
- - delivery_options = JSON.parse(SpreeDeliveryOptions::Config.delivery_time_options)[(@order.delivery_date || Date.today).strftime('%A').downcase]
26
+ - delivery_options = JSON.parse(SpreeDeliveryOptions::Config.delivery_time_options)
27
27
  .selected-delivery-time{data: @order.delivery_time}
28
- = f.label :delivery_time, "Delivery Time"
29
- = f.select :delivery_time, delivery_options || ""
28
+ = f.label :delivery_time, "Delivery Time"
29
+ = f.select :delivery_time, []
30
30
  .field
31
31
  = f.label :delivery_instructions, "Delivery Instructions"
32
32
  = f.text_area :delivery_instructions, class: 'fullwidth'
@@ -22,7 +22,7 @@
22
22
  = form.text_field :delivery_date, value: (l(order.delivery_date) rescue l(Date.current + 1))
23
23
  .field
24
24
  = form.label :delivery_time, "Delivery Time"
25
- = form.select :delivery_time, JSON.parse(SpreeDeliveryOptions::Config.delivery_time_options)["monday"]
25
+ = form.select :delivery_time, current_delivery_options_for_date(Date.tomorrow)
26
26
  .field
27
27
  = form.submit "Set Delivery Time"
28
28
  .delivery-time-options{data: SpreeDeliveryOptions::Config.delivery_time_options}
@@ -1,7 +1,7 @@
1
1
  module SpreeDeliveryOptions
2
2
  class Configuration < Spree::Preferences::Configuration
3
- preference :delivery_cut_off_hour, :integer, default: 13
4
- preference :delivery_time_options, :string, default: {monday: ['Between 6am-8am']}.to_json
3
+ preference :delivery_cut_off_time, :string, default: [{cutoff_time: "13:15", id: :morning}, {cutoff_time: "23:59", id: :evening}].to_json
4
+ preference :delivery_time_options, :string, default: {morning: {monday: ['Between 6-7am']}, evening: {monday: ['6pm to 7:30pm']}}.to_json
5
5
  preference :show_homepage_form, :boolean, default: true
6
6
  end
7
7
  end
@@ -0,0 +1,49 @@
1
+ module SpreeDeliveryOptions
2
+ module DeliveryOptionsService
3
+
4
+ private
5
+
6
+ def current_delivery_options_for_date(delivery_date)
7
+ if delivery_date > (Date.current + 1.day)
8
+ delivery_options_for_date_and_time(delivery_date, "00:01")
9
+ else
10
+ delivery_options_for_date_and_time(delivery_date, Time.zone.now.strftime("%H:%M"))
11
+ end
12
+ end
13
+
14
+ def delivery_options_for_date_and_time(delivery_date, time_string)
15
+ current_delivery_options = delivery_options_for_time(time_string)
16
+
17
+ date_string = delivery_date.strftime("%d/%m/%Y")
18
+ return current_delivery_options[date_string] if current_delivery_options[date_string]
19
+
20
+ week_day = delivery_date.strftime("%A")
21
+ current_delivery_options[week_day.downcase] || []
22
+ end
23
+
24
+ def all_delivery_options_for_date(delivery_date)
25
+ all_options = []
26
+ date_string = delivery_date.strftime("%d/%m/%Y")
27
+ week_day = delivery_date.strftime("%A").downcase
28
+
29
+ delivery_groups.each do |cutoff_time, options|
30
+ if options[date_string]
31
+ all_options << {cutoff_time => options[date_string]}
32
+ elsif options[week_day]
33
+ all_options << {cutoff_time => options[week_day]}
34
+ end
35
+ end
36
+ all_options
37
+ end
38
+
39
+ def delivery_options_for_time(order_time_string)
40
+ delivery_groups.each{|cutoff_time, options| return options if order_time_string < cutoff_time}
41
+ {}
42
+ end
43
+
44
+ def delivery_groups
45
+ @delivery_groups = JSON.parse(SpreeDeliveryOptions::Config.delivery_time_options)[0] || []
46
+ end
47
+
48
+ end
49
+ end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe SpreeDeliveryOptions::BaseHelper do
4
4
 
5
+
5
6
  describe 'current order cutoff time' do
6
7
 
7
8
  let(:order){FactoryGirl.build(:order)}
@@ -15,18 +16,56 @@ describe SpreeDeliveryOptions::BaseHelper do
15
16
  helper.current_order_cutoff_time.should be_nil
16
17
  end
17
18
 
18
- it 'should return nil if there current order has no delivery date' do
19
+ it 'should return nil if current order has no delivery date' do
19
20
  order.delivery_date = nil
20
21
  helper.current_order_cutoff_time.should be_nil
21
22
  end
22
23
 
23
- it 'should return the day before if delivery date is set' do
24
- SpreeDeliveryOptions::Config.delivery_cut_off_hour = 13
24
+ it 'should return nil if current order has no delivery time' do
25
+ order.delivery_date = Date.parse('23/04/2014')
26
+ order.delivery_time = nil
27
+ helper.current_order_cutoff_time.should be_nil
28
+ end
29
+
30
+ it 'should return nil if delivery time is invalid' do
25
31
  order.delivery_date = Date.parse('23/04/2014')
32
+ order.delivery_time = "crazy!"
33
+ helper.current_order_cutoff_time.should be_nil
34
+ end
35
+
36
+ it 'should return the correct delivery group cut off time depending on the delivery time' do
37
+ SpreeDeliveryOptions::Config.delivery_time_options = [{"13:15" => {monday: ['6am to 7:30am']}, "20:00" => {monday: ['6pm to 7:30pm']}}].to_json
38
+
39
+ order.delivery_date = Date.parse('21/04/2014')
40
+ order.delivery_time = '6pm to 7:30pm'
41
+
42
+ time_now = DateTime.parse("18/03/2013")
43
+ Timecop.freeze(time_now)
44
+ helper.current_order_cutoff_time.should == 'Sunday, 20 Apr before 8pm'
45
+ Timecop.return
46
+ end
47
+
48
+ it 'should consider overrides when establishing the cutoff time' do
49
+ SpreeDeliveryOptions::Config.delivery_time_options = [{"13:15" => {monday: ['6pm to 7:30pm']}, "20:00" => {"21/04/2014" => ["9am to 12am"], monday: ['6pm to 7:30pm']}}].to_json
50
+
51
+ order.delivery_date = Date.parse('21/04/2014')
52
+ order.delivery_time = '6pm to 7:30pm'
53
+
54
+ time_now = DateTime.parse("18/03/2013")
55
+ Timecop.freeze(time_now)
56
+ helper.current_order_cutoff_time.should == 'Sunday, 20 Apr before 1pm'
57
+ Timecop.return
58
+ end
59
+
60
+ it 'should return the latest one if time is in both' do
61
+ SpreeDeliveryOptions::Config.delivery_time_options = [{"13:15" => {monday: ['6pm to 7:30pm']}, "20:00" => {monday: ['6pm to 7:30pm']}}].to_json
26
62
 
27
- time_now = DateTime.parse("20/03/2013")
63
+ order.delivery_date = Date.parse('21/04/2014')
64
+ order.delivery_time = '6pm to 7:30pm'
65
+
66
+ time_now = DateTime.parse("18/03/2013")
28
67
  Timecop.freeze(time_now)
29
- helper.current_order_cutoff_time.should == 'Tuesday, 22 Apr before 1pm'
68
+ helper.current_order_cutoff_time.should == 'Sunday, 20 Apr before 8pm'
30
69
  Timecop.return
31
70
  end
32
71
 
@@ -34,36 +73,65 @@ describe SpreeDeliveryOptions::BaseHelper do
34
73
 
35
74
  describe 'next delivery slot' do
36
75
 
37
- it 'should return first slot for tomorrow if its before cutoff time' do
38
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['6am-7am', '7am-9am'], tuesday: ['9am-12pm']}.to_json
39
- time_now = DateTime.parse("10/03/2014 #{SpreeDeliveryOptions::Config.delivery_cut_off_hour-1}:00 +1100")
40
- Timecop.freeze(time_now)
76
+ before :each do
77
+ SpreeDeliveryOptions::Config.delivery_time_options = [{
78
+ "13:15" => {tuesday: ['6am to 7:30am'], wednesday: ['6am to 7:30am'], thursday: []},
79
+ "20:00" => {tuesday: ['6pm to 7:30pm']}
80
+ }].to_json
81
+ end
41
82
 
42
- helper.next_delivery_slot.should == 'Tuesday between 9am-12pm'
83
+ after :each do
43
84
  Timecop.return
44
85
  end
45
86
 
46
- it 'should return the day after tomorrow morning if its after cutoff time' do
47
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['6am-7am', '7am-9am'], tuesday: ['9am-12pm'], wednesday: ['9am-12pm']}.to_json
48
- time_now = DateTime.parse("10/03/2014 #{SpreeDeliveryOptions::Config.delivery_cut_off_hour+1}:00 +1100")
87
+ it 'should return first slot for tomorrow morning if its before cutoff time' do
88
+ time_now = DateTime.parse("10/03/2014 12:00 +1100")
49
89
  Timecop.freeze(time_now)
50
90
 
51
- helper.next_delivery_slot.should == 'Wednesday between 9am-12pm'
52
- Timecop.return
91
+ helper.next_delivery_slot.should == 'Tuesday between 6am to 7:30am'
92
+ end
93
+
94
+ it 'should return first slot for tomorrow evening if its before evening cutoff time' do
95
+ time_now = DateTime.parse("10/03/2014 14:00 +1100")
96
+ Timecop.freeze(time_now)
97
+
98
+ helper.next_delivery_slot.should == 'Tuesday between 6pm to 7:30pm'
99
+ end
100
+
101
+ it 'should consider overrides when getting cutoff time' do
102
+ SpreeDeliveryOptions::Config.delivery_time_options = [{
103
+ "13:15" => {tuesday: ['6am to 7:30am'], wednesday: ['6am to 7:30am'], thursday: []},
104
+ "20:00" => {"11/03/2014" => ['9am to 12am'], tuesday: ['6pm to 7:30pm']}
105
+ }].to_json
106
+
107
+ time_now = DateTime.parse("10/03/2014 14:00 +1100")
108
+ Timecop.freeze(time_now)
109
+
110
+ helper.next_delivery_slot.should == 'Tuesday between 9am to 12am'
111
+ end
112
+
113
+ it 'should return the day after tomorrow morning if its after evening cutoff time' do
114
+ time_now = DateTime.parse("10/03/2014 20:01 +1100")
115
+ Timecop.freeze(time_now)
116
+
117
+ helper.next_delivery_slot.should == 'Wednesday between 6am to 7:30am'
53
118
  end
54
119
 
55
120
  it 'should skip day if deliveries are not available' do
56
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['6am-7am', '7am-9am'], tuesday: ['9am-12pm'], wednesday: ['9am-12pm']}.to_json
57
- time_now = DateTime.parse("13/03/2014 #{SpreeDeliveryOptions::Config.delivery_cut_off_hour+1}:00 +1100")
121
+ SpreeDeliveryOptions::Config.delivery_time_options = [{
122
+ "13:15" => {monday: ['6am to 7:30am'], tuesday: ['6am to 7:30am'], wednesday: ['6am to 7:30am'], thursday: []},
123
+ "20:00" => {"11/03/2014" => ['9am to 12am'], tuesday: ['6pm to 7:30pm']}
124
+ }].to_json
125
+
126
+ time_now = DateTime.parse("02/05/2014 14:00 +1100")
58
127
  Timecop.freeze(time_now)
59
128
 
60
- helper.next_delivery_slot.should == 'Monday between 6am-7am'
61
- Timecop.return
129
+ helper.next_delivery_slot.should == 'Monday between 6am to 7:30am'
62
130
  end
63
131
 
64
- it 'should return nil if no delivery times are avaialble' do
65
- SpreeDeliveryOptions::Config.delivery_time_options = {}.to_json
66
- time_now = DateTime.parse("13/03/2014 #{SpreeDeliveryOptions::Config.delivery_cut_off_hour+1}:00 +1100")
132
+ it 'should return nil if no delivery times are available' do
133
+ SpreeDeliveryOptions::Config.delivery_time_options = [].to_json
134
+ time_now = DateTime.parse("13/03/2014 12:00 +1100")
67
135
  Timecop.freeze(time_now)
68
136
 
69
137
  helper.next_delivery_slot.should == ''
@@ -5,8 +5,8 @@ describe Spree::Order do
5
5
  let(:order){Spree::Order.new}
6
6
 
7
7
  before :each do
8
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['Between 6-7am']}.to_json
9
- SpreeDeliveryOptions::Config.delivery_cut_off_hour = 13
8
+ SpreeDeliveryOptions::Config.delivery_time_options = [{monday: ['Between 6-7am']}].to_json
9
+ SpreeDeliveryOptions::Config.delivery_cut_off_time = "13:15"
10
10
  end
11
11
 
12
12
  describe 'valid_delivery_instructions' do
@@ -46,147 +46,179 @@ describe Spree::Order do
46
46
 
47
47
  end
48
48
 
49
- describe "valid_delivery_date" do
49
+ describe 'delivery_time_present' do
50
+
51
+ it 'should require delivery time' do
52
+ order.delivery_date = Date.today
53
+
54
+ order.delivery_time_present?.should == false
55
+ order.errors[:delivery_time].should_not be_empty
56
+ end
57
+
58
+ end
59
+
60
+ describe "valid_delivery_options?" do
50
61
 
51
62
  before :each do
52
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['Between 6-7am']}.to_json
63
+ SpreeDeliveryOptions::Config.delivery_time_options = [{"13:15" => {monday: ['Between 6-7am'], tuesday: ['Between 6-7am'], wednesday: ['Between 6-7am']}, "20:00" => {monday: ['6pm to 7:30pm']}}].to_json
53
64
  end
54
65
 
55
66
  it 'should not be valid if delivery date is in the past' do
56
67
  order.delivery_date = Date.yesterday
57
- order.valid_delivery_date?.should == false
68
+ order.delivery_time = 'Between 6-7am'
69
+ order.valid_delivery_options?.should == false
58
70
  order.errors[:delivery_date].should_not be_empty
59
71
  end
60
72
 
61
73
  it 'should not be valid if delivery date is today' do
62
74
  order.delivery_date = Date.today
63
- order.valid_delivery_date?.should == false
75
+ order.delivery_time = 'Between 6-7am'
76
+ order.valid_delivery_options?.should == false
64
77
  order.errors[:delivery_date].should_not be_empty
65
78
  end
66
79
 
67
- it 'should be valid if delivery date is tomorrow and it is past the cutoff time by less than 15 min' do
68
- time_now = DateTime.parse("17/11/2013 #{SpreeDeliveryOptions::Config.delivery_cut_off_hour}:14 +1100", "%d/%m/%Y %H:%M %z")
80
+ it 'should be valid if delivery date is tomorrow morning and it is before the morning cutoff time' do
81
+ time_now = DateTime.parse("17/11/2013 13:14 +1100", "%d/%m/%Y %H:%M %z")
69
82
  Timecop.freeze(time_now)
70
83
 
71
84
  order.delivery_date = '18/11/2013'
72
- order.valid_delivery_date?.should == true
85
+ order.delivery_time = 'Between 6-7am'
86
+
87
+ order.valid_delivery_options?.should == true
73
88
  order.errors[:delivery_date].should be_empty
74
89
  Timecop.return
75
90
  end
76
91
 
77
- it 'should not be valid if delivery date is tomorrow and it is past the cutoff time + 15 min' do
78
- time_now = DateTime.parse("17/11/2013 #{SpreeDeliveryOptions::Config.delivery_cut_off_hour}:16 +1100", "%d/%m/%Y %H:%M %z")
92
+ it 'should be valid if delivery date is tomorrow evening and it is before the evening cutoff time' do
93
+ time_now = DateTime.parse("17/11/2013 19:14 +1100", "%d/%m/%Y %H:%M %z")
79
94
  Timecop.freeze(time_now)
80
95
 
81
96
  order.delivery_date = '18/11/2013'
82
- order.valid_delivery_date?.should == false
83
- order.errors[:delivery_date].should_not be_empty
84
- Timecop.return
85
- end
97
+ order.delivery_time = '6pm to 7:30pm'
86
98
 
87
- it 'should be valid if delivery date is tomorrow but is before the cutoff time' do
88
- time_now = DateTime.parse("17/11/2013 #{SpreeDeliveryOptions::Config.delivery_cut_off_hour-1}:59 +1100")
89
- Timecop.freeze(time_now)
90
-
91
- order.delivery_date = '18/11/2013'
92
- order.valid_delivery_date?
99
+ order.valid_delivery_options?.should == true
93
100
  order.errors[:delivery_date].should be_empty
94
101
  Timecop.return
95
102
  end
96
103
 
97
- end
98
-
99
- describe 'delivery_time_present' do
104
+ it 'should not be valid if delivery date is tomorrow morning but is after the morning cutoff time' do
105
+ time_now = DateTime.parse("17/11/2013 13:16 +1100", "%d/%m/%Y %H:%M %z")
106
+ Timecop.freeze(time_now)
100
107
 
101
- it 'should require delivery time' do
102
- order.delivery_date = Date.today
108
+ order.delivery_date = '18/11/2013'
109
+ order.delivery_time = 'Between 6-7am'
103
110
 
104
- order.delivery_time_present?.should == false
111
+ order.valid_delivery_options?.should == false
105
112
  order.errors[:delivery_time].should_not be_empty
113
+ Timecop.return
106
114
  end
107
115
 
108
- end
116
+ it 'should not be valid if delivery date is tomorrow evening and it is after the evening cutoff time' do
117
+ time_now = DateTime.parse("17/11/2013 20:01 +1100", "%d/%m/%Y %H:%M %z")
118
+ Timecop.freeze(time_now)
109
119
 
110
- describe 'valid_delivery_time' do
120
+ order.delivery_date = '18/11/2013'
121
+ order.delivery_time = '6pm to 7:30pm'
111
122
 
112
- before :each do
113
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['Between 6-7am']}.to_json
123
+ order.valid_delivery_options?.should == false
124
+ order.errors[:delivery_date].should_not be_empty
125
+ Timecop.return
114
126
  end
115
127
 
116
- it 'should require a valid option for delivery time' do
117
- order.delivery_date = Date.today
128
+ it 'should be valid if delivery date is after tomorrow morning even when its after the morning cutoff time' do
129
+ time_now = DateTime.parse("17/11/2013 19:14 +1100", "%d/%m/%Y %H:%M %z")
130
+ Timecop.freeze(time_now)
118
131
 
119
- order.delivery_time = 'crazy times!'
120
- order.valid_delivery_time?.should == false
121
- order.errors[:delivery_time].should_not be_empty
122
- end
132
+ order.delivery_date = '19/11/2013'
133
+ order.delivery_time = 'Between 6-7am'
123
134
 
124
- it 'should allow delivery time to be in a valid delivery day' do
125
- order.delivery_date = DateTime.now.next_week.next_day(0)
126
- order.valid_delivery_date?#.should == true
135
+ order.valid_delivery_options?.should == true
127
136
  order.errors[:delivery_date].should be_empty
137
+ Timecop.return
128
138
  end
129
139
 
130
- it 'should not allow delivery time to be in a non delivery day' do
131
- order.delivery_date = DateTime.now.next_week.next_day(1)
132
- order.valid_delivery_date?.should == false
133
- order.errors[:delivery_date].should_not be_empty
134
- end
140
+ context 'delivery time' do
135
141
 
136
- describe "overriding delivery day with specific date" do
142
+ before :each do
143
+ SpreeDeliveryOptions::Config.delivery_time_options = [{"13:15" => {monday: ['Between 6-7am']}, "20:00" => {monday: ['6pm to 7:30pm']}}].to_json
144
+ end
137
145
 
138
- it 'should not allow delivery time to be in an invalid slot for the delivery day' do
139
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['Between 6-7am'], '03/03/2014' => ['Between 9-12am']}.to_json
146
+ it 'should require a valid option for delivery time' do
147
+ order.delivery_date = Date.today
140
148
 
141
- time_now = DateTime.parse("01/03/2014")
149
+ order.delivery_time = 'crazy times!'
150
+ order.valid_delivery_options?.should == false
151
+ order.errors[:delivery_date].should_not be_empty
152
+ end
153
+
154
+ it 'should allow valid delivery time' do
155
+ time_now = DateTime.parse("05/04/2014 10:00 +1100", "%d/%m/%Y %H:%M %z")
142
156
  Timecop.freeze(time_now)
143
157
 
144
- order.delivery_date = Date.parse('03/03/2014')
158
+ order.delivery_date = Date.parse('07/04/2014')
145
159
  order.delivery_time = 'Between 6-7am'
160
+
161
+ order.valid_delivery_options?.should == true
162
+ Timecop.return
163
+ end
146
164
 
147
- order.valid_delivery_time?.should == false
165
+ it 'should not allow invalid delivery time for the date' do
166
+ time_now = DateTime.parse("05/04/2014 10:00 +1100", "%d/%m/%Y %H:%M %z")
167
+ Timecop.freeze(time_now)
168
+
169
+ order.delivery_date = Date.parse('07/04/2014')
170
+ order.delivery_time = '6am to 7:30am'
171
+
172
+ order.valid_delivery_options?.should == false
148
173
  order.errors[:delivery_time].should_not be_empty
149
174
  Timecop.return
150
175
  end
151
176
 
152
- it 'should not allow delivery time to be in date with empty options' do
153
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['Between 6-7am'], '03/03/2014' => []}.to_json
154
-
155
- time_now = DateTime.parse("01/03/2014")
177
+ it 'should not allow date that has no delivery slots' do
178
+ time_now = DateTime.parse("05/04/2014 10:00 +1100", "%d/%m/%Y %H:%M %z")
156
179
  Timecop.freeze(time_now)
157
180
 
158
- order.delivery_date = Date.parse('03/03/2014')
181
+ order.delivery_date = Date.parse('08/04/2014')
159
182
  order.delivery_time = 'Between 6-7am'
160
-
161
- order.valid_delivery_date?.should == false
183
+
184
+ order.valid_delivery_options?.should == false
162
185
  order.errors[:delivery_date].should_not be_empty
163
- order.valid_delivery_time?.should == false
164
- order.errors[:delivery_time].should_not be_empty
165
186
  Timecop.return
166
187
  end
167
188
 
168
189
  end
169
190
 
170
- describe "validating delivery time in specific week day" do
191
+ context "overriding delivery day with specific date" do
171
192
 
172
193
  before :each do
173
- SpreeDeliveryOptions::Config.delivery_time_options = {monday: ['Between 6-7am'], saturday: ['Between 9-12am']}.to_json
174
194
  end
175
195
 
176
196
  it 'should not allow delivery time to be in an invalid slot for the delivery day' do
177
- order.delivery_date = DateTime.now.next_week.next_day(5)
197
+ SpreeDeliveryOptions::Config.delivery_time_options = [{"13:15" => {monday: ['Between 6-7am'], '03/03/2014' => ['Between 9-12am']}, "20:00" => {monday: ['6pm to 7:30pm']}}].to_json
198
+
199
+ time_now = DateTime.parse("01/03/2014 10:00 +1100", "%d/%m/%Y %H:%M %z")
200
+ Timecop.freeze(time_now)
201
+
202
+ order.delivery_date = Date.parse('03/03/2014')
178
203
  order.delivery_time = 'Between 6-7am'
179
204
 
180
- order.valid_delivery_time?.should == false
205
+ order.valid_delivery_options?.should == false
181
206
  order.errors[:delivery_time].should_not be_empty
207
+ Timecop.return
182
208
  end
183
209
 
184
- it 'should allow delivery time to be in an valid slot for the delivery day' do
185
- order.delivery_date = DateTime.now.next_week.next_day(5)
186
- order.delivery_time = 'Between 9-12am'
210
+ it 'should not allow delivery time to be in date with empty options' do
211
+ SpreeDeliveryOptions::Config.delivery_time_options = [{"13:15" => {monday: ['Between 6-7am'], '03/03/2014' => []}, "20:00" => {monday: ['6pm to 7:30pm']}}].to_json
187
212
 
188
- order.valid_delivery_time?.should == true
189
- order.errors[:delivery_time].should be_empty
213
+ time_now = DateTime.parse("01/03/2014")
214
+ Timecop.freeze(time_now)
215
+
216
+ order.delivery_date = Date.parse('03/03/2014')
217
+ order.delivery_time = 'Between 6-7am'
218
+
219
+ order.valid_delivery_options?.should == false
220
+ order.errors[:delivery_date].should_not be_empty
221
+ Timecop.return
190
222
  end
191
223
 
192
224
  end
@@ -2,7 +2,7 @@
2
2
  Gem::Specification.new do |s|
3
3
  s.platform = Gem::Platform::RUBY
4
4
  s.name = 'spree_delivery_options'
5
- s.version = '2.2.8'
5
+ s.version = '2.2.10'
6
6
  s.summary = 'Adds delivery date and time during checkout'
7
7
  s.description = ''
8
8
  s.required_ruby_version = '>= 2.0.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_delivery_options
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.8
4
+ version: 2.2.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francisco Trindade
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-14 00:00:00.000000000 Z
11
+ date: 2014-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree_core
@@ -294,13 +294,13 @@ files:
294
294
  - lib/generators/spree_delivery_options/install/install_generator.rb
295
295
  - lib/spree_delivery_options.rb
296
296
  - lib/spree_delivery_options/configuration.rb
297
+ - lib/spree_delivery_options/delivery_options_service.rb
297
298
  - lib/spree_delivery_options/engine.rb
298
299
  - script/rails
299
300
  - spec/controllers/spree/admin/orders/delivery_options_controller_spec.rb
300
301
  - spec/helpers/spree_delivery_options/base_helper_spec.rb
301
302
  - spec/models/order_spec.rb
302
303
  - spec/spec_helper.rb
303
- - spree_delivery_options-2.2.6.gem
304
304
  - spree_delivery_options.gemspec
305
305
  homepage:
306
306
  licenses: []
Binary file