# Alan Adı Yaşam Sonu Kancaları

https://dev.wisecp.com/tr/alan-adi-yasam-sonu-kancalari

Ödenmemiş bir alan adının sonuna kadar giden sekiz kanca: ödemesiz dönem, kurtarma dönemi, düşme ve içe aktarma.

## Genel Bakış

Süresi dolan bir alan adı **tek adımda** kaybolmaz. Önce ödemesiz dönem gelir ve ad hâlâ normal ücretle yenilenebilir. Sonra kurtarma dönemi gelir: ad kullanımdan kalkar ve geri almak **çok daha pahalıdır**. En sonunda düşme gelir ve ad herkese açılır.

Bu üç aşamanın ayrı kancaları vardır ve hepsi **zamanlanmış görevden** çalışır. Kimse bir butona tıklamaz; ekranda kimse yoktur.

## Referans

### Ödemesiz döneme girişi yakalama

actiondomain.grace_started

`cronjobs/DomainLifecycle` zamanlanmış görev

Alan adı ödemesiz döneme geçtiği anda çalışır; ad hâlâ çalışır ve normal ücretle yenilenebilir.

Parametreler 2

$service_idintAlan adı hizmetinin kimliği.

$statearrayYaşam döngüsü durumu: `stage`, `days_past_due`, `days_in_stage`. Bu aşamada ayrıca `grace_days`, `grace_fee` ve `grace_fee_active` gelir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.grace_started', 10, function ($service_id, $state) {
    // Musteriye bu asamada ulasmak en ucuz kurtarma yoludur.
    Crm::nudge($service_id, 'domain-grace', (int) ($state['grace_days'] ?? 0));
});
```

### Kurtarma dönemine girişi yakalama

actiondomain.redemption_started

`cronjobs/DomainLifecycle` ad artık çalışmıyor

Ödemesiz dönem bittiğinde çalışır. Bu noktada ad **kullanımdan kalkmıştır** ve geri alma ücreti devreye girer.

Parametreler 2

$service_idintAlan adı hizmetinin kimliği.

$statearrayYaşam döngüsü durumu: `stage`, `days_past_due`, `days_in_stage`. Bu aşamada `redemption_days`, `redemption_fee`, `amount_cid` ve `can_restore` gelir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.redemption_started', 10, function ($service_id, $state) {
    // Ucret ve para birimi state icinde gelir; kendiniz hesaplamayin.
    if (!empty($state['can_restore']))
        Crm::urgent($service_id, (float) ($state['redemption_fee'] ?? 0),
            (int) ($state['amount_cid'] ?? 0));
});
```

### Düşme isteğini durdurma

gatedomain.delete_request

`cronjobs/DomainPurge` cron bağlamı

Sağlayıcıya iptal isteği gitmeden önce çalışır. Zamanlanmış görev içindedir; durdurduğunuzda **kimse bir hata görmez**.

Parametreler 3

$servicearrayDüşürülecek alan adı hizmeti.

$statearrayYaşam döngüsü durumu: `stage`, `days_past_due`, `days_in_stage`.

$modulestringSağlayıcı modülünün adı. Modül atanmamışsa boş gelir.

Dönüş 1

stringBoş olmayan bir string düşmeyi **durdurur**. Görev bir sonraki turda yeniden dener; kalıcı durdurma için kendi işaretinizi kendiniz tutun.

Dinleyici PHP

```php
Hook::add('gate:domain.delete_request', 10, function ($service, $state, $module) {
    // Musteri odeme sozu verdiyse dusmeyi bir tur ertele.
    if (Acme::promiseToPay((int) ($service['id'] ?? 0)))
        return 'Odeme sozu var; dusme ertelendi.';

    return null;
});
```

### Düşme isteğini izleme

actiondomain.delete_requested

`cronjobs/DomainPurge` sağlayıcıya gitti

İptal isteği sağlayıcıya gönderildikten sonra çalışır.

Parametreler 3

$servicearrayDüşürülen alan adı hizmeti.

$statearrayYaşam döngüsü durumu: `stage`, `days_past_due`, `days_in_stage`.

$modulestringSağlayıcı modülünün adı; boş olabilir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.delete_requested', 10,
    function ($service, $state, $module) {
        Audit::note('domain-drop', $service['name'] ?? '', $module ?: 'modulsuz');
    });
