# Müşteri Yapılandırması

https://dev.wisecp.com/tr/musteri-yapilandirmasi

Müşteri gruplarını, rozet eşiklerini ve güven puanı kademelerini okuyan ve kaydeden altı uç.

## Genel Bakış

Bu altı uç kurulum genelindeki müşteri yapılandırmasını okur ve yazar: gruplar, rozet eşikleri ve güven puanı kademeleri. Hiçbiri tek bir müşteriye bakmaz.

Güven puanı dört eksenden hesaplanır: hizmet sayısı, gelir, hesap yaşı ve destek talebi. Her eksen bir kademe listesidir; müşteri hangi kademeye düşerse o kademenin puanını alır.

## Referans

### Grupları Listeleme

get/api/v1/admin/clients/groups

`Clients/GetClientGroups` admin

Kurulumdaki tüm müşteri gruplarını döndürür.

Dönen alanlar data[] — 11

idintMevcut grubun kimliği. Yeni grupta boş bırakın ya da `0` gönderin.

namestringzorunluGrup adı. Boşsa o grup sessizce atlanır.

descriptionstringAçıklama.

colorstringRozet rengi. Varsayılan `#095174`.

iconstringİkon adı.

discount_ratenumberGruba uygulanan indirim oranı.

discount_productsstringİndirimin geçerli olduğu ürün grupları. Virgülle ayrılmış kimlikler.

combine_discountboolİndirimi diğer indirimlerle birleştirir.

protectionboolAçıkken otomatik askıya alma ve iptal görevleri grup üyelerinin hizmetlerini atlar.

priorityintAçıkken (1) grup üyelerinin destek talepleri personel kuyruğunun en üstünde listelenir.

separate_invoicesboolGruptaki müşteriler için ayrı fatura keser.

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

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

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

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

```php
$response = Api::Clients()->GetClientGroups();
```

### Grupları Kaydetme

put/api/v1/admin/clients/groups

`Clients/SaveClientGroups` admin listenin tamamı

Grup listesini olduğu gibi kaydeder. Gönderdiğiniz liste yeni gerçektir: içinde olmayan grup silinir.

Gövde 1

groupsobject[]zorunlu 11 alanGrupların tamamı.

idintMevcut grubun kimliği. Yeni grupta boş bırakın ya da `0` gönderin.

namestringzorunluGrup adı. Boşsa o grup sessizce atlanır.

descriptionstringAçıklama.

colorstringRozet rengi. Varsayılan `#095174`.

iconstringİkon adı.

discount_ratenumberGruba uygulanan indirim oranı.

discount_productsstringİndirimin geçerli olduğu ürün grupları. Virgülle ayrılmış kimlikler.

combine_discountboolİndirimi diğer indirimlerle birleştirir.

protectionboolAçıkken otomatik askıya alma ve iptal görevleri grup üyelerinin hizmetlerini atlar.

priorityintAçıkken (1) grup üyelerinin destek talepleri personel kuyruğunun en üstünde listelenir.

separate_invoicesboolGruptaki müşteriler için ayrı fatura keser.

Dönen alanlar data[] — 11

dataobject[]Güncel grup listesi. Listeleme ucuyla aynı şekildedir.

Hatalar 2

groups_invalid422`groups` bir dizi değil.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/clients/groups' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"groups":[{"id":5,"name":"VIP","discount_rate":10,"discount_products":"1,2","priority":1}]}'
```

```javascript
// Once listeyi okuyun, uzerinde degisiklik yapin, tamamini geri gonderin.
const current = await (await fetch('https://panel.ornek.com/api/v1/admin/clients/groups', {
  headers: { Authorization: `Bearer ${apiKey}` },
})).json();

const groups = current.data.map((g) =>
  g.id === 5 ? { ...g, discount_rate: 15 } : g);

const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/groups', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ groups }),
});
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/groups');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'groups' => [
            [
                'id'            => 5,
                'name'          => 'VIP',
                'discount_rate' => 10,
                'priority'      => 1,
            ],
        ],
    ]),
]);

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

