# Sipariş Kayıtları

https://dev.wisecp.com/tr/siparis-kayitlari

Var olan siparişleri okuyan, durumunu değiştiren ve kaldıran altı uç.

## Genel Bakış

Sipariş, alışverişin **kaydıdır**; hizmet ise o alışverişten doğan **şeydir**. İkisi ayrı yaşar: siparişi silmek hizmeti öldürmez, hizmeti kapatmak siparişi değiştirmez.

Detay ucu bu ikiliği açıkça gösterir. Kalemler siparişin kendi satırlarıdır ve değişmez; hizmet listesi ise **her okumada canlı** gelir, durumları hizmet kaydından alınır.

Vergi ve indirim de aynı mantıkla saklanır: sipariş anındaki oranlar kaydın içinde donmuştur. Bugünkü ayarla yeniden hesaplamak geçmiş bir faturayı yanlış gösterir.

## Referans

### Siparişleri Listeleme

get/api/v1/admin/orders

`Orders/GetOrders` admin

Siparişleri sayfalı olarak, müşteri ve fatura özetiyle döndürür.

Sorgu 9

pageintKaçıncı sayfa.

limitintSayfa başına kayıt. Aralık dışı bir değer 25 sayılır.

searchstringSipariş numarası, müşteri bilgileri ve adreste arar.

statusstringSipariş durumu süzgeci: bekliyor, işlemde, etkin ya da iptal.

groupstringÜrün grubu süzgeci. Sipariş kalemlerinin içinde arar.

paymentstringFatura durumu süzgeci: tamamlanmış, eksik ya da bilinmeyen.

client_idintMüşteri numarası.

numberintSipariş numarası. Kısmi eşleşme kabul eder.

ipstringSiparişin geldiği adres. Kısmi eşleşme kabul eder.

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

idintSiparişin numarası.

order_numberstringSiparişin görünen numarası.

statusstringSiparişin durumu.

amountfloatSipariş tutarı.

currency_idintTutarın para birimi numarası.

payment_methodstringÖdeme yöntemi modülü. Seçilmemişse boş gelir.

invoice_idintBağlı faturanın numarası. Sıfır fatura yok demektir.

invoice_statusstringFaturanın durumu.

item_countintSipariş kalemi sayısı.

has_active_moduleboolSağlayıcıya bağlı bir hizmet içeriyor mu.

ipstringSiparişin geldiği adres.

created_atstringOluşturulduğu an.

clientobjectMüşteri özeti. Numara, ad, şirket ve e-posta taşır.

totalintToplam sipariş. 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/orders?status=waiting&limit=50' \
  -H "Authorization: Bearer $API_KEY"
```

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

const { data, meta } = await res.json();
const unpaid = data.filter((o) => o.invoice_status === 'unpaid');
```

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

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

```php
// Sipariste tutar VAR, kalemler YOK: kalem ve hizmet ancak detay ucunda gelir.
$rows = Api::Orders()->GetOrders([], ['status' => 'waiting'])['data'];
foreach ($rows as $o) $detail[$o['id']] = Api::Orders()->GetOrder(['id' => $o['id']])['data'];
```

### Sipariş Detayını Okuma

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

`Orders/GetOrder` admin

Siparişin vergisini, indirimlerini, kalemlerini ve doğurduğu hizmetleri döndürür.

Dönen alanlar data — 17

idintSiparişin numarası.

order_numberstringGörünen sipariş numarası.

statusstringSiparişin durumu.

amountfloatSipariş tutarı.

currency_idintPara birimi numarası.

payment_methodstringÖdeme yöntemi modülü.

tax_typestringVerginin fiyata dahil mi ayrı mı olduğu.

taxesobject taxesVergi anlık görüntüsü. Sipariş anındaki oranı ve tutarı saklar.

typestringVerginin fiyata dahil mi ayrı mı olduğu.

ratefloatUygulanan oran.

system_ratefloatSistemin belirlediği oran.

amountfloatVergi tutarı.

additionalobjectEk vergiler ve toplamları.

exemptionintMuafiyet uygulandı mı.

discountsobject discountsİndirim anlık görüntüsü.

resellerobjectBayi indirimi: toplamı, kalemleri ve grupları.

couponobjectKupon indirimi: toplamı ve kalemleri.

totalfloatToplam indirim.

detailsobject detailsSipariş anındaki ek bilgiler.

subtotalfloatAra toplam.

display_subtotalfloatGösterilen ara toplam.

taxable_subtotalfloatVergilendirilen ara toplam.

billing_profile_idintFatura adresi profili.

send_notificationintSiparişin oluşturulduğu bildirim anahtarı.

generate_invoiceintFatura kesildi mi.

invoice_statusstringFatura durumu.

promo_codesarrayUygulanan kupon numaraları.

