# Sipariş Durum Kancaları

https://dev.wisecp.com/tr/siparis-durum-kancalari

Sipariş kaydının ömrü boyunca dokuz kanca: kurulum, durum geçişleri, yapılandırma, süre dolumu ve silme.

## Genel Bakış

Sipariş, sepetin **kalıcı kaydıdır**. Durumu hizmetlerin ne zaman açılacağını belirler: bekleyen sipariş hiçbir şey açmaz, etkin sipariş hizmetleri kurar.

Ödenmeden bırakılan sepetler bir süre sonra **kendiliğinden** düşer. O akışın kendi kancası vardır ve zamanlanmış görevden çalışır.

## Referans

### Sipariş kaydını durdurma

gateorder.create

`Orders::create()` kayıt yazılmadan

Sipariş kaydı yazılmadan önce çalışır.

Parametreler 1

$dataarrayYazılacak sipariş verisi: sahip, tutar, para birimi, kalemler, vergiler, indirimler, durum, ödeme yöntemi.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır.

Dinleyici PHP

```php
Hook::add('gate:order.create', 10, function ($data) {
    if (Acme::blocked((int) ($data['user_id'] ?? 0)))
        return 'Bu hesap yeni siparis veremez.';

    return null;
});
```

### Sipariş kaydını izleme

actionorder.created

`Orders::create():215` durum bekliyor olabilir

Sipariş satırı yazıldıktan sonra çalışır. Bağlı hizmetler bu noktada **henüz kurulmamıştır**.

Parametreler 1

$orderarraySipariş verisi ile yeni kimliğin birleşimi: sahip, tutar, para birimi, kalemler, vergiler, indirimler, durum, ödeme yöntemi, adres, notlar. Durum çoğu zaman **bekliyor**dur.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:order.created', 10, function ($order) {
    // Hizmetler HENUZ kurulmadi: onlar durum etkine dondugunde acilir.
    Crm::orderRecord((int) ($order['id'] ?? 0), $order);
});
```

### Sipariş durum geçişini durdurma

gateorder.status_change

`Orders::change_status()` modüle yansıma bilgisi

Sipariş durumu değişmeden önce çalışır.

Parametreler 3

$order_idintSipariş kimliği. Sipariş kaydı gelmez; gerekiyorsa kendiniz okuyun.

$statusstringHedef durum.

$apply_on_moduleboolDeğişikliğin sağlayıcı modülüne **yansıtılıp yansıtılmayacağı**. Yanlışsa hizmet kurulmaz; yalnız kayıt değişir.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır.

Dinleyici PHP

```php
Hook::add('gate:order.status_change', 10,
    function ($order_id, $status, $apply_on_module) {
        // Modüle yansimayan gecis hizmet kurmaz: kurali ona gore yazin.
        if ($status === 'active' && $apply_on_module && !Acme::capacityFree())
            return 'Su an yeni hizmet acilamiyor; kapasite dolu.';

        return null;
    });
```

### Sipariş durumunu izleme

actionorder.status_changed

`Orders::change_status()` eski durum boş olabilir

Sipariş durumu değiştikten sonra çalışır.

Parametreler 3

$idintSipariş kimliği.

$statusstringYeni durum: `waiting`, `inprocess`, `active`, `cancelled`.

$old_statusstringÖnceki durum. İlk yazımda **boş string** gelir; geçiş karşılaştırması yapıyorsanız bunu hesaba katın.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:order.status_changed', 10, function ($id, $status, $old_status) {
    // Ilk yazimda eski durum BOS gelir: dogrudan karsilastirma yaniltir.
    if ($old_status === '' || $status === $old_status) return;

    if ($status === 'active') Crm::orderActivated($id);
});
```

### Sipariş güncellemesini izleme

actionorder.updated

`AdminOrders` operatör düzenledi

Sipariş kaydı güncellendikten sonra çalışır.

Parametreler 2

$idintSipariş kimliği.

$dataarrayYazılan güncelleme verisi.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:order.updated', 10, function ($id, $data) {
    Audit::orderEdited((int) $id, array_keys($data));
});
```

### Düşen sepeti yakalama

actionorder.expired

`cronjobs/OrderCleanup` zamanlanmış görev

Ödenmeden bırakılan sipariş süresi dolup iptal edildikten sonra çalışır.

Parametreler 3

$order_idintİptal edilen siparişin kimliği.

$ordernumstringMüşterinin gördüğü sipariş numarası.

$user_idintSepetin sahibi.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:order.expired', 10, function ($order_id, $ordernum, $user_id) {
    // Terk edilmis sepet: geri kazanim icin en dogru an.
    Retention::abandoned((int) $user_id, $ordernum);
});
```