```php
// Tek grubu degistirmek icin bile listenin TAMAMI gonderilir.
$groups = Api::Clients()->GetClientGroups()['data'];

foreach ($groups as &$group)
    if ((int) $group['id'] === 5) $group['discount_rate'] = 15;
unset($group);

$response = Api::Clients()->SaveClientGroups(['groups' => $groups]);
```

### Rozet Eşiklerini Getirme

get/api/v1/admin/clients/badge-settings

`Clients/GetBadgeSettings` admin

Müşteri rozetlerinin kazanılma eşiklerini döndürür. Hiç kaydedilmemişse varsayılanlar gelir.

Dönen alanlar data — 5

loyal_yearsintSadık müşteri rozeti için gereken yıl.

rev_silverintGümüş rozeti için gelir eşiği.

rev_goldintAltın rozeti için gelir eşiği.

multi_service_minintÇoklu hizmet rozeti için en az hizmet sayısı.

experienced_maxintDeneyimli rozetinin üst sınırı.

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

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

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

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

```php
$response = Api::Clients()->GetBadgeSettings();
```

### Rozet Eşiklerini Kaydetme

put/api/v1/admin/clients/badge-settings

`Clients/SaveBadgeSettings` admin değerler kırpılır

Beş eşiği birlikte kaydeder. Göndermediğiniz eşik varsayılanına döner; hepsini birlikte gönderin. Değerler güvenli aralığa çekilir, geçersiz olan reddedilmez.

Gövde 5

loyal_yearsintSadık müşteri yıl eşiği. En az 1.

rev_silverintGümüş gelir eşiği. En az 0.

rev_goldintAltın gelir eşiği. Gümüşten küçük ya da eşit gönderirseniz `rev_silver + 1` yapılır.

multi_service_minintÇoklu hizmet rozeti minimumu. En az 1.

experienced_maxintDeneyimli rozeti üst sınırı. En az 0.

Dönen alanlar data — 5

dataobjectGüncel eşikler. Getirme ucuyla aynı şekildedir.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/clients/badge-settings' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"loyal_years":5,"rev_silver":500,"rev_gold":1000,"multi_service_min":5,"experienced_max":15}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/badge-settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    loyal_years: 5,
    rev_silver: 500,
    rev_gold: 1000,
    multi_service_min: 5,
    experienced_max: 15,
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/badge-settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'loyal_years'       => 5,
        'rev_silver'        => 500,
        'rev_gold'          => 1000,
        'multi_service_min' => 5,
        'experienced_max'   => 15,
    ]),
]);

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

```php
$response = Api::Clients()->SaveBadgeSettings([
    'rev_silver' => 500,
    'rev_gold'   => 400,
]);

// Yanit kaydedilen degeri tasir: rev_gold burada 501 olarak doner.
$saved = $response['data']['rev_gold'];
```

### Güven Puanı Kademelerini Getirme

get/api/v1/admin/clients/trust-score-settings

`Clients/GetTrustScoreSettings` admin

Güven puanının dört eksenindeki kademeleri döndürür. Kaydedilmemişse varsayılanlar gelir.

Dönen alanlar data — 4

servicesobject[] 2 alanHizmet sayısı ekseni.

maxint | nullzorunluKademenin üst sınırı. `null` üst sınırsız son kademedir.

pointsintzorunluKademeye karşılık gelen puan.

revenueobject[] 2 alanGelir ekseni.

maxint | nullzorunluKademenin üst sınırı. `null` üst sınırsız son kademedir.

pointsintzorunluKademeye karşılık gelen puan.

ageobject[] 2 alanHesap yaşı ekseni.

maxint | nullzorunluKademenin üst sınırı. `null` üst sınırsız son kademedir.

pointsintzorunluKademeye karşılık gelen puan.

ticketsobject[] 2 alanDestek talebi ekseni.

