snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 3s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,121 @@
---
title: الرد التلقائي على رسائل البريد الإلكتروني الواردة
description: أنشئ سير عمل يستخدم الذكاء الاصطناعي لفرز رسائل البريد الإلكتروني الواردة وإرسال ردود ضمن سلسلة المحادثة تلقائيًا.
---
استجب لرسائل البريد الإلكتروني الواردة خلال ثوانٍ — وليس ساعات. يستخدم سير العمل هذا وكيل AI لتصفية الضوضاء (الرسائل الإخبارية، الرسائل غير المرغوب فيها، الردود التلقائية) وصياغة استجابة مخصصة للرسائل الحقيقية. ثم تقوم منظمة العفو الدولية بإرسالها كرد متسلل داخل المحادثة الأصلية.
## كيف يعمل تسلسل رسائل البريد الإلكتروني
تحمل كل رسالة بريد إلكتروني ترويسة `Message-ID` مخفية — بصمة فريدة يعيّنها خادم بريد المرسل. عند الرد على بريد إلكتروني، يقوم عميل البريد لديك بتعيين ترويسة `In-Reply-To` التي تُشير إلى تلك البصمة. بهذه الطريقة يقوم Gmail وOutlook وكل عميل آخر بتجميع الرسائل في سلاسل المحادثات.
في Twenty، تُخزَّن تلك البصمة كـ `headerMessageId` على كائن Message. يلتقطه سير العمل لديك ويمرّره إلى حقل In-Reply-To لإجراء Send Email.
## بناء سير العمل
### الخطوة 1: إنشاء سير عمل جديد
توجّه إلى **Settings -> Workflows** وانقر **+ New Workflow**.
### الخطوة 2: التشغيل عند الرسائل الواردة
اختر **When a Record is Created** ثم **Messages**.
في كل مرة يصل فيها بريد إلكتروني إلى Twenty، يُشغَّل هذا.
<img src="/images/user-guide/workflows/auto-reply/workflow-overview.png" style={{width:'100%'}} />
### الخطوة 3: البحث عن المُرسِل
أضِف إجراء **Search Records**.
عنوان المُرسِل ليس في الرسالة نفسها — بل في سجل Message Participant المرتبط.
| الحقل | القيمة |
| ---------- | ---------------------------------- |
| **الكائن** | المشاركون في الرسالة |
| **تصفية** | Message **يساوي** `{{trigger.id}}` |
| **تصفية** | Role **يساوي** From |
| **الحد** | 1 |
سيمنحك هذا بريد المُرسِل الإلكتروني في `handle` واسمه في `displayName`.
<img src="/images/user-guide/workflows/auto-reply/find-sender.png" style={{width:'100%'}} />
### الخطوة 4: التكرار وصياغة رد مع الذكاء الاصطناعي
أضِف إجراء **AI Agent**. تقوم هذه الخطوة الواحدة بأمرين: تقرر ما إذا كان البريد الإلكتروني يستحق الرد، وإن كان كذلك، تصوغ ردًا.
استخدم موجهًا مثل:
```
You are an email triage assistant for a sales team. Read the following
inbound email and decide if it deserves a reply.
Subject: {{trigger.subject}}
Body: {{trigger.text}}
From: {{Find Sender.first.displayName}} ({{Find Sender.first.handle}})
If this email is spam, a newsletter, an automated notification, or
otherwise does not need a human reply, respond with exactly: SKIP
Otherwise, write a short, professional reply (3-4 sentences max) that:
- Acknowledges their specific message
- Lets them know someone from the team will follow up shortly
- Is warm but not overly casual
Respond with only the reply text, no subject line or greeting prefix.
```
يُنتِج AI Agent استجابته في الحقل `response` الذي يمكن للخطوات التالية الرجوع إليه.
<img src="/images/user-guide/workflows/auto-reply/ai-triage.png" style={{width:'100%'}} />
### الخطوة 5: التفريع بناءً على قرار الذكاء الاصطناعي
أضِف إجراء **If/Else** للتحقق مما إذا كان الذكاء الاصطناعي قرر الرد أم التخطي.
| الحقل | القيمة |
| ------------------ | ------------------------------------------- |
| **الشرط** | AI Agent `response` **لا يحتوي على** `SKIP` |
| **إذا كان صحيحًا** | المتابعة إلى Send Email |
| **وإلا** | لا تفعل شيئًا (ينتهي سير العمل) |
يتم تجاهل الرسائل غير المرغوب فيها والنشرات البريدية والرسائل المُنشأة تلقائيًا. كل ما عدا ذلك ينتقل إلى الخطوة التالية.
<img src="/images/user-guide/workflows/auto-reply/should-reply.png" style={{width:'100%'}} />
### الخطوة 6: إرسال رد ضمن سلسلة المحادثة
أضِف إجراء **Send Email** على فرع "if true". انقر **Advanced options** ثم **Add In-Reply-To**.
| الحقل | القيمة |
| --------------- | -------------------------------------- |
| **إلى** | `{{Find Sender.first.handle}}` |
| **الموضوع** | `Re: {{trigger.subject}}` |
| **المحتوى** | `{{AI Triage & Draft Reply.response}}` |
| **In-Reply-To** | `{{trigger.headerMessageId}}` |
حقل In-Reply-To هو ما يجعل هذا ردًا بدلًا من محادثة جديدة. سيراه المستلِم ضمن سلسلة تحت البريد الأصلي في Gmail أو Outlook أو أي عميل آخر.
<img src="/images/user-guide/workflows/auto-reply/send-email.png" style={{width:'100%'}} />
<Tip>
**In-Reply-To** يتوقّع `message.headerMessageId` من المشغّل — إنها البصمة الفريدة للبريد الإلكتروني، وليست عنوان المستلم. إذا تركته فارغًا، فسيُرسَل البريد الإلكتروني على أي حال، ولكن كرسالة مستقلة.
</Tip>
<Warning>
يستخدم Gmail سطر الموضوع لتجميع الرسائل في سلاسل المحادثات. يجب أن يبدأ الموضوع بـ `Re:` (بما في ذلك النقطتان والمسافة) ليعرض Gmail الرد داخل سلسلة المحادثة الأصلية. بدون ذلك، سيظهر الرد كمحادثة منفصلة — حتى إذا تم تعيين ترويسة In-Reply-To بشكل صحيح.
</Warning>
### الخطوة 7: الاختبار والتفعيل
اضغط **Test**، ثم تحقّق من عميل البريد لديك. يجب أن يظهر الرد متداخلًا تحت الرسالة الأصلية.
فعِّل عندما تكون راضيًا عنه.
## أفكار للبناء عليها
* **الرد على كبار الشخصيات فقط** — أضِف فرعًا يتحقق من مجال المُرسِل أو مما إذا كان موجودًا كجهة اتصال في Twenty
* **التوجيه حسب النية** — استخدم موجهات AI Agent منفصلة للتعامل مع استفسارات المبيعات بشكل مختلف عن طلبات الدعم
* **الإثراء قبل الرد** — أضِف خطوة Search Records لجلب شركة المُرسِل أو سجل الصفقات إلى الموجه الخاص بالذكاء الاصطناعي للحصول على ردود أكثر تخصيصًا

