calc_working_hours 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,5 +21,43 @@ module CalcWorkingHours
21
21
  end
22
22
  @working_hours = WorkingHours.new("0:00").add_array_time(array_of_working_hours).time_string
23
23
  end
24
+
25
+ def total_working_hours_in_range(start_range, end_range)
26
+ array_of_working_hours_in_range = []
27
+ if start_range == true && end_range == true
28
+ unless valid_time_format?(start_range) || valid_time_format?(end_range)
29
+ raise "invalid time format (TimeCard total_working_hours)"
30
+ end
31
+ end
32
+ @time_card_rows.each do |row|
33
+ array_of_working_hours_in_range << row.working_hours_in_range(start_range, end_range)
34
+ end
35
+ return WorkingHours.new("0:00").add_array_time(array_of_working_hours_in_range).time_string
36
+ end
37
+
38
+ private
39
+
40
+ def valid_range?(first, second)
41
+ false
42
+ true if change_to_minute(first) < change_to_minute(second)
43
+ end
44
+
45
+ def valid_time_format?(time)
46
+ flag = false
47
+ if time.class == String
48
+ if /(\d+):(\d+)/ =~ time
49
+ if ($1.to_i <= 48 && $1.to_i >= 0) && ($2.to_i < 60 && $2.to_i >= 0)
50
+ flag = true
51
+ end
52
+ end
53
+ end
54
+ return flag
55
+ end
56
+
57
+ def change_to_minute(str)
58
+ /(\d+):(\d+)/ =~ str
59
+ return $1.to_i * 60 + $2.to_i
60
+ end
61
+
24
62
  end
25
63
  end
@@ -5,7 +5,7 @@ require "date"
5
5
  module CalcWorkingHours
6
6
 
7
7
  class TimeCardRow
8
- attr_reader :starting_time, :ending_time, :break_time, :working_hours, :date_string
8
+ attr_reader :starting_time, :ending_time, :break_time, :working_hours, :date_string, :time_point, :working_hours_in_range
9
9
  def initialize(starting_time, ending_time, *break_time)
10
10
  unless valid_time_format?(starting_time) && valid_time_format?(ending_time)
11
11
  raise "failure initialize (invalid time format! TimeCardRow class)"
@@ -36,7 +36,15 @@ module CalcWorkingHours
36
36
  @ending_time = ending_time
37
37
  @break_time = break_time
38
38
  @working_hours = WorkingHours.new(ending_time).minus_time(starting_time).minus_time(total_break_time_string)
39
-
39
+ @time_point = []
40
+ @time_point << starting_time
41
+ unless break_time.empty?
42
+ break_time.each do |bt|
43
+ @time_point << bt[0]
44
+ @time_point << bt[1]
45
+ end
46
+ end
47
+ @time_point << ending_time
40
48
  self
41
49
  end
42
50
 
@@ -48,8 +56,36 @@ module CalcWorkingHours
48
56
  self
49
57
  end
50
58
 
59
+ def working_hours_in_range(start_range, end_range)
60
+ i = @time_point.size / 2
61
+ starting_time, ending_time = ""
62
+ array_of_working_hours = []
63
+ for counter in 1..i
64
+ counter = 2 * counter - 2
65
+ starting_time = @time_point[counter]
66
+ ending_time = @time_point[counter + 1]
67
+
68
+ if valid_range?(end_range, starting_time) || valid_range?(ending_time, start_range)
69
+ elsif valid_range?(start_range, starting_time) && valid_range?(end_range, ending_time)
70
+ array_of_working_hours << WorkingHours.new(end_range).minus_time(starting_time).time_string
71
+ elsif valid_range?(starting_time, start_range) && valid_range?(end_range, ending_time)
72
+ array_of_working_hours << WorkingHours.new(end_range).minus_time(start_range).time_string
73
+ elsif valid_range?(starting_time, start_range) && valid_range?(ending_time, end_range)
74
+ array_of_working_hours << WorkingHours.new(ending_time).minus_time(start_range).time_string
75
+ elsif valid_range?(start_range, starting_time) && valid_range?(ending_time, end_range)
76
+ array_of_working_hours << WorkingHours.new(ending_time).minus_time(starting_time).time_string
77
+ end
78
+ end
79
+ return @working_hours_in_range = WorkingHours.new("0:00").add_array_time(array_of_working_hours).time_string
80
+ end
81
+
51
82
  private
