workpattern 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/README.md +48 -3
- data/lib/workpattern.rb +58 -134
- data/lib/workpattern/clock.rb +40 -25
- data/lib/workpattern/day.rb +93 -29
- data/lib/workpattern/hour.rb +65 -26
- data/lib/workpattern/utility/base.rb +20 -2
- data/lib/workpattern/version.rb +3 -1
- data/lib/workpattern/week.rb +50 -35
- data/lib/workpattern/workpattern.rb +125 -78
- metadata +2 -2
data/lib/workpattern/day.rb
CHANGED
@@ -1,13 +1,33 @@
|
|
1
1
|
module Workpattern
|
2
|
-
|
2
|
+
|
3
|
+
# @author Barrie Callender
|
4
|
+
# @!attribute values
|
5
|
+
# @return [Array] each hour of the day
|
6
|
+
# @!attribute hours
|
7
|
+
# @return [Integer] number of hours in the day
|
8
|
+
# @!attribute first_hour
|
9
|
+
# @return [Integer] first working hour in the day
|
10
|
+
# @!attribute first_min
|
11
|
+
# @return [Integer] first working minute in first working hour in the day
|
12
|
+
# @!attribute last_hour
|
13
|
+
# @return [Integer] last working hour in the day
|
14
|
+
# @!attribute last_min
|
15
|
+
# @return [Integer] last working minute in last working hour in the day
|
16
|
+
# @!attribute total
|
17
|
+
# @return [Integer] total number of minutes in the day
|
18
|
+
#
|
19
|
+
# Represents the 24 hours of a day.
|
20
|
+
#
|
21
|
+
# @since 0.2.0
|
22
|
+
# @todo implement a day with different number of hours in it to support daylight saving
|
3
23
|
#
|
4
24
|
class Day
|
5
25
|
include Workpattern::Utility
|
6
26
|
attr_accessor :values, :hours, :first_hour, :first_min, :last_hour, :last_min, :total
|
7
27
|
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
28
|
+
# The new <tt>Day</tt> object can be created as either working or resting.
|
29
|
+
#
|
30
|
+
# @param [Integer] type is working (1) or resting (0)
|
11
31
|
#
|
12
32
|
def initialize(type=1)
|
13
33
|
@hours=24
|
@@ -18,9 +38,10 @@ module Workpattern
|
|
18
38
|
set_attributes
|
19
39
|
end
|
20
40
|
|
21
|
-
# :call-seq: duplicate => Day
|
22
41
|
# Creates a duplicate of the current <tt>Day</tt> instance.
|
23
42
|
#
|
43
|
+
# @return [Day]
|
44
|
+
#
|
24
45
|
def duplicate
|
25
46
|
duplicate_day = Day.new()
|
26
47
|
duplicate_values=Array.new(@values.size)
|
@@ -38,21 +59,18 @@ module Workpattern
|
|
38
59
|
return duplicate_day
|
39
60
|
end
|
40
61
|
|
41
|
-
# :call-seq: refresh
|
42
62
|
# Recalculates characteristics for this day
|
43
63
|
#
|
44
64
|
def refresh
|
45
65
|
set_attributes
|
46
66
|
end
|
47
67
|
|
48
|
-
# :call-seq: workpattern(start_time,finish_time,type)
|
49
68
|
# Sets all minutes in a date range to be working or resting.
|
50
|
-
# The <tt>start_time</tt> and <tt>finish_time</tt> need to have
|
51
|
-
# <tt>#hour</tt> and <tt>#min</tt> methods to return the time
|
52
|
-
# in hours and minutes respectively.
|
53
69
|
#
|
54
|
-
#
|
55
|
-
#
|
70
|
+
# @param [(#hour,#min)] start_time is the start of the range to set
|
71
|
+
# @param [(#hour, #min)] finish_time is the finish of the range to be set
|
72
|
+
# @param [Integer] type is either working (1) or resting (0)
|
73
|
+
#
|
56
74
|
def workpattern(start_time,finish_time,type)
|
57
75
|
|
58
76
|
if start_time.hour==finish_time.hour
|
@@ -71,15 +89,22 @@ module Workpattern
|
|
71
89
|
set_attributes
|
72
90
|
end
|
73
91
|
|
74
|
-
# :call-seq: calc(time,duration) => time, duration
|
75
|
-
#
|
76
92
|
# Calculates the result of adding <tt>duration</tt> to
|
77
93
|
# <tt>time</tt>. The <tt>duration</tt> can be negative in
|
78
94
|
# which case it subtracts from <tt>time</tt>.
|
79
95
|
#
|
80
96
|
# An addition where there are less working minutes left in
|
81
97
|
# the day than are being added will result in the time
|
82
|
-
# returned
|
98
|
+
# returned being 00:00 on the following day.
|
99
|
+
#
|
100
|
+
# A subtraction where there are less working minutes left in
|
101
|
+
# the day than are being added will result in the time
|
102
|
+
# returned being the previous day with the <tt>midnight</tt> flag set to true.
|
103
|
+
#
|
104
|
+
# @param [DateTime] time when the calculation starts from
|
105
|
+
# @param [Integer] duration is the number of minutes to add or subtract if it is negative
|
106
|
+
# @param [Boolean] midnight is a flag used in subtraction to pretend the time is actually midnight
|
107
|
+
# @return [DateTime,Integer,Boolean] Calculated time along with any remaining duration and the midnight flag
|
83
108
|
#
|
84
109
|
def calc(time,duration,midnight=false)
|
85
110
|
|
@@ -93,17 +118,21 @@ module Workpattern
|
|
93
118
|
|
94
119
|
end
|
95
120
|
|
96
|
-
#
|
97
|
-
#
|
121
|
+
# Returns true if the given minute is working and false if it is resting
|
122
|
+
#
|
123
|
+
# @param [(#hour, #min)] start is the time in the day to inspect
|
124
|
+
# @return [Boolean] true if the time is working and false if it is resting
|
98
125
|
#
|
99
126
|
def working?(start)
|
100
127
|
return true if minutes(start.hour,start.min,start.hour,start.min)==1
|
101
128
|
return false
|
102
129
|
end
|
103
130
|
|
104
|
-
#
|
105
|
-
#
|
106
|
-
#
|
131
|
+
# Returns the difference in working minutes between two times.
|
132
|
+
#
|
133
|
+
# @param [(#hour, #min)] start start time in the range
|
134
|
+
# @param [(#hour, #min)] finish finish time in the range
|
135
|
+
# @return [Integer] number of working minutes
|
107
136
|
#
|
108
137
|
def diff(start,finish)
|
109
138
|
start,finish=finish,start if ((start <=> finish))==1
|
@@ -120,9 +149,16 @@ module Workpattern
|
|
120
149
|
return duration, start
|
121
150
|
end
|
122
151
|
|
123
|
-
#
|
124
|
-
#
|
125
|
-
#
|
152
|
+
# Returns the total number of minutes between two times.
|
153
|
+
#
|
154
|
+
# @param [Integer] start_hour first hour in range
|
155
|
+
# @param [Integer] start_min first minute of first hour in range
|
156
|
+
# @param [Integer] finish_hour last hour in range
|
157
|
+
# @param [Integer] finish_min last minute of last hour in range
|
158
|
+
# @return [Integer] minutes between supplied hours and minutes
|
159
|
+
#
|
160
|
+
# @todo can this method and #diff method be combined?
|
161
|
+
#
|
126
162
|
def minutes(start_hour,start_min,finish_hour,finish_min)
|
127
163
|
|
128
164
|
if (start_hour > finish_hour) || ((finish_hour==start_hour) && (start_min > finish_min))
|
@@ -146,6 +182,8 @@ module Workpattern
|
|
146
182
|
|
147
183
|
private
|
148
184
|
|
185
|
+
# Calculates the attributes that describe the day. Called after changes.
|
186
|
+
#
|
149
187
|
def set_attributes
|
150
188
|
@first_hour=nil
|
151
189
|
@first_min=nil
|
@@ -161,6 +199,12 @@ module Workpattern
|
|
161
199
|
}
|
162
200
|
end
|
163
201
|
|
202
|
+
# Returns the first working minute as a <tt>DateTime</tt> or <tt>oo:oo</tt>
|
203
|
+
# when there is no working minutes in the day. Used by the <tt>#subtract</tt> method
|
204
|
+
#
|
205
|
+
# @param [DateTime] time day for which the first working time is sought.
|
206
|
+
# @return [DateTime] the first working time of the day
|
207
|
+
#
|
164
208
|
def first_working_minute(time)
|
165
209
|
if @first_hour.nil?
|
166
210
|
return time - (HOUR*time.hour) - (MINUTE*time.min)
|
@@ -171,6 +215,13 @@ module Workpattern
|
|
171
215
|
end
|
172
216
|
end
|
173
217
|
|
218
|
+
# Handles the subtraction of a duration from a time in the day.
|
219
|
+
#
|
220
|
+
# @param [DateTime] time when the subtraction starts from
|
221
|
+
# @param [Integer] duration is the number of minutes to subtract from the <tt>time</tt>
|
222
|
+
# @param [Boolean] midnight is a flag used in subtraction to pretend the time is actually midnight
|
223
|
+
# @return [DateTime,Integer,Boolean] Calculated time along with any remaining duration and the midnight flag
|
224
|
+
#
|
174
225
|
def subtract(time,duration,midnight=false)
|
175
226
|
if (time.hour==0 && time.min==0)
|
176
227
|
if midnight
|
@@ -213,10 +264,13 @@ module Workpattern
|
|
213
264
|
return time,duration, false
|
214
265
|
end
|
215
266
|
|
216
|
-
#
|
217
|
-
# Returns the result of adding #duration to the specified time
|
267
|
+
# Returns the result of adding <tt>duration</tt> to the given <tt>time</tt>
|
218
268
|
# When there are not enough minutes in the day it returns the date
|
219
|
-
# for the start of the following
|
269
|
+
# for the start of the following day.
|
270
|
+
#
|
271
|
+
# @param [DateTime] time when the calculation starts from
|
272
|
+
# @param [Integer] duration is the number of minutes to add
|
273
|
+
# @return [DateTime,Integer] Calculated time along with any remaining duration
|
220
274
|
#
|
221
275
|
def add(time,duration)
|
222
276
|
available_minutes=minutes(time.hour,time.min,@hours-1,59)
|
@@ -245,16 +299,26 @@ module Workpattern
|
|
245
299
|
return result_date,duration, false
|
246
300
|
end
|
247
301
|
|
302
|
+
# Returns the start of the next hour.
|
303
|
+
#
|
304
|
+
# The next hour could be the start of the following day.
|
305
|
+
#
|
306
|
+
# @param [DateTime] start is the <tt>DateTime</tt> for which the following hour is required.
|
307
|
+
# @return [DateTime] the start of the next hour following the <tt>DateTime</tt> supplied
|
308
|
+
#
|
248
309
|
def next_hour(start)
|
249
310
|
return start+HOUR-(start.min*MINUTE)
|
250
311
|
end
|
251
312
|
|
313
|
+
# Returns the number of working minutes left in the current hour
|
314
|
+
#
|
315
|
+
# @param [DateTime] start is the <tt>DateTime</tt> for which the remaining working minutes
|
316
|
+
# in the hour are required
|
317
|
+
# @return [Integer] number of remaining working minutes
|
318
|
+
#
|
252
319
|
def minutes_left_in_hour(start)
|
253
320
|
return @values[start.hour].diff(start.min,60)
|
254
321
|
end
|
255
322
|
|
256
|
-
def minutes_left_in_day(start)
|
257
|
-
start.hour
|
258
|
-
end
|
259
323
|
end
|
260
324
|
end
|
data/lib/workpattern/hour.rb
CHANGED
@@ -1,60 +1,76 @@
|
|
1
1
|
module Workpattern
|
2
2
|
|
3
|
-
# Represents the 60 minutes of an hour using
|
3
|
+
# Represents the 60 minutes of an hour using an <tt>Integer</tt>
|
4
|
+
#
|
5
|
+
# @since 0.2.0
|
4
6
|
#
|
5
7
|
module Hour
|
6
8
|
|
7
|
-
# :call-seq: total => Integer
|
8
9
|
# Returns the total working minutes in the hour
|
9
|
-
#
|
10
|
+
#
|
11
|
+
# @return [Integer] working minutes in the hour
|
12
|
+
#
|
10
13
|
def total
|
11
14
|
return minutes(0,59)
|
12
15
|
end
|
13
16
|
|
14
|
-
# :call-seq: workpattern(start,finish,type) => Fixnum
|
15
17
|
# Sets the minutes to either working (type=1) or resting (type=0)
|
18
|
+
#
|
19
|
+
# @param [Integer] start minute at start of range
|
20
|
+
# @param [Integer] finish minute at end of range
|
21
|
+
# @param [Integer] type defines whether working (1) or resting (0)
|
16
22
|
#
|
17
23
|
def workpattern(start,finish,type)
|
18
24
|
return working(start,finish) if type==1
|
19
25
|
return resting(start,finish) if type==0
|
20
26
|
end
|
21
27
|
|
22
|
-
#
|
23
|
-
#
|
28
|
+
# Returns the first working minute in the hour or 60 if there are no working minutes
|
29
|
+
#
|
30
|
+
# @return [Integer] first working minute or 60 if none found
|
24
31
|
#
|
25
32
|
def first
|
26
33
|
0.upto(59) {|minute| return minute if self.minutes(minute,minute)==1}
|
27
34
|
return nil
|
28
35
|
end
|
29
36
|
|
30
|
-
#
|
31
|
-
#
|
37
|
+
# Returns the last working minute in the hour or nil if there are no working minutes
|
38
|
+
#
|
39
|
+
# @return [Integer] last working minute or nil if none found
|
32
40
|
#
|
33
41
|
def last
|
34
42
|
59.downto(0) {|minute| return minute if self.minutes(minute,minute)==1}
|
35
43
|
return nil
|
36
44
|
end
|
37
45
|
|
38
|
-
# :call-seq: working?(start) => Boolean
|
39
46
|
# Returns true if the given minute is working and false if it isn't
|
47
|
+
#
|
48
|
+
# @param [Integer] start is the minute being tested
|
49
|
+
# @return [Boolean] true if minute is working, otherwise false
|
40
50
|
#
|
41
51
|
def working?(start)
|
42
52
|
return true if minutes(start,start)==1
|
43
53
|
return false
|
44
54
|
end
|
45
55
|
|
46
|
-
# :call-seq: minutes(start,finish) => Integer
|
47
56
|
# Returns the total number of minutes between and including two minutes
|
48
57
|
#
|
58
|
+
# @param [Integer] start first minute in range
|
59
|
+
# @param [Integer] finish last minute in range
|
60
|
+
# @return [Integer] number of minutes from <tt>start</tt> to <tt>finish</tt> inclusive
|
61
|
+
#
|
49
62
|
def minutes(start,finish)
|
50
63
|
start,finish=finish,start if start > finish
|
51
64
|
return (self & mask(start,finish)).to_s(2).count('1')
|
52
65
|
end
|
53
66
|
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
67
|
+
# Returns the DateTime and remainding minutes when adding a duration to a minute in the hour.
|
68
|
+
# A negative duration will subtract the minutes.
|
69
|
+
#
|
70
|
+
# @param [DateTime] time is the full date but only the minute element is used
|
71
|
+
# @param [Integer] duration is the number of minutes to add and can be negative (subtraction)
|
72
|
+
# @param [Boolean] next_hour used in subtraction to specify the starting point as midnight (00:00 the next day)
|
73
|
+
# @return [DateTime,Integer,Boolean] The <tt>DateTime</tt> calculated along with remaining minutes and a flag indicating if starting point is next hour
|
58
74
|
#
|
59
75
|
def calc(time,duration,next_hour=false)
|
60
76
|
|
@@ -67,8 +83,10 @@ module Workpattern
|
|
67
83
|
end
|
68
84
|
end
|
69
85
|
|
70
|
-
#
|
71
|
-
#
|
86
|
+
# Returns the number of minutes between two minutes
|
87
|
+
# @param [Integer] start first minute in range
|
88
|
+
# @param [Integer] finish last minute in range
|
89
|
+
# @return [Integer] number of working minutes in the range
|
72
90
|
#
|
73
91
|
def diff(start,finish)
|
74
92
|
start,finish=finish,start if start > finish
|
@@ -78,22 +96,39 @@ module Workpattern
|
|
78
96
|
|
79
97
|
private
|
80
98
|
|
81
|
-
#
|
99
|
+
# Sets a working pattern
|
100
|
+
#
|
101
|
+
# @param [Integer] start is first minute in the range
|
102
|
+
# @param [Integer] finish is last minute in the range
|
103
|
+
#
|
82
104
|
def working(start,finish)
|
83
105
|
return self | mask(start,finish)
|
84
106
|
end
|
85
107
|
|
86
|
-
# sets resting pattern
|
108
|
+
# sets a resting pattern
|
109
|
+
#
|
110
|
+
# @param [Integer] start is first minute in the range
|
111
|
+
# @param [Integer] finish is last minute in the range
|
112
|
+
#
|
87
113
|
def resting(start,finish)
|
88
114
|
return self & ((2**60-1)-mask(start,finish))
|
89
115
|
end
|
90
116
|
|
91
|
-
#
|
117
|
+
# Creates a bit mask of 1's over the specified range
|
118
|
+
#
|
119
|
+
# @param [Integer] start is first minute in the range
|
120
|
+
# @param [Integer] finish is the last minute in the range
|
121
|
+
#
|
92
122
|
def mask(start,finish)
|
93
123
|
return ((2**(finish+1)-1)-(2**start-1))
|
94
124
|
end
|
95
125
|
|
96
|
-
#
|
126
|
+
# Handles the addition of minutes to a time
|
127
|
+
#
|
128
|
+
# @param [DateTime] time is the full date but only the minute element is used
|
129
|
+
# @param [Integer] duration is the number of minutes to add and can be negative (subtraction)
|
130
|
+
# @return [DateTime, Integer] The resulting DateTime and any remaining minutes
|
131
|
+
#
|
97
132
|
def add(time,duration)
|
98
133
|
start = time.min
|
99
134
|
available_minutes=minutes(start,59)
|
@@ -121,7 +156,12 @@ module Workpattern
|
|
121
156
|
return result_date, result_remainder
|
122
157
|
end
|
123
158
|
|
124
|
-
#
|
159
|
+
# Handles the subtraction of minutes from a time.
|
160
|
+
# @param [DateTime] time is the full date but only the minute element is used
|
161
|
+
# @param [Integer] duration is the number of minutes to add and can be negative (subtraction)
|
162
|
+
# @param [Boolean] next_hour indicates if the 59th second is the first one to be included
|
163
|
+
# @return [DateTime, Integer] The resulting DateTime and any remaining minutes
|
164
|
+
#
|
125
165
|
def subtract(time,duration,next_hour)
|
126
166
|
if next_hour
|
127
167
|
if working?(59)
|
@@ -157,10 +197,9 @@ module Workpattern
|
|
157
197
|
end
|
158
198
|
end
|
159
199
|
|
160
|
-
class
|
200
|
+
# Hours are represented by a bitwise <tt>Integer</tt> class so the code is mixed in to that class
|
201
|
+
# @ since 0.3.0
|
202
|
+
#
|
203
|
+
class Integer
|
161
204
|
include Workpattern::Hour
|
162
205
|
end
|
163
|
-
class Bignum
|
164
|
-
include Workpattern::Hour
|
165
|
-
end
|
166
|
-
|
@@ -1,11 +1,29 @@
|
|
1
1
|
module Workpattern
|
2
|
-
|
2
|
+
|
3
|
+
# Mixins expected to be used in more than one class
|
4
|
+
#
|
5
|
+
# @since 0.2.0
|
6
|
+
#
|
3
7
|
module Utility
|
4
|
-
|
8
|
+
|
9
|
+
# Returns the supplied <tt>DateTime</tt> at the very start of the day.
|
10
|
+
#
|
11
|
+
# @param [DateTime] adate is the <tt>DateTime</tt> to be changed
|
12
|
+
# @return [DateTime]
|
13
|
+
#
|
14
|
+
# @todo Consider mixin for DateTime class
|
15
|
+
#
|
5
16
|
def midnight_before(adate)
|
6
17
|
return adate -(HOUR * adate.hour) - (MINUTE * adate.min)
|
7
18
|
end
|
8
19
|
|
20
|
+
# Returns the supplied <tt>DateTime</tt> at the very start of the next day.
|
21
|
+
#
|
22
|
+
# @param [DateTime] adate is the <tt>DateTime</tt> to be changed
|
23
|
+
# @return [DateTime]
|
24
|
+
#
|
25
|
+
# @todo Consider mixin for DateTime class
|
26
|
+
#
|
9
27
|
def midnight_after(adate)
|
10
28
|
return midnight_before(adate.next_day)
|
11
29
|
end
|
data/lib/workpattern/version.rb
CHANGED
data/lib/workpattern/week.rb
CHANGED
@@ -4,26 +4,29 @@ module Workpattern
|
|
4
4
|
# @!attribute values
|
5
5
|
# @return [Array] each day of the week
|
6
6
|
# @!attribute days
|
7
|
-
# @return [
|
7
|
+
# @return [Integer] number of days in the week
|
8
8
|
# @!attribute start
|
9
9
|
# @return [DateTime] first date in the range
|
10
10
|
# @!attribute finish
|
11
11
|
# @return [DateTime] last date in the range
|
12
12
|
# @!attribute week_total
|
13
|
-
# @return [
|
13
|
+
# @return [Integer] total number of minutes in a week
|
14
14
|
# @!attribute total
|
15
|
-
# @return [
|
15
|
+
# @return [Integer] total number of minutes in the range
|
16
16
|
#
|
17
17
|
# Represents working and resting periods for each day in a week for a specified date range.
|
18
18
|
#
|
19
|
+
# @since 0.2.0
|
20
|
+
#
|
19
21
|
class Week
|
20
22
|
|
21
23
|
attr_accessor :values, :days, :start, :finish, :week_total, :total
|
22
24
|
|
23
|
-
#
|
25
|
+
# The new <tt>Week</tt> object can be created as either working or resting.
|
26
|
+
#
|
24
27
|
# @param [DateTime] start first date in the range
|
25
28
|
# @param [DateTime] finish last date in the range
|
26
|
-
# @param [
|
29
|
+
# @param [Integer] type working (1) or resting (0)
|
27
30
|
# @return [Week] newly initialised Week object
|
28
31
|
#
|
29
32
|
def initialize(start,finish,type=1)
|
@@ -36,8 +39,9 @@ module Workpattern
|
|
36
39
|
set_attributes
|
37
40
|
end
|
38
41
|
|
39
|
-
# Duplicates the current Week object
|
40
|
-
#
|
42
|
+
# Duplicates the current <tt>Week</tt> object
|
43
|
+
#
|
44
|
+
# @return [Week] a duplicated instance of the current <tt>Week</tt> object
|
41
45
|
#
|
42
46
|
def duplicate()
|
43
47
|
duplicate_week=Week.new(@start,@finish)
|
@@ -55,15 +59,18 @@ module Workpattern
|
|
55
59
|
return duplicate_week
|
56
60
|
end
|
57
61
|
|
58
|
-
# Recalculates the attributes that
|
59
|
-
# This was made public for
|
62
|
+
# Recalculates the attributes that define a <tt>Week</tt> object.
|
63
|
+
# This was made public for <tt>#duplicate</tt> to work
|
60
64
|
#
|
61
65
|
def refresh
|
62
66
|
set_attributes
|
63
67
|
end
|
64
68
|
|
65
69
|
# Changes the date range.
|
66
|
-
# This method calls
|
70
|
+
# This method calls <tt>#refresh</tt> to update the attributes.
|
71
|
+
#
|
72
|
+
# @param [DateTime] start is the new starting date for the <tt>Week</tt>
|
73
|
+
# @param [DateTime] finish is the new finish date for the <tt>Week</tt>
|
67
74
|
#
|
68
75
|
def adjust(start,finish)
|
69
76
|
@start=DateTime.new(start.year,start.month,start.day)
|
@@ -73,18 +80,21 @@ module Workpattern
|
|
73
80
|
|
74
81
|
# Sets a range of minutes in a week to be working or resting. The parameters supplied
|
75
82
|
# to this method determine exactly what should be changed
|
76
|
-
#
|
83
|
+
#
|
84
|
+
# @param [Hash(DAYNAMES)] days identifies the days to be included in the range
|
77
85
|
# @param [DateTime] from_time where the time portion is used to specify the first minute to be set
|
78
86
|
# @param [DateTime] to_time where the time portion is used to specify the last minute to be set
|
79
|
-
# @param [
|
87
|
+
# @param [Integer] type where a 1 sets it to working and a 0 to resting
|
88
|
+
#
|
80
89
|
def workpattern(days,from_time,to_time,type)
|
81
90
|
DAYNAMES[days].each {|day| @values[day].workpattern(from_time,to_time,type)}
|
82
91
|
refresh
|
83
92
|
end
|
84
93
|
|
85
94
|
# Calculates a new date by adding or subtracting a duration in minutes.
|
95
|
+
#
|
86
96
|
# @param [DateTime] start original date
|
87
|
-
# @param [
|
97
|
+
# @param [Integer] duration minutes to add or subtract
|
88
98
|
# @param [Boolean] midnight flag used for subtraction that indicates the start date is midnight
|
89
99
|
#
|
90
100
|
def calc(start,duration, midnight=false)
|
@@ -94,13 +104,14 @@ module Workpattern
|
|
94
104
|
return subtract(start,duration, midnight) if duration <0
|
95
105
|
end
|
96
106
|
|
97
|
-
# Comparison
|
107
|
+
# Comparison Returns an integer (-1, 0, or +1) if week is less than, equal to, or greater than other_week
|
108
|
+
#
|
98
109
|
# @param [Week] other_week object to compare to
|
99
110
|
# @return [Integer] -1,0 or +1 if week is less than, equal to or greater than other_week
|
100
|
-
def <=>(
|
101
|
-
if @start <
|
111
|
+
def <=>(other_week)
|
112
|
+
if @start < other_week.start
|
102
113
|
return -1
|
103
|
-
elsif @start ==
|
114
|
+
elsif @start == other_week.start
|
104
115
|
return 0
|
105
116
|
else
|
106
117
|
return 1
|
@@ -108,6 +119,7 @@ module Workpattern
|
|
108
119
|
end
|
109
120
|
|
110
121
|
# Returns true if the supplied DateTime is working and false if resting
|
122
|
+
#
|
111
123
|
# @param [DateTime] start DateTime to be tested
|
112
124
|
# @return [Boolean] true if the minute is working otherwise false if it is a resting minute
|
113
125
|
#
|
@@ -116,10 +128,10 @@ module Workpattern
|
|
116
128
|
end
|
117
129
|
|
118
130
|
# Returns the difference in minutes between two DateTime values.
|
131
|
+
#
|
119
132
|
# @param [DateTime] start starting DateTime
|
120
133
|
# @param [DateTime] finish ending DateTime
|
121
|
-
# @return [
|
122
|
-
# @return [DateTime] start date for rest of calculation. The calculation is complete when this is the same as the finish date
|
134
|
+
# @return [Integer, DateTime] number of minutes and start date for rest of calculation.
|
123
135
|
#
|
124
136
|
def diff(start,finish)
|
125
137
|
start,finish=finish,start if ((start <=> finish))==1
|
@@ -159,9 +171,10 @@ module Workpattern
|
|
159
171
|
end
|
160
172
|
|
161
173
|
# Calculates the total number of minutes between two dates
|
174
|
+
#
|
162
175
|
# @param [DateTime] start is the first date in the range
|
163
176
|
# @param [DateTime] finish is the last date in the range
|
164
|
-
# @return [
|
177
|
+
# @return [Integer] total number of minutes between supplied dates
|
165
178
|
#
|
166
179
|
def total_hours(start,finish)
|
167
180
|
total=0
|
@@ -171,13 +184,13 @@ module Workpattern
|
|
171
184
|
return total
|
172
185
|
end
|
173
186
|
|
174
|
-
# Adds a duration in minutes to a date
|
187
|
+
# Adds a duration in minutes to a date.
|
188
|
+
#
|
189
|
+
# The Boolean returned is always false.
|
190
|
+
#
|
175
191
|
# @param [DateTime] start original date
|
176
|
-
# @param [
|
177
|
-
# @
|
178
|
-
# @return [DateTime] the calculated date
|
179
|
-
# @return [Fixnum] the number of minutes still to be added
|
180
|
-
# @return [Boolean] Always false, this is the flag used for subtraction
|
192
|
+
# @param [Integer] duration minutes to add
|
193
|
+
# @return [DateTime, Integer, Boolean] the calculated date, remaining minutes and flag used for subtraction
|
181
194
|
#
|
182
195
|
def add(start,duration)
|
183
196
|
# aim to calculate to the end of the day
|
@@ -220,12 +233,12 @@ module Workpattern
|
|
220
233
|
end
|
221
234
|
|
222
235
|
# Subtracts a duration in minutes from a date
|
236
|
+
#
|
223
237
|
# @param [DateTime] start original date
|
224
|
-
# @param [
|
238
|
+
# @param [Integer] duration minutes to subtract - always a negative
|
225
239
|
# @param [Boolean] midnight flag indicates the start date is midnight when true
|
226
|
-
# @return [DateTime] the calculated date
|
227
|
-
#
|
228
|
-
# @return [Boolean] When set to true indicates the time is midnight on the given date
|
240
|
+
# @return [DateTime, Integer, Boolean] the calculated date, remaining number of minutes and
|
241
|
+
# true if the time is midnight on the date
|
229
242
|
#
|
230
243
|
def subtract(start,duration,midnight=false)
|
231
244
|
|
@@ -286,10 +299,11 @@ module Workpattern
|
|
286
299
|
|
287
300
|
# Supports calculating from midnight by updating the given duration depending on whether the
|
288
301
|
# last minute in the day is resting or working. It then sets the time to this minute.
|
302
|
+
#
|
289
303
|
# @param [DateTime] start is the date whose midnight is to be used as the start date
|
290
|
-
# @param [
|
291
|
-
# @return [DateTime] the date with a time of 23:59
|
292
|
-
#
|
304
|
+
# @param [Integer] duration is the number of minutes to subtract
|
305
|
+
# @return [DateTime, Integer] the date with a time of 23:59 and remaining duration
|
306
|
+
# adjusted according to whether 23:59 is resting or not
|
293
307
|
#
|
294
308
|
def minute_b4_midnight(start,duration)
|
295
309
|
start -= start.hour * HOUR
|
@@ -300,6 +314,7 @@ module Workpattern
|
|
300
314
|
end
|
301
315
|
|
302
316
|
# Calculates the date and time after the last working minute of the current date
|
317
|
+
#
|
303
318
|
# @param [DateTime] start is the current date
|
304
319
|
# @return [DateTime] the new date
|
305
320
|
#
|
@@ -314,11 +329,11 @@ module Workpattern
|
|
314
329
|
end
|
315
330
|
|
316
331
|
# Calculates the difference between two dates that exist in this Week object.
|
332
|
+
#
|
317
333
|
# @param [DateTime] start first date
|
318
334
|
# @param [DateTime] finish last date
|
319
335
|
# @param [DateTime] finish_on the range to be used in this Week object.
|
320
|
-
# @return [DateTime] new date for rest of calculation
|
321
|
-
# @return [Fixnum] total number of minutes calculated thus far.
|
336
|
+
# @return [DateTime, Integer] new date for rest of calculation and total number of minutes calculated thus far.
|
322
337
|
#
|
323
338
|
def diff_detail(start,finish,finish_on)
|
324
339
|
duration, start=@values[start.wday].diff(start,finish)
|