1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-08-03 12:35:21 +02:00
Maybe/app/models/time_series/value.rb

47 lines
1,012 B
Ruby
Raw Normal View History

class TimeSeries::Value
2024-04-18 18:03:52 -06:00
include Comparable
2024-04-18 20:03:46 -06:00
include ActiveModel::Validations
2024-04-18 20:49:43 -06:00
attr_reader :value, :date, :original, :trend
2024-04-18 20:03:46 -06:00
validates :date, presence: true
validate :value_must_be_of_known_type
def initialize(date:, value:, original: nil, series: nil, previous_value: nil)
@date, @value, @original, @series = date, value, original, series
@trend = create_trend previous_value
2024-04-18 20:03:46 -06:00
validate!
2024-04-18 18:03:52 -06:00
end
2024-04-18 18:03:52 -06:00
def <=>(other)
result = date <=> other.date
result = value <=> other.value if result == 0
result
end
2024-04-18 20:03:46 -06:00
def as_json
{
date: date.iso8601,
2024-04-18 20:03:46 -06:00
value: value.as_json,
trend: trend.as_json
}
end
2024-04-18 18:03:52 -06:00
private
2024-04-18 20:49:43 -06:00
attr_reader :series
2024-04-18 20:03:46 -06:00
def create_trend(previous_value)
2024-04-18 20:03:46 -06:00
TimeSeries::Trend.new \
current: value,
previous: previous_value,
2024-04-18 20:03:46 -06:00
series: series
end
def value_must_be_of_known_type
unless value.is_a?(Money) || value.is_a?(Numeric)
errors.add :value, "must be a Money or Numeric"
end
2024-04-18 18:03:52 -06:00
end
end