> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flextell.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Toplu işlemler

> Toplu işlem endpoint'lerinde kimlik listesi ile select_all seçimi, bulk-count, kuyruğa alınan {queued, count} yanıtı, sonuçların bildirimle raporlanması ve hatalar.

Birçok liste için tek istekle birden fazla kayıt üzerinde işlem yapabilirsiniz: arşivleme, silme, aşama değiştirme, atama gibi. Seçimi iki yoldan verirsiniz: kayıt kimliklerini tek tek listelersiniz ya da `select_all` ile listenin tamamını seçersiniz. Bu sayfa iki yolu, işlem sayısını önceden öğrenmeyi ve sonucun nasıl raporlandığını anlatır.

## Seçimi belirtmek

Gövde iki biçimden birini taşır. İkisini aynı istekte karıştırmayın.

| Biçim | Gövde | Sınır | Çalışma |
| - | - | - | - |
| Kimlik listesi | Endpoint'in kimlik alanı: `ids`, `lead_ids`, `file_ids`, `ticket_ids`, `product_ids` veya `transaction_ids` | Genellikle 1–100 benzersiz kimlik | İstek içinde çalışır; her kayıt için ayrı sonuç döner. |
| Tümünü seç | `select_all: true`, `filters`, isteğe bağlı `except_ids` | Kayıt sayısı sınırı yok; `except_ids` en çok 1000 | Arka planda çalışır; yanıt `{queued, count}` döner. |

`select_all` ile kimlik alanını birlikte göndermek 422 döner. Gönderilmeyen kimlik alanı, `select_all` yoksa zorunludur.

| Alan | Açıklama |
| - | - |
| `select_all` | `true` ise seçim, ilgili liste endpoint'inin `filters` ile döndürdüğü tüm kayıtlardır. |
| `filters` | Liste endpoint'inin kendi sorgu parametreleri, aynı adlar ve değerlerle (örneğin destek talepleri için `{"status": "open"}`). Sayfalama ve sıralama parametreleri yok sayılır. Yalnızca `select_all` ile gönderilir. |
| `except_ids` | Seçimden çıkarılacak kimlikler; en çok 1000. Yalnızca `select_all` ile gönderilir. |

`filters` içindeki değerler, liste endpoint'inin kendi doğrulamasından geçer. Liste endpoint'inin reddedeceği bir filtre burada da reddedilir ve hata `filters.<alan>` anahtarıyla gelir. Kayıt değiştiren bir istekte liste filtresini `filters` dışında, gövdenin üst düzeyinde göndermek de 422 döner; aksi halde filtre sessizce yok sayılır ve seçim listenin tamamına genişlerdi.

Sınırlar endpoint'e göre değişir:

* Lead'lerde `POST /v1/leads/bulk-stage` ve `POST /v1/leads/bulk-assign` `lead_ids` için üst sınır koymaz. 200'den fazla Lead kuyruğa alınır. `POST /v1/leads/bulk-delete` ise 100 kimlik sınırını korur.
* Faturaların toplu indirilmesinde en çok 200 fatura seçilir.
* Hesap hareketlerinin toplu silinmesinde kimlik alanı `transaction_ids`'tir. Hesabın tüm hareketlerini silmek için `all: true` da gönderebilirsiniz; bu, filtreleri yok sayar ve `select_all` ile birlikte kullanılamaz.

## Desteklenen kaynaklar

