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

# Randevu hatırlatmaları

> Hatırlatma, seans onayı, iptal takibi ve taşıma onayı kayıtlarını listelemeyi ve onaylama, reddetme ve gönderme işlemlerini anlatır.

Randevu hatırlatması, Flextell'in bir randevu nedeniyle hastaya göndereceği (veya gönderdiği) otomatik mesajın kaydıdır. Flextell bu kayıtları kendisi oluşturur. API ile yeni kayıt açamaz ve mevcut kaydı düzenleyemezsiniz. Kayıtları listeler, onaylar, reddeder, hemen gönderir, hatalıları yeniden kuyruğa alır ve silersiniz.

Dört tür kayıt aynı kaynakta durur. `type` filtresiyle ayırırsınız. Panel karşılıkları için bkz. [Hatırlatmalar](/panel/randevular/hatirlatmalar), [Seans onayları](/panel/randevular/seans-onaylari) ve [İptal takibi](/panel/randevular/iptal-takibi).

## Endpoint özeti

Tüm isteklerde `Authorization: Bearer <access_token>` ve `X-Tenant: <tenant_id>` başlıkları gerekir (bkz. [Klinikler ve X-Tenant](/api/klinikler-ve-x-tenant)). Okuma `appointment_reminders:read`, diğer her işlem `appointment_reminders:write` scope'u ister (bkz. [Scope'lar](/api/kimlik-dogrulama/scopelar)).

| Metot | Endpoint | Açıklama | İzin |
| - | - | - | - |
| GET | `/api/v1/appointment-reminders` | Hatırlatmaları sayfalı listeler | `View:AppointmentReminder` |
| GET | `/api/v1/appointment-reminders/{id}` | Tek hatırlatmayı getirir | `View:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/{id}/approve` | Onaylar | `Approve:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/{id}/reject` | Reddeder | `Reject:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/{id}/send` | Hemen gönderir | `Send:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/{id}/retry` | Hatalı kaydı yeniden kuyruğa alır | `Send:AppointmentReminder` |
| DELETE | `/api/v1/appointment-reminders/{id}` | Siler | `Delete:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/bulk/approve` | Toplu onaylar | `Approve:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/bulk/reject` | Toplu reddeder | `Reject:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/bulk/send` | Toplu gönderir | `Send:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/bulk/retry` | Toplu yeniden kuyruğa alır | `Send:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/bulk/delete` | Toplu siler | `Delete:AppointmentReminder` |
| POST | `/api/v1/appointment-reminders/retry-all-errors` | Bir türdeki tüm hatalıları yeniden kuyruğa alır | `Send:AppointmentReminder` |

Rol bazlı görünürlük kuralları için [İzinler ve görünürlük](/api/izinler-ve-gorunurluk) sayfasına bakın.

### Listeleme

`GET /api/v1/appointment-reminders` genel [sayfalama](/api/istekler/sayfalama) ve [sıralama](/api/istekler/filtreleme-ve-siralama) kurallarını izler. Kaynağa özgü parametreler:

| Parametre | Değerler | Açıklama |
| - | - | - |
| `type` | `appointment`, `cancellation_follow_up`, `session_confirmation`, `reschedule_confirmation` | Hatırlatma türü |
| `status` | `queued`, `sent`, `error`, `expired` | Gönderim durumu |
| `approval_status` | `pending`, `approved`, `rejected` | Onay durumu |
| `channel` | metin, en fazla 255 karakter | Kanal türü (örneğin `whatsapp`) |
| `from`, `to` | tarih | Randevunun planlı tarihine göre filtre. Sınırlar klinik saatiyle gün başı ve gün sonudur. |
| `search` | metin, en fazla 255 karakter | Randevu, ana randevu ve tedavi alanlarında arar |
| `sort_by` | `scheduled_for` (varsayılan), `sent_at`, `created_at`, `updated_at`, `appointment_date` | Sıralama alanı |
| `sort_order` | `asc`, `desc` (varsayılan `desc`) | Sıralama yönü |
| `per_page` | 1–100 (varsayılan 15) | Sayfa boyutu |

<Tip>
  Durum sayılarını görmek için ilgili filtreyle `per_page=1` isteyin ve yanıttaki `meta.total` değerini okuyun.
</Tip>

