
# تشغيل مهام سير العمل

يمكن لسير العمل بدء سير عمل فرعي كإحدى خطواته. يتوقف سير العمل الرئيسي مؤقتًا إلى أن يكتمل سير العمل الفرعي، ثم يدمج الحالة النهائية للفرعي في حالته.

## طريقة `->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' ] );
```

تأخذ طريقة `run_workflow()` وسيطين:
1. اسم لسير العمل الفرعي
2. مثيل `WorkflowBuilder` يعرّف خطوات سير العمل الفرعي

## طريقة العمل

عندما يصل سير العمل الرئيسي إلى خطوة `run_workflow`:

1. يُطلق سير العمل الفرعي كسير عمل مستقل بمعرّف خاص به
2. يتوقف سير العمل الرئيسي مؤقتًا
3. ينفذ سير العمل الفرعي خطواته كالمعتاد
4. عند اكتمال سير العمل الفرعي، تُدمج حالته النهائية في حالة سير العمل الرئيسي
5. يستأنف سير العمل الرئيسي التنفيذ بالخطوة التالية

## حالة سير العمل الرئيسي والفرعي

يتلقى سير العمل الفرعي الحالة المتراكمة الحالية لسير العمل الرئيسي كحمولة أولية. وهذا يعني أن خطوات الفرعي يمكنها الوصول إلى أي بيانات أنتجتها خطوات الرئيسي السابقة:

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

## دمج الحالة

عند اكتمال سير العمل الفرعي، تُدمج حالته النهائية (باستثناء المفاتيح الداخلية مثل `_steps` و`_queue` و`_priority` و`_max_attempts`) في حالة سير العمل الرئيسي. وسترى الخطوة التالية في الرئيسي بيانات جميع خطواته السابقة وسير العمل الفرعي:

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

## خيارات سير العمل الفرعي

تنطبق خيارات منشئ سير العمل الفرعي `on_queue()` و`with_priority()` و`max_attempts()` على سير العمل الفرعي. أما خيارات مستوى سير العمل الأخرى في المنشئ الفرعي، مثل `on_cancel()` و`prune_state_after()` و`must_complete_within()` و`version()` و`idempotency_key()` وميزانيات `max_*()` و`compensate_on_failure()`، فلا تنتقل إليه:

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

## مهام سير العمل الفرعية المتداخلة

يمكن أن تحتوي مهام سير العمل الفرعية على مهام أخرى، مما يتيح تداخلًا بأي عمق:

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