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

# Sorun bildirimleri

> Kliniğin Flextell'e ilettiği sorun bildirimlerini API ile oluşturmayı ve listelemeyi anlatır.

`/v1/panel-tickets` kaynağı **Sorun Bildirimi** kayıtlarını yönetir. Sorun Bildirimi, kliniğin Flextell panelinin kendisi hakkında Flextell ekibine ilettiği sorun, soru veya iyileştirme önerisidir. Bildirimi siz açarsınız, Flextell ekibi tek bir cevap metni ve bir durumla yanıtlar.

<Note>
  Bu kaynak, hastalar için açılan **Destek Talepleri**'nden farklıdır. Onlar için [Destek talepleri](/api/kaynaklar/destek-talepleri) sayfasına bakın. Panelde aynı ekran için [Sorun bildirimleri](/panel/sistem/sorun-bildirimleri) sayfasına bakın.
</Note>

Kaynak bilinçli olarak küçüktür. Bildirimin türü, önceliği, eki veya yorum akışı yoktur. Kliniğin tarafında bildirimi düzenleyen, silen ya da cevaplayan bir endpoint de yoktur. Bir bildirim açıldıktan sonra yalnızca okunabilir.

## Endpoint özeti

Tüm isteklerde `Authorization: Bearer <access_token>` ve `X-Tenant: <tenant_id>` başlıkları gerekir. Scope'ların anlamı için [Scope'lar](/api/kimlik-dogrulama/scopelar), izin ve görünürlük kuralları için [İzinler ve görünürlük](/api/izinler-ve-gorunurluk) sayfasına bakın.

| Metot | Endpoint | Açıklama | Scope | İzin |
| - | - | - | - | - |
| GET | `/v1/panel-tickets` | Kendi bildirimlerinizi listeler. | `panel_tickets:read` | `View:PanelTicket` |
| POST | `/v1/panel-tickets` | Bildirim oluşturur. | `panel_tickets:write` | `Create:PanelTicket` |
| GET | `/v1/panel-tickets/{id}` | Tek bildirimi getirir. | `panel_tickets:read` | `View:PanelTicket` |

Kaynakta başka endpoint yoktur. `{id}` yalnızca sayısal olabilir.

Scope ve izin birbirinden bağımsız denetlenir. Yalnızca `panel_tickets:write` scope'u olan bir token listeleyemez. Yalnızca `Create:PanelTicket` iznine sahip bir kullanıcı da listeleyemez. İzin, `X-Tenant` ile seçtiğiniz klinikte aranır; başka bir klinikte verilmiş izin sayılmaz.

Rol editöründe izinler **Panel Destek Talepleri** grubunda görünür.

| İzin | Rol editöründeki etiket | Ne açar |
| - | - | - |
| `View:PanelTicket` | **Görüntüle** | Listeleme ve tek bildirim. |
| `Create:PanelTicket` | **Oluştur** | `POST`. |

Yeni kurulan kliniklerde Satış Temsilcisi ve Satış Direktörü rolleri bu iki izinle gelir; Koordinatör rolü gelmez. Diğer roller için klinik yöneticisi izni rol editöründen verir.

### Görünürlük

Her kullanıcı yalnızca **kendi açtığı** bildirimleri, **`X-Tenant` ile seçtiği klinikte** görür. Aynı kliniğin başka bir kullanıcısının bildirimi ya da sizin başka bir klinikte açtığınız bildirim listede yer almaz. Tek bildirim isteğinde bunlar için 403 değil 404 `RESOURCE_NOT_FOUND` döner. Klinikteki tüm bildirimleri görmeyi sağlayan bir izin yoktur.

## Nesne modeli

Tüm endpoint'ler aynı bildirim nesnesini döner.

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | sayı | Bildirim kimliği. |
| `code` | metin | `PSR-` ile başlayıp 10 büyük harf veya rakamla devam eden benzersiz kod (örneğin `PSR-AB12CD34EF`). Sunucu üretir, istemci belirleyemez. |
| `subject` | metin | Kısa başlık. En çok 255 karakter. |
| `description` | metin | Sorunun ayrıntısı. |
| `status` | metin | `open`, `processing`, `resolved` veya `closed`. |
| `status_label` | metin | Durumun Türkçe etiketi. `Accept-Language` değerinden bağımsız olarak her zaman Türkçedir. |
| `admin_notes` | metin veya `null` | Flextell ekibinin cevabı. Cevap gelene kadar `null` olur. |
| `user_id` | sayı | Bildirimi açan kullanıcı. Her zaman istek yapan kullanıcıdır. |
| `tenant_id` | sayı | Bildirimin bağlı olduğu klinik. |
| `user` | nesne | Bildirimi açan kullanıcı: `id`, `name`. |
| `tenant` | nesne | Klinik: `id`, `name`. |
| `created_at`, `updated_at` | tarih | Kliniğin saat diliminde, saat farkıyla (örneğin `2026-10-12T14:30:00+03:00`). Saat dilimi yanıttaki `meta.timezone` alanında ve `X-Timezone` başlığında da gelir. |

<Info>
  `admin_notes` yalnızca okunur. Panel bu alanı göstermez; Flextell ekibinin cevabına yalnızca API yanıtından ulaşırsınız. Bildirimin durumu da yalnızca Flextell ekibi tarafından değiştirilir.
</Info>

## Oluşturma

`POST /v1/panel-tickets` yeni bir bildirim açar. İstek gövdesi JSON olmalıdır.

<ParamField body="subject" type="string" required>
  Kısa başlık. En çok 255 karakter.
</ParamField>

<ParamField body="description" type="string" required>
  Sorunun ayrıntısı. API üst sınır uygulamaz; panel formu 5000 karakterle sınırlar. Panelle aynı davranış için 5000 karakteri aşmayın.
</ParamField>

Başka alanlar yok sayılır. `user_id`, `tenant_id`, `status`, `code` veya `admin_notes` gönderseniz de bildirim yine açık durumda, sizin adınıza ve `X-Tenant` kliniğinde açılır.

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST "https://app.flextell.ai/api/v1/panel-tickets" \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>" \
    -H "Content-Type: application/json" \
    -d '{
      "subject": "Takvimde randevu saatleri kayıyor",
      "description": "Haftalık görünümde 14:30 randevusu 14:00 satırında görünüyor. Ayşe Yılmaz adlı hastanın kaydında fark ettik."
    }'
  ```

  ```javascript JavaScript theme={null}
  const res = await fetch("https://app.flextell.ai/api/v1/panel-tickets", {
    method: "POST",
    headers: {
      Authorization: "Bearer <access_token>",
      "X-Tenant": "<tenant_id>",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      subject: "Takvimde randevu saatleri kayıyor",
      description:
        "Haftalık görünümde 14:30 randevusu 14:00 satırında görünüyor.",
    }),
  });
  const { data } = await res.json();
  ```
</CodeGroup>

Başarılı istek 201 ve bildirim nesnesini döner:

```json theme={null}
{
  "success": true,
  "data": {
    "id": 123,
    "code": "PSR-AB12CD34EF",
    "subject": "Takvimde randevu saatleri kayıyor",
    "description": "Haftalık görünümde 14:30 randevusu 14:00 satırında görünüyor.",
    "status": "open",
    "status_label": "Açık",
    "admin_notes": null,
    "user_id": 12,
    "tenant_id": 5,
    "user": { "id": 12, "name": "Ayşe Yılmaz" },
    "tenant": { "id": 5, "name": "Örnek Klinik" },
    "created_at": "2026-10-12T14:30:00+03:00",
    "updated_at": "2026-10-12T14:30:00+03:00"
  },
  "meta": { "timezone": "Europe/Istanbul" }
}
```

<Warning>
  Oluşturma isteği [idempotent](/api/istekler/idempotency) değildir. Aynı isteği iki kez gönderirseniz iki ayrı bildirim açılır. Zaman aşımında yeniden denemeden önce listeyi kontrol edin.
</Warning>

<Note>
  Kurulumunu henüz tamamlamamış bir klinik de bildirim açabilir; bu kaynak kurulum kilidinin dışında tutulur.
</Note>

## Listeleme

`GET /v1/panel-tickets` yalnızca sizin açtığınız bildirimleri sayfalı bir liste olarak döner. Genel kurallar için [Sayfalama](/api/istekler/sayfalama) ve [Filtreleme ve sıralama](/api/istekler/filtreleme-ve-siralama) sayfalarına bakın. Yanıtta `success` alanı yoktur; gövde `data`, `links` ve `meta` alanlarından oluşur. Bu kaynağa özgü parametreler:

| Parametre | Açıklama |
| - | - |
| `status` | Durum filtresi: `open`, `processing`, `resolved` veya `closed`. |
| `search` | En çok 255 karakter. Bildirim kodunda, başlıkta ve açıklamada arar. |
| `sort_by` | `created_at`, `updated_at`, `status`, `code`. Varsayılan `created_at`. |
| `sort_order` | `asc` veya `desc`. Varsayılan `desc`. |
| `per_page` | 1 ile 100 arası. Varsayılan 15. |
| `page` | 1 veya daha büyük. |

Filtreler birlikte uygulanır. Boş gönderilen parametreler (`status=&search=`) hiç gönderilmemiş sayılır. Geçersiz bir değer, örneğin `sort_by=subject`, 422 `VALIDATION_FAILED` döner.

Arama şöyle çalışır:

* Terim, harf ve rakam olmayan her karakterden bölünür. Her sözcük önek olarak eşleşir ve tüm sözcükler birlikte aranır.
* Arama `admin_notes` alanına bakmaz.
* Hiç harf veya rakam içermeyen bir terim (`!!!`) boş liste döner.
* `search` kullandığınızda sonuçlar önce eşleşme uygunluğuna, sonra `sort_by` değerine göre sıralanır.

<Warning>
  `sort_by=status` durumları iş akışı sırasına göre değil, ham değerin alfabetik sırasına göre sıralar: `closed`, `open`, `processing`, `resolved`.
</Warning>

Bu endpoint'te tarih aralığı filtresi (`created_at_from`, `created_at_to`) yoktur.

```bash theme={null}
curl "https://app.flextell.ai/api/v1/panel-tickets?status=open&search=takvim&per_page=25" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>"
```

Tek bir bildirimi `GET /v1/panel-tickets/{id}` ile alırsınız. Yanıt, oluşturma yanıtıyla aynı biçimdedir.

## Durumlar

Her yeni bildirim `open` olarak başlar. Durumu yalnızca Flextell ekibi değiştirir; kliniğin tarafında durum değiştiren bir endpoint yoktur. Sunucu bir durum makinesi uygulamaz, bu yüzden bir bildirim herhangi bir durumdan herhangi birine geçebilir ve yeniden açılabilir.

| `status` | `status_label` | Anlam |
| - | - | - |
| `open` | **Açık** | Her yeni bildirimin ilk durumu. |
| `processing` | **İşleniyor** | Flextell ekibi bildirimle ilgileniyor. |
| `resolved` | **Çözüldü** | Bildirim çözüldü. |
| `closed` | **Kapalı** | Bildirim kapatıldı. |

Panel durum rozetlerini şu renklerle gösterir: `open` mavi, `processing` sarı, `resolved` yeşil, `closed` gri.

## Hatalar

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

| Kod | HTTP | Ne zaman |
| - | - | - |
| `UNAUTHENTICATED` | 401 | Token yok veya geçersiz. |
| `FORBIDDEN` | 403 | Endpoint için gereken scope veya `PanelTicket` izni eksik. |
| `RESOURCE_NOT_FOUND` | 404 | Bildirim yok, başka bir kullanıcıya ya da başka bir kliniğe ait. Mesaj: `Panel destek talebi bulunamadı`. |
| `VALIDATION_FAILED` | 422 | `subject` veya `description` eksik, `subject` 255 karakteri aşıyor, `status`, `sort_by`, `sort_order`, `per_page` ya da `page` geçersiz. |
| `TENANT_HEADER_REQUIRED` | 400 | `X-Tenant` başlığı eksik. |
| `TENANT_NOT_FOUND` | 404 | Klinik bulunamadı veya token'ın bağlı olduğu klinikte üye değilsiniz. |
| `TOO_MANY_REQUESTS` | 429 | Oran sınırı aşıldı. [Oran sınırları](/api/istekler/oran-sinirlari) sayfasına bakın. |

Sayısal olmayan bir `{id}` bu hata kodlarından birini değil, düz bir 404 döner.


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