### Sipariş silmeyi durdurma

gateorder.delete

`AdminOrders` liste gelir, tek kayıt değil

Sipariş silinmeden önce çalışır.

Parametreler 1

$idsarraySilinecek sipariş kimlikleri. Tek sipariş silinirken de **dizi** gelir; tek kimlik beklemeyin.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır.

Dinleyici PHP

```php
Hook::add('gate:order.delete', 10, function ($ids) {
    // Tekil silmede bile DIZI gelir.
    foreach ($ids as $id)
        if (Acme::hasPaidInvoice((int) $id))
            return 'Odenmis faturasi olan siparis silinemez.';

    return null;
});
```

### Sipariş silmeyi izleme

actionorder.deleted

`Orders::delete()` son anlık görüntü

Sipariş silindikten sonra çalışır.

Parametreler 2

$idintSilinen siparişin kimliği.

$orderarraySilme **öncesi** anlık görüntü; kalemler, vergiler, indirimler ve ayrıntılar **çözülmüş** hâldedir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:order.deleted', 10, function ($id, $order) {
    // Kalemler cozulmus gelir: JSON ayristirmaya gerek yok.
    Accounting::orderRemoved((int) $id, $order['items'] ?? []);
});
```

### Sipariş toplamını değiştirme

filterorder.total

`Orders` faturaya giden tutar

Sipariş toplamları hesaplandıktan sonra çalışır.

Parametreler 4

$tax_calcarrayrefToplamlar: `total`, `tax_amount`, ek vergi ayrıntıları, gösterim ara toplamı. `total` siparişe **kalıcı** olarak yazılan tutardır.

$subtotalfloatİndirim ve vergi öncesi ara toplam.

$total_discountfloatBayilik ve kupon indirimlerinin toplamı.

$itemsarrayNihai sepet kalemleri.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:order.total', 10,
    function (&$tax_calc, $subtotal, $total_discount, $items) {
        // total siparise KALICI yazilir; vergi anahtarlarina dokunursaniz
        // fatura satirlari da ona gore kesilir.
        if (Acme::roundUp()) $tax_calc['total'] = ceil((float) $tax_calc['total']);
    });
```

## Tuzaklar

> **Sipariş kaydı hizmet demek değildir**
> 
> Sipariş oluşturuldu kancasında durum çoğunlukla **bekliyor**dur ve bağlı hizmetler **henüz kurulmamıştır**. Hizmete dair iş yapan bir dinleyici burada boş bulur; doğru an durumun **etkine** döndüğü andır.

> **İlk yazımda eski durum boştur**
> 
> Durum olayında önceki durum **boş string** olabilir: sipariş ilk kez yazılıyordur. "Eskisi şuydu, yenisi bu" diye karşılaştıran bir dinleyici bu durumda yanlış sonuç üretir. Boş değeri **ayrı** ele alın.

> **Silme kapısı liste alır**
> 
> Tek bir sipariş silinirken bile kapı **dizi** alır. Tek kimlik bekleyen bir dinleyici diziyi sayıya çevirmeye çalışır ve kural **hiçbir zaman** tutmaz. Her zaman döngüyle gezin.

> **Modüle yansımayan geçiş hizmet kurmaz**
> 
> Durum kapısının üçüncü parametresi, değişikliğin sağlayıcı modülüne **yansıtılıp yansıtılmayacağını** söyler. Yanlışsa yalnız kayıt değişir: sunucuda hiçbir şey açılmaz. Kapasiteye, sunucuya ya da sağlayıcıya bakan bir kural bu parametreyi **okumalıdır**.

## İlgili Makaleler

- [Sepet Kancaları](https://dev.wisecp.com/tr/sepet-kancalari)
- [Hizmet Durum Kancaları](https://dev.wisecp.com/tr/hizmet-durum-kancalari)
- [Fatura Yaşam Döngüsü Kancaları](https://dev.wisecp.com/tr/fatura-yasam-dongusu-kancalari)
