Add per-billet sales stats in stats tab

- Calculate sold count and revenue per billet from paid orders
- Display 'Ventes par billet' card between KPIs and orders list

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-21 20:06:31 +01:00
parent 2364abe0cf
commit 06dcc95a32
2 changed files with 27 additions and 0 deletions

View File

@@ -392,11 +392,20 @@ class AccountController extends AbstractController
$eventTotalHT = 0;
$eventTotalSold = 0;
$billetStats = [];
$paidEventOrders = $em->getRepository(BilletBuyer::class)->findBy(['event' => $event, 'status' => BilletBuyer::STATUS_PAID]);
foreach ($paidEventOrders as $paidOrder) {
$eventTotalHT += $paidOrder->getTotalHT();
foreach ($paidOrder->getItems() as $item) {
$eventTotalSold += $item->getQuantity();
$billetId = $item->getBillet()?->getId();
if ($billetId) {
if (!isset($billetStats[$billetId])) {
$billetStats[$billetId] = ['name' => $item->getBilletName(), 'sold' => 0, 'revenue' => 0];
}
$billetStats[$billetId]['sold'] += $item->getQuantity();
$billetStats[$billetId]['revenue'] += $item->getLineTotalHT();
}
}
}
@@ -412,6 +421,7 @@ class AccountController extends AbstractController
'event_total_ht' => $eventTotalHT / 100,
'event_total_sold' => $eventTotalSold,
'event_total_orders' => \count($paidEventOrders),
'billet_stats' => $billetStats,
'search_query' => $searchQuery,
'breadcrumbs' => [
self::BREADCRUMB_HOME,

View File

@@ -482,6 +482,23 @@
</div>
</div>
{% if billet_stats|length > 0 %}
<div class="card-brutal overflow-hidden mb-6">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Ventes par billet</h2>
</div>
<div class="p-6">
{% for stat in billet_stats %}
<div class="flex flex-wrap items-center gap-4 py-3 {{ not loop.last ? 'border-b border-gray-200' : '' }}">
<span class="font-black uppercase text-sm flex-1">{{ stat.name }}</span>
<span class="text-sm font-bold text-gray-600">{{ stat.sold }} vendu{{ stat.sold > 1 ? 's' : '' }}</span>
<span class="font-black text-sm text-indigo-600">{{ (stat.revenue / 100)|number_format(2, ',', ' ') }} &euro; HT</span>
</div>
{% endfor %}
</div>
</div>
{% endif %}
<div class="card-brutal overflow-hidden">
<div class="section-header flex justify-between items-center">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Commandes</h2>