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
|