aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/calendar/period.rb
blob: 1c423dfcc978b2768b0e611660fdb80ca758d70a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Calendar < ActiveRecord::Base
  
  class Period
    include ActiveAttr::Model

    attribute :id, type: Integer
    attribute :begin, type: Date
    attribute :end, type: Date

    validates_presence_of :begin, :end
    validate :check_end_greather_than_begin

    def check_end_greather_than_begin
      if self.begin && self.end && self.begin >= self.end
        errors.add(:base, I18n.t('calendars.errors.short_period'))
      end
    end

    def self.from_range(range, index)
      last = range.exclude_end? ? range.end - 1.day : range.end
      Period.new id: index, begin: range.begin, end: last
    end

    def range
      if self.begin && self.end && self.begin <= self.end
        Range.new self.begin, self.end
      end
    end

    def intersect?(*other)
      return false if range.nil?

      other = other.flatten
      other = other.delete_if { |o| o.id == id } if id

      other.any? do |period|
        if other_range = period.range
          (range & other_range).present?
        end
      end
    end

    def cover? date
      range.cover? date
    end

    # Stuff required for coocon
    def new_record?
      !persisted?
    end

    def persisted?
      id.present?
    end

    def mark_for_destruction
      self._destroy = true
    end

    attribute :_destroy, type: Boolean
    alias_method :marked_for_destruction?, :_destroy
  end
end