aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/holiday.rb56
-rw-r--r--app/models/info_request.rb8
2 files changed, 47 insertions, 17 deletions
diff --git a/app/models/holiday.rb b/app/models/holiday.rb
index debd88dec..1072f6a70 100644
--- a/app/models/holiday.rb
+++ b/app/models/holiday.rb
@@ -25,18 +25,34 @@
class Holiday < ActiveRecord::Base
- # Calculate the date on which a request made on a given date falls due.
+ def Holiday.weekend_or_holiday?(date)
+ # TODO only fetch holidays after the start_date
+ holidays = self.all.collect { |h| h.day }.to_set
+
+ date.wday == 0 || date.wday == 6 || holidays.include?(date)
+ end
+
+ def Holiday.due_date_from(start_date, days, type_of_days)
+ case type_of_days
+ when "working"
+ Holiday.due_date_from_working_days(start_date, days)
+ when "calendar"
+ Holiday.due_date_from_calendar_days(start_date, days)
+ else
+ raise "Unexpected value for type_of_days: #{type_of_days}"
+ end
+ end
+
+ # Calculate the date on which a request made on a given date falls due when
+ # days are given in working days
# i.e. it is due by the end of that day.
- def Holiday.due_date_from(start_date, working_days)
+ def Holiday.due_date_from_working_days(start_date, working_days)
# convert date/times into dates
start_date = start_date.to_date
- # TODO only fetch holidays after the start_date
- holidays = self.all.collect { |h| h.day }.to_set
-
- # Count forward (20) working days. We start with today as "day zero". The
- # first of the twenty full working days is the next day. We return the
- # date of the last of the twenty.
+ # Count forward the number of working days. We start with today as "day zero". The
+ # first of the full working days is the next day. We return the
+ # date of the last of the number of working days.
# This response for example of a public authority complains that we had
# it wrong. We didn't (even thought I changed the code for a while,
@@ -46,15 +62,27 @@ class Holiday < ActiveRecord::Base
days_passed = 0
response_required_by = start_date
- # Now step forward into each of the 20 days.
+ # Now step forward into each of the working days.
while days_passed < working_days
- response_required_by += 1.day
- next if response_required_by.wday == 0 || response_required_by.wday == 6 # weekend
- next if holidays.include?(response_required_by)
- days_passed += 1
+ response_required_by += 1
+ days_passed += 1 unless weekend_or_holiday?(response_required_by)
end
- return response_required_by
+ response_required_by
end
+ # Calculate the date on which a request made on a given date falls due when
+ # the days are given in calendar days (rather than working days)
+ # If the due date falls on a weekend or a holiday then the due date is the next
+ # weekday that isn't a holiday.
+ def Holiday.due_date_from_calendar_days(start_date, days)
+ # convert date/times into dates
+ start_date = start_date.to_date
+
+ response_required_by = start_date + days
+ while weekend_or_holiday?(response_required_by)
+ response_required_by += 1
+ end
+ response_required_by
+ end
end
diff --git a/app/models/info_request.rb b/app/models/info_request.rb
index b62f67ee1..141440c6d 100644
--- a/app/models/info_request.rb
+++ b/app/models/info_request.rb
@@ -690,7 +690,8 @@ public
# things, e.g. fees, not properly covered.
def date_response_required_by
days_later = MySociety::Config.get('REPLY_LATE_AFTER_DAYS', 20)
- return Holiday.due_date_from(self.date_initial_request_last_sent_at, days_later)
+ working_or_calendar_days = MySociety::Config.get('WORKING_OR_CALENDAR_DAYS', 'working')
+ return Holiday.due_date_from(self.date_initial_request_last_sent_at, days_later, working_or_calendar_days)
end
# This is a long stop - even with UK public interest test extensions, 40
# days is a very long time.
@@ -698,12 +699,13 @@ public
last_sent = last_event_forming_initial_request
very_late_days_later = MySociety::Config.get('REPLY_VERY_LATE_AFTER_DAYS', 40)
school_very_late_days_later = MySociety::Config.get('SPECIAL_REPLY_VERY_LATE_AFTER_DAYS', 60)
+ working_or_calendar_days = MySociety::Config.get('WORKING_OR_CALENDAR_DAYS', 'working')
if self.public_body.is_school?
# schools have 60 working days maximum (even over a long holiday)
- return Holiday.due_date_from(self.date_initial_request_last_sent_at, 60)
+ return Holiday.due_date_from(self.date_initial_request_last_sent_at, school_very_late_days_later, working_or_calendar_days)
else
# public interest test ICO guidance gives 40 working maximum
- return Holiday.due_date_from(self.date_initial_request_last_sent_at, 40)
+ return Holiday.due_date_from(self.date_initial_request_last_sent_at, very_late_days_later, working_or_calendar_days)
end
end