spree_delivery_options 2.2.8 → 2.2.10

Sign up to get free protection for your applications and to get access to all the features.
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