Class: EventsController

Inherits:
ApplicationController show all
Defined in:
app/controllers/events_controller.rb

Overview

This controller manage the views refering to Event model

  • before_action :ApplicationController#powered_in!, except: :reserve

  • before_action :set_event, only: [:edit, :destroy, :confirmed, :confirmed_users]

  • before_action :set_user, only: [:new, :create, :reserve, :meeting_destroy, :meeting_sendmail, :confirmed]

  • before_action :set_meetings, only: [:reserve, :meeting_destroy, :meeting_sendmail]

Instance Method Summary collapse

Methods inherited from ApplicationController

#admin_in!, #doctor_in!, #powered_in!, #secretary_in!, #translate_errors

Instance Method Details

#agendaJson

GET /events/agenda

render a json with the events to popolate the calendari

  • set @start date for the query from params, if empty is set to beginning of the month

  • set @stop date for the query from params, if empty is set to end of month

  • set @events with Event.between param :start and param :stop

Returns:

  • (Json)

    an array with @events for generate the calendar



32
33
34
35
36
37
# File 'app/controllers/events_controller.rb', line 32

def agenda
  start = params[:start].presence || Time.zone.today.at_beginning_of_month
  stop = params[:end].presence || Time.zone.today.at_end_of_month
  @events = Event.between(start_on: start, stop_on: stop)
  render json: @events.map { |event| { id: "event-#{event.id}", title: "#{event.city} (#{event.meetings.confirmed.joins(:audit).group(:user_id).count.count}/#{event.users.distinct.count})", start: event.date_on, allDay: true, date_on: event.date_on, gender: event.gender, city: I18n.t(event.city, scope: 'user.cities', default: event.city), className: [event.gender.to_s], url: event_path(id: event.id) } }
end

#confirmedObject



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'app/controllers/events_controller.rb', line 165

def confirmed
  @meeting = @user.meetings.find_by(event: @event)
  @meeting.sended_at = Time.zone.now
  if @meeting.save && @user.email.present?
    if @event.status(@user) == 'proposed'
      if @event.analisys?
        @response = Notifier.user_event_analisys(@user, @event).deliver_now
      elsif @event.visit?
        @response = Notifier.user_event_visit(@user, @event).deliver_now
      end
    else
      @response = Notifier.user_event_confirmed(@user, @event).deliver_now
    end
  end
  @zone = params[:zone].presence || 'users'
  if @zone == 'users'
    @event = Event.new
    set_timer
    render partial: 'new', locals: { meeting: @meeting, event: @event, user: @user, view: @view, timer: @timer }, status: :ok
  elsif @zone == 'events'
    render partial: 'events/meeting', locals: { meeting: @meeting, event: @event, user: @user, timer: @timer }, status: :ok
  end
end

#confirmed_usersObject



189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'app/controllers/events_controller.rb', line 189

def confirmed_users
  @meetings = @event.meetings.joins(:user).order('meetings.start_at asc, users.label asc').to_a.uniq { |a| a.user.id }
  @meetings.each do |meeting|
    user = meeting.user
    response = user.email.blank? ? false : Notifier.user_event_confirmed(user, @event).deliver_now
    if response
      meeting.sended_at = Time.zone.now
      meeting.save
    end
  end
  render turbo_stream: [
    turbo_stream.update("event_#{@event.id}_meetings", partial: 'events/meeting', collection: @meetings, as: :meeting, locals: { event: @event })
  ]
end

#createObject

POST /events POST /events.json



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'app/controllers/events_controller.rb', line 64

def create
  @current_event = Event.find_or_initialize_by(date_on: params[:event][:date_on].to_date, gender: Event.genders[params[:event][:gender]], city: params[:event][:city])
  if params[:event][:ids] != ['']
    @result = @current_event.update(event_params)
  else
    @result = false
    @message = t('select_one_category', scope: 'message.meeting').to_s
  end
  @event = Event.new
  if @result
    set_timer
    flash.now[:success] = 'Creazione avvenuta con successo'
    render turbo_stream: [
      turbo_stream.replace(:flashes, partial: "flashes"),
      turbo_stream.replace("user_#{@user.id}_event_form", partial: "events/form", locals: {user: @user, event: @event, timer: @timer, view: @view}),
      turbo_stream.update("user_#{@user.id}_events", partial: "events/events", locals: {user: @user}),
      turbo_stream.update("user_#{@user.id}", partial: "users/user", locals: {user: @user})
    ]
  else
    set_timer
    flash.now[:error] = @message
    render turbo_stream: [
      turbo_stream.replace(:flashes, partial: "flashes"),
      turbo_stream.replace("user_#{@user.id}_event_form", partial: "events/form", locals: {user: @user, event: @event, timer: @timer, view: @view})
    ]
  end
end

#destroyObject

DELETE /events/1 DELETE /events/1.json



120
121
122
123
124
125
126
127
128
# File 'app/controllers/events_controller.rb', line 120

