import React from 'react'; import { supabaseAdmin } from '@/lib/supabase'; import { TrendingUp, TrendingDown, Users, Wallet, ClipboardList, CheckCircle2, } from 'lucide-react'; import { format } from 'date-fns'; import { tr } from 'date-fns/locale'; import Link from 'next/link'; async function getStats() { const { data: transactions, error } = await supabaseAdmin .from('transactions') .select('*') .order('created_at', { ascending: false }); if (error || !transactions) return null; const successfulTransactions = transactions.filter(t => t.status === 'succeeded'); const totalRevenue = successfulTransactions.reduce((acc, t) => acc + Number(t.amount), 0); const successfulCount = successfulTransactions.length; const pendingCount = transactions.filter(t => t.status === 'pending').length; const totalCount = transactions.length; const successRate = totalCount > 0 ? (successfulCount / totalCount) * 100 : 0; // Calculate unique customers const uniqueCustomers = new Set( transactions .filter(t => t.customer_name || t.customer_phone) .map(t => t.customer_name || t.customer_phone) ).size; // Last 30 days chart data const last30Days = Array.from({ length: 30 }, (_, i) => { const d = new Date(); d.setHours(0, 0, 0, 0); d.setDate(d.getDate() - (29 - i)); return { date: d.toISOString().split('T')[0], displayDate: format(d, 'd MMM', { locale: tr }), amount: 0 }; }); successfulTransactions.forEach(t => { const dateStr = new Date(t.created_at).toISOString().split('T')[0]; const dayMatch = last30Days.find(d => d.date === dateStr); if (dayMatch) { dayMatch.amount += Number(t.amount); } }); return { transactions, totalRevenue, successfulCount, pendingCount, successRate, totalCount, uniqueCustomers, chartData: last30Days }; } export default async function AdminDashboard() { const stats = await getStats(); if (!stats) { return
Henüz bir işlem verisi bulunamadı.
; } const recentTransactions = stats.transactions.slice(0, 5); return (
{/* Top Stats Cards */}
{/* Total Revenue */}

Toplam Ciro

{stats.totalRevenue.toLocaleString('tr-TR', { minimumFractionDigits: 2 })} ₺

Sistem Aktif gerçek zamanlı veri
{/* Total Customers */}

Toplam Müşteri

{stats.uniqueCustomers.toLocaleString('tr-TR')}

{stats.totalCount} toplam işlem kaydı
{/* Pending Payments */}

Bekleyen Ödemeler

{stats.pendingCount}

İşlem Bekliyor onay aşamasında
{/* Success Rate */}

Başarı Oranı

{stats.successRate.toFixed(1)}%

Optimized ödeme dönüşüm oranı
{/* Middle Section: Charts */}
{/* Transaction Volume Line Chart */}

İşlem Hacmi

Son 30 günlük toplam hacim

{/* Dynamic SVG Chart */} {(() => { const maxAmount = Math.max(...stats.chartData.map(d => d.amount), 100); const points = stats.chartData.map((d, i) => ({ x: (i / 29) * 100, // 0 to 100% y: 100 - (d.amount / maxAmount) * 80 - 10 // 10 to 90% (lower y is higher value) })); const dLine = points.reduce((acc, p, i) => i === 0 ? `M 0 ${p.y}` : `${acc} L ${p.x} ${p.y}`, '' ); const dArea = `${dLine} L 100 100 L 0 100 Z`; return ( ); })()}
{stats.chartData[0].displayDate} {stats.chartData[10].displayDate} {stats.chartData[20].displayDate} Bugün
{/* Revenue by Source Donut Chart */}

Kaynak Bazlı Ciro

{stats.totalRevenue.toLocaleString('tr-TR', { maximumFractionDigits: 0 })} ₺

Toplam Ciro

Kart (60%)
Havale (20%)
Cüzdan (15%)
Diğer (5%)
{/* Bottom Section: Recent Transactions Table */}

Son İşlemler

Tümünü Gör
{recentTransactions.map((t) => ( ))}
İşlem ID Müşteri / Ref Tarih Tutar Durum
#{t.stripe_pi_id.slice(-8).toUpperCase()} {t.id.slice(0, 8)}
{t.customer_name ? t.customer_name.slice(0, 2).toUpperCase() : (t.source_ref_id ? t.source_ref_id.slice(0, 2).toUpperCase() : 'PI')}
{t.customer_name || t.source_ref_id || 'Sistem Ödemesi'} {t.customer_phone || t.callback_url || 'doğrudan-ödeme'}
{format(new Date(t.created_at), 'dd MMM yyyy', { locale: tr })} {Number(t.amount).toLocaleString('tr-TR', { minimumFractionDigits: 2 })} ₺
{t.status === 'succeeded' ? 'Başarılı' : t.status === 'failed' ? 'Hatalı' : 'Bekliyor'}
); }