created_bystringSiparişi kimin açtığı: yönetici ya da müşteri.

admin_idintAçan personelin numarası.

notesstringSipariş notu.

ipstringSiparişin geldiği adres.

affiliate_idintSatış ortağı ataması. Sıfır atama yok demektir.

created_atstringOluşturulduğu an.

clientobjectMüşteri özeti. Numara, ad, şirket, e-posta ve dil taşır.

invoiceobjectBağlı fatura. Numara, seri, durum ve toplam taşır.

itemsarray items[]Ham sipariş kalemleri.

typestringKalem türü: ürün ya da alan adı.

product_idintÜrünün numarası.

product_namestringÜrünün adı.

product_typestringÜrünün türü.

domainstringAlan adı.

tldstringUzantı.

sldstringAlan adının gövdesi.

billing_cyclestringÖdeme döngüsü.

periodintSüre. Alan adı kaleminde yıl sayısıdır.

pricefloatBirim fiyat.

quantityintAdet.

allow_qtyintÇoklu adet izinli mi.

actionstringAlan adı işlemi: kayıt ya da transfer.

requirementsarrayMüşterinin verdiği yanıtlar. Her yanıt soru numarası, ad, tür, değer ve modül eşlemesi taşır.

addonsarraySeçilen ek hizmetler.

servicesint[]Bu kalemden doğan hizmet numaraları.

invoice_item_idintBağlı fatura kalemi.

servicesarray services[]Siparişten doğan hizmetler. Durumları hizmet kaydından canlı okunur.

idintHizmetin numarası.

existsboolHizmet hâlâ duruyor mu. Yanlışsa kalem hizmete dönüşmemiş ya da hizmet silinmiştir.

namestringHizmetin adı.

typestringHizmetin türü.

product_idintÜrünün numarası.

statusstringHizmetin canlı durumu.

amountfloatHizmet tutarı.

total_amountfloatEk hizmetlerle toplam.

currency_idintPara birimi numarası.

periodstringSüre birimi.

period_timeintSüre çarpanı.

cyclestringÖdeme döngüsü.

modulestringSağlayıcı modülü.

has_requirementsboolSoru yanıtı taşıyor mu.

optionsobjectHizmet seçenekleri.

addonsarrayHizmetin ek hizmetleri. Her biri seçenek, adet, durum ve tutar taşır.

Hatalar 2

not_found404Sipariş bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

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

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

const { data } = await res.json();
const live = data.services.filter((s) => s.exists);
```

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

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

```php
// Vergi ve indirim SIPARIS ANININ fotografidir; bugunku oranla yeniden hesaplamayin.
$o = Api::Orders()->GetOrder(['id' => $id])['data'];
$rateThen = $o['taxes']['rate'] ?? 0;
```

### Sipariş Zarfını Güncelleme

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

`Orders/UpdateOrder` admin iki alan

Siparişin notunu ve satış ortağı atamasını değiştirir.

Gövde 2

notesstringSipariş notu.

affiliate_idintSatış ortağı ataması. Sıfır atamayı kaldırır.

Dönen alanlar data — 17

dataobjectGüncel sipariş detayı. Okuma ucuyla aynı şekildedir.

Hatalar 2

not_found404Sipariş bulunamadı.

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/orders/92' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"notes":"Expedite provisioning","affiliate_id":5}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/orders/${id}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ notes: 'Expedite provisioning' }),
});

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

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

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

```php
// Yalnizca not ve satis ortagi degisir; kalem, fiyat ve musteri bu uctan DUZENLENEMEZ.
Api::Orders()->UpdateOrder(['id' => $id, 'notes' => $note, 'affiliate_id' => $aff]);
```

### Sipariş Durumunu Değiştirme

put/api/v1/admin/orders/{id}/status

`Orders/UpdateOrderStatus` admin hizmetlere yansır

Siparişin durumunu değiştirir ve hizmetlerine de yansıtır.

Gövde 2

statusstringreqYeni durum: bekliyor, işlemde, etkin ya da iptal.

apply_on_moduleboolDeğişiklik sağlayıcıda da uygulansın mı. Sunucuda gerçek işlem başlatır.

Dönen alanlar data — 5

idintSiparişin numarası.

statusstringYeni durum.

old_statusstringÖnceki durum.

services_updatedboolHizmetlere yansıdı mı. Bekliyor durumuna geçişte yansımaz.

applied_on_moduleboolSağlayıcıda uygulandı mı.

Hatalar 5

not_found404Sipariş bulunamadı.

invalid_status422Durum dört değerden biri değil.

blocked_by_gate422Bir kanca değişikliği reddetti.

status_change_failed500Durum değiştirilemedi.

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

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

const { data } = await res.json();
if (data.services_updated) refreshServices();
```

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

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

