
# Zrušenie pracovného postupu

Pracovné postupy možno zrušiť programovo alebo cez CLI. Pri zrušení pracovného postupu nastaví Queuety jeho stav na `cancelled`, ukryje všetky čakajúce alebo spracúvané úlohy a spustí voliteľnú obslužnú funkciu na vyčistenie.

## Registrácia obslužnej funkcie na vyčistenie

Na registráciu triedy, ktorá sa spustí pri zrušení pracovného postupu, použite `on_cancel()` na zostavovači pracovného postupu. Trieda obslužnej funkcie musí implementovať metódu `handle( array $state ): void`.

```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 ] );
```

Obslužná funkcia na vyčistenie dostane verejný stav pracovného postupu (všetky kľúče, ktoré nezačínajú na `_`):

```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.'
        );
    }
}
```

## Zrušenie cez PHP

Zavolajte `Queuety::cancel_workflow()` a odovzdajte ID pracovného postupu:

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

Táto metóda:

1. Uzamkne riadok pracovného postupu
2. Nastaví stav pracovného postupu na `cancelled`
3. Ukryje všetky čakajúce a spracúvané úlohy pracovného postupu so správou "Workflow cancelled"
4. Zapíše udalosť `workflow_cancelled` do logu a potvrdí transakciu
5. Spustí kompenzačné akcie dokončených krokov v opačnom poradí (ak boli zaregistrované cez `compensate_with()`)
6. Spustí obslužnú funkciu na vyčistenie `on_cancel` (ak bola zaregistrovaná)

Ak je pracovný postup už `completed` alebo `cancelled`, vyvolá sa výnimka `RuntimeException`.

## Zrušenie cez CLI

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

| Možnosť | Opis |
|---|---|
| `<id>` | ID pracovného postupu, ktorý sa má zrušiť (povinné) |

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

## Čo sa stane pri zrušení

Pri zrušení pracovného postupu:

- **Stav** sa zmení na `cancelled`
- **Kompenzácie krokov** sa vykonajú v opačnom poradí dokončenia, ak ste ich pripojili pomocou `compensate_with()`
- **Obslužná funkcia na vyčistenie** sa spustí po označení riadka pracovného postupu ako `cancelled`
- **Čakajúce úlohy** pracovného postupu sa okamžite ukryjú
- **Spracúvané úlohy** pracovného postupu sa ukryjú; po dokončení práve bežiacej obslužnej funkcie sa jej výstup zahodí a pracovný postup nepokročí
- **Dokončené úlohy** z predchádzajúcich krokov zostanú nezmenené
- **Záznam v logu** s udalosťou `workflow_cancelled` sa uloží

## Zrušený a neúspešný stav

| Vlastnosť | Neúspešný | Zrušený |
|---|---|---|
| Spúšťač | Krok vyčerpá počet opakovaných pokusov | Explicitné volanie `cancel_workflow()` |
| Stav | `failed` | `cancelled` |
| Možno opakovať | Áno, cez `retry_workflow()`, ak už neprebehla kompenzácia pracovného postupu | Nie |
| Obslužná funkcia na vyčistenie | Nespustí sa | Spustí sa, ak je zaregistrovaná cez `on_cancel()` |
| Udalosť v logu | `workflow_failed` | `workflow_cancelled` |

## Príklad: zrušenie s potvrdením

Bežným vzorom je pred zrušením skontrolovať stav pracovného postupu:

```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 );
}
```
