You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
5.6 KiB
146 lines
5.6 KiB
|
|
module ScheduleHelper
|
|
def get_schedule_data
|
|
schedule = Hash.new
|
|
workshop_errors = Hash.new
|
|
workshop_warnings = Hash.new
|
|
|
|
all_events = (@workshops + @events)
|
|
conflicts = 0
|
|
errors = 0
|
|
|
|
(0...all_events.count).each do |i|
|
|
w = all_events[i]
|
|
|
|
if w.start_time.present? && w.end_time.present? && w.event_location_id.present?
|
|
type = w.is_a?(Workshop) ? :workshop : :event
|
|
|
|
hour = w.start_time.strftime('%H').to_i
|
|
hour += 0.5 if w.start_time.strftime('%M').to_i > 15
|
|
|
|
end_hour = w.end_time.strftime('%H').to_i
|
|
end_hour += 0.5 if w.end_time.strftime('%M').to_i > 15
|
|
|
|
day = w.conference_day
|
|
|
|
schedule[day] ||= Hash.new
|
|
schedule[day][:locations] ||= Hash.new
|
|
schedule[day][:locations][w.event_location_id] ||= Hash.new
|
|
|
|
conflict = nil
|
|
(hour...end_hour).step(0.5).each do |h|
|
|
h = h.to_i if h == h.to_i
|
|
if !conflict && schedule[day][:locations][w.event_location_id][h].present?
|
|
conflict = schedule[day][:locations][w.event_location_id][h]
|
|
end
|
|
end
|
|
|
|
if conflict.present?
|
|
w_conflict = get_workshop(conflict, @workshops, @events)
|
|
workshop_errors[(w_conflict.is_a?(Workshop) ? 'w' : 'e') + w_conflict.id.to_s] = "Time conflict with “<strong>#{w.title}</strong>”".html_safe
|
|
workshop_errors[(w.is_a?(Workshop) ? 'w' : 'e') + w.id.to_s] = "Time conflict with “<strong>#{w_conflict.title}</strong>”".html_safe
|
|
errors += 1 if workshop_errors[(w_conflict.is_a?(Workshop) ? 'w' : 'e') + w_conflict.id.to_s].nil?
|
|
else
|
|
schedule[day][:start_time] = hour if schedule[day][:start_time].nil? || hour < schedule[day][:start_time]
|
|
schedule[day][:end_time] = end_hour if schedule[day][:end_time].nil? || end_hour > schedule[day][:end_time]
|
|
|
|
schedule[day][:locations][w.event_location_id][hour] = {
|
|
:span => w.duration / 60.0,
|
|
:type => w.is_a?(Event) ? w.event_type : :workshop
|
|
}
|
|
schedule[day][:locations][w.event_location_id][hour][:workshop] = i if type == :workshop
|
|
schedule[day][:locations][w.event_location_id][hour][:event] = (i - @workshops.count) if type == :event
|
|
end
|
|
else
|
|
workshop_warnings["w#{w.id}"] ||= Array.new
|
|
workshop_warnings["w#{w.id}"] << (w.is_a?(Workshop) ? "This workshop is not scheduled" : "This event is not scheduled")
|
|
end
|
|
end
|
|
|
|
schedule.each do |day, day_data|
|
|
day_data[:locations].each do |location1, location_data1|
|
|
location_data1.each do |time1, data1|
|
|
day_data[:locations].each do |location2, location_data2|
|
|
location_data2.each do |time2, data2|
|
|
if data1[:workshop].present?
|
|
if data2[:workshop].present?
|
|
unless location1 == location2 && time1 == time2
|
|
if workshop_errors[data1[:workshop]].nil?
|
|
w1 = @workshops[data1[:workshop]]
|
|
w2 = @workshops[data2[:workshop]]
|
|
if time1 == time2
|
|
w1.workshop_facilitators.each do |f|
|
|
u = User.find(f.user_id)
|
|
if w2.active_facilitator?(u)
|
|
errors += 1 if workshop_errors[(w2.is_a?(Workshop) ? 'w' : 'e') + w2.id.to_s].nil?
|
|
workshop_errors["w#{w1.id}"] = "This workshop shares facilitators with “<strong>#{w2.title}</strong>”".html_safe
|
|
end
|
|
end
|
|
connection ||= ActiveRecord::Base.connection
|
|
common_interest_count = connection.select_value("SELECT COUNT(w1.user_id) FROM workshop_interests AS w1 JOIN workshop_interests AS w2 ON w2.user_id=w1.user_id WHERE w1.workshop_id=#{w1.id} AND w2.workshop_id=#{w2.id}")
|
|
common_interest_count = common_interest_count ? common_interest_count.to_i : 0
|
|
if common_interest_count > 0
|
|
conflicts += common_interest_count
|
|
workshop_warnings["w#{w1.id}"] ||= Array.new
|
|
workshop_warnings["w#{w1.id}"] << "<strong>#{common_interest_count}</strong> people are also interested in “<strong>#{w2.title}</strong>”".html_safe
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
{
|
|
:schedule => schedule.sort,
|
|
:errors => workshop_errors,
|
|
:warnings => workshop_warnings,
|
|
:conflict_score => conflicts,
|
|
:error_count => errors
|
|
}
|
|
end
|
|
|
|
def get_workshop(workshop, workshops, events)
|
|
workshop[:workshop] ? workshops[workshop[:workshop]] : (events[workshop[:event]] || :event)
|
|
end
|
|
|
|
def workshop_classes(workshop, show_interest)
|
|
classes = [workshop.is_a?(Workshop) ? :workshop : workshop.event_type]
|
|
if show_interest && workshop.is_a?(Workshop) && current_user && WorkshopInterest.where(:user_id => current_user.id)
|
|
if workshop.interested?(current_user) || workshop.facilitator?(current_user)
|
|
classes << 'interested'
|
|
else
|
|
classes << 'not-interested'
|
|
end
|
|
end
|
|
|
|
return classes
|
|
end
|
|
|
|
def schedule_start_and_end_times(day_part, day_parts, day_schedule)
|
|
start_time = [day_parts[day_parts.keys[day_part]], day_schedule[:start_time]].max
|
|
end_time = [day_parts[day_parts.keys[day_part + 1]] || 24, day_schedule[:end_time]].min
|
|
|
|
min_time = nil
|
|
max_time = nil
|
|
|
|
day_schedule[:locations].each do |location, location_schedule|
|
|
location_schedule.each do |hour, workshop|
|
|
t_start = hour
|
|
t_end = hour + workshop[:span]
|
|
if t_start >= start_time && t_end <= end_time
|
|
min_time = [min_time || 24, t_start].min
|
|
max_time = [max_time || 0, t_end].max
|
|
end
|
|
end
|
|
end
|
|
|
|
return nil unless min_time.present? && max_time.present?
|
|
|
|
[min_time || 0, max_time || 24]
|
|
end
|
|
end
|
|
|