
# Zagon potekov dela

Potek dela lahko kot enega od svojih korakov zažene podrejeni potek dela. Nadrejeni počaka, da se zagon poteka dela zaključi, nato pa končno stanje podrejenega združi s svojim stanjem.

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

Metoda `run_workflow()` sprejme dva argumenta:
1. Ime zagona poteka dela
2. Instanco `WorkflowBuilder`, ki določa korake zagona poteka dela

## Kako deluje

Ko nadrejeni potek dela doseže korak `run_workflow`:

1. Zagon poteka dela se zažene kot neodvisen potek dela z lastnim ID-jem
2. Nadrejeni potek dela se začasno ustavi
3. Zagon poteka dela običajno izvede svoje korake
4. Ko se zagon poteka dela zaključi, se njegovo končno stanje združi s stanjem nadrejenega
5. Nadrejeni potek dela nadaljuje z naslednjim korakom

## Stanje nadrejenega in podrejenega

Zagon poteka dela prejme trenutno zbrano stanje nadrejenega poteka dela kot začetni podatkovni niz. Tako lahko podrejeni koraki dostopajo do vseh podatkov, ki so jih ustvarili prejšnji koraki nadrejenega:

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

## Združevanje stanja

Ko se zagon poteka dela zaključi, se njegovo končno stanje (brez notranjih ključev, kot so `_steps`, `_queue`, `_priority`, `_max_attempts`) združi s stanjem nadrejenega. Naslednji korak nadrejenega vidi vse podatke iz prejšnjih korakov nadrejenega in zagona poteka dela:

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

## Možnosti zagona poteka dela

Možnosti `on_queue()`, `with_priority()` in `max_attempts()` gradnika za zagon poteka dela veljajo za podrejeni potek dela. Druge možnosti na ravni poteka dela v podrejenem gradniku, kot so `on_cancel()`, `prune_state_after()`, `must_complete_within()`, `version()`, `idempotency_key()`, omejitve `max_*()` in `compensate_on_failure()`, se ne prenesejo:

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

## Ugnezdeni zagoni potekov dela

Zagoni potekov dela lahko vsebujejo tudi druge zagone potekov dela, kar omogoča poljubno gnezdenje:

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