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

# Tedaviler ve tedavi grupları

> Tedavileri, seans şablonlarını, tedavi gruplarını ve tedavi görsellerini anlatır.

Tedavi, kliniğin sattığı ve randevuya bağladığı hizmettir. Her tedavinin bir fiyatı, KDV oranı, seans sayısı ve isteğe bağlı bir seans şablonu vardır. Tedavi grubu, birkaç tedaviyi tek bir paket altında toplar. Doktorları tedavilere bağlamak için [Doktorlar, asistanlar, odalar](/api/kaynaklar/doktorlar-asistanlar-odalar) sayfasına bakın.

<Info>
  Her istekte `Authorization: Bearer <access_token>` ve `X-Tenant: <tenant_id>` başlıkları gerekir. Ayrıntı: [Klinikler ve X-Tenant](/api/klinikler-ve-x-tenant).
</Info>

## Endpoint özeti

Taban adres `https://app.flextell.ai/api/v1`. Scope bilgisi için [Scope'lar](/api/kimlik-dogrulama/scopelar) sayfasına bakın.

| Metot | Endpoint | Açıklama | Scope | İzin |
| - | - | - | - | - |
| GET | `/treatments` | Tedavileri listeler | `treatments:read` | `View:Treatment` |
| POST | `/treatments` | Tedavi oluşturur | `treatments:write` | `Create:Treatment` |
| GET | `/treatments/{id}` | Tek tedavi döner | `treatments:read` | `View:Treatment` |
| PUT | `/treatments/{id}` | Tedaviyi kısmen günceller | `treatments:write` | `Update:Treatment` |
| DELETE | `/treatments/{id}` | Tedaviyi siler | `treatments:write` | `Delete:Treatment` |
| GET | `/treatments/{id}/deletion-relations` | Silmenin etkileyeceği kayıtları önizler | `treatments:read` | `Delete:Treatment` |
| GET | `/treatment-groups` | Tedavi gruplarını listeler | `treatment_groups:read` | `View:TreatmentGroup` |
| POST | `/treatment-groups` | Tedavi grubu oluşturur | `treatment_groups:write` | `Create:TreatmentGroup` |
| GET | `/treatment-groups/{id}` | Tek tedavi grubu döner | `treatment_groups:read` | `View:TreatmentGroup` |
| PUT | `/treatment-groups/{id}` | Tedavi grubunu günceller | `treatment_groups:write` | `Update:TreatmentGroup` |
| DELETE | `/treatment-groups/{id}` | Tedavi grubunu siler | `treatment_groups:write` | `Delete:TreatmentGroup` |

Panelde bu izinler rol editöründe **Tedaviler** modülünün altında, **Tedaviler** ve **Tedavi Grupları** gruplarında görünür. Etiketler **Görüntüle**, **Oluştur**, **Güncelle** ve **Sil**'dir.

Tanımsız veya başka kliniğe ait kimlikler `404 RESOURCE_NOT_FOUND` döner (`Tedavi bulunamadı`, `Tedavi grubu bulunamadı`). Doğrulama hataları `422 VALIDATION_FAILED` ve `errors` nesnesiyle gelir.

## Tedavi nesnesi

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | integer | Tedavi kimliği |
| `group_id` | integer veya null | Bağlı olduğu tedavi grubu |
| `name` | string | Tedavi adı veya uygulama bölgesi. En fazla 255 karakter |
| `invoice_name` | string veya null | Faturada ve satışta görünen ad. Boşsa grup varsa `<Grup> - <Ad>`, yoksa `name` kullanılır |
| `keywords` | string dizisi | Reklam adları ve hastaların kullandığı eş anlamlılar. Her biri en fazla 100 karakter. Kayıtta kırpılır, boşlar ve tekrarlar atılır |
| `price` | string | KDV dahil fiyat. JSON'da string döner (`"3500.00"`) |
| `tax_rate` | integer | KDV oranı: `0`, `1`, `10` veya `20` |
| `description` | string veya null | Serbest metin, en fazla 65535 karakter |
| `session` | integer | Seans sayısı, en az 1 |
| `is_active` | boolean | Pasif tedaviler AI eşleştirmesinde ve seçicilerde görünmez |
| `extra_info` | object | Serbest anahtar–değer çiftleri. Boşsa `{}` döner |
| `group` | object veya null | `id`, `name`, `is_active` |
| `users` | array | Tedaviye bağlı, bu kliniğin üyesi kullanıcılar (doktorlar ve satış temsilcileri). Her öğe `id`, `name`, `email`, `phone` ve `is_active` alanlarını taşır. Kliniği bırakmış doktorlar listelenmez |
| `sessions` | array | Seans şablonu. Bkz. [Seans şablonları](#seans-şablonları) |
| `import_source` | object veya null | İçe aktarıldığı sistem. Yalnızca tek tedavi yanıtlarında |
| `created_at`, `updated_at`, `deleted_at` | datetime | Zaman damgaları |

### Listeleme ve filtreler

`GET /treatments` sayfalı döner (`per_page` 1–100, varsayılan 15; `page`). Zarf için [Sayfalama](/api/istekler/sayfalama) ve [Yanıt yapısı](/api/istekler/yanit-yapisi) sayfalarına bakın.

| Parametre | Açıklama |
| - | - |
| `search` | En fazla 255 karakter. Ad, grup adı ve açıklaması, anahtar kelimeler, açıklama ve `extra_info` içinde arar. Her kelime ön ek olarak eşleşir. Sonuçlar önce eşleşme sırasına, sonra `sort_by` değerine göre dizilir |
| `is_active` | `true` veya `false` |
| `min_price`, `max_price` | 0 veya üstü |
| `group_id` | Gruba göre filtreler |
| `user_id` | O kullanıcıya (doktor) bağlı tedaviler |
| `keyword` | Tam eşleşen anahtar kelime, en fazla 255 karakter. Büyük/küçük harfe duyarlıdır. "Bu reklam adı hangi tedavi?" sorusu için kullanın |
| `created_at_from`, `created_at_to` | Oluşturulma aralığı. `created_at_to`, seçilen günün tamamını kapsar (klinik saat dilimi) |
| `sort_by` | `name`, `price`, `session`, `is_active`, `created_at`, `updated_at`. Varsayılan `created_at` |
| `sort_order` | `asc` veya `desc`. Varsayılan `desc` |

Genel sıralama kuralları için [Filtreleme ve sıralama](/api/istekler/filtreleme-ve-siralama) sayfasına bakın.

### Tedavi oluşturma

`POST /treatments` için `name`, `price`, `tax_rate`, `session` ve `is_active` zorunludur. `PUT` isteğinde tüm alanlar isteğe bağlıdır; yalnızca gönderdiğiniz alanlar değişir. `group_id` yalnızca kendi kliniğinizin grubu olabilir. Güncellemede `null` göndermek tedaviyi gruptan çıkarır.

`extra_info` bir nesne olmalıdır. Liste (`["a","b"]`) gönderirseniz doğrulama hatası alırsınız.

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://app.flextell.ai/api/v1/treatments \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Diş beyazlatma",
      "price": 3500,
      "tax_rate": 20,
      "session": 1,
      "is_active": true,
      "keywords": ["beyazlatma kampanyası"],
      "group_id": 123,
      "sessions": [
        { "session_order": 1, "session_type": "operation" }
      ]
    }'
  ```

  ```javascript JavaScript theme={null}
  const res = await fetch("https://app.flextell.ai/api/v1/treatments", {
    method: "POST",
    headers: {
      Authorization: "Bearer <access_token>",
      "X-Tenant": "<tenant_id>",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      name: "Diş beyazlatma",
      price: 3500,
      tax_rate: 20,
      session: 1,
      is_active: true,
      keywords: ["beyazlatma kampanyası"],
      group_id: 123,
      sessions: [{ session_order: 1, session_type: "operation" }],
    }),
  });
  ```
</CodeGroup>

Başarılı istek `201` ve oluşturulan tedaviyi döner.

## Seans şablonları

Seans şablonu, çok seanslı bir tedavinin her seansının türünü ve aralığını tanımlar. Randevu tamamlama akışı, seansa tanımlı ürünleri önceden doldurur. `sessions` dizisindeki her öğe şu alanlara sahiptir:

| Alan | Tür | Kural |
| - | - | - |
| `session_order` | integer | Zorunlu, en az 1. 1'den `session` değerine kadar tüm sıralar bulunmalı |
| `session_type` | string | `control`, `operation`, `treatment`, `consultation`, `follow_up`, `emergency` veya `surgery`. 1. seans her zaman `operation` olmalı. Boş bırakılırsa 1. seans için `operation`, diğerleri için `control` kullanılır |
| `next_gap_days` | integer veya null | Sonraki seansa kaç gün kaldığı, en az 1. Son seansta `null` olarak saklanır |
| `offset_days` | integer veya null | Sonraki seans tarihi önerilirken ± esneklik (gün), en az 0. Varsayılan 3 |
| `products` | array | Seansa tanımlı ürünler: `product_id` (zorunlu) ve `min_quantity` (0 veya üstü) |

Yanıtta her seans ayrıca `id` taşır; `products` içindeki her öğe `id`, `product_id`, `min_quantity` ve `product` (ad, marka, birim kodu) alanlarını döner.

<Warning>
  Seans listesi her kayıtta tamamen değiştirilir. Mevcut bir seans satırını tek başına güncelleyemezsiniz; değişmeyen seansları da yeniden gönderin.
</Warning>

Kurallar:

* `session` 1'den büyükse ve `sessions` gönderiyorsanız, liste tam olarak `session` öğe içermeli ve her sırayı kapsamalıdır.
* `session` değerini güncellerken `sessions` dizisini de gönderin. Göndermezseniz doğrulama hatası alırsınız.
* 1'den fazla seanslı tedavide son seans dışındaki her seans için pozitif `next_gap_days` gönderin.
* `session` 1 ise tek bir `operation` seansı oluşur ve yalnızca ilk öğenin ürünleri saklanır.
* Oluşturmada `sessions` göndermezseniz seans satırı oluşturulmaz.
* Aynı seansta tekrar eden `product_id` değerleri tek kayda indirilir.

<Note>
  Doğrulama mesajlarının bir kısmı İngilizcedir, örneğin `The sessions plan must contain exactly 3 items.` Hata ayrıntıları `errors` altında alan adıyla gelir.
</Note>

## Tedavi grupları

Tedavi grubu, tedavileri adlandırılmış bir paket altında toplar. Grup fiyatı elle girilebilir ya da üye tedavilerin fiyat toplamından hesaplanabilir.

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | integer | Grup kimliği |
| `name` | string | Grup adı (**Grup Adı**), en fazla 255 karakter. Oluştururken zorunlu |
| `description` | string veya null | Açıklama |
| `total_price` | string veya null | Paket fiyatı. JSON'da string döner |
| `effective_price` | number | `total_price` doluysa o, boşsa üye tedavilerin fiyat toplamı |
| `is_price_manual` | boolean | `false` ise `total_price` üye fiyatlarının toplamı olarak otomatik hesaplanır |
| `is_active` | boolean | Oluştururken zorunlu |
| `treatments` | array | Üye tedaviler. İç içe ilişki taşımaz |
| `created_at`, `updated_at`, `deleted_at` | datetime | Zaman damgaları |

`GET /treatment-groups` şu parametreleri destekler: `search` (ad ve açıklamada), `is_active`, `per_page` (1–100), `page`, `sort_by` (`name`, `total_price`, `is_active`, `created_at`, `updated_at`) ve `sort_order`.

Yazarken `name`, `description`, `total_price` (0 veya üstü), `is_price_manual`, `is_active` ve `treatment_ids` gönderebilirsiniz.

<CodeGroup>
  ```bash curl theme={null}
  curl -X PUT https://app.flextell.ai/api/v1/treatment-groups/123 \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>" \
    -H "Content-Type: application/json" \
    -d '{
      "is_price_manual": false,
      "treatment_ids": [123, 124]
    }'
  ```
</CodeGroup>

<Warning>
  `treatment_ids` üyeliği tamamen değiştirir. Listede olmayan tedaviler gruptan çıkarılır (`group_id` `null` olur). Listedeki tedaviler, başka bir gruptaydılarsa da bu gruba taşınır. Güncellemede `treatment_ids: []` göndermek grubu boşaltır; anahtarı hiç göndermezseniz üyelik değişmez. Başka kliniğe ait kimlikler sessizce yok sayılır.
</Warning>

Otomatik fiyat şöyle çalışır:

* Üye bir tedavi kaydedilince, silinince, geri gelince veya grup değiştirince ilgili grupların fiyatı yeniden hesaplanır.
* Oluşturmada fiyat, yalnızca `treatment_ids` ile birlikte `is_price_manual: false` gönderirseniz hesaplanır.
* Elle girilen fiyat (`is_price_manual: true`) hiçbir zaman otomatik olarak ezilmez.

## Görseller

Tedavi ve tedavi grubu görselleri ayrı bir endpoint'le değil, Dosyalar API'siyle yönetilir. Görsel, `fileable_type` değeri `treatment` veya `treatment_group` olan bir `image` dosyasıdır. Yükleme biçimi için [Dosya yükleme](/api/istekler/dosya-yukleme), uç noktalar için [Dosyalar](/api/kaynaklar/dosyalar) sayfasına bakın.

* Bir tedavinin görsellerini listelemek için dosya listesini `fileable_type=treatment` ve `fileable_id=<tedavi_id>` ile filtreleyin. Gruplar için `treatment_group` kullanın.
* Yeni görseller sıranın sonuna eklenir. Sıra `sort_order` alanıyla değişir.
* Görseller hastaya dönük içeriktir; AI asistan bunları sohbette gönderebilir.

<Note>
  Görsel yüklemek veya değiştirmek için dosya izninin yanında tedavide `Update:Treatment`, grupta `Update:TreatmentGroup` izni de gerekir.
</Note>

## Kurallar

| Kural | Ayrıntı |
| - | - |
| Silme | Tedavi ve tedavi grubu silme "soft delete"tir. Geri alma veya kalıcı silme endpoint'i yoktur. Ayrıntı: [Silme yaşam döngüsü](/api/istekler/silme-yasam-dongusu) |
| Randevusu olan tedavi | Silinebilir. Tedaviyi içeren randevular kalır ve tedaviye bağlı görünmeye devam eder |
| Silme önizlemesi | `GET /treatments/{id}/deletion-relations`, `[{ "relation": "appointments", "label": "Randevular", "count": 2, "deleted": false }]` biçiminde döner. Tedavi grupları için önizleme yoktur |
| Dolu grubu silme | Silinebilir. Üye tedaviler silinmez |
| Geri Dönüşüm Kutusu | Tedaviler ve tedavi grupları **Geri Dönüşüm Kutusu**'ndan geri yüklenemez |
| AI asistan | Asistan yalnızca aktif tedavileri eşleştirmede kullanır; doktoru olmayan tedavi asistana görünmez. Eşleştirme ad, açıklama, anahtar kelimeler ve aktif grup adlarına bakar. Asistanın önerdiği tedaviler ayrıca takvimi bağlı doktorların tedavileriyle sınırlıdır |
| Pasif tedavi | AI eşleştirmesinde ve randevu seçicilerinde görünmez, ama API'de listelenir |
| Fiyat ve KDV | `price` KDV dahildir. `tax_rate` yalnızca `0`, `1`, `10`, `20` olabilir |
| Kontrol günleri | `extra_info` içindeki `control_min_days` ve `control_max_days` anahtarları Flexy'nin kontrol zamanı hesaplarında kullanılır |

<Tip>
  Randevu formunda tedavi seçmek için `View:Treatment` iznine gerek yoktur; randevu seçicileri `Create:Appointment` veya `Update:Appointment` izniyle açılır.
</Tip>

### İlgili sayfalar

<CardGroup cols={2}>
  <Card title="Doktorlar, asistanlar, odalar" icon="user-round" href="/api/kaynaklar/doktorlar-asistanlar-odalar">
    Doktorları tedavilere bağlama.
  </Card>

  <Card title="Randevular" icon="calendar" href="/api/kaynaklar/randevular">
    Randevuya tedavi ekleme.
  </Card>
</CardGroup>


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