# Personel Hesapları

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

Panele giren personel hesaplarını açan, güncelleyen ve kaldıran altı uç.

## Genel Bakış

Personel hesapları **panele girebilen** kişilerdir; müşterilerden ayrı bir kayıt kümesinde yaşarlar ama e-posta adresleri müşterilerle **aynı havuzu paylaşır**.

Bir hesabın ne yapabileceğini **yetki grubu** belirler; hangi destek taleplerini göreceğini ise atandığı **departmanlar**. İkisi de ayrı uçlardan yönetilir.

Kurulumun **kurucu hesabı** korumalıdır: silinemez ve yetkisi değiştirilemez. Kendi hesabınız da kısmen korumalıdır; kendi yetkinizi düşüremez ve kendinizi silemezsiniz.

## Referans

### Personeli Listeleme

get/api/v1/admin/admins

`Admins/GetStaff` admin

Panele giriş yapabilen hesapları döndürür.

Sorgu 3

pageintKaçıncı sayfa.

limitintSayfa başına kayıt. Bir ile yüz arasına çekilir.

searchstringAd, e-posta, telefon ve numarada arar.

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

idintPersonelin numarası.

full_namestringAdı soyadı.

emailstringE-posta adresi.

statusstringHesabın etkin olup olmadığı.

privilege_namestringBağlı olduğu yetki grubunun adı.

departmentsstring[]Atandığı departmanların adları.

is_rootboolKurulumun kurucu hesabı mı. Bu hesap silinemez ve yetkisi değiştirilemez.

totalintToplam personel. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa. Sıfır, son sayfadasınız demektir.

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' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
// Kurucu hesap ayri isaretlenir; toplu islem yazarken onu disarida birakin.
$staff = Api::Admins()->GetStaff()['data'];
$rest  = array_filter($staff, fn ($s) => ! $s['is_root']);
```

### Personel Hesabı Açma

post/api/v1/admin/admins

`Admins/CreateStaff` admin panel erişimi verir

Panele girebilecek yeni bir hesap açar.

Gövde 15

full_namestringreqAdı soyadı.

emailstringreqE-posta adresi. Personel ve müşteriler arasında benzersiz olmalı.

passwordstringreqHesabın parolası.

password_confirmationstringreqParolanın tekrarı.

privilegeintreqBağlanacağı yetki grubu. Hesabın panelde ne yapabileceğini bu belirler.

langstringreqPanelin dili.

display_namestringMüşterilere gösterilen ad. Boş bırakılırsa gerçek ad görünür.

phonestringTelefon numarası. Yeterince uzunsa biçimlenir ve benzersizliği denetlenir.

departmentsint[]Atanacağı departmanlar. Güncellemede gönderilmezse mevcut atamalar korunur.

signatureobject | stringDil başına yanıt imzası.

notesstringHesaba düşülen not.

display_modestringPanelin görünüm tercihi.

menu_statestringMenünün açılış biçimi.

statusstringHesabın etkin olup olmadığı. Öntanımlı olarak etkindir.

avatarstringProfil görseli.

Dönen alanlar 201 — data

dataobjectAçılan hesap. Detay ucuyla aynı şekildedir.

Hatalar 4

staff_save_failed422E-posta ya da telefon kullanımda, yetki grubu geçersiz ya da parolalar uyuşmuyor.

create_failed422Hesap açılamadı.

blocked_by_gate422Bir kanca hesabı reddetti.

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' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"full_name":"Ayse Yilmaz","email":"ayse@ornek.com","password":"G1zliParola","password_confirmation":"G1zliParola","privilege":2,"lang":"tr"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/admins', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    full_name: 'John Doe',
    email: 'john@example.com',
    password: secret,
    password_confirmation: secret,
    privilege: 2,
    lang: 'en',
    departments: [1, 2],
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'full_name'             => 'John Doe',
        'email'                 => 'john@example.com',
        'password'              => $secret,
        'password_confirmation' => $secret,
        'privilege'             => 2,
        'lang'                  => 'en',
    ]),
]);

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

```php
// Yetki grubu hesabin NE YAPABILECEGINI belirler; en genis grubu varsayilan yapmayin.
Api::Admins()->CreateStaff([
    'full_name'             => 'John Doe',
    'email'                 => $email,
    'password'              => $secret,
    'password_confirmation' => $secret,
    'privilege'             => $limitedGroupId,
    'lang'                  => 'en',
]);
```

### Personel Detayı

get/api/v1/admin/admins/{id}

`Admins/GetStaffMember` admin

Tek bir personel hesabını bütün alanlarıyla döndürür.

Dönen alanlar data — 21

idintPersonelin numarası.

statusstringHesabın etkin olup olmadığı.

full_namestringAdı soyadı.

namestringAdı.

surnamestringSoyadı.

emailstringE-posta adresi.

phonestringTelefon numarası.

langstringPanelin dili.

privilege_idintBağlı olduğu yetki grubu.

gsm_ccstringCep telefonunun ülke kodu.

gsmstringCep telefonu numarası.

residence_addressstringAdresi.

notesstringHesaba düşülen not.

display_modestringPanelin görünüm tercihi.

menu_statestringMenünün açılış biçimi.

signatureobject | stringDil başına yanıt imzası.

has_2faboolİki adımlı doğrulamanın açık olup olmadığı.

authentication_methodsstring[]Açık olan doğrulama yöntemlerinin adları. Yalnız adları döner, hiçbir gizli değer dönmez.

department_idsint[]Atandığı departmanların numaraları.

avatar_urlstringProfil görselinin adresi.

is_rootboolKurulumun kurucu hesabı mı.

Hatalar 2

not_found404Personel 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/5' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
// Parola HICBIR KOSULDA donmez; dogrulama tarafinda da yalniz yontem ADLARI gorunur.
$s = Api::Admins()->GetStaffMember(['id' => $id])['data'];
```