```

### Düşmenin tamamlandığını yakalama

actiondomain.purged

`cronjobs/DomainPurge` geri dönüşü yok

Hizmet iptal edilip alan adı düşürüldükten sonra çalışır. Bu **son adımdır**.

Parametreler 3

$service_idintAlan adı hizmetinin kimliği.

$statearrayYaşam döngüsü durumu: `stage`, `days_past_due`, `days_in_stage`. Bu noktada `stage` değeri düşme aşamasıdır.

$modulestringSağlayıcı modülünün adı; boş olabilir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.purged', 10, function ($service_id, $state, $module) {
    // Ad artik bizim degil: bagli kayitlari temizleyin.
    DnsMonitor::forget($service_id);
});
```

### Süre dolum bildirimini izleme

actiondomain.expired_notice_sent

`cronjobs/DomainExpired` her eşikte bir kez

Süresi geçmiş bir alan adı için bildirim gönderildikten sonra çalışır.

Parametreler 2

$service_idintAlan adı hizmetinin kimliği.

$delayed_dayintVadenin üzerinden geçen gün. Bildirim eşiğidir: aynı ad için **birden çok kez**, farklı gün değerleriyle çalışır.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.expired_notice_sent', 10,
    function ($service_id, $delayed_day) {
        // Her esikte calisir: 1., 7., 15. gun ayri ayri gelir.
        if ($delayed_day >= 15) Ops::escalate('domain-expiry', $service_id);
    });
```

### İçe aktarmayı izleme

actiondomain.imported

`Imports` toplu iş

Sağlayıcıdan alan adları içe aktarıldıktan sonra çalışır. Kanca **tüm küme için bir kez** çalışır, ad başına değil.

Parametreler 2

$importedarrayİçe aktarılan hizmet etiketleri: `"example.com (#123)"` biçiminde metinler. Hizmet kaydı değil **etiket** gelir; kimliği metinden ayıklamanız gerekir.

$module_namestringİçe aktarmanın yapıldığı sağlayıcı modülü.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.imported', 10, function ($imported, $module_name) {
    // Tum kume icin BIR kez calisir; ad basina degil.
    Ops::note('domain-import', $module_name . ': ' . count($imported));
});
```

### Bekleme ve kurtarma ücretini değiştirme

filterdomain.grace_redemption_save

`AdminProductsDomain` bağla geçer

Bekleme ya da kurtarma ücreti kaydedilmeden önce çalışır. Ücret politikasını tek yerden dayatmanın yolu budur: uzantı uzantı elle girmek yerine kuralı buraya yazarsınız.

Parametreler 3

$set_dataarraybağlaYazılacak fiyat kaydı: `amount`, `cid` (para birimi), `owner_id`, `status` ve diğerleri.

$typestring`grace` ya da `redemption`.

$idintUzantı kimliği. **Sıfır gelirse** kayıt tek bir uzantıya değil, varsayılan olarak hepsine yazılıyordur.

Dönüş 1

voidDönüş yoksayılır; kaydın üzerine yazarsınız. Kanca her para birimi ve her tip için ayrı ayrı çalışır: tek kayıtta birden çok kez çağrıldığınızı hesaba katın.

Dinleyici PHP

```php
Hook::add('filter:domain.grace_redemption_save', 10, function (&$set_data, $type, $id) {
    // Bekleme suresi her uzantida ucretsiz olsun.
    if ($type === 'grace') $set_data['amount'] = 0;
});
```

## Tuzaklar

> **Bu kancalarda ekran yoktur**
> 
> Yaşam sonu kancalarının hepsi zamanlanmış görevden çalışır. Bir kapıyı durdurduğunuzda **kimse hata mesajı görmez**: ne müşteri ne operatör. Durdurma kararınızı kendi tarafınızda kaydedin, yoksa alan adının neden düşmediğini kimse anlayamaz.

> **Durdurmak kalıcı değildir**
> 
> Görev bir sonraki turda **yeniden dener**. Kapıda "bir kez engelledim" diye düşünmek yanlıştır; koşulunuz her turda yeniden sorulur. Kalıcı bir bekletme istiyorsanız kendi işaretinizi tutun ve onu kapıda okuyun.

> **Bildirim kancası aynı ad için tekrarlanır**
> 
> Süre dolum bildirimi eşik eşik gönderilir ve kanca **her eşikte yeniden** çalışır. Gün değerini okumadan tepki veren bir dinleyici, tek bir alan adı için art arda uyarılar üretir.

> **İçe aktarma etiket verir, kayıt değil**
> 
> İçe aktarma kancası size `"example.com (#123)"` biçiminde **metinler** verir. Hizmet kaydı beklemek yanlıştır; kimliğe ihtiyacınız varsa metinden ayıklayın ve kaydı kendiniz okuyun.

## İlgili Makaleler

- [Alan Adı Edinme Kancaları](https://dev.wisecp.com/tr/alan-adi-edinme-kancalari)
- Zamanlanmış Görev Kancaları
- Alan Adı Kancaları
