
# İş Akışı Telafisi

Telafi, tamamlanmış bir iş akışı adımına geri alma işleyicisi eklemenizi sağlar. Queuety, adım tamamlandığında genel durumun anlık görüntüsünü saklar; ardından iş akışı iptal edildiğinde veya isteğe bağlı olarak başarısız olduğunda telafi işleyicilerini ters sırada çalıştırır.

## `compensate_with()` yöntemi

Geri alınması gereken adımdan hemen sonra `compensate_with()` çağrısı yapın:

```php
use Queuety\Queuety;

Queuety::workflow( 'provision_account' )
    ->then( CreateRemoteUserStep::class )
    ->compensate_with( DeleteRemoteUserCompensation::class )
    ->then( CreateSubscriptionStep::class )
    ->compensate_with( CancelSubscriptionCompensation::class )
    ->then( SendWelcomeEmailStep::class )
    ->dispatch( [ 'user_id' => 42 ] );
```

İş akışı daha sonra iptal edilirse Queuety çalışır:

1. `CancelSubscriptionCompensation`
2. `DeleteRemoteUserCompensation`

## Telafi işleyicileri

Telafi işleyicileri `Contracts\Compensation` arayüzünü uygular:

```php
use Queuety\Contracts\Compensation;

final class DeleteRemoteUserCompensation implements Compensation {
    public function handle( array $state ): void {
        remote_api_delete_user( $state['remote_user_id'] );
    }
}
```

İşleyici, telafi uygulanan adım tamamlandıktan hemen sonraki genel iş akışı durumunu alır. Ayrılmış dahili anahtarlar dahil edilmez.

## İptal ve başarısızlık

Açıkça iptal edildiğinde, tamamlanmış adımların telafileri isteğe bağlı `on_cancel()` işleyicisinden önce her zaman çalışır.

Başarısızlık durumunda telafiler yalnızca etkinleştirmeniz halinde çalışır:

```php
Queuety::workflow( 'provision_account' )
    ->then( CreateRemoteUserStep::class )
    ->compensate_with( DeleteRemoteUserCompensation::class )
    ->then( CreateSubscriptionStep::class )
    ->compensate_with( CancelSubscriptionCompensation::class )
    ->then( ChargeCardStep::class )
    ->compensate_on_failure()
    ->dispatch( $payload );
```

`compensate_on_failure()` olmadan başarısız bir iş akışı, tamamlanmış adımların geçmişini korur ve başarısız adımdan yeniden denenebilir.

`compensate_on_failure()` kullanıldığında, tamamlanmış adımların telafileri iş akışı başarısız olarak işaretlendikten sonra çalışır. Bunun ardından iş akışına zaten telafi uygulandığından `retry_workflow()` bir hata fırlatır.

## Desteklenen adım türleri

Telafi şu adımlara eklenebilir:

- sıralı `then()` adımları
- `parallel()` grupları
- `for_each()` adımları
- `run_workflow()` adımları
- `delay()` gecikme adımları
- `wait_for_signal()` sinyal adımları
- `wait_for_workflow()` iş akışı bağımlılığı adımları

`run_workflow()` ve `for_each()` için telafi anlık görüntüsü, iç içe geçmiş veya dallanmış işler tamamen sonuçlandıktan sonra kaydedilir.

## `on_cancel()` ile telafi karşılaştırması

Tamamlanmış adımların yan etkilerini ters sırada geri almak için `compensate_with()` kullanın.

İş akışı açıkça iptal edildiğinde çalışması gereken iş akışı düzeyinde tek bir temizleme kancası için `on_cancel()` kullanın.
