import React from 'react'; import { db } from '@/lib/db'; 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'; import TransactionChart from '@/components/admin/TransactionChart'; import QueryRangeSelector from '@/components/admin/QueryRangeSelector'; import PlatformTreasuryWidget from '@/components/admin/PlatformTreasuryWidget'; async function getStats(rangeDays: number = 30) { const result = await db.query('SELECT * FROM transactions ORDER BY created_at DESC'); const transactions = result.rows; if (!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; // Dynamic chart data based on range const chartData = Array.from({ length: rangeDays }, (_, i) => { const d = new Date(); d.setHours(0, 0, 0, 0); d.setDate(d.getDate() - (rangeDays - 1 - 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 = chartData.find(d => d.date === dateStr); if (dayMatch) { dayMatch.amount += Number(t.amount); } }); return { transactions, totalRevenue, successfulCount, pendingCount, successRate, totalCount, uniqueCustomers, chartData }; } export default async function AdminDashboard(props: { searchParams: Promise<{ range?: string }>; }) { const searchParams = await props.searchParams; const range = searchParams.range ? parseInt(searchParams.range) : 30; const stats = await getStats(range); 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
{/* Successful Transactions */}

İşlem Sayısı

{stats.successfulCount}

Tamamlanan Ödeme

{/* Conversion Rate */}

Başarı Oranı

%{stats.successRate.toFixed(1)}

{stats.totalCount} Toplam İstek

{/* Unique Customers */}

Tekil Müşteri

{stats.uniqueCustomers}

Farklı Ödeme Kaynağı

{/* Platform Treasury Status - High Visibility */} {/* Middle Section: Charts */}

İşlem Hacmi

Son {range} günlük toplam hacim

{range} günlük veri gösteriliyor

{/* 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() || 'EXTERNAL'} {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'}
); }