diff --git a/lib/business_time/business_minutes.rb b/lib/business_time/business_minutes.rb index 33d30b05f..b37527d3f 100644 --- a/lib/business_time/business_minutes.rb +++ b/lib/business_time/business_minutes.rb @@ -15,19 +15,48 @@ module BusinessTime def after(time) after_time = Time.roll_forward(time) - # Step through the hours, skipping over non-business hours - @minutes.times do - after_time = after_time + 1.minute + # Step through the minutes, skipping over non-business minutes + days = @minutes / 60 / 24 + hours = ( @minutes - ( days * 60 * 24 ) ) / 60 + minutes = @minutes - ( (days * 60 * 24 ) + (hours * 60) ) + if @minutes > 60 * 12 + + end + + local_sec = @minutes * 60 + loop = true + while (loop == true) do + a = after_time + if local_sec >= 60 * 60 + after_time = after_time + 1.hour + else + after_time = after_time + 1.minute + end # Ignore minutes before opening and after closing if (after_time > Time.end_of_workday(after_time)) after_time = after_time + off_minutes + if local_sec < 60 * 60 + after_time = after_time - 60 + else + after_time = after_time - 60 * 60 + end + next end # Ignore weekends and holidays while !Time.workday?(after_time) - after_time = after_time + 1.day + after_time = Time.beginning_of_workday(after_time + 1.day) + a = after_time end + diff = after_time - a + local_sec = local_sec - diff + + if local_sec <= 0 + loop = false + next + end + end after_time end diff --git a/lib/time_calculation.rb b/lib/time_calculation.rb index d0c904064..9d5bb59ef 100644 --- a/lib/time_calculation.rb +++ b/lib/time_calculation.rb @@ -25,14 +25,20 @@ module TimeCalculation end def self.business_time_diff(start_time, end_time) - start_time = Time.parse( start_time.to_s + 'UTC' ) - end_time = Time.parse( end_time.to_s + 'UTC' ) + if start_time.class == String + start_time = Time.parse( start_time.to_s + 'UTC' ) + end + if end_time.class == String + end_time = Time.parse( end_time.to_s + 'UTC' ) + end diff = start_time.business_time_until( end_time ) / 60 diff.round end def self.dest_time(start_time, diff_in_min) - start_time = Time.parse( start_time.to_s + ' UTC' ) + if start_time.class == String + start_time = Time.parse( start_time.to_s + ' UTC' ) + end dest_time = diff_in_min.round.business_minute.after( start_time ) return dest_time end diff --git a/test/unit/working_time_test.rb b/test/unit/working_time_test.rb index 73ba48971..2ffa06941 100644 --- a/test/unit/working_time_test.rb +++ b/test/unit/working_time_test.rb @@ -129,11 +129,123 @@ class WorkingTimeTest < ActiveSupport::TestCase 'end_of_workday' => '6:00 pm', }, }, + + # test 3 + { + :start => '2012-12-17 08:00:00', + :dest_time => '2012-12-18 18:00:00', + :diff => 1200, + :config => { + 'Mon' => true, + 'Tue' => true, + 'Wed' => true, + 'Thu' => true, + 'Fri' => true, + 'beginning_of_workday' => '8:00 am', + 'end_of_workday' => '6:00 pm', + }, + }, + + # test 4 + { + :start => '2012-12-17 08:00:00', + :dest_time => '2012-12-19 08:30:00', + :diff => 1230, + :config => { + 'Mon' => true, + 'Tue' => true, + 'Wed' => true, + 'Thu' => true, + 'Fri' => true, + 'beginning_of_workday' => '8:00 am', + 'end_of_workday' => '6:00 pm', + }, + }, + + # test 5 + { + :start => '2012-12-17 08:00:00', + :dest_time => '2012-12-21 18:00:00', + :diff => 3000, + :config => { + 'Mon' => true, + 'Tue' => true, + 'Wed' => true, + 'Thu' => true, + 'Fri' => true, + 'beginning_of_workday' => '8:00 am', + 'end_of_workday' => '6:00 pm', + }, + }, + + # test 6 + { + :start => '2012-12-17 08:00:00', + :dest_time => '2012-12-24 08:05:00', + :diff => 3005, + :config => { + 'Mon' => true, + 'Tue' => true, + 'Wed' => true, + 'Thu' => true, + 'Fri' => true, + 'beginning_of_workday' => '8:00 am', + 'end_of_workday' => '6:00 pm', + }, + }, + + # test 7 + { + :start => '2012-12-17 08:00:00', + :dest_time => '2012-12-31 08:05:00', + :diff => 6005, + :config => { + 'Mon' => true, + 'Tue' => true, + 'Wed' => true, + 'Thu' => true, + 'Fri' => true, + 'beginning_of_workday' => '8:00 am', + 'end_of_workday' => '6:00 pm', + }, + }, + + # test 8 + { + :start => '2012-12-17 08:00:00', + :dest_time => '2012-12-31 13:30:00', + :diff => 6330, + :config => { + 'Mon' => true, + 'Tue' => true, + 'Wed' => true, + 'Thu' => true, + 'Fri' => true, + 'beginning_of_workday' => '8:00 am', + 'end_of_workday' => '6:00 pm', + }, + }, + + # test 9 + { + :start => '2013-04-12 21:20:15', + :dest_time => '2013-04-15 10:00:00', + :diff => 120, + :config => { + 'Mon' => true, + 'Tue' => true, + 'Wed' => true, + 'Thu' => true, + 'Fri' => true, + 'beginning_of_workday' => '8:00 am', + 'end_of_workday' => '6:00 pm', + }, + }, ] tests.each { |test| TimeCalculation.config( test[:config] ) dest_time = TimeCalculation.dest_time( test[:start] + ' UTC', test[:diff] ) - assert_equal( dest_time.gmtime, Time.parse( test[:dest_time] + ' UTC' ), 'dest time' ) + assert_equal( dest_time.gmtime, Time.parse( test[:dest_time] + ' UTC' ), "dest time - #{test[:dest_time].to_s}" ) } end