feat(event available/sold out): Promoter can mark event as sold out or available
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.
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
class Promoter::EventsController < ApplicationController
|
class Promoter::EventsController < ApplicationController
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :ensure_can_manage_events!
|
before_action :ensure_can_manage_events!
|
||||||
before_action :set_event, only: [ :show, :edit, :update, :destroy, :publish, :unpublish, :cancel, :mark_sold_out, :duplicate ]
|
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
|
# Display all events for the current promoter
|
||||||
def index
|
def index
|
||||||
@@ -93,6 +93,16 @@ class Promoter::EventsController < ApplicationController
|
|||||||
end
|
end
|
||||||
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
|
# Duplicate an event and all its ticket types
|
||||||
def duplicate
|
def duplicate
|
||||||
clone_ticket_types = params[:clone_ticket_types] == "true"
|
clone_ticket_types = params[:clone_ticket_types] == "true"
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ class Event < ApplicationRecord
|
|||||||
# Scope for published events ordered by start time
|
# Scope for published events ordered by start time
|
||||||
scope :upcoming, -> { published.where("start_time >= ?", Time.current).order(start_time: :asc) }
|
scope :upcoming, -> { published.where("start_time >= ?", Time.current).order(start_time: :asc) }
|
||||||
|
|
||||||
|
|
||||||
# === Instance Methods ===
|
# === Instance Methods ===
|
||||||
|
|
||||||
# Check if coordinates were successfully geocoded or are fallback coordinates
|
# Check if coordinates were successfully geocoded or are fallback coordinates
|
||||||
|
|||||||
@@ -132,10 +132,14 @@
|
|||||||
<div class="bg-blue-50 border border-blue-200 rounded-2xl p-4">
|
<div class="bg-blue-50 border border-blue-200 rounded-2xl p-4">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<i data-lucide="users" class="w-5 h-5 text-blue-400 mr-3"></i>
|
<i data-lucide="users" class="w-5 h-5 text-blue-400 mr-3"></i>
|
||||||
<div>
|
<div class="flex-1">
|
||||||
<h3 class="text-sm font-medium text-blue-900">Événement complet</h3>
|
<h3 class="text-sm font-medium text-blue-900">Événement complet</h3>
|
||||||
<p class="text-sm text-blue-700">Tous les billets pour cet événement ont été vendus.</p>
|
<p class="text-sm text-blue-700">Tous les billets pour cet événement ont été vendus.</p>
|
||||||
</div>
|
</div>
|
||||||
|
<%= button_to mark_available_promoter_event_path(@event), method: :patch, class: "ml-4 inline-flex items-center px-3 py-1 bg-white border border-blue-300 text-blue-700 text-sm font-medium rounded-lg hover:bg-blue-50 transition-colors duration-200" do %>
|
||||||
|
<i data-lucide="refresh-ccw" class="w-4 h-4 mr-1"></i>
|
||||||
|
Marquer comme disponible
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -273,10 +277,19 @@
|
|||||||
<i data-lucide="ticket" class="w-4 h-4 mr-2"></i>
|
<i data-lucide="ticket" class="w-4 h-4 mr-2"></i>
|
||||||
Gérer les types de billets
|
Gérer les types de billets
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= button_to mark_sold_out_promoter_event_path(@event), method: :patch, class: "w-full inline-flex items-center justify-center px-4 py-3 bg-gray-50 text-gray-700 font-medium text-sm rounded-lg hover:bg-gray-100 transition-colors duration-200", disabled: !@event.published? do %>
|
|
||||||
|
<% if @event.sold_out? %>
|
||||||
|
<%= button_to mark_available_promoter_event_path(@event), method: :patch, class: "w-full inline-flex items-center justify-center px-4 py-3 bg-blue-50 text-blue-700 font-medium text-sm rounded-lg hover:bg-blue-100 transition-colors duration-200" do %>
|
||||||
|
<i data-lucide="refresh-ccw" class="w-4 h-4 mr-2"></i>
|
||||||
|
Marquer comme disponible
|
||||||
|
<% end %>
|
||||||
|
<% elsif @event.published? %>
|
||||||
|
<%= button_to mark_sold_out_promoter_event_path(@event), method: :patch, class: "w-full inline-flex items-center justify-center px-4 py-3 bg-gray-50 text-gray-700 font-medium text-sm rounded-lg hover:bg-gray-100 transition-colors duration-200" do %>
|
||||||
<i data-lucide="users" class="w-4 h-4 mr-2"></i>
|
<i data-lucide="users" class="w-4 h-4 mr-2"></i>
|
||||||
Marquer comme complet
|
Marquer comme complet
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<hr class="border-gray-200">
|
<hr class="border-gray-200">
|
||||||
<%= button_to promoter_event_path(@event), method: :delete,
|
<%= button_to promoter_event_path(@event), method: :delete,
|
||||||
data: { confirm: "Êtes-vous sûr de vouloir supprimer cet événement ? Cette action est irréversible." },
|
data: { confirm: "Êtes-vous sûr de vouloir supprimer cet événement ? Cette action est irréversible." },
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ Rails.application.routes.draw do
|
|||||||
patch :unpublish
|
patch :unpublish
|
||||||
patch :cancel
|
patch :cancel
|
||||||
patch :mark_sold_out
|
patch :mark_sold_out
|
||||||
|
patch :mark_available
|
||||||
post :duplicate
|
post :duplicate
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user