Files
bogazici-api/prompts/admin-leads.md
2026-03-27 10:41:54 +03:00

247 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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ıı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