# Satış Ortakları

https://dev.wisecp.com/tr/satis-ortaklari

Programdaki satış ortaklarını gören, arayan, açıp kapatan ve silen dört uç.

## Genel Bakış

Satış ortaklığı, bir müşterinin kendi bağlantısıyla getirdiği müşteriler üzerinden komisyon kazandığı programdır. Bu makale programdaki **kişileri** yönetir: kimler var, hangisi açık, hangisi silinecek.

Her kaydın **iki numarası** vardır. `id` satış ortağı kaydına, `owner_id` ise arkasındaki müşteriye aittir. Atama uçları müşteri numarasıyla konuşur; ikisini karıştırmak sessiz bir yanlış atamaya yol açar.

Arama ucu ayrı durur çünkü atama ekranlarını besler: numarayı bilmeyen bir arayüz önce burada ad yazar, sonra dönen numarayı atamaya verir.

## Referans

### Satış Ortaklarını Listeleme

get/api/v1/admin/affiliates

`Affiliates/GetAffiliates` admin

Programdaki satış ortaklarını kazanç ve yönlendirme özetleriyle döndürür.

Sorgu 4

pageintKaçıncı sayfa.

limitintSayfa başına kayıt. En çok 100.

searchstringAd, şirket, e-posta, ortak numarası ve müşteri numarasında arar.

statusstringDurum süzgeci: `active` ya da `inactive`.

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

idintSatış ortağı kaydının numarası.

owner_idintOrtağın arkasındaki müşteri numarası. Atamalarda kullanılan numara budur.

user_idintAynı müşteri numarası. Sorgu birleştirmesinden gelen ikinci ad.

full_namestringMüşterinin adı soyadı.

company_namestringŞirket adı.

emailstringE-posta adresi.

disabledintKapalı mı. 0 açık, 1 kapalı demektir.

balancestringÖdenmeyi bekleyen kazanç. Dört ondalıklı metin.

currencyintKazancın para birimi numarası.

referralsintYönlendirdiği müşteri sayısı.

hitsintBağlantısına gelen tıklama sayısı.

total_paidstringBugüne kadar ödenen tutar. Yalnız tamamlanmış talepleri sayar.

datestringPrograma katıldığı an.

totalintToplam ortak sayısı. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

next_pageintSonraki sayfa. Son sayfada sıfı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/affiliates?status=active&limit=50' \
  -H "Authorization: Bearer $API_KEY"
```

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

const { data } = await res.json();
const owing = data.filter((a) => Number(a.balance) > 0);
```

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

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

```php
// id ORTAGIN numarasi, owner_id ARKASINDAKI musteriye ait; atamalar owner_id ile konusur.
$rows = Api::Affiliates()->GetAffiliates([], ['status' => 'active'])['data'];
$byClient = array_column($rows, 'balance', 'owner_id');
```

### Ortak, Müşteri ve Hizmet Arama

get/api/v1/admin/affiliates/select

`Affiliates/SelectForAffiliate` admin en çok 10 sonuç

Atama ekranlarını besleyen arama; numara yerine ad yazmanızı sağlar.

Sorgu 2

typestringNe aranacağı: `affiliate`, `client` ya da `service`. Öntanımlı olarak ortak aranır.

qstringArama metni. `search` adını da kabul eder.

Dönen alanlar data — 2

typestringAranan tür. Gönderdiğinizin aynısı.

resultsobject[] results[]Bulunanlar.

idintBulunan kaydın numarası.

textstringEkranda gösterilecek etiket. Hizmette numara ve ad, kişide ad ile şirket birleştirilir.

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/affiliates/select?type=client&q=jane' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/affiliates/select');
url.searchParams.set('type', 'client');
url.searchParams.set('q', term);