### Nesne modeli

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | integer | Hatırlatma kimliği |
| `appointment_id` | integer | İlgili randevu. Seans onaylarında ana randevudur. |
| `type` | string | Hatırlatma türü |
| `offset_days` | integer | Konu tarihine göre gün farkı (eksi değer: öncesi). İptal takibi ve taşıma onayında `0`. |
| `scheduled_for` | datetime | Gönderimin planlandığı zaman |
| `sent_at` | datetime, null | Gönderildi olarak işaretlenme zamanı |
| `channel` | string | Hastaya ulaşılacak kanal türü |
| `message` | string | Gönderilene kadar boştur. Metin, gönderim anında mesaj şablonundan üretilir. |
| `status` | string | Gönderim durumu |
| `approval_status` | string | Onay durumu |
| `approved_at`, `approved_by`, `approver` | datetime, integer, nesne | Onaylayan veya reddeden kullanıcı (`approver`: `id`, `name`) |
| `metadata` | nesne | Türe göre ek bilgi (aşağıya bakın) |
| `appointment` | nesne | `code`, `scheduled_at`, `status`, `relation_type`, `customer`, `doctor`, `treatments` içeren ilgili randevu |
| `record_state` | nesne | `is_read_only` ve `reason_code`. Verisi imha edilmiş hastada salt okunurdur. |
| `created_at`, `updated_at` | datetime | Tarihler klinik saat diliminde, ofsetle döner |

`metadata` içeriği türe göre değişir. Seans onayında `confirmation_status` (`pending`, `confirmed`, `rejected`), `planned_date` ve `session_order` bulunur. Taşıma onayında `original_scheduled_at`, `proposed_scheduled_at` ve `confirmation_status` bulunur. Gönderim hatasında `error` ve `retry_count` alanları eklenir.

Hatırlatma ayrıca `GET /api/v1/appointments/{id}` yanıtında `reminders[]` olarak, `scheduled_for` sırasıyla gelir (bkz. [Randevular](/api/kaynaklar/randevular)).

## Hatırlatma türleri

| `type` | Arayüz etiketi | Ne zaman oluşur | Onay |
| - | - | - | - |
| `appointment` | Randevu | Doktoru olan, iptal ya da reddedilmemiş bir randevu oluşturulduğunda, yeniden etkinleştirildiğinde veya saati değiştiğinde. Varsayılan olarak randevudan 3 ve 1 gün önce. | Randevu o anda `approved` ise `approved`, değilse `pending`. Randevu sonradan `approved` olunca bekleyen kayıtlar otomatik onaylanır. |
| `session_confirmation` | Seans Onayı | Bir randevu `completed` olunca tedavi planındaki sonraki seans için. Hastaya seans tarihi onay sorusu olarak gider. | Her zaman `pending`. Elle onay gerekir. |
| `cancellation_follow_up` | İptal Takibi | Bir randevu iptal nedeniyle iptal edildiğinde. İptal nedeni boşsa oluşmaz. Varsayılan 30 gün sonra, hastaya tedaviyi yeniden planlamak isteyip istemediği sorulur. | Her zaman `pending`. Elle onay gerekir. |
| `reschedule_confirmation` | Taşıma Onayı | [Toplu randevu taşıma](/api/kaynaklar/toplu-randevu-tasima) sırasında hastaya yeni saat önerilirken. | Oluşurken `approved`. Hemen gönderilir. |

<Note>
  Randevunun saati değişirse veya randevu iptal ya da reddedilirse, o randevunun `appointment` türündeki hatırlatmaları silinir. Saat değişikliğinde yenileri oluşturulur. Randevu silinirse tüm hatırlatmaları silinir.
</Note>

Mesaj metinleri klinik şablonlarından üretilir. Şablonları [Mesaj şablonları](/api/kaynaklar/mesaj-sablonlari) sayfasından yönetirsiniz. Hatırlatma saatleri ve gün farkları klinik bildirim ayarlarına bağlıdır (bkz. [Ayarlar](/api/kaynaklar/ayarlar)).

Hastanın seans onayına ve taşıma önerisine verdiği evet/hayır yanıtını AI asistan işler. Seans onayı `confirmed` olunca planlanan tarihte `pending` durumunda bir seans randevusu açılır. `rejected` olunca randevu açılmaz ve o seansın sonraki onay hatırlatmaları silinir.

## Durumlar

Her kayıtta iki ayrı durum vardır: gönderim durumu (`status`) ve onay durumu (`approval_status`).

| `status` | Etiket | Anlamı |
| - | - | - |
| `queued` | Planlandı | Gönderim bekliyor. Yeni kayıtlar bu durumda başlar. |
| `sent` | Gönderildi | Mesaj gönderim kuyruğuna alındı. Sağlayıcının mesajı kabul ettiğini garanti etmez. |
| `error` | Hatalı | Gönderim başarısız oldu. Hata metni `metadata.error` alanındadır. |
| `expired` | Süresi Geçti | Gönderim zamanı geçti ve kayıt bayatladı. |

| `approval_status` | Etiket | Anlamı |
| - | - | - |
| `pending` | Onay Bekliyor | Onay veya ret bekliyor. |
| `approved` | Onaylandı | Zamanı gelince gönderilir. |
| `rejected` | Reddedildi | Asla gönderilmez. Bir daha onaylanamaz. |

Flextell her 5 dakikada bir, zamanı gelmiş ve hem `queued` hem `approved` olan kayıtları `scheduled_for` sırasıyla gönderir. Onaylanmamış kayıt hiçbir zaman gönderilmez. Otomatik yeniden deneme yoktur. Hatalı kayıtları siz yeniden kuyruğa alırsınız.

<Warning>
  Bayat kayıtlar `expired` olur ve onaylanamaz ya da reddedilemez. Bir kayıt şu durumlarda bayatlar: randevu başlamışsa, planlanan seans tarihi geçmişse, iptal takibi 3 günden fazla gecikmişse veya aynı randevu (seans onayında aynı seans) için daha yeni bir gecikmiş hatırlatma varsa. Geç onayda yalnızca en yeni kayıt gider. Taşıma onayları bu kuralla süresi geçmiş sayılmaz.
</Warning>

## Onaylama, reddetme ve gönderme

Hangi işlemin hangi durumda yapılabildiği:

| İşlem | Gereken durum | Sonuç |
| - | - | - |
| `approve` | `approval_status = pending` ve `expired` değil | `approval_status: approved`, `approved_at` ve `approved_by` dolar |
| `reject` | `approval_status = pending` ve `expired` değil | `approval_status: rejected`. Kayıt `queued` kalır, gönderilmez. |
| `send` | `status = queued` ve `approval_status = approved` | Hemen gönderir, `status: sent` döner. `scheduled_for` beklenmez. |
| `retry` | `status = error` | `status: queued`, `scheduled_for` şimdiden 5 dakika sonraya ayarlanır. Hemen göndermez. |
| `DELETE` | `status` değeri `queued`, `error` veya `expired` | Kayıt kalıcı silinir. `sent` kayıt silinemez. |

`send` isteği eşzamanlıdır. Gönderim başarısız olursa `422 REMINDER_SEND_FAILED` döner ve kayıt `error` olmaz, `queued` kalır.

<CodeGroup>
  ```bash Listele theme={null}
  curl -G "https://app.flextell.ai/api/v1/appointment-reminders" \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>" \
    --data-urlencode "type=session_confirmation" \
    --data-urlencode "approval_status=pending" \
    --data-urlencode "from=2026-10-14" \
    --data-urlencode "to=2026-10-31" \
    --data-urlencode "per_page=50"
  ```

  ```bash Onayla theme={null}
  curl -X POST "https://app.flextell.ai/api/v1/appointment-reminders/123/approve" \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>"
  ```

  ```bash Hemen gönder theme={null}
  curl -X POST "https://app.flextell.ai/api/v1/appointment-reminders/123/send" \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>"
  ```
</CodeGroup>

Başarılı işlem, güncel kaydı `{"success": true, "data": {...}}` zarfında döndürür:

```json theme={null}
{
  "success": true,
  "data": {
    "id": 123,
    "appointment_id": 456,
    "type": "session_confirmation",
    "scheduled_for": "2026-10-20T13:00:00+03:00",
    "sent_at": null,
    "status": "queued",
    "approval_status": "approved",
    "approved_at": "2026-10-13T11:42:10+03:00",
    "approver": { "id": 7, "name": "Ayşe Yılmaz" }
  }
}
```

## Toplu işlemler

`bulk/approve`, `bulk/reject`, `bulk/send`, `bulk/retry` ve `bulk/delete` aynı gövdeyi alır: 1 ile 100 arası `ids` dizisi.

```bash theme={null}
curl -X POST "https://app.flextell.ai/api/v1/appointment-reminders/bulk/approve" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  -H "Content-Type: application/json" \
  -d '{"ids": [123, 124, 125]}'
```

Her kayıt ayrı işlenir; biri başarısız olursa diğerleri etkilenmez. Yanıtta toplam ve kayıt bazında sonuç bulunur:

```json theme={null}
{
  "success_count": 2,
  "failed_count": 1,
  "results": [
    { "id": 123, "success": true, "message": "Onaylandı" },
    { "id": 124, "success": true, "message": "Onaylandı" },
    { "id": 125, "success": false, "error_code": "REMINDER_EXPIRED", "message": "Bu hatırlatmanın gönderim zamanı geçtiği için süresi doldu; artık onaylanamaz veya reddedilemez." }
  ]
}
```

Başarılı kayıt mesajları işleme göre `Onaylandı`, `Reddedildi`, `Yeniden kuyruğa alındı`, `Gönderildi` ve `Silindi` olur. Bulunamayan kimlikler `RESOURCE_NOT_FOUND` ile raporlanır. İşlemden sonra `failed_count` değerini ve `results` içindeki `error_code` alanlarını kontrol edin.

`POST /api/v1/appointment-reminders/retry-all-errors` bir türdeki tüm hatalı kayıtları yeniden kuyruğa alır. Gövdede `type` zorunludur. Yanıt `{"requeued_count": 12}` biçimindedir. Verisi imha edilmiş hastalar ve (kısıtlı satış temsilcisi için) başka temsilcinin hastaları atlanır.

## Hatalar

Genel hata zarfı ve ortak kodlar için [Hata kodları](/api/istekler/hata-kodlari) sayfasına bakın. Bu kaynağa özgü kodlar:

| Kod | HTTP | Ne zaman |
| - | - | - |
| `REMINDER_NOT_PENDING` | 422 | Onay durumu `pending` olmayan kayıt onaylanmak veya reddedilmek istendi. Mesaj: `Yalnızca bekleyen hatırlatmalar onaylanabilir.` veya `Yalnızca bekleyen hatırlatmalar reddedilebilir.` |
| `REMINDER_EXPIRED` | 422 | `expired` kayıt onaylanmak veya reddedilmek istendi. |
| `REMINDER_NOT_ERRORED` | 422 | `error` durumunda olmayan kayıt yeniden kuyruğa alınmak istendi. Mesaj: `Yalnızca hatalı hatırlatmalar yeniden kuyruğa alınabilir.` |
| `REMINDER_NOT_SENDABLE` | 422 | `queued` ve `approved` olmayan kayıt gönderilmek istendi. Mesaj: `Yalnızca kuyrukta ve onaylanmış hatırlatmalar gönderilebilir.` |
| `REMINDER_SEND_FAILED` | 422 | Hemen gönderim başarısız oldu. Mesaj: `Hatırlatma gönderilemedi. Lütfen tekrar deneyin.` |
| `REMINDER_NOT_DELETABLE` | 422 | Gönderilmiş kayıt silinmek istendi. Mesaj: `Yalnızca kuyruktaki, hatalı veya süresi geçmiş hatırlatmalar silinebilir.` |
| `CUSTOMER_ERASED` | 409 | Verisi imha edilmiş hastanın hatırlatmasında yazma işlemi yapıldı. |
| `LEAD_NOT_ASSIGNED` | 403 | Satış temsilcisi, kendisine atanmamış bir Lead'in hatırlatmasında işlem yaptı. Yanıttaki `data.assigned_user` atanan kişiyi (`id`, `name`) veya `null` verir. |
| `FORBIDDEN` | 403 | Scope veya izin eksik. Mesaj: `Bu işlem için yetkiniz yok.` |
| `RESOURCE_NOT_FOUND` | 404 | Kimlik yok. Mesaj: `Randevu hatırlatması bulunamadı` |
| `VALIDATION_FAILED` | 422 | Geçersiz filtre veya gövde (örneğin `ids` boş ya da 100'den fazla, `retry-all-errors` için `type` eksik). |

## Yetki

Listeleme, kliniğin tüm hatırlatmalarını `View:AppointmentReminder` iznine sahip her kullanıcıya gösterir. Yalnızca kendi Lead'lerini görebilen satış temsilcisi için başka temsilcinin hastaları maskelenir (`customer.is_masked: true`) ve bu kayıtlardaki yazma işlemleri `LEAD_NOT_ASSIGNED` verir.

| İzin | Arayüz etiketi | Kapsadığı işlemler |
| - | - | - |
| `View:AppointmentReminder` | Görüntüle | Listeleme ve detay |
| `Approve:AppointmentReminder` | Onayla | `approve`, `bulk/approve` |
| `Reject:AppointmentReminder` | Reddet | `reject`, `bulk/reject` |
| `Send:AppointmentReminder` | Gönder | `send`, `retry`, `bulk/send`, `bulk/retry`, `retry-all-errors` |
| `Delete:AppointmentReminder` | Sil | `DELETE`, `bulk/delete` |

Yeni kliniklerde satış temsilcisi rolü varsayılan olarak görüntüleme, onaylama ve reddetme izinlerini alır. Gönderme ve silme izinleri yoktur. Satış direktörü rolü bunlara ek olarak silme iznini de alır.


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