Module: DateContinuity::Model

Extended by:
ActiveSupport::Concern
Defined in:
lib/date_continuity/model.rb

Constant Summary collapse

TIME_UNIT_VALUES =
%w(second minute hour day week month year).freeze
DAY_EQUIVALENTS =
{
  second: 86_400,
  minute: 1_440,
  hour: 24,
  day: 1,
  week: (1.0 / 7.0)
}.freeze

Instance Method Summary collapse

Instance Method Details

#calc_duration(start_datetime = start_value, end_datetime = end_value) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/date_continuity/model.rb', line 52

def calc_duration(start_datetime = start_value, end_datetime = end_value)
  # DateTime subtraction returns a fraction representing days
  if start_datetime && end_datetime
    duration = case time_unit_value
                when "month" then months_between(start_datetime, end_datetime)
                when "year" then years_between(start_datetime, end_datetime)
                else
                  (end_datetime - start_datetime) * DAY_EQUIVALENTS[time_unit_value.to_sym]
                end + 1
    (duration * frequency_value).to_i
  else
    _raise_not_enough_information_error [start_method, end_method]
  end
end

#calc_endObject

Calculation Methods



36
37
38
39
40
41
42
# File 'lib/date_continuity/model.rb', line 36

def calc_end
  if start_value.present? && duration_value.present?
    start_value + duration_object
  else
    _raise_not_enough_information_error [start_method, duration_method]
  end
end

#calc_startObject



44
45
46
47
48
49
50
# File 'lib/date_continuity/model.rb', line 44

def calc_start
  if end_value.present? && duration_value.present?
    end_value - duration_object
  else
    _raise_not_enough_information_error [end_method, duration_method]
  end
end

#duration_object(duration = duration_value - 1) ⇒ Object



67
68
69
# File 'lib/date_continuity/model.rb', line 67

def duration_object(duration = duration_value - 1)
  (duration.public_send(time_unit_value) / frequency_value)
end

#set_durationObject

Setter methods



73
74
75
76
# File 'lib/date_continuity/model.rb', line 73

def set_duration
  send("#{duration_method}=", calc_duration)
  self
end

#set_endObject



78
79
80
81
# File 'lib/date_continuity/model.rb', line 78

def set_end
  send("#{end_method}=", calc_end)
  self
end

#set_startObject



83
84
85
86
# File 'lib/date_continuity/model.rb', line 83

def set_start
  send("#{start_method}=", calc_start)
  self
end