### Personeli Güncelleme

patch/api/v1/admin/admins/{id}

`Admins/UpdateStaff` admin bazı alanlar korunur

Personel hesabının gönderdiğiniz alanlarını değiştirir.

Gövde 15

full_namestringAdı soyadı.

emailstringE-posta adresi.

passwordstringYeni parola. Tekrarıyla birlikte gönderilir.

password_confirmationstringYeni parolanın tekrarı.

privilegeintYetki grubu. Kurucu hesapta ve kendi hesabınızda yok sayılır.

langstringPanelin dili.

display_namestringMüşterilere gösterilen ad. Boş bırakılırsa gerçek ad görünür.

phonestringTelefon numarası. Yeterince uzunsa biçimlenir ve benzersizliği denetlenir.

departmentsint[]Atanacağı departmanlar. Güncellemede gönderilmezse mevcut atamalar korunur.

signatureobject | stringDil başına yanıt imzası.

notesstringHesaba düşülen not.

display_modestringPanelin görünüm tercihi.

menu_statestringMenünün açılış biçimi.

statusstringHesabın etkin olup olmadığı. Öntanımlı olarak etkindir.

avatarstringProfil görseli.

Dönen alanlar data — 21

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

Hatalar 3

not_found404Personel bulunamadı.

staff_save_failed422E-posta ya da telefon kullanımda, yetki grubu geçersiz ya da parolalar uyuşmuyor.

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/5' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"full_name":"Ayse Kaya","departments":[1,3]}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/admins/${id}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ full_name: 'Jane Doe', departments: [1, 3] }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['full_name' => 'Jane Doe', 'departments' => [1, 3]]),
]);

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

```php
// Departman listesi gonderilirse YERINE GECER; korumak istiyorsaniz alani hic gondermeyin.
Api::Admins()->UpdateStaff(['id' => $id, 'full_name' => 'Jane Doe']);
```

