Toplu İşlemler ve Dışa Aktarım
500 kişilik bir listede ısı durumunu tek tek değiştirmek saatler alır. Purvisor’da seçtiğin kontakları tek istekte güncelleyebilir, listeden kaldırabilir ya da tüm kontak tabanını CSV olarak indirip Excel’de, CRM’de veya yedek olarak kullanabilirsin. Bu sayfa üç işlemi de kod düzeyinde — hangi alan, hangi sınır, hangi hata mesajı — anlatır.
İçeri aktarma (CSV yükleme) bu sayfanın konusu değil; onun için bkz. Kontak Listeleri ve CSV İçe Aktarma.
Toplu güncelleme
Kontaklar listesinde birden çok kişi seçip aşağıdaki alanları tek seferde değiştirebilirsin (PATCH /api/contacts/bulk):
| Alan | Kabul edilen değerler | Not |
|---|---|---|
contactStatus | hot, warm, cold, inactive | Genel kontak durumu. |
status | new, contacted, qualified, proposal, negotiation, closed | Satış pipeline aşaması. |
universalStage | serbest metin | Pipeline’daki özel aşama etiketi. |
heat | hot, warm, cold | Isı göstergesi. |
priority | 0-10 arası tamsayı | Öncelik puanı. |
contactStatus ile heat aynı ısı skalasını (hot / warm / cold) kullanır; contactStatus ayrıca inactive değerini de destekler. İkisi ayrı alanlardır — birini değiştirmek diğerini otomatik güncellemez.
Kişileri seç
Kontaklar listesinde değiştirmek istediğin kişilerin yanındaki kutucukları işaretle.
Toplu işlem menüsünden alan(lar)ı seç
Açılan toplu işlem panelinden değiştirmek istediğin alan(lar)ı ve yeni değer(ler)i seç. En az bir alan seçmen gerekir — boş bir istek “En az bir güncelleme alanı gerekli” hatasıyla reddedilir.
Uygula
Onayladığında istek gönderilir; kaç kaydın güncellendiği ekranda döner ("X contacts updated successfully").
📸 [Ekran görüntüsü: Kontaklar listesi — çoklu seçim + toplu işlem paneli]
Sınırlar:
- Tek istekte en fazla 100 ID gönderilebilir (
idsdizisi min 1, max 100) — daha fazlası “Çok fazla ID” hatası döner. - Yalnızca kendi hesabına ait ve silinmemiş (
deletedAt: null) kayıtlar güncellenir; başka kullanıcıya ait veya zaten arşivlenmiş bir ID listeye karışsa bile sessizce atlanır (hata vermez, sadece güncellenen sayıya dahil olmaz). - Etiket eklemek/kaldırmak veya itiraz/aktivite kaydı işlemek ayrı bir akıştır — bkz. İtiraz, Aktivite ve Etiket.
Toplu silme
Seçili kişileri listeden kaldırmak DELETE /api/contacts/bulk ile çalışır ve bir yumuşak silmedir: kayıt gerçekten silinmez, deletedAt alanına silinme zamanı yazılır. Kişi listede ve raporlarda artık görünmez ama arama geçmişi veritabanında durur.
Toplu silme, tek tek silmenin aynısıdır — sadece çok sayıda ID’yi aynı anda işler. Kalıcı (geri döndürülemez) silme ayrı bir akıştır ve KVKK “unutulma hakkı” talepleri için kullanılır — bkz. KVKK ve Veri Yönetimi.
- İstek gövdesinde
idsdizisi zorunludur; boş veya dizi olmayan bir gövde “ids array is required” hatasıyla reddedilir. - Güncelleme uç noktasının aksine, silme isteğinde şema düzeyinde bir üst sınır (örn. 100) uygulanmaz — yine de aynı anda çok büyük seçimler yapmak yerine listeyi filtreleyip parçalar halinde silmen önerilir.
- Sadece kendi hesabına ait ve henüz silinmemiş kayıtlar etkilenir (aynı
userId+deletedAt: nullkısıtı).
CSV dışa aktarma
GET /api/contacts/export tüm aktif (silinmemiş) kontaklarını, oluşturulma tarihine göre en yeniden eskiye sıralı bir CSV dosyası olarak indirir. Dosya adı potansiyel-musteriler-YYYY-AA-GG.csv biçimindedir ve tarayıcı otomatik indirir.
| CSV sütunu | Kaynak alan / mantık |
|---|---|
| Ad, Soyad | firstName, lastName |
| Telefon | phoneNumber |
| E-posta | email |
| Şirket, Ünvan | company, title |
| Durum | contactStatus varsa o, yoksa status |
| Kaynak | leadSource varsa o; yoksa bağlı kampanyanın adı; ikisi de yoksa "Manuel" |
| Etiketler | Kontağa atanmış etiket adları, ; ile birleştirilmiş |
| Arama Sayısı / Başarılı Arama / Başarısız Arama | callAttempts, successfulCalls, failedCalls (boşsa 0) |
| AI Duygu | aiSentiment — çağrı sonrası analiz çıktısı, bkz. Çağrı Sonrası Analiz |
| Dönüşüm Olasılığı | conversionProbability (sayısal) |
| Son Arama | lastCallAttemptAt, TR tarih biçimi |
| Notlar | notes |
| Oluşturulma Tarihi | createdAt, TR tarih biçimi |
Dosya UTF-8 BOM ile başlar; bu sayede Excel Türkçe karakterleri (ş, ğ, ı, ö, ü, ç) bozmadan açar. Ayrıca her hücre bir CSV formula-injection korumasından geçer: bir hücre =, +, - veya @ ile başlıyorsa (örn. bir CRM’den veya Meta lead formundan gelen bozuk/kötü niyetli bir alan), başına tek tırnak eklenir — böylece Excel/Sheets o hücreyi bir formül gibi çalıştırmaz.
Silinmiş (arşivlenmiş) kontaklar dışa aktarıma dahil edilmez — export sorgusu da deletedAt: null filtresi kullanır.
Çok kiracılı izolasyon ve KVKK
Toplu güncelleme, toplu silme ve CSV dışa aktarma sorgularının üçü de userId’yi zorunlu bir filtre olarak kullanır. Bu, bir kullanıcının başka bir Purvisor hesabının kontaklarını asla görmediği, güncelleyemediği veya dışa aktaramadığı anlamına gelir — kiracılar (tenant’lar) arasında veri sızıntısı olmaz. Purvisor’da daha önce kontak geçmişi tarafında benzer bir çok-kiracılı izolasyon açığı tespit edilip kapatılmıştı; toplu işlem ve dışa aktarma uç noktaları tasarım gereği baştan bu izolasyonla yazıldı.
- CSV dışa aktardığın an, o dosya artık senin sorumluluğundadır — telefon numarası, e-posta gibi kişisel veriler içerir. Dosyayı gereksiz yere paylaşma, İYS/KVKK yükümlülüklerine göre sakla ve gerektiğinde sil.
- Bir kişi “beni arama” derse ya da veri silme talep ederse, toplu silme (yumuşak) yeterli değildir — kalıcı silme akışını kullan: KVKK ve Veri Yönetimi.
Sorun giderme
| Belirti | Olası neden / çözüm |
|---|---|
| ”Çok fazla ID” hatası | Toplu güncellemede 100’den fazla kişi seçtin → seçimi böl. |
| ”En az bir güncelleme alanı gerekli” | Toplu işlem panelinde hiçbir alan/değer seçilmedi → en az bir alan seç. |
| ”ids array is required” | Toplu silme isteği boş/bozuk gönderildi → sayfayı yenileyip seçimi tekrar yap. |
| Güncellenen sayı beklenenden az | Seçtiğin bazı ID’ler zaten silinmiş ya da başka hesaba ait → bu kayıtlar sessizce atlanır, hata görünmez. |
| CSV’de Türkçe karakterler bozuk | Dosyayı açan program BOM’u yok sayıyor → dosyayı doğrudan Excel ile aç veya “CSV UTF-8” olarak içe aktar. |
| Dışa aktarılan dosyada bazı kişiler eksik | Silinmiş (arşivlenmiş) kontaklar exporta dahil edilmez → bu beklenen davranıştır. |