Class: Ecom::Core::CrewTime
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Ecom::Core::CrewTime
- Defined in:
- app/models/ecom/core/crew_time.rb
Constant Summary collapse
- MORNING =
Time Ranges
'Morning'.freeze
- AFTERNOON =
'Afternoon'.freeze
- BOTH =
'Both'.freeze
- TIME_RANGE =
{ MORNING => {start: Time.zone.parse('5:00 AM'), end: Time.zone.parse('9:00 AM')}, AFTERNOON => {start: Time.zone.parse('10:00 AM'), end: Time.zone.parse('2:00 PM')}, BOTH => {start: Time.zone.parse('5:00 AM'), end: Time.zone.parse('2:00 PM')} }.freeze
Instance Method Summary collapse
- #calculate_hours ⇒ Object
- #calculate_total ⇒ Object
-
#compute_hours ⇒ Object
A method to adjust time ranges by trimming any time value outside of the defined morning and afternoon ranges.
- #compute_total_for_entry ⇒ Object
-
#find_range(start, finish) ⇒ Object
A method to check if checkin and checkout range falls in the morning, afternoon, or both.
Instance Method Details
#calculate_hours ⇒ Object
25 26 27 28 29 30 31 |
# File 'app/models/ecom/core/crew_time.rb', line 25 def calculate_hours self.hours = if checkout_time.nil? || checkin_time.nil? 0 else compute_hours end end |
#calculate_total ⇒ Object
33 34 35 |
# File 'app/models/ecom/core/crew_time.rb', line 33 def calculate_total compute_total_for_entry if saved_change_to_hours? end |
#compute_hours ⇒ Object
A method to adjust time ranges by trimming any time value outside of the defined morning and afternoon ranges
59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'app/models/ecom/core/crew_time.rb', line 59 def compute_hours # Reparse time to avoid errors caused by date differences start = Time.zone.parse(checkin_time.strftime('%I:%M%p')) finish = Time.zone.parse(checkout_time.strftime('%I:%M%p')) range = find_range(start, finish) puts "Found the range #{range} for [#{start} - #{finish}]" left = start.before?(TIME_RANGE[range][:start]) ? TIME_RANGE[range][:start] : start right = finish.after?(TIME_RANGE[range][:end]) ? TIME_RANGE[range][:end] : finish puts "Applicable time range is [#{left} - #{right}]" time = (right - left) / 1.hour time -= 1 if range == BOTH puts "Calculated time is #{time}" time end |
#compute_total_for_entry ⇒ Object
37 38 39 40 41 42 43 |
# File 'app/models/ecom/core/crew_time.rb', line 37 def compute_total_for_entry attendance_sheet_entry.total_hours = Ecom::Core::CrewTime.where( attendance_sheet_entry: attendance_sheet_entry, revised: false ).sum(:hours) attendance_sheet_entry.save end |
#find_range(start, finish) ⇒ Object
A method to check if checkin and checkout range falls in the morning, afternoon, or both.
47 48 49 50 51 52 53 54 55 |
# File 'app/models/ecom/core/crew_time.rb', line 47 def find_range(start, finish) if start.before?(TIME_RANGE[MORNING][:end]) && finish.before?(TIME_RANGE[AFTERNOON][:start]) MORNING elsif start.after?(TIME_RANGE[MORNING][:end]) && finish.after?(TIME_RANGE[AFTERNOON][:start]) AFTERNOON else BOTH end end |