View File

@@ -0,0 +1,179 @@
---
title: أتمتة الصفقات المغلقة الرابحة
description: أتمتة الأنشطة بعد الفوز عند إغلاق الفرص.
---
عند إغلاق صفقة، يجب أن تحدث أمور عدة: تحديث حالة الشركة، إشعار أعضاء الفريق، إنشاء مهام الإعداد. قم بأتمتة كل ذلك عبر سير عمل واحد.
## المشكلة
عند انتقال فرصة إلى "Closed Won":
* يجب تغيير نوع الشركة من "Prospect" إلى "Customer"
* يجب إنشاء مهام الإعداد
* يجب إشعار فريق نجاح العملاء
* يحتاج مندوب المبيعات إلى تأكيد
القيام بذلك يدويًا يستغرق وقتًا ومعرّض للأخطاء.
## الحل
أنشئ سير عمل يتولى تلقائيًا جميع الأنشطة بعد الفوز.
## إعداد سير العمل الكامل
### الخطوة 1: إنشاء سير العمل
1. اذهب إلى **الإعدادات → سير العمل**
2. انقر **+ سير عمل جديد**
3. قم بتسميته "تم ربح الصفقة - أتمتة ما بعد الفوز"
### الخطوة 2: تهيئة المشغّل
1. اختر **Record is Updated**
2. اختر **Opportunities**
3. ضمن "Fields to monitor"، اختر **Stage**
### الخطوة 3: إضافة عامل تصفية للمرحلة
1. أضف إجراء **Filter**
2. الشرط: `{{trigger.object.stage}}` يساوي "Closed Won"
### الخطوة 4: تحديث نوع الشركة
1. أضف إجراء **Update Record**
2. التكوين:
| الحقل | القيمة |
| ------------------ | ------------------------------- |
| **الكائن** | الشركات |
| **السجل** | `{{trigger.object.company.id}}` |
| **نوع** | العميل |
| **تاريخ أول صفقة** | `{{trigger.object.closedAt}}` |
| **مالك الحساب** | `{{trigger.object.owner.id}}` |
### الخطوة 5: إنشاء مهمة إعداد
1. أضف إجراء **Create Record**
2. التكوين:
| الحقل | القيمة |
| -------------------- | ----------------------------------------------------------------------------------------------- |
| **الكائن** | المهام |
| **العنوان** | `Onboarding: {{trigger.object.name}}` |
| **المسند إليه** | عضو فريق نجاح العملاء |
| **تاريخ الاستحقاق** | بعد 3 أيام |
| **الأولوية** | عالية |
| **الشركة ذات الصلة** | `{{trigger.object.company.id}}` |
| **الفرصة ذات الصلة** | `{{trigger.object.id}}` |
| **الوصف** | `إعداد عميل جديد لشركة {{trigger.object.company.name}}. قيمة الصفقة: {{trigger.object.amount}}` |
### الخطوة 6: إشعار فريق نجاح العملاء
1. أضف إجراء **Send Email**
2. التكوين:
| الحقل | القيمة |
| ----------- | ----------------------------------------------- |
| **إلى** | customer-success@yourcompany.com |
| **الموضوع** | `🎉 عميل جديد: {{trigger.object.company.name}}` |
| **المحتوى** | انظر المثال أدناه |
**مثال على محتوى البريد الإلكتروني**:
```
Hi CS Team,
We have a new customer!
Company: {{trigger.object.company.name}}
Deal: {{trigger.object.name}}
Value: {{trigger.object.amount}}
Sales Rep: {{trigger.object.owner.name}}
Close Date: {{trigger.object.closedAt}}
An onboarding task has been created automatically.
Let's give them a great start!
```
### الخطوة 7: تأكيد لمندوب المبيعات
1. أضف إجراء **Send Email** آخر
2. التكوين:
| الحقل | القيمة |
| ----------- | -------------------------------------------------------------------------- |
| **إلى** | `{{trigger.object.owner.email}}` |
| **الموضوع** | `✅ تم إغلاق الصفقة: {{trigger.object.name}}` |
| **المحتوى** | تهانينا! تمت معالجة صفقتك. تم إشعار فريق نجاح العملاء وبدأت عملية الإعداد. |
### الخطوة 8: الاختبار والتفعيل
1. اختبر بنقل فرصة اختبار إلى "Closed Won"
2. التحقق:
* تم تغيير نوع الشركة إلى "Customer"
* تم إنشاء مهمة الإعداد
* تلقى فريق نجاح العملاء بريدًا إلكترونيًا
* تلقى مندوب المبيعات تأكيدًا
3. فعّل عند الجاهزية
## التعامل مع "Closed Lost"
أنشئ سير عمل مشابهًا للصفقات الخاسرة:
### المشغّل
* تم تحديث السجل (Opportunities، Stage = "Closed Lost")
### الإجراءات
1. **Create Record**: مهمة "تحليل الصفقة الخاسرة"
2. **Update Record**: أضِف سبب الخسارة إلى سجل الشركة
3. **Send Email**: إخطار المدير بالصفقة الخاسرة
## متقدم: إعداد متعدد الخطوات
لعمليات الإعداد المعقدة، أنشئ مهام متعددة:
```javascript
export const main = async (params) => {
const tasks = [
{ title: "Welcome call", daysFromNow: 1, assignee: "CS" },
{ title: "Send onboarding materials", daysFromNow: 2, assignee: "CS" },
{ title: "Technical setup", daysFromNow: 5, assignee: "Support" },
{ title: "30-day check-in", daysFromNow: 30, assignee: "CS" }
];
return { tasks };
};
```
استخدم **Iterator** لإنشاء كل مهمة من المصفوفة.
## أفكار للتخصيص
### أبقِ أدواتك الأخرى محدثة
* أنشئ عميلًا في نظام الفوترة بواسطة **HTTP Request**
### الإجراءات المشروطة
استخدم إجراءات **Filter** لـ:
* إعداد مختلف للمؤسسات مقابل الشركات الصغيرة والمتوسطة
* مُسندون مختلفون حسب المنطقة
* تخطي الإشعارات للصفقات الصغيرة
### تضمين تفاصيل الصفقة
استخدم إجراء **Code** للتنسيق:
* مستندات ملخص الصفقة
* ملاحظات التسليم لفريق نجاح العملاء
* قوائم تدقيق إعداد مخصصة
## ذات صلة
* [إجراءات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-actions)
* [إرسال رسائل البريد الإلكتروني من سير العمل](/l/ar/user-guide/workflows/capabilities/send-emails-from-workflows)

