Show purchase history in /mon-compte achats tab with paid/cancelled/refunded status

- Add STATUS_REFUNDED constant to BilletBuyer
- Filter out pending orders, show only paid/cancelled/refunded
- Display: order number, status badge, date, event info, items breakdown,
  total, payment method, link to order page

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-21 17:03:09 +01:00
parent 85c2b1baa5
commit c6fd76da28
2 changed files with 50 additions and 2 deletions

View File

@@ -13,6 +13,7 @@ class BilletBuyer
public const STATUS_PENDING = 'pending';
public const STATUS_PAID = 'paid';
public const STATUS_CANCELLED = 'cancelled';
public const STATUS_REFUNDED = 'refunded';
#[ORM\Id]
#[ORM\GeneratedValue]

View File

@@ -148,14 +148,61 @@
{% endif %}
</div>
{% elseif tab == 'purchases' %}
<div class="card-brutal">
{% elseif tab == 'purchases' %}
<div class="card-brutal overflow-hidden">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Mes achats</h2>
</div>
{% set filtered_orders = orders|filter(o => o.status != 'pending') %}
{% if filtered_orders|length > 0 %}
<div class="p-6">
{% for order in filtered_orders %}
<div class="border-2 border-gray-900 bg-white mb-4 p-4">
<div class="flex flex-wrap items-center gap-3 mb-3">
<span class="font-black uppercase text-sm">{{ order.orderNumber }}</span>
{% if order.status == 'paid' %}
<span class="badge-green text-[10px] font-black uppercase">Payee</span>
{% elseif order.status == 'refunded' %}
<span class="badge-yellow text-[10px] font-black uppercase">Remboursee</span>
{% elseif order.status == 'cancelled' %}
<span class="badge-red text-[10px] font-black uppercase">Annulee</span>
{% endif %}
<span class="text-xs font-bold text-gray-400">{{ order.createdAt|date('d/m/Y H:i') }}</span>
</div>
<div class="space-y-1 text-sm font-bold text-gray-600 mb-3">
<p class="font-black text-gray-900">{{ order.event.title }}</p>
<p>{{ order.event.startAt|date('d/m/Y') }}{{ order.event.startAt|date('H:i') }} a {{ order.event.endAt|date('H:i') }}</p>
<p>{{ order.event.address }}, {{ order.event.zipcode }} {{ order.event.city }}</p>
</div>
<div class="flex flex-wrap items-center gap-4 mb-3">
{% for item in order.items %}
<div class="text-xs font-bold text-gray-500">
{{ item.billetName }} x{{ item.quantity }}{{ item.lineTotalHTDecimal|number_format(2, ',', ' ') }} &euro;
</div>
{% endfor %}
</div>
<div class="flex flex-wrap items-center justify-between gap-3">
<div class="flex flex-wrap gap-3 text-xs font-bold text-gray-400">
<span>Total: <span class="font-black text-indigo-600">{{ order.totalHTDecimal|number_format(2, ',', ' ') }} &euro;</span></span>
{% if order.paymentMethod %}
<span>{{ order.paymentMethod }}{% if order.cardBrand and order.cardLast4 %}{{ order.cardBrand|upper }} **** {{ order.cardLast4 }}{% endif %}</span>
{% endif %}
</div>
<a href="{{ path('app_order_public', {orderNumber: order.orderNumber, token: order.accessToken}) }}" class="px-3 py-2 border-2 border-gray-900 bg-white text-xs font-black uppercase hover:bg-indigo-600 hover:text-white transition-all">
Voir la commande
</a>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun achat pour le moment.</p>
</div>
{% endif %}
</div>
{% elseif tab == 'invoices' %}