maxint | nullzorunluKademenin üst sınırı. `null` üst sınırsız son kademedir.

pointsintzorunluKademeye karşılık gelen puan.

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/clients/trust-score-settings' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
$response = Api::Clients()->GetTrustScoreSettings();
```

Yanıt 200

```json
{
  "data": {
    "services": [
      { "max": 5, "points": 20 },
      { "max": null, "points": 30 }
    ],
    "revenue": [{ "max": 1000, "points": 25 }],
    "age":     [{ "max": 12, "points": 10 }],
    "tickets": [{ "max": null, "points": 5 }]
  }
}
```

### Güven Puanı Kademelerini Kaydetme

put/api/v1/admin/clients/trust-score-settings

`Clients/SaveTrustScoreSettings` admin dört eksen birlikte

Dört ekseni birlikte kaydeder. Göndermediğiniz eksen boş kalır ve o eksenin kademeleri silinir; korumak istediğiniz her ekseni gönderin. Puanlar 0-100 aralığına, negatif eşik 0'a çekilir; geçersiz değer reddedilmez.

Gövde 4

servicesobject[] 2 alanHizmet sayısı kademeleri.

maxint | nullzorunluKademenin üst sınırı. `null` üst sınırsız son kademedir.

pointsintzorunluKademeye karşılık gelen puan.

revenueobject[] 2 alanGelir kademeleri.

maxint | nullzorunluKademenin üst sınırı. `null` üst sınırsız son kademedir.

pointsintzorunluKademeye karşılık gelen puan.

ageobject[] 2 alanHesap yaşı kademeleri.

maxint | nullzorunluKademenin üst sınırı. `null` üst sınırsız son kademedir.

pointsintzorunluKademeye karşılık gelen puan.

ticketsobject[] 2 alanDestek talebi kademeleri.

maxint | nullzorunluKademenin üst sınırı. `null` üst sınırsız son kademedir.

pointsintzorunluKademeye karşılık gelen puan.

Dönen alanlar data — 4

dataobjectGüncel kademeler. Getirme ucuyla aynı şekildedir.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/clients/trust-score-settings' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"services":[{"max":5,"points":20},{"max":null,"points":30}]}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/clients/trust-score-settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    services: [
      { max: 5, points: 20 },
      { max: null, points: 30 },
    ],
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/clients/trust-score-settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'services' => [
            ['max' => 5,    'points' => 20],
            ['max' => null, 'points' => 30],
        ],
    ]),
]);

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

```php
// Son kademe 'max' => null olmali, yoksa esigin ustundeki musteri puan almaz.
$response = Api::Clients()->SaveTrustScoreSettings([
    'services' => [
        ['max' => 5,    'points' => 20],
        ['max' => null, 'points' => 30],
    ],
]);
```

## Tuzaklar

> **Grup kaydı listenin tamamını değiştirir**
> 
> Kaydetme ucu birleştirme yapmaz. Gönderdiğiniz listede olmayan bir grup **silinir**, o gruba bağlı müşteriler grupsuz kalır. Tek bir grubu değiştirmek için önce listeyi okuyun, üzerinde değişikliği yapın, tamamını geri gönderin.

> **Altın eşiği gümüşün üstüne itilir**
> 
> Altın gelir eşiğini gümüşe eşit ya da altında gönderirseniz hata almazsınız; değer sessizce `rev_silver + 1` yapılır. Ne kaydedildiğini yanıttan okuyun.

> **Son kademe üst sınırsız olmalı**
> 
> Bir eksenin son kademesinde `max` alanını `null` bırakın. Aksi hâlde en yüksek sınırın üstündeki müşteri hiçbir kademeye düşmez ve o eksenden puan almaz.

## İlgili Makaleler

- [Müşteri Uçları](https://dev.wisecp.com/tr/musteri-uclari)
- [Hesap Durumu ve Toplu İşlem](https://dev.wisecp.com/tr/hesap-durumu-ve-toplu-islem)
