
# Darbplūsmas atcelšana

Darbplūsmas var atcelt programmatiski vai ar CLI. Kad darbplūsma tiek atcelta, Queuety iestata tās statusu uz `cancelled`, noglabā visas gaidošās vai apstrādē esošās darbvietas un palaiž izvēles tīrīšanas apstrādātāju.

## Tīrīšanas apstrādātāja reģistrēšana

Izmantojiet `on_cancel()` darbplūsmas veidotājā, lai reģistrētu klasi, kas tiek palaista, kad darbplūsma tiek atcelta. Apstrādātāja klasei jāimplementē metode `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 ] );
```

Tīrīšanas apstrādātājs saņem publisko darbplūsmas stāvokli (visas atslēgas, kas nesākas ar `_`):

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

## Atcelšana, izmantojot PHP

Izsauciet `Queuety::cancel_workflow()` ar darbplūsmas ID:

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

Šī metode:

1. Bloķē darbplūsmas rindu
2. Iestata darbplūsmas statusu uz `cancelled`
3. Noglabā visas gaidošās un apstrādē esošās darbplūsmas darbvietas ar ziņojumu "Workflow cancelled"
4. Reģistrē `workflow_cancelled` notikumu un apstiprina izmaiņas
5. Apgrieztā secībā palaiž pabeigto darbību kompensācijas (ja tādas reģistrētas, izmantojot `compensate_with()`)
6. Palaiž `on_cancel` tīrīšanas apstrādātāju (ja tas reģistrēts)

Ja darbplūsma jau ir `completed` vai `cancelled`, tiek izmests `RuntimeException`.

## Atcelšana, izmantojot CLI

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

| Opcija | Apraksts |
|---|---|
| `<id>` | Atceļamās darbplūsmas ID (obligāts) |

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

## Kas notiek atcelšanas brīdī

Kad darbplūsma tiek atcelta:

- **Statuss** tiek mainīts uz `cancelled`
- **Darbību kompensācijas** tiek izpildītas apgrieztā pabeigšanas secībā, ja tās pievienotas ar `compensate_with()`
- **Tīrīšanas apstrādātājs** tiek palaists pēc darbplūsmas rindas statusa maiņas uz `cancelled`
- **Gaidošās darbvietas** darbplūsmai tiek noglabātas nekavējoties
- **Apstrādē esošās darbvietas** darbplūsmai tiek noglabātas; kad jau palaistais apstrādātājs beidz darbu, tā izvade tiek atmesta un darbplūsma neturpinās
- **Pabeigtās darbvietas** no iepriekšējām darbībām paliek nemainītas
- Tiek reģistrēts **žurnāla ieraksts** ar notikumu `workflow_cancelled`

## Atcelts un neveiksmīgs

| Aspekts | Neveiksmīgs | Atcelts |
|---|---|---|
| Aktivizētājs | Darbība izsmēlusi atkārtošanas mēģinājumus | Skaidrs `cancel_workflow()` izsaukums |
| Statuss | `failed` | `cancelled` |
| Var atkārtot | Jā, izmantojot `retry_workflow()`, ja darbplūsmai jau nav veikta kompensācija | Nē |
| Tīrīšanas apstrādātājs | Netiek izsaukts | Tiek izsaukts, ja reģistrēts ar `on_cancel()` |
| Žurnāla notikums | `workflow_failed` | `workflow_cancelled` |

## Piemērs: atcelšana ar apstiprinājumu

Bieži pirms atcelšanas tiek pārbaudīts darbplūsmas statuss:

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