2016-07-08 13:28:02 +02:00
|
|
|
class EventSchedule < ActiveRecord::Base
|
|
|
|
|
belongs_to :schedule
|
|
|
|
|
belongs_to :event
|
|
|
|
|
belongs_to :room
|
2016-07-13 01:33:56 +02:00
|
|
|
|
2016-08-18 00:32:16 +05:30
|
|
|
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }
|
|
|
|
|
|
2016-07-26 16:20:31 +02:00
|
|
|
validates :schedule, presence: true
|
|
|
|
|
validates :event, presence: true
|
|
|
|
|
validates :room, presence: true
|
|
|
|
|
validates :start_time, presence: true
|
2016-08-15 16:08:02 +02:00
|
|
|
validates :event, uniqueness: { scope: :schedule }
|
2016-07-26 16:20:31 +02:00
|
|
|
|
2016-07-20 23:20:47 +02:00
|
|
|
scope :confirmed, -> { joins(:event).where('state = ?', 'confirmed') }
|
|
|
|
|
scope :canceled, -> { joins(:event).where('state = ?', 'canceled') }
|
|
|
|
|
scope :withdrawn, -> { joins(:event).where('state = ?', 'withdrawn') }
|
|
|
|
|
|
2016-07-26 16:20:31 +02:00
|
|
|
delegate :guid, to: :room, prefix: true
|
2016-07-20 23:20:47 +02:00
|
|
|
|
|
|
|
|
##
|
|
|
|
|
# Returns end of the event
|
|
|
|
|
#
|
|
|
|
|
def end_time
|
|
|
|
|
start_time + event.event_type.length.minutes
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
##
|
2017-02-12 19:10:03 +05:30
|
|
|
# Returns event schedules that are scheduled in the same room and start_time as event
|
2016-07-20 23:20:47 +02:00
|
|
|
#
|
2017-02-12 19:10:03 +05:30
|
|
|
def intersecting_event_schedules
|
2016-07-20 23:20:47 +02:00
|
|
|
room.event_schedules.where(start_time: start_time, schedule: schedule).where.not(id: id)
|
|
|
|
|
end
|
2016-08-18 00:32:16 +05:30
|
|
|
|
2016-08-15 17:17:57 +05:30
|
|
|
def replacement?
|
2017-02-12 19:10:03 +05:30
|
|
|
event.state == 'confirmed' && (!intersecting_event_schedules.canceled.empty? || !intersecting_event_schedules.withdrawn.empty?)
|
2016-08-15 17:17:57 +05:30
|
|
|
end
|
|
|
|
|
|
2016-08-18 00:32:16 +05:30
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def conference_id
|
|
|
|
|
schedule.program.conference_id
|
|
|
|
|
end
|
2016-07-08 13:28:02 +02:00
|
|
|
end
|