52
83
 
84
+ def valid_range?(first, second)
85
+ false
86
+ true if change_to_minute(first) <= change_to_minute(second)
87
+ end
88
+
53
89
  def total_break_time(break_time)
54
90
  total = WorkingHours.new("0:00")
55
91
  break_time.each do |time|
@@ -1,3 +1,3 @@
1
1
  module CalcWorkingHours
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -25,6 +25,22 @@ describe TimeCardRow do
25
25
  @time_card_row.set_date("2013/8/1").date_string.class.should == String
26
26
  end
27
27
 
28
+ it "time_pointは9:00,11:00,12:00,15:00,16:00,19:00" do
29
+ @time_card_row.time_point.should == ["9:00", "11:00", "12:00", "15:00", "16:00", "19:00"]
30
+ end
31
+
32
+ it "労働時間のうち、10:00〜15:30の間の労働時間は4:00" do
33
+ @time_card_row.working_hours_in_range("10:00", "15:30").should == "4:00"
34
+ end
35
+
36
+ it "労働時間のうち、11:30〜14:00の間の労働時間は2:00" do
37
+ @time_card_row.working_hours_in_range("11:00", "14:00").should == "2:00"
38
+ end
39
+
40
+ it "労働時間のうち、14:00〜17:00の間の労働時間は2:00" do
41
+ @time_card_row.working_hours_in_range("14:00", "17:00").should == "2:00"
42
+ end
43
+
28
44
  end
29
45
 
30
46
  context "適正な時間設定と、不適な設定時間を設定したとき" do
@@ -26,5 +26,9 @@ describe TimeRecorder do
26
26
  @time_recorder.time_cards["0000000084"].total_working_hours.should == "149:12"
27
27
  end
28
28
 
29
+ it "タイムカードのidが0000000002の人物の11:00〜16:00の労働時間は87:02であること" do
30
+ @time_recorder.time_cards["0000000002"].total_working_hours_in_range("11:00", "16:00").should == "87:02"
31
+ end
32
+
29
33
  end
30
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calc_working_hours
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2013-09-21 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &70321991304440 !ruby/object:Gem::Requirement
16
+ requirement: &70311384099360 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '1.3'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70321991304440
24
+ version_requirements: *70311384099360
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &70321991303700 !ruby/object:Gem::Requirement
27
+ requirement: &70311384098460 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70321991303700
35
+ version_requirements: *70311384098460
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70321991302820 !ruby/object:Gem::Requirement
38
+ requirement: &70311384096960 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70321991302820
46
+ version_requirements: *70311384096960
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: activesupport
49
- requirement: &70321991301920 !ruby/object:Gem::Requirement
49
+ requirement: &70311384095880 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70321991301920
57
+ version_requirements: *70311384095880
58
58
  description: 例えば、173:08のような表記の時間を計算するライブラリです
59
59
  email:
60
60
  - ''
@@ -98,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
98
98
  version: '0'
99
99
  segments:
100
100
  - 0
101
- hash: 2137619453684458958
101
+ hash: 4216760181021085759
102
102
  required_rubygems_version: !ruby/object:Gem::Requirement
103
103
  none: false
104
104
  requirements:
@@ -107,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
107
  version: '0'
108
108
  segments:
109
109
  - 0
110
- hash: 2137619453684458958
110
+ hash: 4216760181021085759
111
111
  requirements: []
112
112
  rubyforge_project:
113
113
  rubygems_version: 1.8.10