### Personeli Silme

delete/api/v1/admin/admins/{id}

`Admins/DeleteStaff` admin

Personel hesabını kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen hesabın numarası.

Hatalar 6

not_found404Personel bulunamadı.

root_protected422Kurucu hesap silinemez.

self_protected422Kendi hesabınızı silemezsiniz.

delete_failed422Hesap silinemedi.

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/6' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/' . $id);
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
// Ayrilan personelde silmek yerine hesabi KAPATIN: gecmis islemlerin sahibi kayitli kalir.
Api::Admins()->UpdateStaff(['id' => $id, 'status' => 'passive']);
```

### İkinci Adımı Kapatma

post/api/v1/admin/admins/{id}/disable-authentication

`Admins/DisableStaffAuthentication` admin panelde parola ister

Personelin girişteki ikinci doğrulama adımını kaldırır. Açık oturumları kapanır ve güvenilen cihazları silinir.

Gövde 1

methodstringreqKapatılacak doğrulama yöntemi. Adı personel detayındaki listeden alınır.

Dönen alanlar data — 2

disabledboolKapatma çalıştı mı.

methodstringKapatılan yöntem.

Hatalar 2

not_found404Personel bulunamadı.

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/5/disable-authentication' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"method":"Totp"}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/admins/${id}/disable-authentication`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ method: 'Totp' }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/admins/' . $id . '/disable-authentication');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['method' => 'Totp']),
]);

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

```php
// Panelde bu islem YONETICI PAROLASI ister; API'de tek kapi anahtarin kapsamidir.
$s = Api::Admins()->GetStaffMember(['id' => $id])['data'];
foreach ($s['authentication_methods'] as $m)
    Api::Admins()->DisableStaffAuthentication(['id' => $id, 'method' => $m]);
```

## Tuzaklar

> **E-posta havuzu müşterilerle ortaktır**
> 
> Bir personel hesabının e-postası yalnız diğer personel arasında değil, **müşteriler arasında da** benzersiz olmalıdır. Aynı adresle hem müşteri hem personel hesabı açılamaz. Kendi ekibini müşteri olarak da kaydeden bir kurulumda bu, beklenmedik bir çakışma hatası olarak karşınıza çıkar.

> **Kendi yetkinizi düşüremezsiniz**
> 
> Güncelleme çağrısı, **kurucu hesapta ve kendi hesabınızda** yetki grubu ile durum alanlarını sessizce yok sayar. Yani kendinizi yanlışlıkla kilitleyemezsiniz, ama gönderdiğiniz değerin uygulandığını da varsayamazsınız. Yanıttaki yetki grubunu okuyup beklediğinizle karşılaştırın.

> **Departman listesi yerine geçer**
> 
> Güncellemede departman listesi gönderirseniz mevcut atamaların **yerine geçer**. Bir departman eklemek isterken yalnız onu göndermek diğerlerini düşürür. Mevcut atamaları korumak istiyorsanız alanı hiç göndermeyin; eklemek istiyorsanız önce detayı okuyup birleştirin.

> **İkinci adımı kapatmak panelden kolaydır**
> 
> Panelde bir personelin ikinci doğrulama adımını kapatmak **yönetici parolası** ister; bu uçta tek kapı anahtarın kapsamıdır. Yani bu kapsamı taşıyan bir anahtar, bir hesabın ek korumasını doğrudan kaldırabilir. Anahtarları dağıtırken bu kapsamı ayrı değerlendirin.

> **Ayrılan personeli silmek yerine kapatın**
> 
> Bir personeli silmek hesabı **ortadan kaldırır**; oysa yaptığı işlemler, yazdığı yanıtlar ve düştüğü notlar kayıtlarda ona işaret etmeye devam eder. Hesabı kapatmak girişi engeller ve geçmişi okunur bırakır. Kurucu hesap ve kendi hesabınız zaten silinemez.

## İlgili Makaleler

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