View File

@@ -0,0 +1,136 @@
---
title: اكتشاف الفرص الراكدة
description: إخطار المديرين تلقائيًا عند عدم تحديث الفرص.
---
حافظ على صحة خط أنابيب المبيعات من خلال تنبيه المديرين عندما تصبح الفرص راكدة. يتحقق سير العمل هذا من الفرص التي لم يتم تحديثها خلال عدد محدد من الأيام.
## المشكلة
الفرص التي تبقى دون تحديث تؤدي إلى:
* فتور الصفقات
* توقعات غير موثوقة
* إيرادات مفقودة
## الحل
أنشئ سير عملًا مُجدولًا يعثر على الفرص الراكدة ويرسل بريدًا إلكترونيًا إلى مديريها.
## إعداد خطوة بخطوة
### الخطوة 1: إنشاء سير العمل
1. اذهب إلى **الإعدادات → سير العمل**
2. انقر **+ سير عمل جديد**
3. قم بتسميته "تنبيه الفرص الراكدة"
### الخطوة 2: تهيئة المشغّل
1. حدد **وفق جدول**
2. عيّن التشغيل يوميًا (مثلاً، كل يوم الساعة 8 صباحًا)
### الخطوة 3: البحث عن الفرص الراكدة
1. أضف إجراء **Search Records**
2. التكوين:
| الحقل | القيمة |
| ---------- | ------------------------------------------- |
| **الكائن** | الفرص |
| **تصفية** | Updated At قبل (اليوم - 7 أيام) |
| **تصفية** | المرحلة ليست "Closed Won" ولا "Closed Lost" |
| **الحد** | 100 |
### الخطوة 4: التحقق مما إذا تم العثور على أي عناصر
1. أضف إجراء **تصفية**
2. الشرط: `{{searchRecords.length}}` أكبر من 0
3. إذا لم توجد فرص راكدة، يتوقف سير العمل هنا
### الخطوة 5: تنسيق التنبيه (إجراء Code)
أضف إجراء **Code** لتنسيق البريد الإلكتروني:
```javascript
export const main = async (params) => {
const opportunities = params.opportunities;
// Group opportunities by owner
const byOwner = {};
opportunities.forEach(opp => {
const ownerEmail = opp.owner?.email || 'unassigned';
if (!byOwner[ownerEmail]) {
byOwner[ownerEmail] = [];
}
byOwner[ownerEmail].push({
name: opp.name,
amount: opp.amount,
lastUpdated: opp.updatedAt,
stage: opp.stage
});
});
// Format summary for manager
let summary = "Stale Opportunities Report\n\n";
Object.entries(byOwner).forEach(([owner, opps]) => {
summary += `${owner}: ${opps.length} stale opportunities\n`;
opps.forEach(opp => {
summary += ` - ${opp.name} (${opp.stage})\n`;
});
summary += "\n";
});
return {
summary,
totalCount: opportunities.length
};
};
```
### الخطوة 6: إرسال بريد التنبيه
أضف إجراء **Send Email**:
| الحقل | القيمة |
| ----------- | --------------------------------------------------- |
| **إلى** | sales-manager@yourcompany.com |
| **الموضوع** | `🚨 {{code.totalCount}} فرص راكدة تحتاج إلى اهتمام` |
| **المحتوى** | `{{code.summary}}` |
### الخطوة 7: الاختبار والتفعيل
1. انقر **Test** لتشغيل سير العمل
2. تحقق من أن البريد الإلكتروني يحتوي على البيانات الصحيحة
3. فعّل عند الجاهزية
## خيارات التخصيص
### تغيير عتبة الركود
عدّل عامل تصفية Search Records لتغيير 7 أيام إلى الفترة التي تفضّلها:
* 3 أيام للمبيعات سريعة الوتيرة
* 14 يومًا لصفقات المؤسسات
* 30 يومًا لدورات المبيعات الطويلة
### تنبيه المندوبين بشكل فردي
بدلًا من بريد مدير واحد، استخدم **Iterator** لإرسال رسائل مخصصة إلى كل مندوب حول صفقاته الراكدة.
### إضافة تصعيد
أنشئ عدة سير عمل بتدرّج في الشدة:
1. اليوم 7: بريد إلى المندوب
2. اليوم 14: بريد إلى المندوب + المدير
3. اليوم 21: إنشاء مهمة للمدير للتدخل
### التضمين في Slack
استخدم **HTTP Request** للنشر إلى Slack webhook بدلًا من البريد الإلكتروني أو بالإضافة إليه.
## ذات صلة
* [إجراءات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-actions)
* [إرسال رسائل البريد الإلكتروني من سير العمل](/l/ar/user-guide/workflows/capabilities/send-emails-from-workflows)

