
# Darbo sekų paleidimas

Darbo seka gali paleisti antrinę darbo seką kaip vieną iš savo veiksmų. Pirminė darbo seka pristabdoma, kol baigiama antrinė, tada jos galutinė būsena sujungiama su pirminės darbo sekos būsena.

## Metodas `->run_workflow()`

```php
use Queuety\Queuety;

$enrichment = Queuety::workflow( 'enrich_user' )
    ->then( FetchSocialHandler::class )
    ->then( FetchCreditScoreHandler::class );

Queuety::workflow( 'onboarding' )
    ->then( CreateAccountHandler::class )
    ->run_workflow( 'enrich_user', $enrichment )
    ->then( SendWelcomeEmailHandler::class )
    ->dispatch( [ 'email' => 'user@example.com' ] );
```

Metodas `run_workflow()` priima du argumentus:
1. Darbo sekos paleidimo pavadinimą
2. `WorkflowBuilder` egzempliorių, apibrėžiantį darbo sekos veiksmus

## Kaip tai veikia

Kai pirminė darbo seka pasiekia veiksmą `run_workflow`:

1. Darbo seka paleidžiama kaip nepriklausoma seka su atskiru ID
2. Pirminė darbo seka pristabdoma
3. Antrinė darbo seka įprastai vykdo savo veiksmus
4. Baigus antrinę darbo seką, jos galutinė būsena sujungiama su pirminės būsena
5. Pirminė darbo seka tęsiama nuo kito veiksmo

## Pirminės ir antrinės darbo sekų būsenos

Paleidžiama antrinė darbo seka kaip pradinį duomenų rinkinį gauna dabartinę sukauptą pirminės darbo sekos būseną. Todėl antriniai veiksmai gali pasiekti visus ankstesnių pirminės sekos veiksmų sugeneruotus duomenis:

```php
class CreateAccountHandler implements Step {
    public function handle( array $state ): array {
        $user_id = wp_create_user( $state['email'], wp_generate_password() );
        return [ 'user_id' => $user_id ];
    }

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

// This run-workflow step can access 'user_id' from the parent
class FetchSocialHandler implements Step {
    public function handle( array $state ): array {
        $profile = fetch_social_profile( $state['user_id'] );
        return [ 'social_data' => $profile ];
    }

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

## Būsenų sujungimas

Baigus antrinę darbo seką, jos galutinė būsena (išskyrus vidinius raktus, tokius kaip `_steps`, `_queue`, `_priority`, `_max_attempts`) sujungiama su pirminės darbo sekos būsena. Kitas pirminės sekos veiksmas mato visus ankstesnių pirminės sekos veiksmų ir antrinės darbo sekos duomenis:

```php
class SendWelcomeEmailHandler implements Step {
    public function handle( array $state ): array {
        // Has access to:
        // - $state['email'] (from initial dispatch)
        // - $state['user_id'] (from CreateAccountHandler)
        // - $state['social_data'] (from run-workflow's FetchSocialHandler)
        // - $state['credit_score'] (from run-workflow's FetchCreditScoreHandler)

        send_welcome_email( $state['email'], $state['social_data'] );
        return [ 'welcome_sent' => true ];
    }

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

## Darbo sekos paleidimo parinktys

Darbo sekos paleidimo kūrimo priemonės parinktys `on_queue()`, `with_priority()` ir `max_attempts()` taikomos antrinei darbo sekai. Kitos antrinės kūrimo priemonės darbo sekos lygmens parinktys, pavyzdžiui, `on_cancel()`, `prune_state_after()`, `must_complete_within()`, `version()`, `idempotency_key()`, `max_*()` biudžetai ir `compensate_on_failure()`, nepaveldimos:

```php
$sub = Queuety::workflow( 'heavy_processing' )
    ->on_queue( 'background' )
    ->with_priority( Priority::Normal )
    ->max_attempts( 5 )
    ->then( StepA::class )
    ->then( StepB::class );

Queuety::workflow( 'parent' )
    ->run_workflow( 'heavy', $sub )
    ->then( FinalStep::class )
    ->dispatch( $payload );
```

## Įdėtos darbo sekos

Pačiose darbo sekose gali būti paleidžiamos kitos darbo sekos, todėl galima kurti bet kokio gylio įdėtines struktūras:

```php
$inner = Queuety::workflow( 'inner' )
    ->then( InnerStepA::class )
    ->then( InnerStepB::class );

$middle = Queuety::workflow( 'middle' )
    ->then( MiddleStepA::class )
    ->run_workflow( 'inner', $inner )
    ->then( MiddleStepB::class );

Queuety::workflow( 'outer' )
    ->then( OuterStepA::class )
    ->run_workflow( 'middle', $middle )
    ->then( OuterStepB::class )
    ->dispatch( $payload );
```
