Commit 391629ac authored by Mahmoud Aglan's avatar Mahmoud Aglan

Dashboard: show unique players vs enrollment count in activity breakdown

Explains why total enrollments (211) > activity participants (199):
one player can have multiple enrollments in the same sport.
Now shows "199 لاعب · 211 تسجيل" per activity for clarity.
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent c734f883
...@@ -122,8 +122,6 @@ private function getSubscriptionRevenue($from, $to, $academyId): int ...@@ -122,8 +122,6 @@ private function getSubscriptionRevenue($from, $to, $academyId): int
*/ */
private function getRevenueByActivity($from, $academyId) private function getRevenueByActivity($from, $academyId)
{ {
// Get per-payment subscription amounts with participant info
// Then group by the participant's enrolled activity
return DB::select(" return DB::select("
WITH payment_sub_revenue AS ( WITH payment_sub_revenue AS (
SELECT SELECT
...@@ -155,18 +153,33 @@ private function getRevenueByActivity($from, $academyId) ...@@ -155,18 +153,33 @@ private function getRevenueByActivity($from, $academyId)
JOIN activities a ON tp.activity_id = a.id JOIN activities a ON tp.activity_id = a.id
WHERE e.status IN ('active', 'completed') WHERE e.status IN ('active', 'completed')
ORDER BY e.participant_id, e.created_at DESC ORDER BY e.participant_id, e.created_at DESC
),
enrollment_counts AS (
SELECT
a.id as activity_id,
COUNT(*) as enrollment_count,
COUNT(DISTINCT e.participant_id) as unique_participants
FROM enrollments e
JOIN training_programs tp ON e.training_program_id = tp.id
JOIN activities a ON tp.activity_id = a.id
WHERE e.status IN ('active', 'completed')
AND e.created_at >= ?
" . ($academyId ? "AND e.academy_id = {$academyId}" : "") . "
GROUP BY a.id
) )
SELECT SELECT
pa.activity_id, pa.activity_id,
pa.activity_name, pa.activity_name,
pa.category, pa.category,
SUM(psr.sub_revenue) as total, SUM(psr.sub_revenue) as total,
COUNT(DISTINCT psr.participant_id) as subscriber_count COALESCE(ec.unique_participants, 0) as unique_participants,
COALESCE(ec.enrollment_count, 0) as enrollment_count
FROM payment_sub_revenue psr FROM payment_sub_revenue psr
JOIN participant_activity pa ON pa.participant_id = psr.participant_id JOIN participant_activity pa ON pa.participant_id = psr.participant_id
GROUP BY pa.activity_id, pa.activity_name, pa.category LEFT JOIN enrollment_counts ec ON ec.activity_id = pa.activity_id
GROUP BY pa.activity_id, pa.activity_name, pa.category, ec.unique_participants, ec.enrollment_count
ORDER BY total DESC ORDER BY total DESC
", [$from]); ", [$from, $from]);
} }
/** /**
......
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="w-2.5 h-2.5 rounded-full {{ match($loop->index % 6) { 0 => 'bg-emerald-500', 1 => 'bg-blue-500', 2 => 'bg-purple-500', 3 => 'bg-amber-500', 4 => 'bg-pink-500', 5 => 'bg-cyan-500', default => 'bg-gray-500' } }}"></span> <span class="w-2.5 h-2.5 rounded-full {{ match($loop->index % 6) { 0 => 'bg-emerald-500', 1 => 'bg-blue-500', 2 => 'bg-purple-500', 3 => 'bg-amber-500', 4 => 'bg-pink-500', 5 => 'bg-cyan-500', default => 'bg-gray-500' } }}"></span>
<span class="text-sm font-medium text-gray-700">{{ $activity->activity_name }}</span> <span class="text-sm font-medium text-gray-700">{{ $activity->activity_name }}</span>
<span class="text-xs text-gray-400">({{ $activity->subscriber_count }} {{ __('مشترك نشط') }})</span> <span class="text-xs text-gray-400">({{ $activity->unique_participants }} {{ __('لاعب') }} · {{ $activity->enrollment_count }} {{ __('تسجيل') }})</span>
</div> </div>
<span class="text-sm font-bold text-gray-800" dir="ltr">{{ number_format($activity->total / 100, 0) }} {{ __('ج.م') }}</span> <span class="text-sm font-bold text-gray-800" dir="ltr">{{ number_format($activity->total / 100, 0) }} {{ __('ج.م') }}</span>
</div> </div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment