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

# Doktorlar, asistanlar ve odalar

> Doktor, asistan ve oda kaynaklarını ve doktor-tedavi eşleştirmesini anlatır.

Doktorlar ve asistanlar klinikteki kullanıcı hesaplarıdır. Doktor, klinikte `doctor` rolüne; asistan, `assistant` rolüne sahip kullanıcıdır. Odalar ise randevuya atanan fiziksel mekânlardır. Bu sayfa üç kaynağın endpoint'lerini ve doktorlara tedavi bağlama işlemini anlatır.

Tedavi kaynağının kendisi için [Tedaviler](/api/kaynaklar/tedaviler) sayfasına bakın. Randevu formundaki seçim listeleri için [Randevular](/api/kaynaklar/randevular) sayfasına bakın.

## Endpoint özeti

Bu kaynaklara yalnızca `X-Tenant` başlığıyla seçtiğiniz klinik içinde erişirsiniz. Başka kliniğe ait bir kayıt `404` döner.

| Metot | Endpoint | Açıklama | Scope | İzin |
| - | - | - | - | - |
| GET | `/doctors` | Doktorları listeler | `doctors:read` | `View:Doctor` |
| POST | `/doctors` | Doktor oluşturur | `doctors:write` | `Create:Doctor` |
| GET | `/doctors/{id}` | Doktoru getirir | `doctors:read` | `View:Doctor` |
| PUT | `/doctors/{id}` | Doktoru günceller | `doctors:write` | `Update:Doctor` |
| DELETE | `/doctors/{id}` | Doktoru siler | `doctors:write` | `Delete:Doctor` |
| GET | `/doctors/{id}/deletion-relations` | Silmenin etkisini önizler | `doctors:read` | `Delete:Doctor` |
| POST | `/doctors/{id}/treatments` | Doktora tedavi ekler | `doctors:write` | `Update:Doctor` |
| DELETE | `/doctors/{id}/treatments` | Doktordan tedavi çıkarır | `doctors:write` | `Update:Doctor` |
| GET | `/assistants` | Asistanları listeler | `assistants:read` | `View:Assistant` |
| POST | `/assistants` | Asistan oluşturur | `assistants:write` | `Create:Assistant` |
| GET | `/assistants/{id}` | Asistanı getirir | `assistants:read` | `View:Assistant` |
| PUT | `/assistants/{id}` | Asistanı günceller | `assistants:write` | `Update:Assistant` |
| DELETE | `/assistants/{id}` | Asistanı siler | `assistants:write` | `Delete:Assistant` |
| GET | `/assistants/{id}/deletion-relations` | Silmenin etkisini önizler | `assistants:read` | `Delete:Assistant` |
| GET | `/rooms` | Odaları listeler | `rooms:read` | `View:Room` |
| POST | `/rooms` | Oda oluşturur | `rooms:write` | `Create:Room` |
| GET | `/rooms/{id}` | Odayı getirir | `rooms:read` | `View:Room` |
| PUT | `/rooms/{id}` | Odayı günceller | `rooms:write` | `Update:Room` |
| DELETE | `/rooms/{id}` | Odayı siler | `rooms:write` | `Delete:Room` |

Bu kaynaklarda "kendi kayıtlarını görme" gibi bir sahiplik kısıtı yoktur. `View:Doctor` izni olan kullanıcı klinikteki tüm doktorları görür. İzinlerin genel işleyişi için [İzinler ve görünürlük](/api/izinler-ve-gorunurluk) sayfasına bakın.

## Doktorlar

### Doktor nesnesi

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | integer | Doktorun kullanıcı kimliği. |
| `name`, `email`, `phone` | string | Ad, e-posta, telefon. |
| `title` | string | Unvan. Değerler: `Uzm. Dr.`, `Dr.`, `Prof. Dr.`, `Doç. Dr.`, `Arş. Gör.`, `Öğr. Gör.`. |
| `blood_group` | string | `ARh+`, `ARh-`, `BRh+`, `BRh-`, `ABRh+`, `ABRh-`, `ORh+`, `ORh-`. |
| `language` | array | Konuşulan diller. |
| `avatar_url` | string | Profil görseli için süreli adres. |
| `is_active` | boolean | Doktorun etkin olup olmadığı. |
| `bio` | string | Kısa tanıtım. |
| `preferred_invoice_account_id` | integer | Tercih edilen fatura hesabı. |
| `has_calendar_integration` | boolean | Doktorun varsayılan takvimi bağlıysa `true`. Salt okunurdur. |
| `roles` | array | Doktorun rolleri. |
| `treatments` | array | Doktora bağlı tedaviler. Yalnızca bu kliniğin tedavileri gelir; her biri `group` bilgisini taşır. |
| `import_source` | object veya null | Kayıt dış sistemden aktarıldıysa kaynağı. Yalnızca detay yanıtında bulunur. |
| `emergency_contact_name`, `emergency_contact_surname`, `emergency_contact_phone_number` | string | Acil durum kişisi. Yalnızca okunur; hiçbir istek alanı bu değerleri kabul etmez. |
| `last_login_at`, `last_login_ip`, `created_at`, `updated_at`, `deleted_at` | string | Zaman damgaları ve son giriş bilgisi. |

### Listeleme

`GET /doctors` sayfalı döner. Sayfalama için [Sayfalama](/api/istekler/sayfalama), sıralama için [Filtreleme ve sıralama](/api/istekler/filtreleme-ve-siralama) sayfasına bakın.

| Parametre | Açıklama |
| - | - |
| `search` | Ad, e-posta ve kimlikte arar. |
| `per_page`, `page` | `per_page` 1 ile 100 arasındadır. |
| `sort_by`, `sort_order` | `sort_by` değerleri: `name`, `email`, `created_at`, `updated_at`, `last_login_at`. |
| `is_active` | Etkin veya pasif doktorlar. |
| `title` | Unvan değerine göre süzer. |
| `has_calendar_integration` | Yalnızca `true` değeri süzer. |
| `created_at_from`, `created_at_to`, `updated_at_from`, `updated_at_to` | Tarih aralığı. Tarihler kliniğin saat dilimine göre yorumlanır. |

### Doktor oluşturma ve güncelleme

<ParamField body="name" type="string" required>
  En fazla 255 karakter.
</ParamField>

<ParamField body="email" type="string" required>
  Geçerli ve en fazla 255 karakterli e-posta. Silinmemiş kullanıcılar arasında benzersiz olmalıdır.
</ParamField>

<ParamField body="set_password" type="boolean">
  `true` ise `password` zorunludur. Parola göndermezseniz sistem rastgele bir parola atar ve doktora "parolanızı belirleyin" e-postası gönderir.
</ParamField>

<ParamField body="password" type="string">
  En az 8 karakter. `password_confirmation` ile birlikte gönderilir.
</ParamField>

<ParamField body="phone" type="string">
  En fazla 20 karakter.
</ParamField>

<ParamField body="title" type="string">
  Unvan listesindeki bir değer.
</ParamField>

<ParamField body="blood_group" type="string">
  Kan grubu listesindeki bir değer.
</ParamField>

<ParamField body="language" type="array">
  Dil listesi.
</ParamField>

<ParamField body="avatar_url" type="string">
  En fazla 1000 karakter; depolama yolu olarak gönderilir.
</ParamField>

<ParamField body="is_active" type="boolean">
  Varsayılan olarak doktor etkin oluşturulur.
</ParamField>

<ParamField body="bio" type="string">
  En fazla 1000 karakter.
</ParamField>

<ParamField body="preferred_invoice_account_id" type="integer">
  Kliniğe ait bir fatura hesabının kimliği.
</ParamField>

<ParamField body="treatment_ids" type="array">
  Doktora bağlanacak tedavi kimlikleri. Hepsi kliniğe ait olmalıdır.
</ParamField>

`PUT /doctors/{id}` aynı alanları kabul eder; hepsi isteğe bağlıdır.

<Note>
  Doktor ve asistan oluştururken kliniğin etkin kullanıcı sayısı, klinik için tanımlı en yüksek kullanıcı sayısını aşamaz. Etkin olmayan bir doktoru `is_active: true` ile etkinleştirirken de aynı sınır geçerlidir.
</Note>

### Hata kodları

| Kod | HTTP | Ne zaman |
| - | - | - |
| `VALIDATION_FAILED` | 422 | İstek alanları geçersiz. |
| `USER_LIMIT_REACHED` | 422 | Kullanıcı sınırına ulaşıldı. Mesaj: `Bu klinik için azami kullanıcı sınırına (:limit) ulaşıldı. Yeni doktor eklenemez.` |
| `STAFF_ROLE_NOT_CONFIGURED` | 422 | Klinikte `doctor` rolü yok. Mesaj: `Bu klinik için doktor rolü bulunamadı. Kliniğin doğru biçimde kurulduğundan emin olun.` Kullanıcı oluşmaz, e-posta gitmez. |
| `STAFF_SAVE_FAILED` | 422 | Kayıt beklenmedik bir nedenle kaydedilemedi. Mesaj: `Kayıt kaydedilemedi. Lütfen tekrar deneyin.` |
| `RESOURCE_NOT_FOUND` | 404 | Kimlik yok, başka kliniğe ait ya da doktor değil. |

Genel hata biçimi için [Hata kodları](/api/istekler/hata-kodlari) sayfasına bakın.

### Örnek: doktor oluşturma

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST "https://app.flextell.ai/api/v1/doctors" \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Ayşe Yılmaz",
      "email": "ayse.yilmaz@example.com",
      "title": "Dr.",
      "phone": "+90 5xx xxx xx xx",
      "is_active": true
    }'
  ```

  ```javascript JavaScript theme={null}
  const res = await fetch("https://app.flextell.ai/api/v1/doctors", {
    method: "POST",
    headers: {
      Authorization: "Bearer <access_token>",
      "X-Tenant": "<tenant_id>",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      name: "Ayşe Yılmaz",
      email: "ayse.yilmaz@example.com",
      title: "Dr.",
      is_active: true,
    }),
  });
  ```
</CodeGroup>

Başarılı yanıt `201` ve doktor nesnesidir.

## Doktor-tedavi eşleştirme

Doktorlar ile tedaviler çoktan çoğa ilişkilidir. Randevuda bir doktor seçildiğinde, o doktorun bağlı tedavileri sunulur. Eşleştirmeyi iki yoldan yönetirsiniz.

* `POST /doctors/{id}/treatments` ve `DELETE /doctors/{id}/treatments`: mevcut bağlantılara dokunmadan ekler veya çıkarır.
* `PUT /doctors/{id}` ile `treatment_ids`: bu kliniğin tedavi bağlantılarını gönderdiğiniz listeyle değiştirir.

İki uç da aynı gövdeyi kullanır.

<ParamField body="treatment_ids" type="array" required>
  En az bir, birbirinden farklı tamsayı. Tüm kimlikler bu kliniğin tedavilerine ait olmalıdır.
</ParamField>

| İşlem | Davranış |
| - | - |
| Ekleme | Zaten bağlı olan tedaviler yok sayılır. Diğer bağlantılar korunur. |
| Çıkarma | Yalnızca listelediğiniz tedaviler çıkarılır. Bağlı olmayanlar yok sayılır. |
| `PUT` ile `treatment_ids` | Yalnızca bu kliniğin bağlantılarını değiştirir. Doktorun başka kliniklerdeki tedavi bağlantıları korunur. |

Geçersiz kimlik `422` döner; hata `errors.treatment_ids` altında gelir. Yanıt, güncel `treatments` listesiyle birlikte doktor nesnesidir. Her bağlantı değişikliği doktorun aktivite kaydına yazılır.

```bash theme={null}
curl -X POST "https://app.flextell.ai/api/v1/doctors/123/treatments" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  -H "Content-Type: application/json" \
  -d '{ "treatment_ids": [12, 15] }'
```

<Tip>
  Randevu oluşturan bir istemci doktor, oda ve asistan listesini `/appointments/options/doctors`, `/appointments/options/rooms` ve `/appointments/options/assistants` uçlarından alabilir. Bu uçlar `Create:Appointment` veya `Update:Appointment` izni yeter; `View:Doctor` gibi izinler gerekmez. Listelerde yalnızca etkin kayıtlar gelir. Doktorun tedavileri için `/appointments/options/doctors/{id}/treatments` kullanılır.
</Tip>

## Asistanlar

Asistan nesnesi doktor nesnesiyle aynı alanları taşır; `treatments`, `has_calendar_integration`, `preferred_invoice_account_id` ve `import_source` alanları yoktur.

`GET /assistants` doktor listesindeki `search`, `per_page`, `page`, `sort_by`, `sort_order`, `is_active`, `title` ve tarih aralığı parametrelerini aynı şekilde kabul eder.

Asistan oluştururken yalnızca şu alanları gönderebilirsiniz.

| Alan | Zorunlu | Açıklama |
| - | - | - |
| `name` | Evet | Ad. |
| `email` | Evet | Silinmemiş kullanıcılar arasında benzersiz olmalıdır. |
| `set_password` | Hayır | `true` ise `password` zorunludur. Parola yoksa rastgele parola atanır ve parola belirleme e-postası gider. |
| `password` | Hayır | En az 8 karakter; `password_confirmation` ile birlikte. |
| `phone` | Hayır | En fazla 20 karakter. |
| `language` | Hayır | Dil listesi. |
| `avatar_url` | Hayır | En fazla 1000 karakter. |
| `is_active` | Hayır | Etkin durumu. |

`PUT /assistants/{id}` bu alanları isteğe bağlı olarak kabul eder. `title`, `bio`, acil durum kişisi ve kan grubu asistan isteklerinde kabul edilmez.

Asistan olmayan ya da başka kliniğe ait bir kimlik `404` ve `Asistan bulunamadı` mesajı döner. Oluşturma hataları doktorlarla aynıdır; rol bulunamazsa mesaj `Bu klinik için asistan rolü bulunamadı. Kliniğin doğru biçimde kurulduğundan emin olun.` olur. Başarılı silme yanıtı `{"message": "Asistan başarıyla silindi"}` biçimindedir.

## Odalar

Oda; `id`, `name`, `status`, `created_at`, `updated_at` ve `deleted_at` alanlarından oluşur.

| `status` | Panel etiketi | Anlamı |
| - | - | - |
| `active` | Aktif | Randevu oda seçicisinde sunulur. |
| `inactive` | Pasif | Seçiciden gizlenir. |
| `maintenance` | Bakımda | Seçiciden gizlenir. |

`GET /rooms` için parametreler: `search` (ada göre, kısmi ve büyük/küçük harf duyarsız), `per_page` (1–100), `page`, `status`, `sort_by` (`name`, `status`, `created_at`, `updated_at`) ve `sort_order`.

`POST /rooms` için `name` (en fazla 255 karakter) ve `status` zorunludur. `PUT /rooms/{id}` ikisini de isteğe bağlı kabul eder. Tamsayı olmayan bir `{id}` `422` döner.

```bash theme={null}
curl -X POST "https://app.flextell.ai/api/v1/rooms" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Muayene Odası 1", "status": "active" }'
```

## Silmenin etkisi

Silmeden önce `GET /doctors/{id}/deletion-relations` veya `GET /assistants/{id}/deletion-relations` ile etkilenen kayıtları görün. Yanıt, `relation`, `label`, `count` ve `deleted` alanlı bir listedir. Bu kaynaklarda `deleted` her zaman `false` olur; yani liste "silinmeyecek, korunacak" kayıtları sayar. Sayımlar yalnızca bu klinik için yapılır.

| `relation` | `label` |
| - | - |
| `appointments` | Randevular |
| `assistant_appointments` | Asistan olduğu randevular |
| `sales` | Satışlar |
| `tickets` | Destek talepleri |

Odalar için önizleme endpoint'i yoktur.

<Warning>
  `DELETE /doctors/{id}` ve `DELETE /assistants/{id}` kullanıcının genel hesabını siler. Aynı kişi başka kliniklerde de çalışıyorsa, o kliniklerden de kaybolur. Randevu, satış ve destek talebi geçmişi korunur.
</Warning>

<Warning>
  Oda silme, odayı kullanan randevular olsa bile başarılı olur. Randevular `room_id` değerini korur. Silinen oda liste ve detay yanıtlarında görünmez.
</Warning>

Silinen kayıtlar için genel kurallar [Silme yaşam döngüsü](/api/istekler/silme-yasam-dongusu) sayfasındadır. Doktor, asistan ve odalar Geri Dönüşüm Kutusu'ndan geri yüklenemez.

## Gereken scope'lar ve izinler

Uygulamanızın erişim token'ı `doctors:read`, `doctors:write`, `assistants:read`, `assistants:write`, `rooms:read` ve `rooms:write` scope'larından ihtiyaç duyduklarını içermelidir. Scope'ların nasıl istendiği için [Scope'lar](/api/kimlik-dogrulama/scopelar) sayfasına bakın. Token'ın sahibi olan kullanıcıda ayrıca yukarıdaki tablolardaki izin de bulunmalıdır; eksikse yanıt `403` olur.


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