# Personel Departmanları

https://dev.wisecp.com/tr/personel-departmanlari

Destek departmanlarını kuran ve personelini atayan altı uç.

## Genel Bakış

Departmanlar destek taleplerinin **hangi ekibe düşeceğini** belirler. Müşteri talep açarken bir departman seçer; o departmana atanmış personel de talebi üstlenebilecek kişilerdir.

Departman adı ve açıklaması **dil başına** tutulur. Oluştururken kurulumdaki her etkin dilde ad gerekir; güncellerken yalnız gönderdiğiniz diller değişir.

Simge iki biçimde olabilir: bir **yazı tipi simgesi** ya da yüklenmiş bir **görsel**. Görseli kaldıran ayrı bir uç vardır ve kaldırıldığında tür yazı tipine döner.

## Referans

### Departmanları Listeleme

get/api/v1/admin/admins/departments

`Admins/GetDepartments` admin

Destek departmanlarını ve onlara bakan personeli döndürür.

Sorgu 3

pageintKaçıncı sayfa.

limitintSayfa başına kayıt.

searchstringDepartman adında arar.

Dönen alanlar data[] — 7 + meta — 4

idintDepartmanın numarası.

namestringAdı. Panelin geçerli dilinde gelir.

descriptionstringNe için olduğu.

iconstringSimgesi.

icon_typestringSimgenin yazı tipinden mi görselden mi geldiği.

icon_urlstringGörsel simgenin adresi. Yalnız görsel simgede dolar.

appointee_idsint[]Departmana bakan personelin numaraları.

totalintToplam departman. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/admins/departments' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/admins/departments', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const { data } = await res.json();

const orphan = data.filter((d) => d.appointee_ids.length === 0);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/departments');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Personeli olmayan departmana gelen talep KIMSEYE atanamaz; bos listeleri arayin.
$deps   = Api::Admins()->GetDepartments()['data'];
$orphan = array_filter($deps, fn ($d) => ! $d['appointee_ids']);
```

### Departman Oluşturma

post/api/v1/admin/admins/departments

`Admins/CreateDepartment` admin her dil gerekir

Yeni bir destek departmanı açar.

Gövde 7

namesobjectreqDil başına departman adı. Kurulumdaki her etkin dilde ad gerekir.

descriptionsobjectDil başına açıklama.

rankintListedeki sırası.

appointeesint[]Departmana bakacak personel. Talep atamalarında bu kişiler seçilebilir.

icon_typestringSimgenin yazı tipinden mi görselden mi geldiği. Öntanımlı olarak yazı tipi.

iconstringYazı tipi simgesinin sınıfı.

icon_imagestringYüklenecek simge görseli.

Dönen alanlar 201 — data — 7

dataobjectOluşan departman. Detay ucuyla aynı şekildedir.

Hatalar 3

name_required422Etkin dillerden birinde ad eksik.

create_failed422Departman oluşturulamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/admins/departments' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"names":{"tr":"Genel","en":"General"},"appointees":[1,5]}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/admins/departments', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    names: { en: 'General', tr: 'Genel' },
    descriptions: { en: 'General questions' },
    appointees: [1, 5],
    icon_type: 'font',
    icon: 'fa-solid fa-globe',
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/departments');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'names'      => ['en' => 'General', 'tr' => 'Genel'],
        'appointees' => [1, 5],
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Olusturmada HER etkin dilde ad gerekir; guncellemede yalniz gonderdigin diller degisir.
Api::Admins()->CreateDepartment([
    'names'      => ['en' => 'General', 'tr' => 'Genel'],
    'appointees' => [1, 5],
]);
```

### Departman Detayı

get/api/v1/admin/admins/departments/{did}

`Admins/GetDepartment` admin

Tek bir departmanı bütün dilleriyle döndürür.

Dönen alanlar data — 7

idintDepartmanın numarası.

rankintListedeki sırası.

iconstringSimgesi.

icon_typestringSimgenin yazı tipinden mi görselden mi geldiği.

icon_urlstringGörsel simgenin adresi.

appointee_idsint[]Departmana bakan personelin numaraları.

translationsobjectDil başına ad ve açıklama. Bütün diller birlikte gelir.

Hatalar 2

