
# İş Akışını İptal Etme

İş akışları program aracılığıyla veya CLI üzerinden iptal edilebilir. Bir iş akışı iptal edildiğinde Queuety durumunu `cancelled` olarak ayarlar, bekleyen veya işlenmekte olan tüm işleri kuyruğun dışına alır ve isteğe bağlı bir temizleme işleyicisi çalıştırır.

## Temizleme işleyicisi kaydetme

İş akışı oluşturucusunda `on_cancel()` kullanarak iş akışı iptal edildiğinde çalışacak bir sınıf kaydedin. İşleyici sınıfı bir `handle( array $state ): void` yöntemi uygulamalıdır.

```php
use Queuety\Queuety;

Queuety::workflow( 'import_data' )
    ->then( FetchDataHandler::class )
    ->then( TransformDataHandler::class )
    ->then( LoadDataHandler::class )
    ->on_cancel( ImportCleanupHandler::class )
    ->dispatch( [ 'source_url' => $url ] );
```

Temizleme işleyicisi, genel iş akışı durumunu alır (`_` ile başlamayan tüm anahtarlar):

```php
class ImportCleanupHandler {

    public function handle( array $state ): void {
        // Clean up any partial imports.
        if ( isset( $state['temp_table'] ) ) {
            global $wpdb;
            $wpdb->query( "DROP TABLE IF EXISTS {$state['temp_table']}" );
        }

        // Notify the user.
        wp_mail(
            $state['notify_email'] ?? '',
            'Import cancelled',
            'Your data import was cancelled.'
        );
    }
}
```

## PHP üzerinden iptal etme

İş akışı kimliğiyle `Queuety::cancel_workflow()` çağrısı yapın:

```php
Queuety::cancel_workflow( $workflow_id );
```

Bu yöntem:

1. İş akışı satırını kilitler
2. İş akışı durumunu `cancelled` olarak ayarlar
3. İş akışına ait bekleyen ve işlenmekte olan tüm işleri "Workflow cancelled" ile kuyruğun dışına alır
4. Bir `workflow_cancelled` olayı kaydeder ve işlemi tamamlar
5. Tamamlanan adımların telafilerini ters sırada çalıştırır (varsa, `compensate_with()` üzerinden kaydedilmiş olanları)
6. `on_cancel` temizleme işleyicisini çalıştırır (kayıtlıysa)

İş akışı zaten `completed` veya `cancelled` durumundaysa `RuntimeException` fırlatılır.

## CLI üzerinden iptal etme

```bash
wp queuety workflow cancel <id>
```

| Seçenek | Açıklama |
|---|---|
| `<id>` | İptal edilecek iş akışı kimliği (gerekli) |

```bash
wp queuety workflow cancel 42
```

## İptal edildiğinde ne olur

Bir iş akışı iptal edildiğinde:

- **Durum** `cancelled` olarak değişir
- **Adım telafileri**, `compensate_with()` ile eklendiyse tamamlanma sırasının tersine çalışır
- **Temizleme işleyicisi**, iş akışı satırı `cancelled` olarak işaretlendikten sonra çalışır
- İş akışına ait **bekleyen işler** hemen kuyruğun dışına alınır
- İş akışına ait **işlenmekte olan işler** kuyruğun dışına alınır; devam eden işleyici tamamlandığında çıktısı atılır ve iş akışı ilerlemez
- Önceki adımlara ait **tamamlanmış işler** olduğu gibi bırakılır
- `workflow_cancelled` olayı içeren bir **günlük kaydı** oluşturulur

## İptal edildi ve Başarısız oldu durumları

| Özellik | Başarısız | İptal edildi |
|---|---|---|
| Tetikleyici | Bir adım yeniden deneme hakkını tüketir | `cancel_workflow()` için açık çağrı |
| Durum | `failed` | `cancelled` |
| Yeniden denenebilir mi | Evet, iş akışına telafi uygulanmadıysa `retry_workflow()` üzerinden | Hayır |
| Temizleme işleyicisi | Çağrılmaz | `on_cancel()` üzerinden kaydedildiyse çağrılır |
| Günlük olayı | `workflow_failed` | `workflow_cancelled` |

## Örnek: onayla iptal etme

Yaygın bir örüntü, iptal etmeden önce iş akışı durumunu kontrol etmektir:

```php
$status = Queuety::workflow_status( $workflow_id );

if ( null === $status ) {
    throw new \RuntimeException( 'Workflow not found.' );
}

if ( 'running' === $status->status->value || 'paused' === $status->status->value ) {
    Queuety::cancel_workflow( $workflow_id );
}
```