View File

@@ -0,0 +1,69 @@
---
title: عرض عدد رسائل البريد الإلكتروني المستلمة
description: أنشئ سير عمل لحساب عدد رسائل البريد الإلكتروني المستلمة من كل جهة اتصال وعرضه تلقائيًا.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<img src="/images/user-guide/workflows/workflow-number-of-emails-received.png" style={{width:'100%'}} />
## نظرة عامة
يعمل سير العمل هذا في كل مرة يتم فيها استلام بريد إلكتروني جديد، ويحدّث حقلًا مخصصًا في سجل Person بالقيمة الإجمالية لعدد الرسائل من ذلك المرسِل.
## المتطلبات الأساسية
قبل إعداد سير العمل هذا، أنشئ حقلًا مخصصًا على كائن **People**:
1. اذهب إلى **الإعدادات → نموذج البيانات → People**
2. أضف حقل **Number** جديدًا
3. قم بتسميته بشيء مثل "عدد رسائل البريد الإلكتروني المستلمة من هذا الشخص"
## إعداد خطوة بخطوة
<VimeoEmbed videoId="1148700336" title="عرض توضيحي بالفيديو" />
### الخطوة 1: تهيئة المشغّل
1. انتقل إلى **سير العمل** وأنشئ سير عمل جديدًا
2. اختر **Record is Created** كالمشغّل
3. اختر **Message Participants** (متوفر ضمن الكائنات المتقدمة)
<Note>
يمثّل Message Participant مزيجًا بين معرّف الرسالة ومعرّف الشخص، ما ينشئ سجلًا فريدًا واحدًا لكل رسالة. يكون هذا أسهل في التتبع من Messages مباشرةً لأننا نستطيع الوصول إلى الحقل `handle` الذي يحتوي على عنوان البريد الإلكتروني للمرسل (أو المستلم).
</Note>
### الخطوة 2: التصفية حسب Role
1. أضف إجراء **Filter**
2. عيّن الشرط: **Role** يساوي **FROM**
يضمن هذا أن تحسب الرسائل المُرسلة من هذا الشخص فقط، وليس الرسائل المُرسلة إليه.
### الخطوة 3: البحث عن جميع Message Participants الذين لديهم نفس الـ Handle
1. أضف إجراء **Search Records**
2. حدّد **Message Participants** كالكائن
3. أضف عوامل تصفية: **Handle** يساوي الـ handle من المشغّل (عنوان البريد الإلكتروني للمرسل) و**Role** يساوي **FROM**
4. قم بزيادة **Limit** من 1 إلى **200** (الحد الأقصى)
هذا يعثر على جميع الرسائل من عنوان البريد الإلكتروني هذا للحصول على العدد الإجمالي.
<Note>
إجراء Search Records محدود بإرجاع 200 سجل كحد أقصى. ومع ذلك، بما أنك تستخدم قيمة `totalCount` فقط (وليس السجلات الفردية)، فستُرجِع هذه الخطوة إجمالي عدد رسائل البريد الإلكتروني المُرسلة من هذا الشخص.
</Note>
### الخطوة 4: تحديث سجل Person باستخدام إجراء Create or Update Record
1. أضف إجراء **Create or Update Record**
2. حدّد **People** كالكائن
3. اعثر على الشخص بمطابقة بريده الإلكتروني مع قيمة `handle` من Message Participant
4. عيّن الحقل المخصص "عدد رسائل البريد الإلكتروني المستلمة" إلى `{{searchRecords.totalCount}}`
تمثّل قيمة `totalCount` من إجراء Search Records إجمالي عدد رسائل البريد الإلكتروني المستلمة من هذا الشخص.
## ذات صلة
* [إجراءات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-actions)
* [إنشاء حقول مخصصة](/l/ar/user-guide/data-model/how-tos/customize-your-data-model)
* [إجراء Search Records](/l/ar/user-guide/workflows/capabilities/workflow-actions#search-records)

View File

@@ -0,0 +1,170 @@
---
title: عرض بيانات السجل المرتبط
description: اعرض بيانات من سجلات مرتبطة (مثل معلومات الشركة على الفرص) باستخدام سير العمل.
---
اعرض بيانات من سجلات مرتبطة مباشرةً على سجلاتك — على سبيل المثال، اعرض عدد الموظفين من شركة على فرصها. هذا الحل عبر سير العمل مفيد حتى تصبح الحقول المتداخلة مدعومة أصلاً.
## الاستخدامات الشائعة
| المصدر | الوجهة | الحقول المطلوب نسخها |
| ------ | ------ | ------------------------------------------------- |
| الشركة | الفرصة | الصناعة، حجم الشركة، الإيراد السنوي المتكرر (ARR) |
| شخص | الفرصة | البريد الإلكتروني، الهاتف، المسمّى الوظيفي |
| الفرصة | الشركة | قيمة آخر صفقة، تاريخ آخر صفقة رابحة |
## نسخ أساسي للحقل
### مثال: نسخ البريد الإلكتروني لجهة الاتصال إلى الفرصة
**الهدف**: عند تعيين نقطة اتصال على فرصة، انسخ البريد الإلكتروني لجهة الاتصال إلى الفرصة لسهولة الوصول.
### المتطلبات الأساسية
أنشئ حقول الوجهة في **الإعدادات → نموذج البيانات → الفرص** قبل إنشاء سير العمل:
* البريد الإلكتروني لجهة الاتصال (النوع: Email)
* هاتف جهة الاتصال (النوع: Phone)
### إعداد
1. **المحفّز**: يتم تحديث السجل (الفرص، حقل نقطة الاتصال)
2. **الفلتر**: تحقّق من أن نقطة الاتصال غير فارغة
3. **البحث في السجلات**: اعثر على الشخص المرتبط
* الكائن: الأشخاص
* الفلتر: المعرّف يساوي `{{trigger.object.pointOfContact.id}}`
4. **تحديث السجل**:
* الكائن: الفرص
* السجل: `{{trigger.object.id}}`
* البريد الإلكتروني لجهة الاتصال: `{{searchRecords[0].email}}`
* هاتف جهة الاتصال: `{{searchRecords[0].phone}}`
## نسخ عدة حقول
### مثال: مزامنة معلومات الشركة مع جميع الفرص المرتبطة
**الهدف**: عند تغيّر تفاصيل الشركة، حدّث جميع الفرص المرتبطة.
### إعداد
1. **المحفّز**: يتم تحديث السجل (الشركات)
* الحقول: الصناعة، حجم الشركة، الإيراد السنوي
2. **البحث في السجلات**: اعثر على جميع الفرص الخاصة بهذه الشركة
* الكائن: الفرص
* الفلتر: معرّف الشركة يساوي `{{trigger.object.id}}`
3. **Iterator**: التكرار عبر كل فرصة
4. **تحديث السجل** (داخل الـ Iterator):
* الكائن: الفرص
* السجل: `{{iterator.currentItem.id}}`
* صناعة الشركة: `{{trigger.object.industry}}`
* حجم الشركة: `{{trigger.object.companySize}}`
* الإيراد السنوي المتكرر للشركة: `{{trigger.object.annualRevenue}}`
## النسخ عند إنشاء السجل
### مثال: تعبئة الفرصة مسبقًا ببيانات الشركة
**الهدف**: عند إنشاء فرصة مرتبطة بشركة، انسخ تلقائيًا معلومات الشركة الأساسية.
### المتطلبات الأساسية
أنشئ حقول الوجهة في **الإعدادات → نموذج البيانات → الفرص**:
* صناعة الشركة (النوع: Text)
* حجم الشركة (النوع: Number)
### إعداد
1. **المحفّز**: يتم إنشاء السجل (الفرص)
* الفلتر: الشركة ليست فارغة
2. **البحث في السجلات**: احصل على تفاصيل الشركة المرتبطة
* الكائن: الشركات
* الفلتر: المعرّف يساوي `{{trigger.object.company.id}}`
3. **تحديث السجل**:
* الكائن: الفرص
* السجل: `{{trigger.object.id}}`
* صناعة الشركة: `{{searchRecords[0].industry}}`
* حجم الشركة: `{{searchRecords[0].employees}}`
<Note>
**قيود المهام والملاحظات**: العلاقات في المهام والملاحظات مُحدّدة في الشفرة كعلاقات متعدّدة-لمتعدّدة وليست متاحة بعد في محفّزات أو إجراءات سير العمل. للوصول إلى هذه العلاقات، استخدم بدلًا من ذلك [API](/l/ar/developers/extend/api).
</Note>
## مزامنة ثنائية الاتجاه
### مثال: الحفاظ على تزامن جهة الاتصال الأساسية
**الهدف**: عند تغيّر جهة الاتصال الأساسية للشركة، حدّث جهة الاتصال. وعندما يصبح شخص ما جهة الاتصال الأساسية، حدّث الشركة.
### سير العمل 1: الشركة → الشخص
1. **المحفّز**: يتم تحديث السجل (الشركات، حقل جهة الاتصال الأساسية)
2. **تحديث السجل**: عيّن قيمة "Is Primary Contact" للشخص إلى true
3. **البحث في السجلات**: اعثر على جهة الاتصال الأساسية السابقة
4. **تحديث السجل**: عيّن قيمة "Is Primary Contact" لجهة الاتصال السابقة إلى false
### سير العمل 2: الشخص → الشركة
1. **المحفّز**: يتم تحديث السجل (الأشخاص، Is Primary Contact = true)
2. **تحديث السجل**: عيّن جهة الاتصال الأساسية للشركة إلى هذا الشخص
<Note>
كن حذرًا مع المزامنات ثنائية الاتجاه لتجنّب الحلقات اللانهائية. استخدم عوامل تصفية للتحقّق مما إذا كانت القيمة قد تغيّرت فعلاً قبل التحديث.
</Note>
## استخدام الشيفرة للتعيين المعقّد
### مثال: تحويل البيانات أثناء النسخ
**الهدف**: نسخ رقم الهاتف من الشخص إلى الفرصة وتنسيقه.
```javascript
export const main = async (params) => {
const { phone } = params;
if (!phone) return { formattedPhone: null };
// Remove non-numeric characters
const digits = phone.replace(/\D/g, '');
// Format as (XXX) XXX-XXXX
const formatted = digits.length === 10
? `(${digits.slice(0,3)}) ${digits.slice(3,6)}-${digits.slice(6)}`
: phone;
return { formattedPhone: formatted };
};
```
## أفضل الممارسات
### تجنّب الحلقات
* لا تنشئ سير عمل تُحفّز بعضها بعضًا بلا نهاية
* استخدم شروطًا خاصة بالحقول
* أضف تحقّقات لمعرفة ما إذا كانت القيمة قد تغيّرت فعلاً
### التعامل مع البيانات المفقودة
* تحقّق دائمًا من وجود سجل المصدر قبل النسخ
* وفّر قيمًا افتراضية للحقول الاختيارية
* استخدم عوامل تصفية للتخطّي عندما يكون حقل المصدر فارغًا
### الأداء
* نفّذ تحديثات دفعية عند النسخ إلى العديد من السجلات
* استخدم سير عمل مجدولة لعمليات المزامنة بالجملة
* فكّر في استخدام Iterator لتحديثات متعددة للسجلات
## ذات صلة
* [إجراءات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-actions)
* [محفّزات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-triggers)

View File

@@ -0,0 +1,202 @@
---
title: حقول الصيغ
description: أنشئ حقول الصيغ باستخدام سير العمل إلى حين توفّر الدعم الأصلي.
---
20 لا تدعم بعد حقول الصيغة الأصلية (القادمة في عام 2026)، ولكن يمكنك تحقيق نفس النتيجة باستخدام سير العمل. يتيح لك هذا الحل البديل حساب قيم الحقول وملؤها تلقائيًا — من عمليات الربط البسيطة إلى منطق الأعمال المعقّد.
## الاستخدامات الشائعة
| حالة الاستخدام | مثال على الصيغة |
| ------------------------ | ------------------------------- |
| **الاسم الكامل** | الاسم الأول + " " + اسم العائلة |
| **المبلغ المتوقع** | المبلغ × الاحتمال |
| **الأيام حتى الاستحقاق** | تاريخ الاستحقاق - اليوم |
| **الأيام في المرحلة** | اليوم - تاريخ دخول المرحلة |
| **درجة العميل المحتمل** | نقاط استنادًا إلى معايير متعددة |
<Tip>
للاطلاع على مثال كامل لتتبّع الوقت في مراحل خط الأنابيب، راجع [تتبّع مدة بقاء الفرص في كل مرحلة](/l/ar/user-guide/views-pipelines/how-tos/track-time-in-stage).
</Tip>
## صيغة أساسية: الربط
### مثال: تعبئة الاسم الكامل تلقائيًا
**الهدف**: دمج الاسم الأول واسم العائلة تلقائيًا في حقل الاسم الكامل.
### إعداد
1. **المشغّل**: يتم تحديث السجل أو إنشاؤه (الأشخاص)
2. **التصفية**: التحقق من تغيّر الاسم الأول أو اسم العائلة
3. **إجراء الكود**:
```javascript
export const main = async (params) => {
const { firstName, lastName } = params;
const fullName = [firstName, lastName]
.filter(Boolean)
.join(' ');
return { fullName };
};
```
4. **تحديث السجل**: عيّن الاسم الكامل إلى `{{code.fullName}}`
## صيغة رقمية: المبلغ المتوقع
### مثال: حساب الإيراد المتوقع
**الهدف**: ضرب مبلغ الفرصة في الاحتمال للحصول على المبلغ المتوقع.
اطلع على [كيفية إظهار المبلغ المتوقع في خط الأنابيب](/l/ar/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) للاطلاع على سير العمل الكامل.
### إعداد
1. **المشغّل**: يتم تحديث السجل (الفرص، حقل المبلغ أو الاحتمال)
2. **إجراء الكود**:
```javascript
export const main = async (params) => {
const { amount, probability } = params;
const expectedAmount = (amount || 0) * (probability || 0) / 100;
return { expectedAmount };
};
```
3. **تحديث السجل**: عيّن المبلغ المتوقع إلى `{{code.expectedAmount}}`
## صيغة التاريخ: حساب الأيام
### مثال: الأيام المتبقية حتى استحقاق المهمة
**الهدف**: حساب عدد الأيام المتبقية حتى تاريخ استحقاق المهمة.
### إعداد
1. **المشغّل**: يتم تحديث السجل أو إنشاؤه (المهام، حقل تاريخ الاستحقاق)
2. **إجراء الكود**:
```javascript
export const main = async (params) => {
const { dueDate } = params;
if (!dueDate) {
return { daysUntilDue: null };
}
const due = new Date(dueDate);
const today = new Date();
const diffTime = due - today;
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return { daysUntilDue: diffDays };
};
```
3. **تحديث السجل**: عيّن الأيام حتى الاستحقاق إلى `{{code.daysUntilDue}}`
<Note>
تشير القيم السالبة إلى مهام متأخرة عن موعدها. يمكنك استخدام هذا الحقل لتصفية المهام أو فرزها حسب الإلحاح.
</Note>
## صيغة شرطية: درجة العميل المحتمل
### مثال: حساب درجة العميل المحتمل بناءً على معايير
**الهدف**: منح نقاط للعملاء المحتملين استنادًا إلى حجم الشركة والصناعة والتفاعل.
### إعداد
1. **المشغّل**: يتم تحديث السجل (الأشخاص أو الشركات)
2. **إجراء الكود**:
```javascript
export const main = async (params) => {
const { companySize, industry, hasEmail, hasPhone, source } = params;
let score = 0;
// Company size scoring
if (companySize === 'Enterprise') score += 30;
else if (companySize === 'Mid-Market') score += 20;
else if (companySize === 'SMB') score += 10;
// Industry scoring
const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
if (targetIndustries.includes(industry)) score += 25;
// Contact info scoring
if (hasEmail) score += 10;
if (hasPhone) score += 15;
// Source scoring
if (source === 'Referral') score += 20;
else if (source === 'Website') score += 10;
return { leadScore: score };
};
```
3. **تحديث السجل**: عيّن درجة العميل المحتمل إلى `{{code.leadScore}}`
## صيغة نصية: استخراج النطاق
### مثال: استخراج النطاق من البريد الإلكتروني
**الهدف**: استخراج نطاق البريد الإلكتروني وتخزينه تلقائيًا.
### إعداد
1. **المشغّل**: يتم تحديث السجل (الأشخاص، حقل البريد الإلكتروني)
2. **إجراء الكود**:
```javascript
export const main = async (params) => {
const { email } = params;
if (!email) return { domain: null };
const domain = email.split('@')[1]?.toLowerCase();
return { domain };
};
```
3. **تحديث السجل**: عيّن حقل النطاق إلى `{{code.domain}}`
## أفضل الممارسات
### الأداء
* فعّل المشغّل فقط عند تغيّر الحقول ذات الصلة
* استخدم عوامل التصفية لتجاوز السجلات التي لا تحتاج إلى حساب
* تجنّب الحسابات المعقّدة في عمليات سير عمل ذات حجم كبير
### التعامل مع الأخطاء
* تحقق من القيم null/undefined قبل إجراء الحسابات
* استخدم قيمًا افتراضية عند فقدان البيانات
* أعد رسائل خطأ واضحة عند فشل الحسابات
### "الاختبار"
* اختبر بحالات الحافة (حقول فارغة، قيم صفرية)
* تحقّق من الحسابات يدويًا قبل التفعيل
* راقب تشغيلات سير العمل لرصد النتائج غير المتوقعة
## ذات صلة
* [كيفية إظهار المبلغ المتوقع في خط الأنابيب](/l/ar/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
* [كيفية تتبّع الوقت في المرحلة](/l/ar/user-guide/views-pipelines/how-tos/track-time-in-stage)
* [إجراءات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-actions)

View File

@@ -0,0 +1,127 @@
---
title: إشعار الزملاء بملاحظة للمراجعة
description: أرسل إشعارات بريد إلكتروني تلقائية عند إسناد زميل لمراجعة ملاحظة.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<Note>
**الإشارة إلى الزملاء مباشرةً داخل الملاحظات غير مدعومة بعد.** من المخطط طرح هذه الميزة في النصف الثاني من عام 2026. في هذه الأثناء، يوفّر سير العمل هذا حلاً عمليًا بديلاً.
</Note>
## التحدّي
تريد الإشارة إلى زميل في ملاحظة ليصله إشعار لمراجعتها. حاليًا، Twenty لا يدعم @mentions في الملاحظات أو المهام.
## الحل البديل
بدلًا من الإشارة في نص الملاحظة، يمكنك:
1. أنشئ حقل علاقة **Reviewer** على كائن Notes
2. عيّن المراجع عند إنشاء الملاحظة أو تحريرها
3. الحصول على سير العمل إرسال بريد إلكتروني تلقائياً إلى المستعرض مع رابط إلى الملاحظة
<Warning>
**قيد**: يتيح هذا الأسلوب تعيين مراجع واحد لكل حقل. إذا كنت بحاجة إلى إشعار عدة أشخاص، فأنشئ حقول علاقة إضافية (مثلًا: Reviewer 1، Reviewer 2). لن يكون ذلك قابلًا للتوسّع بشكلٍ جيد إذا احتجت إلى الإشارة إلى العديد من المتعاونين دفعةً واحدة.
</Warning>
## إعداد خطوة بخطوة
### الخطوة 1: إنشاء حقل المراجع
<img src="/images/user-guide/workflows/reviewer-field-for-note.png" style={{width:'100%'}} />
1. انتقل إلى **الإعدادات → نموذج البيانات → Notes**
2. انقر **إضافة حقل**
3. التكوين:
| الإعداد | القيمة |
| ------------------ | --------------------------------------------- |
| **Name** | Reviewer |
| **النوع** | علاقة |
| **الكائن المرتبط** | عضو في مساحة العمل |
| **نوع العلاقة** | العديد من الملاحظات → عضو واحد في مساحة العمل |
4. احفظ الحقل
### الخطوة 2: إنشاء سير العمل
<VimeoEmbed videoId="1151897168" title="عرض توضيحي بالفيديو" />
#### إنشاء مشغّل سير العمل
1. انتقل إلى العرض الرئيسي وأنشئ سير عمل جديدًا
2. اختر **Record Updated** كمشغِّل
3. اختر **Note** كالكائن وحدِّد حقل Reviewer.
4. سيؤدي ذلك إلى التشغيل كلما تم تحديث مُراجع الملاحظة.
#### أضِف عامل تصفية للتحقق من أنه تم تعيين المراجع للتو
أضِف إجراء **Filter** للتأكد من أن سير العمل يستمر فقط عند تعيين مراجع:
| الشرط | القيمة |
| ------------ | -------- |
| **Reviewer** | غير فارغ |
#### ابحث عن عضو مساحة العمل
1. أضف إجراء **Search Records**
2. حدِّد **Workspace Member** (ضمن الكائنات المتقدمة)
3. أضف عامل تصفية:
| الشرط | القيمة |
| ------ | --------------------------- |
| **ID** | يساوي `{{note.reviewerId}}` |
هذا يجلب سجل عضو مساحة العمل الكامل، بما في ذلك عنوان بريده الإلكتروني واسمه.
#### إرسال بريد الإشعار الإلكتروني
1. أضف إجراء **Send Email**
2. التكوين:
| الحقل | القيمة |
| ----------- | --------------------------------------------------- |
| **إلى** | Search Record → First Workspace Member → User Email |
| **الموضوع** | هناك ملاحظة تحتاج إلى مراجعتك |
| **المحتوى** | انظر المثال أدناه |
**مثال على محتوى البريد الإلكتروني:**
```text
Hi {{searchRecord.firstWorkspaceMember.name.firstName}},
You've been assigned to review a note.
View the note here:
https://yourSubDomain.twenty.com/object/note/{{recordIsUpdated.id}}
Best,
Twenty
```
<Note>
استبدل `yourSubDomain` بنطاقك الفرعي الفعلي لمساحة عمل Twenty.
</Note>
#### الاختبار والتفعيل
1. انقر **Test** لتشغيل سير العمل يدويًا
2. أنشئ ملاحظة (أو حرّر ملاحظة موجودة) وعيّن مراجعًا
3. تحقّق من بريد المراجع الوارد بحثًا عن رسالة الإشعار
4. فعّل سير العمل
## استخدام
بعد الإعداد، يمكن لفريقك استخدام سير العمل هذا عبر:
1. إنشاء ملاحظة جديدة (أو تحرير ملاحظة موجودة)
2. اختيار زميل في حقل **Reviewer**
3. سيتلقى الزميل تلقائيًا بريدًا إلكترونيًا يحتوي على رابط مباشر إلى الملاحظة
## ذات صلة
* [مشغلات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-triggers)
* [إرسال رسائل البريد الإلكتروني من سير العمل](/l/ar/user-guide/workflows/capabilities/send-emails-from-workflows)
* [إنشاء حقول مخصصة](/l/ar/user-guide/data-model/how-tos/create-custom-fields)
* [إنشاء حقول العلاقات](/l/ar/user-guide/data-model/how-tos/create-relation-fields)

View File

@@ -0,0 +1,106 @@
---
title: إرسال تنبيهات عبر البريد الإلكتروني بشأن المهام المستحقة
description: إخطار أعضاء الفريق تلقائيًا بمهامهم القادمة أو المتأخرة.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
<img src="/images/user-guide/workflows/email_tasks_due.png" style={{width:'100%'}} />
إرسال تذكيرات يومية عبر البريد الإلكتروني لكل عضو في الفريق بشأن المهام المستحقة اليوم.
## نظرة عامة
يعمل سير العمل هذا وفق جدول زمني ويقوم بما يلي:
1. يجلب جميع أعضاء مساحة العمل
2. يُنفِّذ حلقة على كل عضو
3. يعثر على مهامهم المستحقة اليوم
4. ينسّق ويرسل بريدًا إلكترونيًا مخصصًا
## إعداد خطوة بخطوة
<VimeoEmbed videoId="1147463514" title="عرض توضيحي بالفيديو" />
### الخطوة 1: تهيئة المشغّل
1. انتقل إلى **الإعدادات → سير العمل** وأنشئ سير عمل جديد
2. حدّد **وفق جدول** كمشغّل
3. استخدم تعبير cron للتشغيل يوميًا عند الساعة 8:00 صباحًا: `0 8 * * *`
### الخطوة 2: البحث عن جميع أعضاء مساحة العمل
1. أضف إجراء **Search Records**
2. حدّد **Workspace Members** (ضمن الكائنات المتقدمة)
3. لا حاجة إلى فلاتر — فهذا يعيد جميع الأعضاء
### الخطوة 3: إضافة Iterator
1. أضف إجراء **Iterator**
2. اضبط مصفوفة الإدخال على أعضاء مساحة العمل من الخطوة السابقة
3. ستُنفَّذ جميع الإجراءات داخل المكرّر مرة واحدة لكل عضو
### الخطوة 4: البحث عن المهام المستحقة اليوم (داخل المكرّر)
1. داخل المكرّر، أضف إجراء **Search Records**
2. حدّد **Tasks** كالكائن
3. أضف فلاتر:
* **Assignee** = عضو مساحة العمل الحالي (من المكرّر)
* **Due Date** = اليوم
### الخطوة 5: تنسيق المهام ضمن محتوى البريد الإلكتروني (داخل المكرّر)
أضف إجراء **Code** لتنسيق المهام في قائمة قابلة للقراءة مع روابط:
```javascript
export const main = async (params: {
tasksDue?: Array<{ id: string; title: string }> | null | string;
}) => {
const tasksDue =
typeof params.tasksDue === "string"
? JSON.parse(params.tasksDue)
: params.tasksDue;
if (!Array.isArray(tasksDue) || tasksDue.length === 0) {
return {
formattedTasks: "No tasks due today."
};
}
const formattedTasks = tasksDue
.map(
t =>
`${t.title}\nhttps://yourSubDomain.twenty.com/object/task/${t.id}`
)
.join("\n\n");
return { formattedTasks };
};
```
<Note>
استبدل `yourSubDomain` بنطاقك الفرعي الفعلي لمساحة عمل Twenty.
</Note>
### الخطوة 6: إرسال بريد إلكتروني (داخل المكرّر)
1. أضف إجراء **Send Email** (ما زال داخل المكرّر)
2. التكوين:
| الحقل | القيمة |
| ----------- | ------------------------------------------------------------------------- |
| **إلى** | `{{iterator.currentItem.userEmail}}` (البريد الإلكتروني لعضو مساحة العمل) |
| **الموضوع** | مهامك المستحقة اليوم |
| **المحتوى** | `{{code.formattedTasks}}` |
### الخطوة 7: الاختبار والتفعيل
1. انقر **Test** لتشغيل سير العمل يدويًا
2. تحقّق من صناديق الوارد للرسائل الإلكترونية
3. فعّل سير العمل
## ذات صلة
* [إجراءات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-actions)
* [إرسال رسائل البريد الإلكتروني من سير العمل](/l/ar/user-guide/workflows/capabilities/send-emails-from-workflows)
* [التعامل مع المصفوفات في إجراءات Code](/l/ar/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions)