قبل ما تبدين
الصورة الكاملة
أربع طبقات، وكل طبقة تقرأ من اللي قبلها. ما فيه شي ينكتب مرتين.
قرارات التصميم، ومن وين جات
| القرار | ليش |
|---|---|
| جداول وصف (الموظفين، التاريخ، الشفت) وجداول أحداث (الحضور، الإجازات) | هذا نموذج Star Schema اللي توصي فيه مايكروسوفت: جداول الوصف للفلترة، وجداول الأحداث للجمع والعد. |
| سطر واحد لكل موظف × يوم × شفت في السجل | كل جدول أحداث لازم يكون بنفس الدقة (grain)، وإلا الأرقام تتضاعف. |
| الخطة مسبقًا، والتسجيل للاستثناء | الشفت والأوف والإجازة مخططة، فالمسؤول يغير اللي خالف الخطة بس. أقل أخطاء وأسرع إدخال. |
| كل صفحة تجاوب سؤال واحد، و3 إلى 5 أرقام فوق | الأهم فوق يمين (لأن القراءة عربية)، والتفاصيل تحت. الأعمدة للمقارنة بدل الدونات. |
| الساعات تنحسب، ما تنكتب | المسؤول يكتب الساعات الزيادة بس. ساعات الشفت تجي من جدول الشفتات. |
الجواب على سؤالك
الأوفرتايم والأوف: كيف ينحسبون
وش يقول نظام العمل السعودي
و48 ساعة بالأسبوع. في رمضان 6 و36 للمسلمين.
من الأجر الأساسي، لكل ساعة فوق الحد. ويجوز تعويضها بإجازة بموافقة العامل.
مدفوع، لا يقل عن 24 ساعة متصلة. الجمعة أصلًا، ويجوز استبداله.
أي ساعة يشتغلها في يوم راحته.
يعني: الشفت 12 ساعة × 6 أيام = 72 ساعة بالأسبوع، منها 24 ساعة فوق الحد النظامي حتى لو داوم شفته بالضبط. وأي ساعة يجلسها بعد نهاية الشفت تنضاف فوقها.
ليش ملفك الحالي ما يقدر يحسبها
السجل فيه حالة الموظف بس (On Duty, Off…)، وما فيه ولا ساعة. فنضيف ثلاث معلومات، واحدة منها بس ينكتبها المسؤول:
| المعلومة | وين | مين يكتبها |
|---|---|---|
| ساعات كل شفت (الداي 12، النايت 12) ووقت بدايته ونهايته | جدول tblShift في Keys | أنتي، مرة وحدة |
| الساعات الزيادة بعد الشفت، مثلًا 2 | عمود ExtraHours في سجل الحضور | المسؤول، بس لما يصير |
| الحد النظامي 8 ساعات | جدول tblSettings في Keys | أنتي، مرة وحدة |
والباقي ينحسب لحاله في Power Query:
WorkedHours = ShiftHours + ExtraHours // إذا الحالة حضور، وإلا 0 HoursAbove8 = max(0, WorkedHours − 8) // الأوفرتايم النظامي لليوم
مثال: أسبوع موظف داي
| اليوم | الحالة | ساعات الشفت | ExtraHours | WorkedHours | فوق 8 |
|---|---|---|---|---|---|
| الأحد | On Duty | 12 | 0 | 12 | 4 |
| الاثنين | On Duty | 12 | 2 | 14 | 6 |
| الثلاثاء | On Duty | 12 | 0 | 12 | 4 |
| الأربعاء | On Duty | 12 | 0 | 12 | 4 |
| الخميس | On Duty | 12 | 0 | 12 | 4 |
| الجمعة | Off | 0 | 0 | 0 | 0 |
| السبت | On Duty | 12 | 0 | 12 | 4 |
| المجموع | 2 | 74 | 26 | ||
في الداشبورد تشوفين الرقمين منفصلين:
- أوفرتايم الجدول = 24 ساعة: مبني داخل شفت الـ 12 ساعة، ومتوقع.
- ساعات زيادة = 2: هذي اللي تستاهل متابعة، لأنها فوق الخطة.
- المجموع النظامي = 26 ساعة فوق الـ 8.
الأوف الأسبوعي: نعم، لازم
النظام يلزم بيوم راحة كل أسبوع. وقاعدتكم أوضح منه: بعد كل 6 أيام يوم أوف، ويكون جمعة أو سبت. نتابعه بثلاث فحوصات تلقائية:
| الفحص | كيف ينكشف | وش يطلع |
|---|---|---|
| أوف في غير الجمعة أو السبت | الحالة Off واليوم مو جمعة ولا سبت | يُحسب غياب مثل ما قلتي |
| أسبوع بدون أوف | 7 أيام حضور في نفس الأسبوع (من الأحد إلى السبت) | مخالفة أوف باسم الموظف |
| داوم في يوم أوفه المخطط | الحضور في اليوم المكتوب له في WeeklyOff | شغل يوم راحة وساعاته أوفرتايم |
قبل ما تبنين: تأكدي من هذي مع HR أو المقاول
- الأوفرتايم يُحسب بعد 8 ساعات (النظام) أو بعد 12 ساعة (نهاية الشفت) حسب عقد المقاول؟ الداشبورد يعرض الاثنين، بس لازم تعرفين أيهم المعتمد للدفع.
- وقت بداية ونهاية شفت الداي والنايت بالضبط.
- مين يعتمد الساعات الزيادة قبل ما تنكتب؟
- ساعات رمضان للمقاولين.
- الحد السنوي للأوفرتايم: المصادر تذكر 720 ساعة، وبعضها يقول ما فيه حد موحد. خذي الرقم المعتمد من HR.
المرحلة 1
ملف الموظفين
هذا جاهز تقريبًا. المطلوب تحطينه في مكانه الصح وتثبتين أسماءه.
- حطي الملف في مجلد OneDrive المشتركنفس المجلد اللي فيه ملف الحضور. ليش: الباور بي آي أونلاين يقرأ من OneDrive بدون أي برنامج وسيط.
- تأكدي إن اسم الجدول
tblEmployeesاضغطي أي خلية في الجدول ← Table Design ← Table Name. ليش: الباور بي آي يلقى الجدول باسمه، ولو تغير الاسم ينكسر التحديث. - لا تغيرين أسماء الأعمدة بعد اليومتقدرين تضيفين أعمدة، بس لا تعيدين تسمية الموجود. ليش: كل خطوة في Power Query تنادي العمود باسمه.
- أضيفي عمود
AttendanceRequiredبعدCraft، ومعادلته تجيب القيمة من جدول الكرافت في Keys:=XLOOKUP([@Craft], tblCraft[Craft], tblCraft[AttendanceRequired], "Yes")
ليش: الـ Fire Watch والـ Fabricator والـ Welder يطلعون من حسابات الحضور لحالهم، وأي كرافت جديد تحددين له مرة وحدة. - خلصي شيت Needs Review بالتدريجأهمها: الـ 13 اللي ما عندهم رقم معادن. ليش: اللي بدون رقم ما ينربط حضوره بأي شي.
المرحلة 2
جداول ملف الحضور
في ملفك Daily Attendance نضيف أربع جداول. كل جدول: حوّليه لجدول بـ Ctrl+T وسمّيه بالاسم المكتوب بالضبط.
جداول Keys الجديدة
tblStatus: وش تعني كل حالة في الحساب | |||
|---|---|---|---|
| Status | CountsAs | تُحسب ساعات؟ | معناها |
| On Duty | Present | نعم | داوم شفته |
| Shift Changed | Present | نعم | داوم، بس بغير شفته الافتراضي |
| Permission | Present | نعم | يداوم بمكان ثاني |
| Absent | Absent | لا | غياب |
| Sick Leave | Leave | لا | مرضية |
| Off | Off | لا | أوفه المخطط |
| Off (Unplanned) | Off | لا | أوف بغير يومه، ويتعلم |
ليش جدول بدل ما نكتب الحالات في المعادلات: لو أضفتي حالة جديدة بكرة، تضيفينها سطر هنا وكل الحسابات تفهمها. والإجازة ما هي هنا لأنها تجي من خطة الإجازات.
tblShift | |||
|---|---|---|---|
| Shift | StartTime | EndTime | ShiftHours |
| Day | 06:00 | 18:00 | 12 |
| Night | 18:00 | 06:00 | 12 |
tblSettings | |
|---|---|
| Setting | Value |
| LegalDailyHours | 8 |
| LegalWeeklyHours | 48 |
| EntryDeadline | 08:00 |
| OffDays | Friday, Saturday |
الأوقات مثال، عدليها بعد ما تتأكدين من HR. ليش في جدول: لو تغير الحد في رمضان، تغيرين رقم واحد.
شيت Shift Plan
tblShiftPlan: سطر لما يتغير شي، مو كل أسبوع | |||
|---|---|---|---|
| MaadenID | EffectiveFrom | Shift | WeeklyOff |
| C-40170 | 01/08/2026 | Day | Friday |
| C-40170 | 11/09/2026 | Night | Friday |
ليش كذا: Abdul Waqas صار نايت من 11 سبتمبر، وسطره القديم يبقى. فالحضور القديم يقرأ إنه كان داي، والجديد إنه نايت. لا تعدلين سطر قديم أبدًا، أضيفي سطر جديد.
شيت Vacation Plan
tblVacationPlan | |||||
|---|---|---|---|---|---|
| MaadenID | StartDate | EndDate | LeaveType | PlanStatus | Note |
| C-38184 | 15/06/2026 | 14/09/2026 | Annual | Approved | |
ليش: من هذا الجدول يطلع مين بإجازة اليوم، ومين بيطلع بعد شهرين. والموظف يختفي من قائمة الحضور من أول يوم إجازة ويرجع يوم رجوعه.
سجل الحضور
tblAttendance: سطر لكل موظف × يوم × شفت | |||||||
|---|---|---|---|---|---|---|---|
| Date | MaadenID | Shift | Status | ExtraHours | Note | EnteredBy | EnteredAt |
| 14/09/2026 | C-39422 | Day | On Duty | 2 | Pump P-101 job | Admin1 | 14/09/2026 07:42 |
| 13/09/2026 | C-40170 | Night | On Duty | Admin1 | 14/09/2026 07:48 | ||
- تاريخ النايت = تاريخ بداية الشفت. نايت ليلة 13 يتسجل صباح 14 بتاريخ 13.
- EnteredAt يكتبه الماكرو لحاله، ومنه نعرف الالتزام بساعة 7 إلى 8.
- ExtraHours فاضي في أغلب الأيام، وهذا طبيعي.
- سوي الجداول الثلاثة في Keys
tblStatusوtblShiftوtblSettings، بنفس الأعمدة فوق. - سوي شيت Shift Plan وجدولهسطر لكل موظف بتاريخ 01/08/2026 وشفته الحالي، وبعدين سطر Night بتاريخ 11/09/2026 للـ 21 موظف في قائمة النايت.
- سوي شيت Vacation Plan وجدولهابدئي بالـ 13 اللي بإجازة الحين، وحطي تاريخ الرجوع المتوقع.
- عدّلي سجل الحضورغيري عمود الرقم ليكون
MaadenID، وأضيفيExtraHoursوEnteredByوEnteredAt. وسمّي الجدولtblAttendance. - حوّلي حضور سبتمبر لأرقام معادنعمود مؤقت جنب الرقم القديم:
=XLOOKUP([@EmployeeID]&"", tblEmployees[SIS_ID], tblEmployees[MaadenID], XLOOKUP([@EmployeeID]&"", tblEmployees[MaadenID], tblEmployees[MaadenID], "NOT FOUND"))
الجزء الثاني للمباشرين، لأن رقمهم القديم هو نفسه رقم معادن. خلي ملف الموظفين مفتوح وقتها، لأن المعادلة تقرأ من ملف ثاني. بعدين Paste Values فوق الرقم، وشيكي إن ما فيه NOT FOUND، واحذفي المؤقت. ليش: عشان سبتمبر ينربط بنفس المفتاح الجديد. - تحديث الماكرو: مرحلة لحالها نسويها مع بعضالماكرو الجديد يكتب قائمة اليوم كقيم ثابتة (زر Load)، وبعدين يحفظها في السجل مع وقت الإدخال (زر Save). كذا تنحل مشكلة انزياح الحالات. لما توصلين هنا قولي لي، ونكتب الكود ونجربه خطوة خطوة.
المرحلة 3
Power Query والنموذج
الاتصال بالملفات من OneDrive (مو من مسار الجهاز)
- انسخي رابط الملفافتحي الملف في Excel Desktop ← File ← Info ← Copy path. الرابط يبدأ بـ https://…sharepoint.com/…. امسحي من آخره
?web=1إذا موجودة. - Get Data ← Web ← الصقي الرابطوقت تسجيل الدخول اختاري Organizational account. ليش مو "Excel workbook" من الجهاز: المسار المحلي يشتغل على جهازك بس، والرابط يخلي التحديث الأونلاين يشتغل بدون Gateway.
- من Navigator اختاري الجداول، مو الشيتاتالجداول لها أيقونة جدول وتبدأ بـ
tbl. ليش: الجدول يتمدد مع البيانات، والشيت يجيب الشعار والعناوين والفراغات.
خطوات التجهيز داخل Power Query
Attendance: نضيف ساعات الشفت، ومعنى الحالة، والحسابات.
// 1) دمج ساعات الشفت: Home ▸ Merge Queries (Shift ↔ tblShift[Shift]) Merged = Table.NestedJoin(Source, {"Shift"}, tblShift, {"Shift"}, "S", JoinKind.LeftOuter), WithHrs = Table.ExpandTableColumn(Merged, "S", {"ShiftHours"}), // 2) دمج معنى الحالة (Status ↔ tblStatus[Status]) Merged2 = Table.NestedJoin(WithHrs, {"Status"}, tblStatus, {"Status"}, "T", JoinKind.LeftOuter), WithCnt = Table.ExpandTableColumn(Merged2, "T", {"CountsAs"}), // 3) الساعات الفعلية + الأوفرتايم النظامي Worked = Table.AddColumn(WithCnt, "WorkedHours", each if [CountsAs] = "Present" then [ShiftHours] + (if [ExtraHours] = null then 0 else [ExtraHours]) else 0, type number), Above8 = Table.AddColumn(Worked, "HoursAbove8", each List.Max({0, [WorkedHours] - 8}), type number), // 4) الأوف في غير الجمعة والسبت (Date.DayOfWeek: الأحد=0 … الجمعة=5، السبت=6) OffWrong = Table.AddColumn(Above8, "OffWrongDay", each [CountsAs] = "Off" and not List.Contains({5, 6}, Date.DayOfWeek([Date], Day.Sunday)), type logical), // 5) إدخال متأخر: الداي بعد 08:00 نفس اليوم، والنايت بعد 08:00 اليوم اللي بعده Late = Table.AddColumn(OffWrong, "LateEntry", each [EnteredAt] <> null and [EnteredAt] > (([Date] & #time(8, 0, 0)) + (if [Shift] = "Night" then #duration(1, 0, 0, 0) else #duration(0, 0, 0, 0))), type logical)
ما يلزم تكتبين الكود بيدك: كل خطوة لها زر (Merge Queries، Add Column ← Custom Column). الكود هنا عشان تقارنين النتيجة. ورقم 8 تقدرين تجيبينه من tblSettings بعدين.
VacationDays: نفرد كل إجازة لسطر لكل يوم، عشان نعرف مين بإجازة في أي تاريخ.
Days = Table.AddColumn(tblVacationPlan, "Date", each
List.Dates([StartDate], Duration.Days([EndDate] - [StartDate]) + 1, #duration(1, 0, 0, 0))),
Expanded = Table.ExpandListColumn(Days, "Date"),
Typed = Table.TransformColumnTypes(Expanded, {{"Date", type date}}),
Approved = Table.SelectRows(Typed, each [PlanStatus] <> "Cancelled")
Employees: نضيف سنوات الخبرة.
Tenure = Table.AddColumn(tblEmployees, "TenureYears", each
if [JoiningDate] = null then null
else Number.Round(Duration.Days(Date.From(DateTime.LocalNow()) - [JoiningDate]) / 365.25, 1), type number)
جدول التاريخ
Modeling ← New table، والصقي:
Date =
ADDCOLUMNS (
CALENDAR ( DATE ( 2026, 8, 1 ), DATE ( 2027, 12, 31 ) ),
"DayName", FORMAT ( [Date], "dddd" ),
"WeekStart", [Date] - WEEKDAY ( [Date], 1 ) + 1, -- الأسبوع يبدأ الأحد
"Month", FORMAT ( [Date], "yyyy-mm" ),
"IsFriSat", IF ( WEEKDAY ( [Date], 1 ) IN { 6, 7 }, "Fri/Sat", "Workday" )
)
بعدها: كليك يمين على الجدول ← Mark as date table. ليش: بدونها دوال الوقت (مثل آخر 30 يوم) تعطي أرقام غلط.
العلاقات
| من (جهة الواحد) | إلى (جهة الكثير) | النوع |
|---|---|---|
Date[Date] | Attendance[Date] | 1 : * · اتجاه واحد |
Date[Date] | VacationDays[Date] | 1 : * · اتجاه واحد |
Employees[MaadenID] | Attendance[MaadenID] | 1 : * · اتجاه واحد |
Employees[MaadenID] | VacationDays[MaadenID] | 1 : * · اتجاه واحد |
ليش اتجاه واحد: الفلتر ينزل من الوصف إلى الأحداث. الاتجاهين يسببون أرقام غريبة ويبطؤون التقرير. وخبي الأعمدة اللي ما تنعرض (مثل ShiftHours) عشان قائمة الحقول تبقى نظيفة.
- اتصلي بالملفين من الرابطالجداول: tblEmployees، tblAttendance، tblVacationPlan، tblShift، tblStatus، tblSettings.
- جهزي Attendance و VacationDays و Employeesالخطوات فوق، وتأكدي إن أنواع الأعمدة صح: التاريخ Date، والساعات Decimal.
- سوي جدول Date وعلّميه Date table
- اربطي العلاقات الأربع وتأكدي من اتجاههاModel view: كل خط يكون عليه 1 من جهة و * من الجهة الثانية.
المرحلة 4
المقاييس (DAX)
سوي جدول فاضي اسمه _Measures (Enter data ← OK) وحطي فيه كل المقاييس. ليش: كلها في مكان واحد بدل ما تضيع بين الجداول.
الحضور
Present Days = CALCULATE ( COUNTROWS ( Attendance ), Attendance[CountsAs] = "Present" )
Absent Days = CALCULATE ( COUNTROWS ( Attendance ), Attendance[CountsAs] = "Absent" )
+ CALCULATE ( COUNTROWS ( Attendance ), Attendance[OffWrongDay] = TRUE () )
Leave Days = CALCULATE ( COUNTROWS ( Attendance ), Attendance[CountsAs] = "Leave" )
Scheduled Days = [Present Days] + [Absent Days] + [Leave Days]
Attendance % = DIVIDE ( [Present Days], [Scheduled Days] )
Absenteeism % = DIVIDE ( [Absent Days], [Scheduled Days] )
التغطية: هل كل الموظفين انسجلوا؟
Active Staff =
VAR d = MAX ( 'Date'[Date] )
RETURN
COUNTROWS (
FILTER (
Employees,
Employees[JoiningDate] <= d
&& ( ISBLANK ( Employees[ExitDate] ) || Employees[ExitDate] > d )
&& Employees[AttendanceRequired] = "Yes"
)
)
On Vacation = DISTINCTCOUNT ( VacationDays[MaadenID] )
Expected = [Active Staff] - [On Vacation]
Recorded = DISTINCTCOUNT ( Attendance[MaadenID] )
Not Recorded = MAX ( 0, [Expected] - [Recorded] )
Coverage % = DIVIDE ( [Recorded], [Expected] )
Late Entries = CALCULATE ( COUNTROWS ( Attendance ), Attendance[LateEntry] = TRUE () )
الساعات والأوفرتايم
Worked Hours = SUM ( Attendance[WorkedHours] ) Extra Hours = SUM ( Attendance[ExtraHours] ) -- فوق الشفت OT Hours (Legal) = SUM ( Attendance[HoursAbove8] ) -- فوق 8 ساعات Roster OT Hours = [OT Hours (Legal)] - [Extra Hours] -- المبني داخل الشفت Avg Hours / Day = DIVIDE ( [Worked Hours], [Present Days] ) Weeks Without Off = COUNTROWS ( FILTER ( SUMMARIZE ( Attendance, Attendance[MaadenID], 'Date'[WeekStart] ), CALCULATE ( [Present Days] ) >= 7 ) ) Off On Wrong Day = CALCULATE ( COUNTROWS ( Attendance ), Attendance[OffWrongDay] = TRUE () )
القوى العاملة والهويات والإجازات
Headcount = CALCULATE ( COUNTROWS ( Employees ), Employees[EmploymentStatus] IN { "Active", "Vacation" } )
Leavers = CALCULATE ( COUNTROWS ( Employees ), Employees[EmploymentStatus] IN { "Exit", "Resigned", "Demobilized" } )
Permanent % = DIVIDE ( CALCULATE ( [Headcount], Employees[Type of ID] IN { "Permanent", "Permanent (Old ID)", "Maaden Staff" } ), [Headcount] )
Avg Tenure = AVERAGE ( Employees[TenureYears] )
IDs Expired = CALCULATE ( [Headcount], Employees[ID Expire Date] < TODAY () )
IDs Due 60d = CALCULATE ( [Headcount], Employees[ID Expire Date] >= TODAY (), Employees[ID Expire Date] <= TODAY () + 60 )
Away Next 60d =
CALCULATE (
DISTINCTCOUNT ( VacationDays[MaadenID] ),
FILTER ( ALL ( 'Date' ), 'Date'[Date] >= TODAY () && 'Date'[Date] <= TODAY () + 60 )
)
- سوي جدول _Measuresوبعد أول مقياس احذفي العمود الفاضي، فيصير الجدول بأيقونة الآلة الحاسبة فوق القائمة.
- أضيفي مقاييس الحضور واختبريهاسوي Table visual فيه Date و [Present Days] و [Absent Days]، وقارني يوم واحد مع ملف الإكسل. ليش: لو الرقم الأول صح، الباقي مبني عليه.
- أضيفي باقي المقاييس بالترتيبالتغطية ← الساعات ← القوى العاملة. ونسّقي كل مقياس: النسب %، والساعات بدون كسور.
المرحلة 5
صفحات الداشبورد
خمس صفحات، كل صفحة تجاوب سؤال واحد. مقاس الصفحة 1280 × 720، وكل الصفحات بنفس الشريط العلوي ونفس الفلاتر بنفس المكان.
قواعد تمشي على كل الصفحات
- الثيم: View ← Themes ← Browse for themes ← Maaden2026_PBI_1_Light_Operational.json.
- الشريط العلوي: الشعار، واسم الصفحة، وتاريخ آخر تحديث.
- الفلاتر: التاريخ، والـ Area، والكرافت، والشفت. وفعّلي Sync slicers عشان تنتقل مع الصفحات.
- الأرقام الكبيرة: من 3 إلى 5 بس، وكل رقم تحته سطر يوضح وش يعني.
- الألوان: الأخضر = تمام، والبرتقالي = انتبهي، والأحمر = مشكلة. ولا لون بدون معنى.
- المقارنة بالأعمدة، لا دونات ولا عداد.
- الترتيب: الأهم فوق يمين، والتفاصيل تحت.
1 · اليوم
مين المفروض يكون موجود اليوم، ومين فعلًا موجود؟
2 · الاتجاه
الحضور يتحسن أو يسوء، ووين؟
3 · الساعات والأوفرتايم
كم ساعة اشتغلوا، وكم منها فوق الخطة، ومين ما أخذ أوفه؟
4 · القوى العاملة
كم عندنا، مين هم، ومين طلع؟
5 · الإجازات والهويات
مين بيطلع قريب، ومين هويته تحتاج تجديد؟
- جهزي صفحة قالب وحدةالثيم، والمقاس، والشريط العلوي، والفلاتر. بعدين Duplicate page لكل صفحة. ليش: كل الصفحات تطلع بنفس الأماكن بالبكسل.
- ابني صفحة "اليوم" أولهي اللي المدير يفتحها كل صباح، وتختبر إن التغطية والحضور صح.
- ابني باقي الصفحات بالترتيبالاتجاه ← الساعات ← القوى العاملة ← الإجازات والهويات.
- فعّلي Sync slicers وسمّي كل visualView ← Sync slicers. وكل visual له عنوان يقول وش يعرض.
المرحلة 6
النشر والتحديث اليومي
- Publish إلى Workspace القسمHome ← Publish. إذا ما عندك Workspace، اطلبي من IT أو من مديرك.
- أدخلي بيانات الدخول للمصدرفي Power BI Service: الـ Semantic model ← Settings ← Data source credentials ← OAuth2 ← حسابك في معادن.
- جدولي التحديث بعد وقت الإدخالScheduled refresh: يوميًا 09:00، وتقدرين تضيفين 13:00. ليش 9: الإدخال ينتهي 8، فالساعة 9 يكون الداي ونايت أمس كلهم مسجلين.
- شاركي مع الإدارةالأفضل كـ App من الـ Workspace، عشان التعديلات ما تظهر لهم إلا لما تحدثين التطبيق.
المراجع
المصادر
- نظام العمل السعودي، وزارة الموارد البشرية (PDF)
- المادة 107: أجر العمل الإضافي · المادة 98: ساعات العمل
- Overtime Rules in Saudi Arabia, 2026
- Saudi Labor Law working hours guide, 2026 · Playroll: Saudi working hours
- Microsoft Learn: Star schema for Power BI
- Microsoft Learn: Tips for designing a great Power BI dashboard
- Power BI HR dashboard KPIs · HR analytics dashboard best practices
الأرقام في مخططات الصفحات أمثلة توضيحية، مو أرقامكم الفعلية. · آخر تحديث للدليل: 14 سبتمبر 2026