Module: Timet::TimeValidationHelpers

Included in:
ValidationEditor
Defined in:
lib/timet/validation_editor.rb

Overview

Helper module containing validation logic for time tracking items.

Class Method Summary collapse

Class Method Details

.adjust_end_datetime_for_next_day(start_timestamp, new_datetime) ⇒ Object



11
12
13
14
15
# File 'lib/timet/validation_editor.rb', line 11

def adjust_end_datetime_for_next_day(start_timestamp, new_datetime)
  return new_datetime unless start_timestamp && (new_datetime.to_i <= start_timestamp)

  new_datetime + (24 * 60 * 60)
end

.check_start_before_end(new_epoch, ref_timestamp, new_datetime) ⇒ Object



97
98
99
100
# File 'lib/timet/validation_editor.rb', line 97

def check_start_before_end(new_epoch, ref_timestamp, new_datetime)
  validate_start_before_end(new_epoch, ref_timestamp, new_datetime)
  validate_time_difference(new_epoch, ref_timestamp)
end

.create_new_datetime(base_date_time, parsed_time_component) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/timet/validation_editor.rb', line 17

def create_new_datetime(base_date_time, parsed_time_component)
  Time.new(
    base_date_time.year,
    base_date_time.month,
    base_date_time.day,
    parsed_time_component.hour,
    parsed_time_component.min,
    parsed_time_component.sec,
    base_date_time.utc_offset
  )
end

.determine_base_date_time(_item, field, start_timestamp) ⇒ Object



39
40
41
42
43
44
45
46
47
48
# File 'lib/timet/validation_editor.rb', line 39

def determine_base_date_time(_item, field, start_timestamp)
  case field
  when 'start'
    determine_start_base_date_time(start_timestamp)
  when 'end'
    determine_end_base_date_time(start_timestamp)
  else
    raise ArgumentError, "Invalid field: #{field}"
  end
end

.determine_end_base_date_time(start_timestamp) ⇒ Object

Raises:

  • (ArgumentError)


33
34
35
36
37
# File 'lib/timet/validation_editor.rb', line 33

def determine_end_base_date_time(start_timestamp)
  raise ArgumentError, "Cannot set 'end' time because 'start' time is not set." unless start_timestamp

  Time.at(start_timestamp)
end

.determine_start_base_date_time(start_timestamp) ⇒ Object



29
30
31
# File 'lib/timet/validation_editor.rb', line 29

def determine_start_base_date_time(start_timestamp)
  start_timestamp ? Time.at(start_timestamp) : Time.now
end

.fetch_item_after_start(db, id) ⇒ Object



114
115
116
# File 'lib/timet/validation_editor.rb', line 114

def fetch_item_after_start(db, id)
  db.find_item(id + 1)&.dig(Timet::Application::FIELD_INDEX['start']) || TimeHelper.current_timestamp
end

.fetch_item_before_end(db, id, item_start) ⇒ Object



110
111
112
# File 'lib/timet/validation_editor.rb', line 110

def fetch_item_before_end(db, id, item_start)
  db.find_item(id - 1)&.dig(Timet::Application::FIELD_INDEX['end']) || item_start
end

.fetch_item_end(item) ⇒ Object



106
107
108
# File 'lib/timet/validation_editor.rb', line 106

def fetch_item_end(item)
  item[Timet::Application::FIELD_INDEX['end']] || TimeHelper.current_timestamp
end

.fetch_item_start(item) ⇒ Object



102
103
104
# File 'lib/timet/validation_editor.rb', line 102

def fetch_item_start(item)
  item[Timet::Application::FIELD_INDEX['start']]
end

.format_time(epoch) ⇒ Object



56
57
58
# File 'lib/timet/validation_editor.rb', line 56

def format_time(epoch)
  Time.at(epoch).strftime('%Y-%m-%d %H:%M:%S')
end

.parse_time_string(time_str) ⇒ Object



50
51
52
53
54
# File 'lib/timet/validation_editor.rb', line 50

def parse_time_string(time_str)
  Time.parse(time_str)
rescue ArgumentError
  raise ArgumentError, "Invalid time format: #{time_str}"
end

.validate_end_after_start(new_epoch, ref_timestamp, new_datetime) ⇒ Object

Raises:

  • (ArgumentError)


72
73
74
75
76
77
78
79
80
# File 'lib/timet/validation_editor.rb', line 72

def validate_end_after_start(new_epoch, ref_timestamp, new_datetime)
  reference_time = Time.at(ref_timestamp)
  formatted_new = new_datetime.strftime('%Y-%m-%d %H:%M:%S')
  formatted_ref = reference_time.strftime('%Y-%m-%d %H:%M:%S')

  return unless new_epoch <= ref_timestamp

  raise ArgumentError, "End time (#{formatted_new}) must be after start time (#{formatted_ref})."
end

.validate_end_time(new_epoch, ref_timestamp, new_datetime) ⇒ Object



92
93
94
95
# File 'lib/timet/validation_editor.rb', line 92

def validate_end_time(new_epoch, ref_timestamp, new_datetime)
  validate_end_after_start(new_epoch, ref_timestamp, new_datetime)
  validate_time_difference(ref_timestamp, new_epoch)
end

.validate_future_date(new_datetime) ⇒ Object

Raises:

  • (ArgumentError)


60
61
62
63
64
# File 'lib/timet/validation_editor.rb', line 60

def validate_future_date(new_datetime)
  return unless new_datetime > Time.now.getlocal

  raise ArgumentError, "Cannot set time to a future date or time: #{new_datetime.strftime('%Y-%m-%d %H:%M:%S')}"
end

.validate_start_before_end(new_epoch, ref_timestamp, new_datetime) ⇒ Object

Raises:

  • (ArgumentError)


82
83
84
85
86
87
88
89
90
# File 'lib/timet/validation_editor.rb', line 82

def validate_start_before_end(new_epoch, ref_timestamp, new_datetime)
  reference_time = Time.at(ref_timestamp)
  formatted_new = new_datetime.strftime('%Y-%m-%d %H:%M:%S')
  formatted_ref = reference_time.strftime('%Y-%m-%d %H:%M:%S')

  return unless new_epoch >= ref_timestamp

  raise ArgumentError, "Start time (#{formatted_new}) must be before end time (#{formatted_ref})."
end

.validate_time_difference(earlier_timestamp, later_timestamp) ⇒ Object

Raises:

  • (ArgumentError)


66
67
68
69
70
# File 'lib/timet/validation_editor.rb', line 66

def validate_time_difference(earlier_timestamp, later_timestamp)
  return unless (later_timestamp - earlier_timestamp).abs >= 24 * 60 * 60

  raise ArgumentError, 'The difference between start and end time must be less than 24 hours.'
end