```php
// apply_on_module SAGLAYICIDA gercek islem baslatir: etkin kurar, iptal kapatir. Once yanlis birak.
Api::Orders()->UpdateOrderStatus([
    'id' => $id, 'status' => 'active', 'apply_on_module' => false,
]);
```

### Siparişi Silme

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

`Orders/DeleteOrder` admin

Sipariş kaydını siler; doğurduğu hizmetler yerinde kalır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen siparişin numarası.

Hatalar 3

not_found404Sipariş 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/orders/92' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/orders/' . $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
// Hizmetler SILINMEZ: siparis gider, hizmet kalir ve artik hangi siparisten geldigi izlenemez.
$o = Api::Orders()->GetOrder(['id' => $id])['data'];
foreach ($o['services'] as $s) if ($s['exists']) $orphans[] = $s['id'];

Api::Orders()->DeleteOrder(['id' => $id]);
```

### Siparişin Bir Hizmetini Kaldırma

delete/api/v1/admin/orders/{id}/services/{sid}

`Orders/DeleteOrderService` admin

Siparişin doğurduğu bir hizmeti kaldırır.

Gövde 1

apply_on_moduleboolSağlayıcıda da iptal edilsin mi.

Dönen alanlar data — 4

deletedboolSilme çalıştı mı.

service_idintSilinen hizmetin numarası.

order_idintSiparişin numarası.

applied_on_moduleboolSağlayıcıda uygulandı mı.

Hatalar 2

not_found404Sipariş ya da hizmet bulunamadı; hizmet bu siparişe ait değil.

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/orders/92/services/561' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"apply_on_module":false}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/orders/${id}/services/${sid}`, {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ apply_on_module: false }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/orders/' . $id . '/services/' . $sid);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['apply_on_module' => false]),
]);

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

```php
// Hizmet BU siparise ait degilse 404 gelir; numarayi detaydaki hizmet listesinden alin.
$o = Api::Orders()->GetOrder(['id' => $id])['data'];
$mine = array_column($o['services'], 'id');
if (in_array($sid, $mine, true))
    Api::Orders()->DeleteOrderService(['id' => $id, 'sid' => $sid, 'apply_on_module' => false]);
```

## Tuzaklar

> **Siparişi silmek hizmeti silmez**
> 
> Sipariş kaydı gider, doğurduğu hizmetler **yerinde kalır** ve faturalanmaya devam eder. Geriye kalan tek bağ da kopar: hizmetin hangi siparişten geldiği artık izlenemez. Bir alışverişi tümüyle geri almak istiyorsanız önce hizmetleri kaldırın.

> **Sağlayıcıya uygulama gerçek iş başlatır**
> 
> Durum değişiminde sağlayıcıya uygulama seçeneğini açmak **sunucuda gerçek işlem** başlatır: etkin kurulum yapar, iptal hesabı kapatır. Bir toplu düzeltmede bunu açık bırakmak müşteri sunucularını topluca etkiler. Önce kapalı deneyin, sonucu görün.

> **Vergi ve indirim donmuş bir fotoğraftır**
> 
> Detaydaki vergi oranı, ek vergiler ve kupon indirimi **sipariş anında** hesaplanmıştır ve kayıtta öyle durur. Bugünkü vergi ayarı değiştiyse iki rakam tutmaz; bu bir tutarsızlık değil, tarihsel doğruluktur. Raporda kaydın kendi oranını kullanın.

> **Zarf güncellemesi siparişi yeniden fiyatlandırmaz**
> 
> Güncelleme ucu yalnız notu ve satış ortağı atamasını yazar. Kalem, adet, fiyat, döngü ve müşteri bu uçtan **değiştirilemez**. Yanlış kurulmuş bir siparişin doğrusu onu düzeltmek değil, iptal edip yenisini kurmaktır.

> **Hizmet kaldırma yalnız kendi siparişinden yapılır**
> 
> Hizmet kaldırma ucu, hizmetin gerçekten o siparişe ait olduğunu denetler; başka bir siparişin hizmeti `404` alır. Bu bir güvenlik kapısıdır ve yanlış numarayla **yanlış hizmeti silmeyi** engeller. Numarayı detaydaki listeden alın.

> **Listede kalem yok, detayda var**
> 
> Liste ucu her sipariş için yalnız özet verir: tutar, kalem sayısı ve müşteri. Kalemlerin kendisi, soruların yanıtları ve doğan hizmetler **detay ucunda** gelir. Bir liste ekranında kalem göstermek her satır için ayrı bir çağrı demektir.

## İlgili Makaleler

- [Sipariş Verme](https://dev.wisecp.com/tr/siparis-verme)
- [Başvuru Listeleri](https://dev.wisecp.com/tr/basvuru-listeleri)