| Kaynak | İşlem endpoint'leri | Kimlik alanı | Sayım endpoint'i |
| - | - | - | - |
| [Sohbetler](https://docs.flextell.ai/api/kaynaklar/sohbetler.md) | `POST /v1/conversations/bulk/archive`, `bulk/unarchive`, `bulk/delete`, `bulk/read`, `bulk/unread` | `ids` | `POST /v1/conversations/bulk/count` |
| [Lead'ler](https://docs.flextell.ai/api/kaynaklar/leadler.md) | `POST /v1/leads/bulk-delete`, `bulk-stage`, `bulk-assign` | `lead_ids` | `POST /v1/leads/bulk-count` |
| [Randevu hatırlatmaları](https://docs.flextell.ai/api/kaynaklar/randevu-hatirlatmalari.md) | `POST /v1/appointment-reminders/bulk/approve`, `bulk/reject`, `bulk/retry`, `bulk/send`, `bulk/delete` | `ids` | `POST /v1/appointment-reminders/bulk/count` |
| [Dosyalar](https://docs.flextell.ai/api/kaynaklar/dosyalar.md) | `POST /v1/files/bulk-delete` | `file_ids` | `POST /v1/files/bulk-count` |
| [Destek talepleri](https://docs.flextell.ai/api/kaynaklar/destek-talepleri.md) | `POST /v1/tickets/bulk-delete` | `ticket_ids` | `POST /v1/tickets/bulk-count` |
| [Ürünler](https://docs.flextell.ai/api/kaynaklar/urunler.md) | `POST /v1/products/bulk-status` | `product_ids` | `POST /v1/products/bulk-count` |
| [Faturalar](https://docs.flextell.ai/api/kaynaklar/faturalar.md) | `POST /v1/invoices/query-status`, `POST /v1/invoices/download` | `ids` | `POST /v1/invoices/bulk-count` |
| [Engellenen kullanıcılar](https://docs.flextell.ai/api/kaynaklar/engellenen-kullanicilar.md) | `POST /v1/channel-blacklists/bulk-unblock` | `ids` | `POST /v1/channel-blacklists/bulk-count` |
| [Hesaplar ve işlemler](https://docs.flextell.ai/api/kaynaklar/hesaplar-ve-islemler.md) | `POST /v1/bank-accounts/{accountId}/transactions/bulk-delete` | `transaction_ids` | `POST /v1/bank-accounts/{accountId}/transactions/bulk-count` |

Sayım endpoint'leri `:read` scope'u, işlem endpoint'leri `:write` scope'u ister (örneğin `conversations:read` ve `conversations:write`). Faturaların toplu indirilmesi `invoices:read` ister. Hesap hareketleri uçları ek olarak `bank_accounts:*` ile `account_transactions:*` scope'larını birlikte arar. Kaynağın kendi kullanıcı izni de aranır; her endpoint'in izni ilgili kaynak sayfasındadır.

Bu tabloda olmayan toplu silmeler (hasta ve Lead notları, kimlikler, hasta ve satış işlemleri, meslekler) yalnızca kimlik listesi alır. Bunların sonuç biçimi [Yanıt yapısı](https://docs.flextell.ai/api/istekler/yanit-yapisi.md#toplu-işlem-sonucu) sayfasındadır.

## İşlem sayısını önceden öğrenmek

Onay ekranında "1.238 kayıt değişecek" gibi bir sayı göstermek için işlemden önce sayım endpoint'ini aynı seçimle çağırın. Gövde işlem endpoint'iyle aynıdır; işleme özgü alanları (hedef aşama, `is_active` gibi) göndermeniz gerekmez.

```json theme={null}
{
  "success": true,
  "data": { "count": 1238 }
}
```

Sayı, seçimin şu an kapsadığı kayıt sayısıdır.

## Kuyruğa alınan yanıt

`select_all` istekleri kayıtları isteğin içinde işlemez. Sunucu seçimi doğrular, kapsadığı kayıtları sayar ve işi arka plana bırakır:

```json theme={null}
{
  "success": true,
  "data": { "queued": true, "count": 1238 }
}
```

| Alan | Açıklama |
| - | - |
| `queued` | İş kuyruğa alındıysa `true`. Seçim hiçbir kayıt içermiyorsa `false` gelir ve iş başlatılmaz. |
| `count` | İşin kapsadığı kayıt sayısı. |

Yanıtın HTTP durumu **200**'dür. Kimlik listesiyle yapılan Lead aşama ve atama işlemlerinde yanıt biçimi farklıdır:

* `bulk-stage`: 200 Lead'e kadar istek içinde taşınır ve `{queued: false, moved_count}` döner. Daha fazlası kuyruğa alınır ve `{queued: true, lead_count}` döner.
* `bulk-assign`: 200 Lead'e kadar istek içinde atanır. Yanıt, belirli bir temsilcide `assigned_count` ve `cap_exceeded_count`, otomatik dağıtımda `assigned_count` ve `skipped_count` taşır. Daha fazlası `{queued: true, lead_count}` ile kuyruğa alınır.

> [!WARNING]
>
> Faturaların toplu indirilmesi kuyruğa alınan yanıtı kullanmaz. `select_all` ile gönderilen seçim, aynı faturaların `ids` ile gönderilmesi gibi indirilir: Excel hemen iner, PDF ve birleştirilmiş PDF 20 faturaya kadar hemen iner, daha fazlası `202` ile kuyruğa alınır ve imzalı bağlantı bildirimle gelir. Seçim 200 faturayı aşarsa `422 BULK_SELECTION_TOO_LARGE` döner; `data.max` sınırı verir.

## Sonuçların raporlanması

Kuyruğa alınan iş bitince isteği yapan kullanıcıya tek bir bildirim gelir. Bildirimi [Bildirimler](https://docs.flextell.ai/api/kaynaklar/bildirimler.md) endpoint'leriyle okursunuz (`GET /v1/notifications`). Bildirimin `type` değeri kaynağa göre değişir:

| Kaynak | Bildirim `type` değeri |
| - | - |
| Sohbetler, engellenen kullanıcılar | `conversation_bulk_operation` |
| Lead'ler | `lead_bulk_operation` |
| Randevu hatırlatmaları | `appointment_bulk_operation` |
| Destek talepleri | `ticket_bulk_operation` |
| Ürünler, dosyalar | `inventory_bulk_operation` |
| Faturalar, hesap hareketleri | `finance_bulk_operation` |

Bildirim verisi şunları taşır:

| Alan | Açıklama |
| - | - |
| `changed_count` | Değişen kayıt sayısı. |
| `skipped_count` | Atlanan kayıt sayısı. Sıfırdan büyükse bildirim uyarı durumunda gelir. |
| `skipped_by_error_code` | Atlanan kayıtların hata koduna göre sayısı, örneğin `{"LEAD_NOT_ASSIGNED": 3}`. |
| `resource`, `action` | İşlenen kaynak ve işlem. |

Hata olursa da bildirim gelir. Çalışma yarıda kesilirse (zaman aşımı, beklenmeyen hata) değişen sayısı `0` ve atlananlar `SERVER_ERROR` altında bildirilir; o ana kadar bazı kayıtlar değişmiş olabilir. İş yeniden denenmez, çünkü yeniden deneme zaten değişen kayıtları tekrar işlerdi. Bildirimdeki sayılar kesin değilse listeyi yeniden okuyup durumu kontrol edin.

Kuyruğa alınan işlerde şu kurallar geçerlidir:

* Yalnızca isteği onayladığınız anda var olan kayıtlar etkilenir. O andan sonra oluşan kayıtlar filtreye uysa bile işlenmez.
* Her kayıt işlenirken yeniden denetlenir. Artık listeyle eşleşmeyen kayıt `BULK_ROW_NO_LONGER_SELECTED` nedeniyle atlanır.
* İş sırasında kullanıcının işlem izni kalktıysa ya da klinikten çıkarıldıysa kayıtlar `FORBIDDEN` ile atlanır.
* Bir kayıt başkalarını durdurmaz. İmha edilmiş hastanın kaydı (`CUSTOMER_ERASED`) ya da başka temsilciye atanmış Lead (`LEAD_NOT_ASSIGNED`) gibi reddedilen kayıt tek başına atlanır.
* Etkinlik günlüğü kayıtlarında işlemi yapan olarak isteği gönderen kullanıcı görünür.

Kimlik listesiyle yapılan isteklerde sonuç yanıtın içindedir: `data.success_count`, `data.failed_count` ve kayıt başına `data.results[]`. Biçim ve kayıt kimliği anahtarları için [Yanıt yapısı](https://docs.flextell.ai/api/istekler/yanit-yapisi.md#toplu-işlem-sonucu) sayfasına bakın. Hesap hareketlerinin kimlik listesiyle toplu silinmesi istisnadır: hepsi ya da hiçbiri çalışır ve `{deleted_count}` döner.

## Hatalar

| Kod | HTTP | Ne zaman |
| - | - | - |
| `VALIDATION_FAILED` | 422 | Hem kimlik hem `select_all` gönderildi, `except_ids` 1000'i aştı, kimlik listesi sınırı aşıldı, `filters` geçersiz (`filters.<alan>` anahtarıyla) ya da liste filtresi `filters` dışında gönderildi. |
| `BULK_SELECTION_TOO_LARGE` | 422 | Fatura indirmede 200'den fazla fatura seçildi. `data.max` sınırı verir. |
| `BULK_ROW_NO_LONGER_SELECTED` | toplu kalem | Satır, kuyruktaki iş çalışırken artık listeyle eşleşmiyordu. Bildirimde `skipped_by_error_code` içinde sayılır. |
| `LEAD_NOT_ASSIGNED`, `CUSTOMER_ERASED`, `LEAD_ALREADY_CONVERTED` | toplu kalem | Lead işlemlerinde kayıt tek başına atlanır. |
| `RESOURCE_NOT_FOUND` | toplu kalem | Kimlik listesinde gönderilen kayıt yok ya da bu klinikte değil. |

Tüm hata kodları için [Hata kodları](https://docs.flextell.ai/api/istekler/hata-kodlari.md#toplu-işlemler) sayfasına bakın.

## Örnek

Açık destek taleplerinin tamamını, iki talep hariç silin. Önce sayıyı öğrenin, sonra işlemi başlatın.

```bash Sayım theme={null}
curl -X POST "https://app.flextell.ai/api/v1/tickets/bulk-count" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  -H "Content-Type: application/json" \
  -d '{
    "select_all": true,
    "filters": { "status": "open" },
    "except_ids": [123, 124]
  }'
```

```bash Silme theme={null}
curl -X POST "https://app.flextell.ai/api/v1/tickets/bulk-delete" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  -H "Content-Type: application/json" \
  -d '{
    "select_all": true,
    "filters": { "status": "open" },
    "except_ids": [123, 124]
  }'
```

> [!TIP]
>
> Sayım ile işlem arasında liste değişebilir. İşlem yanıtındaki `count`, sayımdan farklı çıkarsa kullanıcıya gerçek sayıyı gösterin.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.