
# Käivita töövood

Töövoog saab käivitada alam töövoo ühe oma sammuna. Põhitöövoog peatub, kuni alam töövoog lõpetab, seejärel liidetakse alam töövoo lõplik olek põhitöövoo olekuga.

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

Meetod `run_workflow()` võtab kaks argumenti:
1. Käivita töövoog toimingu nimi
2. `WorkflowBuilder` eksemplar, mis määratleb käivita töövoog toimingu sammud

## Kuidas see töötab

Kui põhitöövoog jõuab sammuni `run_workflow`:

1. Käivita töövoog toiming saadetakse käima sõltumatu töövoona, millel on oma ID
2. Põhitöövoog peatub
3. Käivita töövoog toiming läbib tavapäraselt oma sammud
4. Kui käivita töövoog toiming lõpetab, liidetakse selle lõplik olek põhitöövoo olekuga
5. Põhitöövoog jätkub järgmise sammuga

## Põhitöövoo ja alam töövoo olek

Käivita töövoog toiming saab algandmetena põhitöövoo praeguse koondoleku. See tähendab, et alam töövoo sammud pääsevad ligi kõigile andmetele, mille varasemad põhitöövoo sammud on loonud:

```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 [];
    }
}
```

## Olekute liitmine

Kui käivita töövoog toiming lõpetab, liidetakse selle lõplik olek (välja arvatud sisemised võtmed, nagu `_steps`, `_queue`, `_priority`, `_max_attempts`) põhitöövoo olekuga. Järgmine põhitöövoo samm näeb nii põhitöövoo varasemate sammude kui ka käivita töövoog toimingu kõiki andmeid:

```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 [];
    }
}
```

## Käivita töövoog toimingu valikud

Alam töövoo koostaja `on_queue()`, `with_priority()` ja `max_attempts()` kehtivad alam töövoole. Teisi alam koostaja töövootaseme valikuid, näiteks `on_cancel()`, `prune_state_after()`, `must_complete_within()`, `version()`, `idempotency_key()`, `max_*()` eelarveid ja `compensate_on_failure()`, edasi ei kanta:

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

## Pesastatud käivita töövoog toimingud

Käivita töövoog toimingud võivad ise sisaldada käivita töövoog toiminguid, võimaldades suvalist pesastamist:

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