
# Ramificação condicional

Os workflows podem saltar para uma etapa nomeada com base na saída de uma etapa anterior. Para isso, retorne uma chave especial `_next_step` no valor de retorno da etapa.

Se você quiser especificamente voltar a uma etapa anterior com base no estado do workflow, consulte [Repetições](https://queuety.inline0.dev/pt/docs/workflows/repeats). Assim, o retorno fica explícito na definição do workflow, em vez de ficar oculto dentro de uma classe de etapa.

## Etapas nomeadas

Dê um nome às etapas usando o segundo argumento de `->then()`:

```php
use Queuety\Queuety;

Queuety::workflow( 'process_order' )
    ->then( ValidateOrderHandler::class, 'validate' )
    ->then( ChargePaymentHandler::class, 'charge' )
    ->then( FulfillOrderHandler::class, 'fulfill' )
    ->then( SendConfirmationHandler::class, 'confirm' )
    ->then( HandleFailureHandler::class, 'failure' )
    ->dispatch( [ 'order_id' => 123 ] );
```

Sem um nome explícito, as etapas recebem nomes com base no índice (`'0'`, `'1'`, `'2'`, etc.).

## A chave `_next_step`

Uma etapa pode retornar `_next_step` para saltar para uma etapa nomeada, ignorando tudo o que estiver entre elas. As etapas após o destino do salto continuam sendo executadas em ordem: sem um salto, o workflow simplesmente continua com a próxima etapa da lista. Portanto, no exemplo acima, uma etapa `confirm` bem-sucedida segue para `failure`, a menos que retorne um `_next_step` que a ignore, ou que `HandleFailureHandler` verifique primeiro se existe uma chave `error`:

```php
use Queuety\Step;

class ValidateOrderHandler implements Step {
    public function handle( array $state ): array {
        $order = wc_get_order( $state['order_id'] );

        if ( ! $order || $order->get_status() === 'cancelled' ) {
            return [
                'error'  => 'Order is invalid or cancelled',
                '_next_step'  => 'failure',
            ];
        }

        return [
            'order_total' => $order->get_total(),
            'customer_id' => $order->get_customer_id(),
        ];
    }

    public function config(): array {
        return [];
    }
}
```

Quando `ValidateOrderHandler` retorna `_next_step => 'failure'`, o workflow ignora `charge`, `fulfill` e `confirm`, saltando diretamente para a etapa `failure`. A chave `_next_step` é consumida pelo mecanismo do workflow e não é persistida no estado.

## Padrões de ramificação

### Pular sob uma condição

```php
class CheckInventoryHandler implements Step {
    public function handle( array $state ): array {
        $in_stock = check_inventory( $state['sku'] );

        if ( ! $in_stock ) {
            return [
                'reason' => 'Out of stock',
                '_next_step'  => 'notify_backorder',
            ];
        }

        return [ 'inventory_reserved' => true ];
    }

    public function config(): array {
        return [];
    }
}
```

### Conclusão antecipada

Salte para a etapa final para evitar processamento desnecessário:

```php
class CheckCacheHandler implements Step {
    public function handle( array $state ): array {
        $cached = get_transient( "report_{$state['user_id']}" );

        if ( $cached ) {
            return [
                'report_url' => $cached,
                '_next_step'      => 'done',
            ];
        }

        return [ 'cache_miss' => true ];
    }

    public function config(): array {
        return [];
    }
}
```

## Exemplo completo

```php
Queuety::workflow( 'content_pipeline' )
    ->then( CheckCacheHandler::class, 'check_cache' )
    ->then( FetchDataHandler::class, 'fetch' )
    ->then( CallLLMHandler::class, 'generate' )
    ->then( SaveResultHandler::class, 'save' )
    ->then( ReturnCachedHandler::class, 'done' )
    ->dispatch( [ 'user_id' => 42 ] );
```

Se a verificação do cache encontrar um resultado, o workflow salta de `check_cache` diretamente para `done`, ignorando `fetch`, `generate` e `save`. Se não encontrar, as etapas são executadas em ordem e `save` também segue para `done`; por isso, `ReturnCachedHandler` precisa lidar com os dois caminhos.
