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