not_found404Departman bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/admins/departments/4' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/admins/departments/${did}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/departments/' . $did);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Liste TEK dil verir, detay hepsini; ceviri isi burada baslar.
$d = Api::Admins()->GetDepartment(['did' => $did])['data'];
$tr = $d['translations']['tr']['name'] ?? '';
```

### Departmanı Güncelleme

patch/api/v1/admin/admins/departments/{did}

`Admins/UpdateDepartment` admin

Departmanın gönderdiğiniz alanlarını ve dillerini değiştirir.

Gövde 7

namesobjectDil başına departman adı. Yalnız gönderdiğiniz diller değişir.

descriptionsobjectDil başına açıklama.

rankintListedeki sırası.

appointeesint[]Departmana bakacak personel. Talep atamalarında bu kişiler seçilebilir.

icon_typestringSimgenin yazı tipinden mi görselden mi geldiği. Öntanımlı olarak yazı tipi.

iconstringYazı tipi simgesinin sınıfı.

icon_imagestringYüklenecek simge görseli.

Dönen alanlar data — 7

dataobjectGüncel departman. Detay ucuyla aynı şekildedir.

Hatalar 3

not_found404Departman bulunamadı.

name_required422Gönderilen bir dilde ad boş.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/admins/departments/4' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"names":{"tr":"Genel Destek"},"appointees":[1,5,8]}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/admins/departments/${did}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    names: { en: 'General Support' },
    appointees: [1, 5, 8],
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/departments/' . $did);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'names'      => ['en' => 'General Support'],
        'appointees' => [1, 5, 8],
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Personel listesi YERINE GECER: birini eklemek icin once mevcut listeyi okuyun.
$d = Api::Admins()->GetDepartment(['did' => $did])['data'];
$d['appointee_ids'][] = $newStaffId;

Api::Admins()->UpdateDepartment([
    'did' => $did, 'appointees' => $d['appointee_ids'],
]);
```

### Departmanı Silme

delete/api/v1/admin/admins/departments/{did}

`Admins/DeleteDepartment` admin

Departmanı kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen departmanın numarası.

Hatalar 3

not_found404Departman bulunamadı.

blocked_by_gate422Bir kanca silmeyi reddetti.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/admins/departments/4' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/admins/departments/${did}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/departments/' . $did);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Departmani silmeden ONCE oradaki talepleri baska bir departmana tasiyin.
Api::Tickets()->UpdateTicket(['id' => $ticketId, 'department_id' => $otherDid]);
Api::Admins()->DeleteDepartment(['did' => $did]);
```

### Simgeyi Kaldırma

delete/api/v1/admin/admins/departments/{did}/icon

`Admins/DeleteDepartmentIcon` admin

Departmanın görsel simgesini kaldırır.

Dönen alanlar data — 7

dataobjectGüncel departman. Simge türü yazı tipine döner.

Hatalar 2

not_found404Departman bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/admins/departments/4/icon' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/admins/departments/${did}/icon`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/departments/' . $did . '/icon');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Kaldirma dosyayi siler ve turu yazi tipine cevirir; simge alani bos kalabilir.
Api::Admins()->DeleteDepartmentIcon(['did' => $did]);
Api::Admins()->UpdateDepartment(['did' => $did, 'icon' => 'fa-solid fa-globe']);
```

## Tuzaklar

> **Personeli olmayan departman talebi öksüz bırakır**
> 
> Bir departmana hiç personel atanmadıysa oraya düşen talep **kimseye atanamaz** ve talep listesinde atanacak kişi seçeneği boş çıkar. Departman yine görünür ve müşteri seçebilir; sorun ancak talep geldiğinde fark edilir. Listeyi boş personel listesi için tarayın.

> **Personel listesi yerine geçer**
> 
> Güncellemede gönderdiğiniz personel listesi mevcut atamaların **yerine geçer**. Bir kişiyi eklemek isterken yalnız onu göndermek diğerlerini departmandan çıkarır ve onların talep görünürlüğü değişir. Önce detayı okuyup listeyi birleştirin.

> **Oluşturma her dilde ad ister, güncelleme istemez**
> 
> Departman oluştururken kurulumdaki **her etkin dilde** ad gerekir; biri eksikse çağrı reddedilir. Güncellemede ise yalnız gönderdiğiniz diller değişir, gerisi korunur. Bu iki farklı davranışı aynı sanmak, oluşturmada beklenmedik bir hata olarak karşınıza çıkar.

> **Silmeden önce talepleri taşıyın**
> 
> Departmanı silmek, ona bağlı destek taleplerinin **dayanağını kaldırır**. Talepler kaybolmaz ama artık var olmayan bir departmanı gösterirler ve listelerde bulunmaları zorlaşır. Silmeden önce o departmandaki talepleri başka bir departmana taşıyın.

> **Simgeyi kaldırmak yerine yenisini koymaz**
> 
> Görsel simgeyi kaldıran uç dosyayı siler ve türü yazı tipine çevirir, ama **yerine bir simge koymaz**. Yazı tipi simgesi alanı boşsa departman simgesiz görünür. Kaldırdıktan sonra bir yazı tipi simgesi yazmak genelde istenen adımdır.

## İlgili Makaleler

- [Personel Hesapları](https://dev.wisecp.com/tr/personel-hesaplari)
- [Talep Referans Listeleri](https://dev.wisecp.com/tr/talep-referans-listeleri)
- [Personel Yetki Grupları](https://dev.wisecp.com/tr/personel-yetki-gruplari)