const res  = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
const body = await res.json();
```

```php
$qs = http_build_query(['type' => 'client', 'q' => $term]);
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/select?' . $qs);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// En cok 10 sonuc doner: bu bir arama kutusudur, liste degil.
$hits = Api::Affiliates()->SelectForAffiliate([], ['type' => 'client', 'q' => $term])['data'];
$exact = count($hits['results']) === 1 ? $hits['results'][0]['id'] : 0;
```

### Ortağı Açma ve Kapatma

put/api/v1/admin/affiliates/{aid}/status

`Affiliates/SetAffiliateStatus` admin

Satış ortağını etkinleştirir ya da devre dışı bırakır.

Gövde 1

enabledboolreqOrtak açık mı. Kayıttaki ters adlı alana çevrilir.

Dönen alanlar data — 2

idintSatış ortağının numarası.

enabledboolGüncel durum.

Hatalar 2

not_found404Satış ortağı bulunamadı.

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/affiliates/7/status' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"enabled":false}'
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/' . $aid . '/status');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['enabled' => false]),
]);

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

```php
// Kapatmak kazanci SILMEZ: bakiye durur, odeme talebi acilabilir.
Api::Affiliates()->SetAffiliateStatus(['aid' => $aid, 'enabled' => false]);
```

### Ortağı Silme

delete/api/v1/admin/affiliates/{aid}

`Affiliates/DeleteAffiliate` admin geri alınamaz

Satış ortağını ve ona bağlı bütün kayıtları siler.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen ortağın numarası.

Hatalar 2

not_found404Satış ortağı 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/affiliates/7' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/affiliates/' . $aid);
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
// Panel bu adimda yonetici sifresi ister; API'de kapsam yeter. Once kapatmayi dusunun.
Api::Affiliates()->SetAffiliateStatus(['aid' => $aid, 'enabled' => false]);
// Api::Affiliates()->DeleteAffiliate(['aid' => $aid]);   // kazanc gecmisi de gider
```

## Tuzaklar

> **İki numara: ortak numarası ile müşteri numarası**
> 
> Listede `id` satış ortağı kaydının, `owner_id` arkasındaki müşterinin numarasıdır. Müşteri kaydında tutulan bağlantı alanı da **müşteri numarasını** saklar, ortak numarasını değil. Atama ve durum uçları farklı numara beklediği için ikisini ayırt edin.

> **Kapalılık iki ayrı kelimeyle konuşulur**
> 
> Liste `disabled` alanını verir ve orada **0 açık** demektir. Durum ucu ise `enabled` alır ve orada **true açık** demektir. İkisi aynı şeyin ters adlarıdır; birini diğerine kopyalamak durumu tersine çevirir.

> **Silme kazanç geçmişini de götürür**
> 
> Ortağı silmek komisyon işlemlerini, ödeme taleplerini, tıklamaları, geçmişi ve yönlendirme kayıtlarını da siler; bağlı müşterilerin bağlantısı sıfırlanır. Panel bu adımda yönetici parolası ister, API ise kapsamla yetinir. Bir ortağı ayırmak istiyorsanız silmek yerine kapatın.

> **Arama ucu en çok on sonuç verir**
> 
> Arama ucu bir liste değil, arama kutusudur: kaç kayıt eşleşirse eşleşsin en çok on sonuç döner ve sayfalama yoktur. Toplu bir işi bu uca dayandırırsanız onuncudan sonrasını sessizce kaçırırsınız. Tam liste için listeleme ucunu kullanın.

> **Ödenen tutar yalnız tamamlanmış talepleri sayar**
> 
> `total_paid` alanı tamamlanmış ödeme taleplerinin toplamıdır. Bekleyen ya da işlemdeki bir talep bu sayıya girmez, ama `balance` alanından da düşmez. İki rakamı toplayarak "ortağa ne borçluyuz" sorusunu yanıtlamayın.

## İlgili Makaleler

- [Satış Ortaklığı Atamaları](https://dev.wisecp.com/tr/satis-ortakligi-atamalari)
- [Satış Ortağı Ödeme Talepleri](https://dev.wisecp.com/tr/satis-ortagi-odeme-talepleri)
- [Satış Ortaklığı Ayarları](https://dev.wisecp.com/tr/satis-ortakligi-ayarlari)
