On the event page, promoter can choose to mark the event as "sold out" using the status field or as "published". Only published event can be marked as sold out if promoter thinks he cannot handle all the people available.
140 lines
4.2 KiB
Ruby
140 lines
4.2 KiB
Ruby
# Promoter Events Controller
|
|
#
|
|
# Handles event management for promoters (event organizers)
|
|
# Allows promoters to create, edit, delete and manage their events
|
|
class Promoter::EventsController < ApplicationController
|
|
before_action :authenticate_user!
|
|
before_action :ensure_can_manage_events!
|
|
before_action :set_event, only: [ :show, :edit, :update, :destroy, :publish, :unpublish, :cancel, :mark_sold_out, :mark_available, :duplicate ]
|
|
|
|
# Display all events for the current promoter
|
|
def index
|
|
@events = current_user.events.order(created_at: :desc).page(params[:page]).per(10)
|
|
end
|
|
|
|
# Display a specific event for the promoter
|
|
def show
|
|
# Event is set by set_event callback
|
|
end
|
|
|
|
# Show form to create a new event
|
|
def new
|
|
@event = current_user.events.build
|
|
end
|
|
|
|
# Create a new event
|
|
def create
|
|
@event = current_user.events.build(event_params)
|
|
|
|
if @event.save
|
|
redirect_to promoter_event_path(@event), notice: "Event créé avec succès!"
|
|
else
|
|
render :new, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
# Show form to edit an existing event
|
|
def edit
|
|
# Event is set by set_event callback
|
|
end
|
|
|
|
# Update an existing event
|
|
def update
|
|
if @event.update(event_params)
|
|
redirect_to promoter_event_path(@event), notice: "Event mis à jour avec succès!"
|
|
else
|
|
render :edit, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
# Delete an event
|
|
def destroy
|
|
@event.destroy
|
|
redirect_to promoter_events_path, notice: "Event supprimé avec succès!"
|
|
end
|
|
|
|
# Publish an event (make it visible to public)
|
|
def publish
|
|
if @event.draft?
|
|
@event.update(state: :published)
|
|
redirect_to promoter_event_path(@event), notice: "Event publié avec succès!"
|
|
else
|
|
redirect_to promoter_event_path(@event), alert: "Cet event ne peut pas être publié."
|
|
end
|
|
end
|
|
|
|
# Unpublish an event (make it draft)
|
|
def unpublish
|
|
if @event.published?
|
|
@event.update(state: :draft)
|
|
redirect_to promoter_event_path(@event), notice: "Event dépublié avec succès!"
|
|
else
|
|
redirect_to promoter_event_path(@event), alert: "Cet event ne peut pas être dépublié."
|
|
end
|
|
end
|
|
|
|
# Cancel an event
|
|
def cancel
|
|
if @event.published?
|
|
@event.update(state: :canceled)
|
|
redirect_to promoter_event_path(@event), notice: "Event annulé avec succès!"
|
|
else
|
|
redirect_to promoter_event_path(@event), alert: "Cet event ne peut pas être annulé."
|
|
end
|
|
end
|
|
|
|
# Mark event as sold out
|
|
def mark_sold_out
|
|
if @event.published?
|
|
@event.update(state: :sold_out)
|
|
redirect_to promoter_event_path(@event), notice: "Event marqué comme complet!"
|
|
else
|
|
redirect_to promoter_event_path(@event), alert: "Cet event ne peut pas être marqué comme complet."
|
|
end
|
|
end
|
|
|
|
# Mark event as available again
|
|
def mark_available
|
|
if @event.sold_out?
|
|
@event.update(state: :published)
|
|
redirect_to promoter_event_path(@event), notice: "Event marqué comme disponible!"
|
|
else
|
|
redirect_to promoter_event_path(@event), alert: "Cet event ne peut pas être marqué comme disponible."
|
|
end
|
|
end
|
|
|
|
# Duplicate an event and all its ticket types
|
|
def duplicate
|
|
clone_ticket_types = params[:clone_ticket_types] == "true"
|
|
@new_event = @event.duplicate(clone_ticket_types: clone_ticket_types)
|
|
|
|
if @new_event
|
|
redirect_to edit_promoter_event_path(@new_event), notice: "Événement dupliqué avec succès! Vous pouvez maintenant modifier les détails de l'événement copié."
|
|
else
|
|
redirect_to promoter_event_path(@event), alert: "Erreur lors de la duplication de l'événement."
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def ensure_can_manage_events!
|
|
unless current_user.can_manage_events?
|
|
redirect_to dashboard_path, alert: "Vous n'avez pas les permissions nécessaires pour gérer des événements."
|
|
end
|
|
end
|
|
|
|
def set_event
|
|
@event = current_user.events.find(params[:id])
|
|
rescue ActiveRecord::RecordNotFound
|
|
redirect_to promoter_events_path, alert: "Event non trouvé ou vous n'avez pas accès à cet event."
|
|
end
|
|
|
|
def event_params
|
|
params.require(:event).permit(
|
|
:name, :slug, :description, :image,
|
|
:venue_name, :venue_address, :latitude, :longitude,
|
|
:start_time, :end_time, :featured, :allow_booking_during_event
|
|
)
|
|
end
|
|
end
|