247 lines
11 KiB
Markdown
247 lines
11 KiB
Markdown
# Admin Panel — Leads (Başvuru Yönetimi) Modülü
|
||
|
||
## Genel Bakış
|
||
|
||
Web sitesindeki formlardan gelen tüm başvurular `leads` tablosuna yazılır. Admin panelden başvurular listelenir, detay görüntülenir, durum güncellenir ve not eklenir. **Lead'ler sadece API'den oluşur — admin panelde "Yeni Oluştur" butonu olmayacak.**
|
||
|
||
---
|
||
|
||
## API Endpoints (Admin — auth:sanctum)
|
||
|
||
| Method | Endpoint | Açıklama |
|
||
|--------|----------|----------|
|
||
| `GET` | `/admin/leads` | Başvuruları listele (paginated, filtrelenebilir) |
|
||
| `GET` | `/admin/leads/{id}` | Başvuru detayı (otomatik okundu işaretler) |
|
||
| `PUT` | `/admin/leads/{id}` | Durum/not güncelle |
|
||
| `DELETE` | `/admin/leads/{id}` | Başvuru sil (soft delete) |
|
||
|
||
---
|
||
|
||
## GET /admin/leads — Liste
|
||
|
||
### Query Parametreleri:
|
||
| Parametre | Tip | Açıklama |
|
||
|-----------|-----|----------|
|
||
| `status` | string | Durum filtresi: `new`, `contacted`, `enrolled`, `cancelled` |
|
||
| `source` | string | Kaynak filtresi: `kurs_kayit`, `danismanlik`, `duyuru`, `iletisim` |
|
||
| `is_read` | boolean | Okundu/okunmadı filtresi |
|
||
| `search` | string | İsim/telefon arama |
|
||
| `per_page` | integer | Sayfa başına (varsayılan: 15) |
|
||
|
||
### Response:
|
||
```json
|
||
{
|
||
"data": [
|
||
{
|
||
"id": 1,
|
||
"name": "Ahmet Yılmaz",
|
||
"phone": "+90 532 724 15 32",
|
||
"email": "ahmet@email.com",
|
||
"source": "kurs_kayit",
|
||
"status": "new",
|
||
"target_course": "gemici-birlesik-egitimi",
|
||
"education_level": "lise",
|
||
"subject": null,
|
||
"message": "Eğitim hakkında bilgi almak istiyorum",
|
||
"is_read": false,
|
||
"kvkk_consent": true,
|
||
"marketing_consent": false,
|
||
"utm_source": "google",
|
||
"utm_medium": "cpc",
|
||
"utm_campaign": "denizcilik-2026",
|
||
"admin_note": null,
|
||
"created_at": "2026-03-24T10:30:00.000000Z",
|
||
"updated_at": "2026-03-24T10:30:00.000000Z"
|
||
}
|
||
],
|
||
"meta": { "current_page": 1, "last_page": 5, "per_page": 15, "total": 72 }
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## GET /admin/leads/{id} — Detay
|
||
|
||
Detay açıldığında backend otomatik olarak `is_read: true` yapar.
|
||
|
||
---
|
||
|
||
## PUT /admin/leads/{id} — Güncelle
|
||
|
||
Admin sadece şu alanları güncelleyebilir:
|
||
|
||
```json
|
||
{
|
||
"status": "contacted",
|
||
"is_read": true,
|
||
"admin_note": "Arandı, bilgi verildi. Nisan dönemine kayıt olacak."
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Veri Modeli
|
||
|
||
### Lead Alanları
|
||
|
||
| Alan | Tip | Açıklama |
|
||
|------|-----|----------|
|
||
| `id` | integer | — |
|
||
| `name` | string | Ad Soyad |
|
||
| `phone` | string | Telefon |
|
||
| `email` | string (nullable) | E-posta |
|
||
| `source` | enum | Başvuru kaynağı (form tipi) |
|
||
| `status` | enum | İşlem durumu |
|
||
| `target_course` | string (nullable) | Hedef eğitim slug'ı |
|
||
| `education_level` | string (nullable) | Eğitim seviyesi |
|
||
| `subject` | string (nullable) | Konu (iletişim formunda) |
|
||
| `message` | text (nullable) | Mesaj |
|
||
| `is_read` | boolean | Admin tarafından okundu mu |
|
||
| `kvkk_consent` | boolean | KVKK onayı |
|
||
| `marketing_consent` | boolean | Pazarlama onayı |
|
||
| `utm_source` | string (nullable) | UTM Source |
|
||
| `utm_medium` | string (nullable) | UTM Medium |
|
||
| `utm_campaign` | string (nullable) | UTM Campaign |
|
||
| `admin_note` | text (nullable) | Admin notu |
|
||
| `created_at` | datetime | Başvuru tarihi |
|
||
|
||
### Source (Kaynak) Değerleri
|
||
|
||
| Değer | Açıklama | Hangi Form? |
|
||
|-------|----------|-------------|
|
||
| `kurs_kayit` | Kurs ön kayıt | Eğitim detay sayfası kayıt formu |
|
||
| `danismanlik` | Danışmanlık | Danışmanlık sayfası formu |
|
||
| `duyuru` | Duyuru | Duyuru sidebar'daki mini form |
|
||
| `iletisim` | İletişim | İletişim sayfası formu |
|
||
| `hero_form` | Hero form | Anasayfa hero bölümü formu |
|
||
| `whatsapp_widget` | WhatsApp | WhatsApp widget üzerinden gelen |
|
||
|
||
### Status (Durum) Değerleri
|
||
|
||
| Değer | Label | Badge Rengi | Açıklama |
|
||
|-------|-------|-------------|----------|
|
||
| `new` | Yeni | `warning` (sarı) | Henüz işlenmemiş |
|
||
| `contacted` | İletişim Kuruldu | `info` (mavi) | Aranmış/e-posta gönderilmiş |
|
||
| `enrolled` | Kayıt Oldu | `success` (yeşil) | Eğitime kaydolmuş |
|
||
| `cancelled` | İptal | `danger` (kırmızı) | Vazgeçmiş/iptal |
|
||
|
||
---
|
||
|
||
## Önerilen Admin Panel Sayfası
|
||
|
||
### Liste Sayfası (`/admin/leads`)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Başvurular [Filtreler ▼] │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ Filtreler: [Kaynak ▼] [Durum ▼] [Okundu ▼] [Ara...] │
|
||
├──────┬──────────────┬──────────────┬────────────┬───────────┤
|
||
│ ● │ Ahmet Yılmaz │ +90 532 ... │ kurs_kayit │ 🟡 Yeni │
|
||
│ ○ │ Mehmet Kaya │ +90 555 ... │ iletisim │ 🔵 İlet. │
|
||
│ ○ │ Ayşe Demir │ +90 212 ... │ danismanlik│ 🟢 Kayıt │
|
||
└──────┴──────────────┴──────────────┴────────────┴───────────┘
|
||
● = okunmadı (bold göster) ○ = okundu
|
||
```
|
||
|
||
#### Tablo Sütunları:
|
||
| Sütun | Açıklama |
|
||
|-------|----------|
|
||
| Okundu göstergesi | `is_read` false ise bold/dot göster |
|
||
| Ad Soyad | `name` |
|
||
| Telefon | `phone` |
|
||
| E-posta | `email` (varsa) |
|
||
| Kaynak | `source` — badge ile göster |
|
||
| Hedef Eğitim | `target_course` (varsa) |
|
||
| Durum | `status` — renkli badge |
|
||
| Tarih | `created_at` — relative (2 saat önce) |
|
||
|
||
#### Kaynak Badge Renkleri:
|
||
| Source | Renk |
|
||
|--------|------|
|
||
| `kurs_kayit` | `primary` (mavi) |
|
||
| `danismanlik` | `purple` |
|
||
| `duyuru` | `orange` |
|
||
| `iletisim` | `teal` |
|
||
| `hero_form` | `indigo` |
|
||
| `whatsapp_widget` | `green` |
|
||
|
||
### Detay/Düzenleme Sayfası (`/admin/leads/{id}`)
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────┐
|
||
│ Başvuru #42 — Ahmet Yılmaz │
|
||
├─────────────────────────────────────────────────┤
|
||
│ Bilgiler │
|
||
│ ┌─────────────────┬───────────────────────────┐ │
|
||
│ │ Ad Soyad │ Ahmet Yılmaz │ │
|
||
│ │ Telefon │ +90 532 724 15 32 │ │
|
||
│ │ E-posta │ ahmet@email.com │ │
|
||
│ │ Kaynak │ 🔵 kurs_kayit │ │
|
||
│ │ Hedef Eğitim │ Gemici (Birleşik) Eğitimi │ │
|
||
│ │ Eğitim Seviyesi │ Lise │ │
|
||
│ │ Mesaj │ Bilgi almak istiyorum │ │
|
||
│ │ KVKK Onay │ ✅ Evet │ │
|
||
│ │ Pazarlama Onay │ ❌ Hayır │ │
|
||
│ │ Tarih │ 24 Mar 2026, 10:30 │ │
|
||
│ └─────────────────┴───────────────────────────┘ │
|
||
│ │
|
||
│ UTM Bilgileri │
|
||
│ ┌─────────────────┬───────────────────────────┐ │
|
||
│ │ utm_source │ google │ │
|
||
│ │ utm_medium │ cpc │ │
|
||
│ │ utm_campaign │ denizcilik-2026 │ │
|
||
│ └─────────────────┴───────────────────────────┘ │
|
||
│ │
|
||
│ İşlem │
|
||
│ ┌───────────────────────────────────────────────┐│
|
||
│ │ Durum: [Yeni ▼] → contacted / enrolled /.. ││
|
||
│ │ ││
|
||
│ │ Admin Notu: ││
|
||
│ │ ┌─────────────────────────────────────────┐ ││
|
||
│ │ │ Arandı, bilgi verildi. Nisan dönemine │ ││
|
||
│ │ │ kayıt olacak. │ ││
|
||
│ │ └─────────────────────────────────────────┘ ││
|
||
│ │ ││
|
||
│ │ [Kaydet] ││
|
||
│ └───────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### Düzenleme Kuralları:
|
||
- Başvuru bilgileri (name, phone, message vb.) **readonly** — sadece görüntüleme
|
||
- Sadece `status`, `is_read` ve `admin_note` düzenlenebilir
|
||
- `target_course` slug ise, linke çevir: `/admin/courses/{slug}/edit`
|
||
- "Yeni Oluştur" butonu **yok** — lead'ler sadece frontend formlarından gelir
|
||
|
||
---
|
||
|
||
## İstatistik Kartları (Dashboard için, opsiyonel)
|
||
|
||
Liste sayfasının üstüne istatistik kartları eklenebilir:
|
||
|
||
```
|
||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||
│ 🟡 Yeni │ │ 🔵 İletişim │ │ 🟢 Kayıt │ │ 📊 Toplam │
|
||
│ 12 │ │ 28 │ │ 45 │ │ 93 │
|
||
│ Bu hafta: 5 │ │ Bu hafta: 8 │ │ Bu ay: 15 │ │ Bu ay: 32 │
|
||
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
|
||
```
|
||
|
||
API'den alınabilir:
|
||
```
|
||
GET /admin/leads?status=new → meta.total
|
||
GET /admin/leads?status=contacted → meta.total
|
||
GET /admin/leads?status=enrolled → meta.total
|
||
GET /admin/leads → meta.total
|
||
```
|
||
|
||
---
|
||
|
||
## Notlar
|
||
|
||
- `is_read` detay sayfası açıldığında otomatik `true` olur (backend tarafından)
|
||
- Soft delete kullanılıyor — silinen lead'ler geri alınabilir
|
||
- UTM verileri backend'de tek JSON sütununda (`utm`) saklanır, API response'da ayrı ayrı döner
|
||
- KVKK ve pazarlama onayları readonly gösterilmeli — admin tarafından değiştirilemez
|