Flow — موافقة الإجازة (Leave Approval) — دليل كامل خطوة بخطوة
التطبيق:
HR Leave
Scope: x_786686_hr_leave
الجدول:
x_786686_hr_leave_req_v2افتح Flow Designer:
URL: /$flow-designer.do
أو من Studio:
Create Application File → Flow
0) قبل أن تبدأ (Prerequisites)
يجب أن يكون جاهزًا قبل الـ Flow:
| # | العنصر | السبب |
|---|---|---|
| 1 | جدول x_786686_hr_leave_req_v2 مع حقل u_state | حالات draft / submitted / approved / rejected |
| 2 | حقل u_approver_user (Approver) | من يوافق |
| 3 | Business Rule BR1 | يملأ u_approver_user من مدير الموظف قبل الحفظ |
| 4 | مستخدم اختبار + مدير له دور موافق | للتجربة |
بدون u_approver_user مملوء، خطوة Ask For Approval لن تجد معتمدًا.
ملف BR1:
src/server/business_rules/BR1_calculate_days.js
1) الفكرة (ماذا يفعل الـ Flow)
text
الموظف يغيّر الحالة إلى submitted
↓
Flow يبدأ (Trigger: Record Updated + شرط submitted)
↓
Ask For Approval → يرسل للمعتمد في u_approver_user
↓
إذا وافق → u_state = approved
إذا رفض → u_state = rejected
↓
BR3 يسجّل التدقيق ويحدّث الرصيد (بعد تغيير الحالة)
مهم:
لا تستخدم Trigger Record Created فقط إذا الطلب يُنشأ أولًا كـ draft ثم يُرسل لاحقًا.
استخدم Record Updated عندما تصبح الحالة submitted.
2) إنشاء Flow جديد
الخطوات
- افتح Flow Designer.
URL: /$flow-designer.do - اضغط Create Flow (أو New).
- املأ:
- Name: HRLX Leave Approval
- Application: HR Leave (scope x_786686_hr_leave) - احفظ.
3) الخطوة 1 — Trigger (مشغّل التدفق)
الإعدادات الصحيحة
| الحقل | القيمة |
|---|---|
| Trigger type | Record Updated |
| Table | Leave Request / x_786686_hr_leave_req_v2 |
| Condition | u_state is submitted |
| Run flow | Once (عادة) |
الخطوات في الواجهة
- في بداية الـ Flow اضغط Add a trigger.
- اختر Record Updated.
- Table: ابحث عن x_786686_hr_leave_req_v2 أو Leave Request.
- في Condition (أو Trigger conditions):
- Field: State / u_state
- Operator: is
- Value: submitted - Done أو احفظ الـ Trigger.
خطأ شائع
| خطأ | الصواب |
|---|---|
| Trigger = Record Created فقط | Record Updated + u_state = submitted |
| بدون شرط على u_state | Flow يعمل على كل تعديل |
4) الخطوة 2 — Action: Ask For Approval
هذه الخطوة تظهر في صورتك كـ Action 1 — Ask For Approval.
الخطوات
- بعد الـ Trigger اضغط + → Ask for Approval.
- املأ Action inputs كالتالي:
| الحقل | ماذا تضع | ملاحظة |
|---|---|---|
| Record | Data pill: Trigger - Record Updated → Leave Request Record | سجل الطلب الذي تغيّرت حالته |
| Table | Leave Request [x_786686_hr_leave_req_v2] | يُملأ تلقائيًا غالبًا |
| Approval field | Approver / u_approver_user | المعتمد |
| Approval reason | نص ثابت أو حقل | مثال: Leave approval required |
| Journal field | Reason / u_reason أو اتركه فارغًا | اختياري — للتعليق في السجل |
| Due date | None أو تاريخ | اختياري |
- Rules (الأهم — يصلح الخطأ الأحمر):
الخطأ في الشاشة:
Rules on action number 1 are missing
الحل:
- في قسم Rules عند Approve:
- اضغط القائمة Choose approval rule (لا تتركها فارغة).
- اختر أحد الخيارات:
| Rule | متى تستخدمه |
|---|---|
| Anyone approves | معتمد واحد في u_approver_user — الأنسب لنا |
| All users approve | أكثر من معتمد يجب أن يوافقوا جميعًا |
| First response from all users | حسب سياسة الشركة |
- للتطبيق البسيط: اختر Anyone approves.
-
(اختياري) أضف قاعدة Reject إن طلبت الواجهة ذلك — نفس المستوى.
-
اضغط Done على الـ Action.
تحقق قبل المتابعة
- لا يظهر خط أحمر على Action 1.
- في الشريط السفلي لا يبقى Error: Rules on action 1 are missing.
5) الخطوة 3 — If: If approval was Approved
الخطوات
- بعد Ask For Approval اضغط + → Flow Logic → If.
- الشرط الجاهز غالبًا:
- If approval was Approved
- أو: 1 - Ask For Approval → Approval state is approved - لا تغيّر الشرط إلا إذا تعرف ما تفعل.
6) الخطوة 4 — Update Record (موافقة)
داخل فرع If (Approved):
- اضغط + → Update Record.
- Record: pill من Trigger → Leave Request Record.
- Table: x_786686_hr_leave_req_v2.
- Set field values:
- Field: State / u_state
- Value: approved - Done.
7) الخطوة 5 — Else (رفض)
الخطوات
- من فرع Else (بجانب If):
- + → Update Record.
- نفس السجل (Trigger record).
- Set:
- u_state = rejected - Done.
8) مخطط الـ Flow النهائي
[Trigger] Record Updated
Table: x_786686_hr_leave_req_v2
Condition: u_state is submitted
│
▼
[1] Ask For Approval
Record: Trigger → Leave Request Record
Approval field: u_approver_user
Rule (Approve): Anyone approves
│
▼
[2] If ── approval was Approved?
│
├─ Yes ─► [3] Update Record → u_state = approved
│
└─ Else ─► [5] Update Record → u_state = rejected
9) الحفظ والنشر (Publish)
| الخطوة | ماذا تفعل |
|---|---|
| 1 | اضغط Save (أعلى اليمين) |
| 2 | تأكد Status ليس Error |
| 3 | اضغط Publish (أو Activate حسب الإصدار) |
| 4 | اختر Publish a new version |
| 5 | انتظر Published |
Modified بدون Publish = الـ Flow غير فعّال للمستخدمين.
10) اختبار عملي (Practice Lab)
تجهيز مستخدمين
| المستخدم | الدور | الغرض |
|---|---|---|
| [email protected] | x_786686_hr_leave.employee | يقدّم الطلب |
| [email protected] | manager + في u_manager للموظف | يوافق |
سيناريو الاختبار
- سجّل دخول كموظف.
- افتح x_786686_hr_leave_req_v2 → New.
- املأ التواريخ والنوع.
- تأكد BR1 ملأ u_approver_user = المدير.
- غيّر State إلى submitted → Save.
- سجّل خروج → سجّل دخول كـ manager.
- افتح:
Navigate: All > My Approvals أو Inbox / Approvals في الـ Next Experience — Open direct - افتح طلب الإجازة → Approve.
- ارجع للسجل: u_state يجب أن تصبح approved.
- تحقق من جدول التدقيق x_786686_hr_leave_audit_v2.
سيناريو الرفض
كرر الخطوات 1–6 ثم اختر Reject → تحقق u_state = rejected.
11) استكشاف الأخطاء (Troubleshooting)
| المشكلة | السبب | الحل |
|---|---|---|
| Rules on action 1 are missing | لم تختر approval rule | Anyone approves في Rules |
| Flow لا يبدأ | Trigger خاطئ | Record Updated + u_state=submitted |
| لا يظهر موافقة للمدير | u_approver_user فارغ | BR1 + employee.u_manager |
| يعمل مرتين | Trigger بدون Once | فعّل Run once أو شرط أدق |
| Error بعد Publish | حقول أو صلاحيات | تحقق approver له user صالح |
| الحالة لا تتغير بعد الموافقة | Update Record غير مربوط | Record pill من Trigger |
12) ربط مع باقي التطبيق
| مكوّن | الدور |
|---|---|
| BR1 | أيام + معتمد قبل Flow |
| BR2 | Event عند submitted (إشعار بريد) |
| BR4 | Event عند approved/rejected (إشعار بريد) |
| BR3 | تدقيق + رصيد بعد approved/rejected |
| Notifications | src/server/notifications/notifications.md |
| Events | src/server/events/events.md |
ملف التطوير الكامل:
../../01_DEVELOPMENT.md §7
13) قائمة تحقق سريعة
- [ ] Trigger = Record Updated
- [ ] Condition = u_state is submitted
- [ ] Ask For Approval → Record = trigger record
- [ ] Approval field = u_approver_user
- [ ] Rules → Anyone approves (لا تترك Choose approval rule فارغًا)
- [ ] If Approved → Update u_state = approved
- [ ] Else → Update u_state = rejected
- [ ] Publish flow
- [ ] اختبار Approve و Reject
14) ملاحظة للصورة التي أرسلتها
في الشاشة كان:
- Trigger يظهر كـ Record Created — غيّره إلى Record Updated + شرط submitted إن كان الطلب يمرّ بـ draft أولًا.
- Rules فارغة (Choose approval rule) — هذا سبب الخطأ الأحمر؛ اختر Anyone approves ثم Done ثم Publish.
15) Options & alternatives (Flow)
Hub: ../../00_TUTORIAL_OPTIONS_REFERENCE.md
| Option | When |
|---|---|
| Flow Designer (this guide) | New approvals — recommended |
| Legacy Workflow | Old instances only — migrate |
| Approval Policy | Enterprise multi-step — optional |
| BR + manual approve | Avoid — no audit trail |
| Catalog + Flow | Record Producer triggers submitted state |
Trigger alternatives:
| Trigger | Use when |
|---|---|
| Record Updated + submitted | Draft then submit (our app) |
| Record Created | Always submitted on insert |
| Service Catalog | RITM fulfillment flow (ITSM pattern) |
Ask For Approval — Rules options:
| Rule | Use when |
|---|---|
| Anyone approves | Single approver in u_approver_user |
| All users approve | Multiple approvers all must approve |
| First response | First approver wins |
Instance note: Flow UI labels vary by release; Publish required — Save alone is not enough.