feat(promotion code): Promotion code system done

I added the features for users to use promotion code
and for promoters to create on their events.
May be rewrite to discount code?
This commit is contained in:
kbe
2025-09-29 15:25:52 +02:00
parent 72d54e02ab
commit 87ccebf229
19 changed files with 391 additions and 302 deletions

View File

@@ -1,30 +1,12 @@
<div class="min-h-screen bg-gradient-to-br from-gray-50 to-gray-100 py-8">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<!-- Breadcrumb -->
<nav class="inline-flex items-center gap-2 bg-white px-4 py-3 rounded-xl shadow-sm border border-gray-100 mb-8" aria-label="Breadcrumb">
<div class="inline-flex items-center text-sm font-medium">
<%= link_to root_path, class: "text-gray-700 hover:text-purple-600 transition-colors" do %>
<i data-lucide="home" class="w-4 h-4 mr-2"></i>
Accueil
<% end %>
</div>
<i data-lucide="chevron-right" class="w-4 h-4 text-gray-400"></i>
<div class="inline-flex items-center text-sm font-medium">
<%= link_to events_path, class: "text-gray-700 hover:text-purple-600 transition-colors" do %>
Événements
<% end %>
</div>
<i data-lucide="chevron-right" class="w-4 h-4 text-gray-400"></i>
<div class="inline-flex items-center text-sm font-medium">
<%= link_to event_path(@order.event.slug, @order.event), class: "text-gray-700 hover:text-purple-600 transition-colors" do %>
<%= @order.event.name %>
<% end %>
</div>
<i data-lucide="chevron-right" class="w-4 h-4 text-gray-400"></i>
<div class="text-sm font-medium text-purple-600">
Commande #<%= @order.id %>
</div>
</nav>
<%= render 'components/breadcrumb', crumbs: [
{ name: 'Accueil', path: root_path },
{ name: 'Événements', path: events_path },
{ name: @order.event.name, path: event_path(@order.event.slug, @order.event) },
{ name: "Commande ##{@order.id}", path: nil }
] %>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
<!-- Order Summary -->
@@ -77,8 +59,8 @@
</div>
<!-- Order Items -->
<div class="space-y-4 mb-6">
<h3 class="text-lg font-semibold text-gray-900 mb-4">Récapitulatif de votre commande</h3>
<div class="space-y-4 mb-6 border-b border-gray-200 pb-6 mb-6">
<h3 class="text-lg font-semibold text-gray-900 mb-4 ">Récapitulatif de votre commande</h3>
<% @tickets.each do |ticket| %>
<div class="flex items-center justify-between py-3 border-b border-gray-100 last:border-b-0">
@@ -99,12 +81,46 @@
<% end %>
</div>
<!-- Promotion Code Discount -->
<% if @order.promotion_codes.any? %>
<div class="space-y-2 mb-6 pb-6 border-b border-gray-200">
<% @order.promotion_codes.each do |promo_code| %>
<div class="flex items-center justify-between">
<span class="text-sm font-medium text-green-600">
<i data-lucide="tag" class="w-4 h-4 mr-1"></i>
Code: <%= promo_code.code %>
</span>
<span class="text-sm font-semibold text-green-600">-<%= promo_code.discount_amount_euros %>€</span>
</div>
<% end %>
</div>
<% end %>
<!-- Order Total -->
<div class=" pt-12">
<div class="space-y-2">
<div class="flex items-center justify-between text-lg pt-2">
<!-- Subtotal -->
<div class="flex items-center justify-between">
<span class="text-sm text-gray-600">Sous-total</span>
<span class="text-sm font-medium text-gray-600"><%= @order.subtotal_amount_euros %>€</span>
</div>
<!-- Discount -->
<% if @order.discount_amount_cents > 0 %>
<div class="flex items-center justify-between">
<span class="text-sm text-green-600">Réduction</span>
<span class="text-sm font-semibold text-green-600">-<%= @order.discount_amount_euros %>€</span>
</div>
<% end %>
<!-- Total -->
<div class="flex items-center justify-between text-lg pt-2 border-t border-gray-200">
<span class="font-medium text-gray-900">Total</span>
<span class="font-bold text-2xl text-purple-600"><%= @order.total_amount_euros %>€</span>
<% if @order.total_amount_cents == 0 %>
<span class="font-bold text-2xl text-green-600">GRATUIT</span>
<% else %>
<span class="font-bold text-2xl text-purple-600"><%= @order.total_amount_euros %>€</span>
<% end %>
</div>
</div>
<p class="text-xs text-gray-500 mt-2">TVA incluse</p>
@@ -150,7 +166,11 @@
>
<div class="flex items-center justify-center">
<i data-lucide="credit-card" class="w-5 h-5 mr-2"></i>
Payer <%= @order.total_amount_euros %>
<% if @order.total_amount_cents == 0 %>
Confirmer la commande
<% else %>
Payer <%= @order.total_amount_euros %>€
<% end %>
</div>
</button>
@@ -251,7 +271,11 @@ const stripeResult = await stripe.redirectToCheckout({
button.innerHTML = `
<div class="flex items-center justify-center">
<i data-lucide="credit-card" class="w-5 h-5 mr-2"></i>
Payer <%= @order.total_amount_euros %>
<% if @order.total_amount_cents == 0 %>
Confirmer la commande
<% else %>
Payer <%= @order.total_amount_euros %>€
<% end %>
</div>
`;
alert('Erreur: ' + error.message);