diff --git a/app/admin/analytics/page.tsx b/app/admin/analytics/page.tsx index 4321327..126bcad 100644 --- a/app/admin/analytics/page.tsx +++ b/app/admin/analytics/page.tsx @@ -9,11 +9,13 @@ import { Smartphone, Calendar } from 'lucide-react'; -import { supabaseAdmin } from '@/lib/supabase'; +import { supabaseAdmin } from '@/lib/supabase-admin'; import { format, subDays } from 'date-fns'; import { tr } from 'date-fns/locale'; +import AnalyticsBarChart from '@/components/admin/AnalyticsBarChart'; +import QueryRangeSelector from '@/components/admin/QueryRangeSelector'; -async function getAnalyticsData() { +async function getAnalyticsData(rangeDays: number = 12) { const { data: transactions, error } = await supabaseAdmin .from('transactions') .select('*') @@ -25,10 +27,9 @@ async function getAnalyticsData() { const totalRevenue = successfulTransactions.reduce((acc, t) => acc + Number(t.amount), 0); const avgOrderValue = successfulTransactions.length > 0 ? totalRevenue / successfulTransactions.length : 0; - // Monthly data for chart (grouped by month or last 12 periods) - // To keep it simple and meaningful, let's show last 12 days for "Gelir Trendi" - const last12Periods = Array.from({ length: 12 }, (_, i) => { - const d = subDays(new Date(), 11 - i); + // Monthly data for chart (grouped by month or last N periods) + const lastPeriods = Array.from({ length: rangeDays }, (_, i) => { + const d = subDays(new Date(), (rangeDays - 1) - i); return { date: d.toISOString().split('T')[0], label: format(d, 'd MMM', { locale: tr }), @@ -38,7 +39,7 @@ async function getAnalyticsData() { successfulTransactions.forEach(t => { const dateStr = new Date(t.created_at).toISOString().split('T')[0]; - const periodMatch = last12Periods.find(p => p.date === dateStr); + const periodMatch = lastPeriods.find(p => p.date === dateStr); if (periodMatch) { periodMatch.amount += Number(t.amount); } @@ -47,14 +48,18 @@ async function getAnalyticsData() { return { totalRevenue, avgOrderValue, - chartData: last12Periods, + chartData: lastPeriods, totalCount: transactions.length, successCount: successfulTransactions.length, }; } -export default async function AnalyticsPage() { - const data = await getAnalyticsData(); +export default async function AnalyticsPage(props: { + searchParams: Promise<{ range?: string }>; +}) { + const searchParams = await props.searchParams; + const range = searchParams.range ? parseInt(searchParams.range) : 12; + const data = await getAnalyticsData(range); if (!data) return
Sistem performans verileri
Müşteri portföyünüzü yönetin
{customers.length.toLocaleString('tr-TR')}
-Toplam Müşteri
+Sorgulanan Müşteri
Gerçek
-Canlı Veri
+%{((customers.filter(c => c.status === 'High Value' || c.status === 'Active').length / (customers.length || 1)) * 100).toFixed(0)}
+Bağlılık Oranı
{customers.filter(c => c.phone !== 'Telefon Yok').length}
-Telefon Kayıtlı
+İletişim Bilgili
Müşteri bulunamadı
+P2CGateway Entegrasyon Rehberi
++ P2CGateway'i projenize entegre etmek için sadece bir URL oluşturmanız yeterlidir. + Karmaşık SDK'lar veya kütüphanelerle uğraşmanıza gerek yok. +
++ Müşterinizi ödeme yapması için aşağıdaki URL yapısını kullanarak P2CGateway checkout sayfasına yönlendirin. +
+ +
+ {checkoutUrlCode}
+
+
+ + Ödeme tamamlandığında sistemimiz otomatik olarak firmanıza tanımlı olan Webhook URL'ine bir POST isteği gönderir. +
+ +
+ {`{
+ "status": "succeeded",
+ "transaction_id": "tx_821...",
+ "ref_id": "ORDER-123",
+ "amount": 100.00,
+ "currency": "TRY",
+ "customer": {
+ "name": "Ahmet Yılmaz",
+ "phone": "555..."
+ }
+}`}
+
+ + Webhook isteklerinin P2CGateway'den geldiğini doğrulamak için API Key'inizi HTTP başlığında (X-P2C-Signature) kontrol etmelisiniz. +
+Yönetim Paneli
+Merkezi Yönetim Paneli
Yönlendiriliyorsunuz...
+Sisteme yeni bir işletme entegre edin
+Firma ismi sisteme özel bir ID ile kaydedilir.
+Kayıt sonrası hemen ödeme linki oluşturulur.
+Tüm işlemler 256-bit SSL ile korunur.
++ Visa, Mastercard, Troy ve tüm yerel banka kartları ile ödeme alabilirsiniz. +
+Ödeme alan tüm işletmeler
+Bu linki tutar ve referans ekleyerek değiştirebilirsiniz.
+Henüz firma bulunmuyor
+İlk firmanızı ekleyerek ödeme almaya başlayın.
+Firma bilgilerini güncelle
+Toplam Müşteri
-Bekleyen Ödemeler
-Başarı Oranı
+İşlem Sayısı
Tamamlanan Ödeme
+Başarı Oranı
+{stats.totalCount} Toplam İstek
+Tekil Müşteri
+Farklı Ödeme Kaynağı
+Son 30 günlük toplam hacim
-Son {range} günlük toplam hacim
+ {range} günlük veri gösteriliyor +
{stats.totalRevenue.toLocaleString('tr-TR', { maximumFractionDigits: 0 })} ₺
-Toplam Ciro
-