def destroy
  old_event = @event
  old_event.destroy
  flash.now[:success] = 'Cancellazione avvenuta con successo'
  render turbo_stream: [
    turbo_stream.replace(:flashes, partial: "flashes", locals: {force: 'true'}),
    turbo_stream.update('yield', partial: "events/index")
  ]
end

#editObject

GET /events/1/edit



51
52
53
54
55
56
57
58
59
60
# File 'app/controllers/events_controller.rb', line 51

def edit
  @event = Event.find(@event.id)
  @meetings = @event.meetings.joins(:user).order('meetings.start_at asc, users.label asc').to_a.uniq { |a| a.user.id }
  @title = "#{t @event.gender, scope: 'event.genders'} #{@event.city.capitalize} del #{l @event.date_on}"
  timer = []
  Settings.events.ranges.each do |range|
    timer += (range.start_time.in_time_zone.to_datetime.to_i .. range.end_time.in_time_zone.to_datetime.to_i).step(range.interval.minutes).map{|t| Time.zone.at(t).strftime('%H:%M') }
  end
  @timer = timer.uniq.sort
end

#indexObject

GET /events

render events index

  • set @meetings with all future events

Returns:

  • (Object)

    render events/index



21
22
23
# File 'app/controllers/events_controller.rb', line 21

def index
  # @meetings = Event.future.where(id: Meeting.waiting.distinct(:event_id).pluck(:event_id))
end

#meeting_destroyObject

DELETE /events/1 DELETE /events/1.json



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'app/controllers/events_controller.rb', line 136

def meeting_destroy
  @zone = params[:zone].presence || 'users'
  @meetings.destroy_all
  @destroyed = !Event.exists?(@event.id)
  if @zone == 'users' # && !@destroyed
    @event = Event.new
    flash.now[:success] = 'Cancellazione avvenuta con successo'
  elsif @zone != 'users' && !@destroyed
    flash.now[:success] = 'Modifica avvenuta con successo'
  end
  render turbo_stream: [
    turbo_stream.replace(:flashes, partial: "flashes"),
    turbo_stream.update("user_#{@user.id}_events", partial: "events/events", locals: {user: @user}),
    turbo_stream.update("user_#{@user.id}", partial: "users/user", locals: {user: @user}),
    turbo_stream.update("event_#{@event.id}_meetings", partial: 'events/meeting', collection: @event.meetings.joins(:user).order('meetings.start_at asc, users.label asc').to_a.uniq { |a| a.user.id }, as: :meeting, locals: {event: @event}),
  ]
end

#meeting_sendmailObject



154
155
156
157
158
# File 'app/controllers/events_controller.rb', line 154

def meeting_sendmail
  @zone = params[:zone].presence || 'users'
  Notifier.user_event(@user, @event).deliver_now
  @meetings.update(sended_at: Time.zone.now)
end

#meetingsObject



130
131
132
# File 'app/controllers/events_controller.rb', line 130

def meetings
  @meetings = @event.meetings.joins(:user).order('meetings.start_at asc, users.label asc').to_a.uniq { |a| a.user.id }
end

#newObject

GET /events/new

render



42
43
44
45
46
47
48
# File 'app/controllers/events_controller.rb', line 42

def new
  @setdatevalue = ''
  @setdatevalue = params[:date] if params[:date].present?
  @event = Event.new
  @title = "Gestione eventi #{@user.label}"
  set_timer
end


160
161
162
163
# File 'app/controllers/events_controller.rb', line 160

def print
  @filter = params[:filter]
  @filename = @filter.blank? ? 'print.xlsx' : "#{@filter}.xlsx"
end

#reserveObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'app/controllers/events_controller.rb', line 92

def reserve
  @template = params[:template].presence || 'user'
  @event.user = @user
  old_status = @event.status(@user)
  @result = @event.update_status! if current_user.secretary? || (current_user == @user && @event.status(@user) == 'proposed')
  @meeting = @user.meetings.find_by(event: @event)
  @response = Notifier.user_event_confirmed(@user, @event).deliver_now if @result && current_user.secretary? && (@event.status(@user) != old_status)
  if @template == 'user'
    render partial: 'home/user_event', locals: { meeting: @meeting, event: @event, user: @user }
  else
    if @template == 'secretary'
      set_timer
      render turbo_stream: [
        turbo_stream.replace("user_#{@user.id}", partial: 'users/user', locals: { meeting: @meeting, event: @event, user: @user, timer: @timer }),
        turbo_stream.replace("user_#{@user.id}_event_#{@event.id}", partial: 'users/user_event', locals: { event: @event, user: @user })
      ]
    else
      render turbo_stream: [
        turbo_stream.replace("meeting_#{@meeting.id}", partial: 'events/meeting', locals: { meeting: @meeting, event: @event, user: @user }),
        turbo_stream.replace("event_#{@event.id}_summary", partial: 'events/summary', locals: { meeting: @meeting, event: @event, user: @user }),
        turbo_stream.update('yield', partial: "events/index")
      ]
    end
  end
end