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
64
65
66
67
68
  | 
class Calendar < ApplicationModel
  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
    alias_method :period_start, :begin
    alias_method :period_end, :end
    alias_method :period_start=, :begin=
    alias_method :period_end=, :end=
    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
  |