Sipariş Kayıtları

1.7k görüntülenme Markdown

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 'https://panel.ornek.com/api/v1/admin/orders?status=waiting&limit=50' \
  -H "Authorization: Bearer $API_KEY"
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');
$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);
// 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.
taxesobjectVergi 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İndirim anlık görüntüsü.
resellerobjectBayi indirimi: toplamı, kalemleri ve grupları.
couponobjectKupon indirimi: toplamı ve kalemleri.
totalfloatToplam indirim.
detailsobjectSipariş 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.
itemsarrayHam 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.
servicesarraySipariş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 'https://panel.ornek.com/api/v1/admin/orders/92' \
  -H "Authorization: Bearer $API_KEY"
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);
$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);
// 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 -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}'
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();
$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);
// 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 -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}'
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();
$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);
// 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 -X DELETE 'https://panel.ornek.com/api/v1/admin/orders/92' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/orders/${id}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$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);
// 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 -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}'
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();
$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);
// 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.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.