التقرير الرسمي الشامل — نظام الحضور والرواتب

التقرير الرسمي الشامل

نظام الحضور والرواتب

من دخول سجلات الموظفين إلى آخر صفحة — توثيق كامل للمعادلات والخوارزميات وسير العمل

تاريخ الوثيقة: 2026-05-05 — الساعة: 18:38

وثيقة داخلية — للمرجعية والتدقيق

العودة للتقارير
فهرس المحتويات
١ — المسار الكامل للنظام (من دخول السجلات إلى آخر صفحة)

المرحلة 1 — إدخال البيانات الأساسية

رفع حضور Excel — upload.php
ملف Excel يحتوي أعمدة: الاسم، رقم البصمة، التاريخ والوقت. كل صف = حركة حضور واحدة (دخول أو خروج). النظام يُدخل الموظف إن لم يكن موجوداً (بالاسم والبصمة) ثم يُدخل سجل في جدول attendance (employee_id, datetime). لا تُجرى أي معادلات هنا — فقط تخزين الخام.
إدخال/تحديث الرواتب — add_salary.php
اختيار الموظف برقم البصمة، إدخال الراتب والعملة (IQD/USD)، الشهر-السنة يُؤخذ تلقائياً (الشهر الحالي). المعادلة المخزنة: INSERT/UPDATE في salaries (employee_id, salary, currency, month_year). لا حساب ساعات — فقط تخزين الراتب الشهري.
استيراد User Info — user_info.php
استيراد بيانات الموظفين من ملف (مثل Excel) — يحدّث أو يضيف سجلات في employees. لا يؤثر على الحضور أو الرواتب.

المرحلة 2 — التعديلات على الحضور والمكافآت/الخصومات

تعديل سجل حضور يدوياً — upload.php (تبويب إدارة سجلات الحضور)
عرض الحضور حسب الفترة والموظف. تعديل وقت الدخول/الخروج ليوم معين: يحذف السجلات القديمة لذلك اليوم ويُدخل سجلين جديدين (دخول، خروج) ويُسجّل التعديل في attendance_modifications. المعادلة الفعلية للحضور تُجرى لاحقاً في التقارير (MIN/MAX datetime).
إضافة خصم أو مكافأة — adjust.php
اختيار موظفين، نوع (مكافأة/خصم)، مبلغ أو كمية، وحدة (مبلغ أو ساعات أو أيام). إذا وحدة = أيام: الكمية × 8 ثم تخزين كساعات. يُخزن في adjustments: employee_id, month_year, type, amount, is_hours, note. التحويل إلى ساعات في التقارير: المبلغ ÷ أجر الساعة.
تصفية العطل وتطبيق مكافأة الجمعة — friday_filter.php
عرض الموظفين المؤهلين (-ث) وحساب مكافأة الجمعة (round_basic_hours + نفس نطاقات 3–7، 8–14، 15–19، 20–30 يوم). إمكانية تطبيق المكافأة كتعديل: INSERT في adjustments كـ reward بالساعات.

المرحلة 3 — التقارير والعروض

لوحة التقارير الرئيسية — dashboard.php
التقرير الرئيسي: قائمة كل الموظفين مع صافي الأيام، صافي الساعات، الراتب الأساسي، صافي الراتب، مكافأة الجمعة، الساعات الإضافية، صافي الإضافي، التعويض. يستخدم كل المعادلات الموثقة أدناه (تقريب 7:30، حد 8 ساعات، جمعة إضافي، تعديلات، مكافأة جمعة، تعويض، حد 30 يوم، إضافي مستحق/غير مستحق).
تصدير Excel للتقرير الرئيسي — export_excel.php
نفس منطق dashboard.php مع تصدير إلى ملف Excel. الفرق: export_excel لا يطبق تقسيم الإضافي المستحق/غير المستحق (كل ما فوق 8 ساعات يُحسب إضافي).
تقرير الساعات الإضافية — overtime_report.php
عرض الإضافي المستحق، غير المستحق، التعويض، صافي الإضافي. نفس المعادلات المستخدمة في dashboard للثابتين.
تصدير تقرير الإضافي Excel — export_overtime_excel.php
نفس منطق تقرير الإضافي مع تصدير Excel.
التقرير الفردي — report.php
تقرير لموظف واحد: نفس معادلات الداشبورد (فترة وتصفية بالاسم أو البصمة).
تصدير التقرير الفردي Excel — export_individual.php
تصدير تفصيلي يومي لموظف واحد؛ يستخدم per_day = salary/30 و per_hour = per_day/8.
تصدير التقرير العام Excel — export_general_report.php
تقرير شهري: اختيار شهر ثم تصدير Excel ببيانات حضور وتعديلات وصافي (مع round_basic_hours ونفس المنطق).
الإحصائيات العامة — statistics.php
إحصائيات مجمعة حسب الوظيفة/الفترة: استخدام round_basic_hours و hours_to_days (الساعات÷8).

المرحلة 4 — الصفحات المساعدة والقديمة

حذف حضور — delete_records.php
حذف سجلات من attendance حسب الفترة — لا معادلات.
حذف خصومات/مكافآت — delete_adjustments.php
حذف من adjustments — لا معادلات.
معالجة رفع الحضور (مسار قديم) — process.php
إذا مُستخدم: يحسب ساعات = نهاية−بداية، overtime = max(0, ساعات−8)، deduction = max(0, 8−ساعات) ويخزن في attendance. لا يُستخدم في التقارير الحالية (التقارير تعتمد MIN/MAX datetime).
التقرير النهائي (قديم) — final_report.php
صافي الراتب = الراتب + إجمالي التعديلات فقط — لا حساب ساعات.
تقرير الحضور العام (قديم) — general_report.php
عرض دقائق العمل (TIMESTAMPDIFF) ÷ 60.
تقرير فردي (قديم) — individual_report.php
عرض hours_worked, overtime, deduction من الجدول مباشرة.
٢ — الجداول ومصادر البيانات
الجدولالأعمدة الرئيسيةالاستخدام في الحسابات
employees id, name, fingerprint_id, job, status_note قائمة الموظفين. التصنيف: اسم أو job ينتهي بـ -ث = ثابت (جمعة إضافي + مكافأة + تعويض). اسم أو job يحتوي اجر بدون -ث = أجر يومي (حد 30 يوم).
attendance employee_id, datetime كل صف = حركة حضور (دخول أو خروج). التقارير تجمع MIN(datetime) و MAX(datetime) لكل (employee_id, DATE(datetime)) للحصول على أول دخول وآخر خروج في اليوم.
salaries employee_id, salary, currency, month_year آخر راتب للموظف: ORDER BY month_year DESC LIMIT 1. أجر اليوم = salary/30، أجر الساعة = salary/30/8.
adjustments employee_id, month_year, type, amount, is_hours, note مكافآت (reward) وخصومات (deduction). is_hours=1: الكمية ساعات تُضاف/تُخصم مباشرة. is_hours=0: المبلغ يُحوّل إلى ساعات بقسمته على أجر الساعة في فترة التقرير.
attendance_modifications employee_id, original_date, original_in/out, modified_in/out, reason, modified_by سجل تعديلات الحضور اليدوية للتدقيق.
٣ — الصفحات التي تحتوي حسابات
#الصفحةالملفالوصف
1 لوحة التقارير الرئيسية dashboard.php التقرير الرئيسي: صافي الراتب، الإضافي، التعويض، مكافأة الجمعة، حد 30 يوم، إضافي مستحق/غير مستحق.
2 تصدير Excel للتقرير الرئيسي export_excel.php نفس منطق الداشبورد ما عدا: لا تقسيم إضافي مستحق/غير مستحق.
3 تصدير تقرير الإضافي Excel export_overtime_excel.php إضافي مستحق/غير مستحق، تعويض، صافي الإضافي، حد 30 يوم.
4 تقرير الساعات الإضافية overtime_report.php عرض الإضافي والتعويض بنفس معادلات الداشبورد.
5 التقرير الفردي report.php موظف واحد — نفس معادلات الداشبورد.
6 تصدير التقرير الفردي Excel export_individual.php per_day, per_hour، تفصيل يومي.
7 تصدير التقرير العام export_general_report.php round_basic_hours وحساب صافي الساعات/الأيام للشهر.
8 الإحصائيات العامة statistics.php round_basic_hours، hours_to_days.
9 تصفية العطل / مكافأة الجمعة friday_filter.php round_basic_hours، حساب مكافأة الجمعة، إدراج تعديل ساعات.
10 إضافة خصم/مكافأة adjust.php تحويل الأيام إلى ساعات: أيام × 8 قبل الإدراج.
11 معالجة رفع الحضور (قديم) process.php ساعات = نهاية−بداية، إضافي = max(0, س−8)، خصم = max(0, 8−س).
12 تقرير الحضور العام (قديم) general_report.php دقائق العمل ÷ 60.
13 التقرير النهائي (قديم) final_report.php صافي الراتب = راتب + تعديلات (بدون ساعات).
14 تقرير فردي (قديم) individual_report.php عرض من الجدول فقط.
٤ — الشرح بالتفصيل (شنو موجود بكل جزء)

هذا القسم يشرح بالعربي كيف يعمل النظام في كل جزء، بدون معادلات — فقط وصف واضح لما يحدث وما يحتويه كل موضوع.

1. تقريب الساعات الأساسية
النظام يعتبر إنو أي يوم شغل، إذا الموظف كمل سبع ساعات ونص (7:30) أو أكثر، يُحسب اليوم كامل يعادل ثمان ساعات. يعني لو دخل الساعة سبع وربع وطلع بعد سبع ساعات ونص، اليوم يُعدّ ثمان ساعات أساسية. لو أقل من سبع ونص، تُحسب الساعات والدقائق كما هي بدون تقريب. هذا التقريب يطبّق على أيام الأسبوع العادية فقط، ما عدا يوم الجمعة. موجود في: لوحة التقارير، تصدير الإكسل، تقرير الإضافي، تصفية العطل، التقرير العام، والإحصائيات.
2. أجر اليوم وأجر الساعة
النظام ياخذ الراتب الشهري للموظف ويقسمه على 30 عشان يطلع أجر اليوم. بعدين أجر اليوم يقسم على 8 عشان يطلع أجر الساعة. هذول الاثنين يهمون في كل شي: صافي الراتب، مبلغ الإضافي، وتحويل المكافآت والخصومات اللي بالمبلغ إلى ساعات. إذا ما كان للموظف راتب مسجل، الأجر يكون صفر وما يصير حساب. صفحة "التقرير النهائي" القديمة ما تستخدم هالطريقة؛ فيها صافي الراتب يساوي الراتب زائد التعديلات فقط.
3. حد الساعات الأساسية — ثمان ساعات باليوم
لكل يوم حضور، النظام ياخذ أول مرة دخل وآخر مرة طلع (من سجلات البصمة) ويحسب الفرق. إذا الفرق أكثر من ثمان ساعات، يُحسب للراتب الأساسي ثمان ساعات فقط والباقي يروح إضافي. إذا الفرق ثمان ساعات أو أقل، يطبّق تقريب السبع ونص (انظر فوق). يوم الجمعة للموظفين الثابتين (اللي اسمهم أو وظيفتهم تنتهي بـ "ث"): كل ساعات الجمعة تُحسب إضافي وما تدخل في الأساسي أصلاً.
4. ساعات الجمعة كإضافي (موظفون ثابتون)
الموظف اللي اسمه أو وظيفته تنتهي بـ "ث" يعدّ موظف ثابت. إذا يوم الحضور جمعة، كل ساعات ذلك اليوم تُحسب ساعات إضافية فقط ولا تُضاف للساعات الأساسية. يعني الجمعة ما تزيد له أيام عادية، تزيد له إضافي. هالساعات تجمع مع بعض (ساعات ودقائق) وبعدين تحويل كل 60 دقيقة إلى ساعة. موجود في لوحة التقارير، تصدير الإكسل، تقرير الإضافي، والتقرير الفردي.
5. تحويل المكافآت والخصومات إلى ساعات
التعديلات نوعين: بالساعات أو بالمبلغ. اللي بالساعات تُجمع مباشرة (مكافأة تزيد، خصم تنقص). اللي بالمبلغ تُجمع كل المبالغ أولاً، بعدين النظام يحولها إلى ساعات بقسمة المجموع على أجر الساعة. الناتج النهائي هو "صافي التعديلات بالساعات" ويُضاف مع الساعات الأساسية ومكافأة الجمعة والتعويض عشان يطلع صافي الساعات الكلي. موجود في لوحة التقارير، تصدير الإكسل، التقرير الفردي، والتقرير العام.
6. مكافأة الجمعة (ساعات إضافية للصافي)
للموظفين الثابتين (اللي اسمهم أو وظيفتهم تنتهي بـ "ث") النظام يحسب كم يوم شغل فعلي (بناءً على الساعات الأساسية مع التعديلات وساعات الجمعة مقسومة على 8). حسب عدد الأيام يحدد مكافأة: من 3 إلى 7 أيام يعطي 8 ساعات مكافأة (جمعة واحدة)، من 8 إلى 14 يوم يعطي 16 ساعة (جمعتين)، من 15 إلى 19 يوم يعطي 24 ساعة (ثلاث جمع)، من 20 إلى 30 يوم يعطي 32 ساعة (أربع جمع). هالساعات تُضاف لصافي الساعات فقط ولا تدخل في حساب الإضافي. موجود في لوحة التقارير، تصدير الإكسل، التقرير الفردي، وصفحة تصفية العطل.
7. صافي الساعات النهائية وصافي الأيام
النظام يجمع: الساعات الأساسية، وتعديلات الساعات (المكافآت والخصومات المحوّلة إلى ساعات)، ومكافأة الجمعة، والتعويض إن وُجد. الجمع يكون ساعات ودقائق منفصلة؛ كل ما تصل الدقائق لستين يتحولون إلى ساعة. من المجموع النهائي يطلع "صافي الأيام" بقسمة صافي الساعات على 8. إذا بعد التعويض صافي الأيام يزيد عن 30 يوم، النظام يحد الصافي بـ 30 يوم (240 ساعة) والزائد يتحول إلى ساعات إضافية. موجود في لوحة التقارير، تصدير الإكسل، تقرير الإضافي، والتقرير الفردي.
8. صافي الراتب
بعد ما يطلع صافي الساعات (بعد كل التعديلات والتعويض وحد الثلاثين يوم)، النظام يضرب صافي الساعات في أجر الساعة ويقرب الناتج لخانتين عشريتين — هذا هو صافي الراتب. ما يسمح يكون الراتب سالب. إذا الموظف عنده ساعات لكن ما مسجل له راتب أساسي، صافي الراتب يبقى صفر. صفحة "التقرير النهائي" القديمة مختلفة: فيها صافي الراتب يساوي الراتب الشهري زائد إجمالي التعديلات فقط بدون استخدام الساعات.
9. الساعات الإضافية من الأيام العادية
في الأيام العادية (غير الجمعة)، إذا الموظف شغل أكثر من ثمان ساعات في يوم واحد، الزيادة تُحسب إضافي. إذا شغل بالضبط ثمان ساعات ودقائق زيادة، الدقائق الزيادة تُحسب إضافي. هالساعات تجمع مع بعض. في لوحة التقارير وتقرير الإضافي، ما كل الإضافي يُدفع؛ يطبّق تقسيم "إضافي مستحق" و"غير مستحق" (انظر التالي). في تصدير الإكسل الرئيسي كل ما فوق ثمان ساعات يُحسب إضافي بدون تقسيم.
10. الإضافي المستحق والإضافي غير المستحق
النظام يفرق بين وقتين: الإضافي اللي من الساعة 1:30 ظهراً إلى 2:24 ظهراً يُعتبر "غير مستحق" وما يُدفع. الإضافي من بعد 2:30 ظهراً إلى 12 منتصف الليل، ومن 12 ليلاً إلى 5 الصبح، يُعتبر "مستحق" ويُدفع. فقط الساعات المستحقة تدخل في إجمالي الإضافي ومبلغ الإضافي. صفحة تصدير الإكسل الرئيسي ما تطبق هالتقسيم؛ فيها كل ما فوق ثمان ساعات إضافي مدفوع.
11. التعويض (ساعات الجمعة كأيام)
للموظف الثابت (اسمه أو وظيفته تنتهي بـ "ث"): إذا صافي الأيام قبل ما يضيف التعويض أقل من 30 يوم وعنده ساعات شغل في الجمعة، كل ساعات الجمعة تُحسب "تعويض". التعويض يزيد صافي الساعات (يعني يزيد الأيام) ويُخصم من الساعات الإضافية — يعني ما يدفع له إضافي على ساعات الجمعة اللي تحوّلت لأيام. الخصم من الإضافي يكون لحد أقصى ما هو متاح فقط. بعد إضافة التعويض يُعاد حساب صافي الأيام. موجود في لوحة التقارير، تصدير الإكسل، تقرير الإضافي، والتقرير الفردي.
12. تحويل الأيام الزائدة عن 30 إلى إضافي
إذا بعد التعويض صافي الأيام صار أكثر من 30، النظام ياخذ الزيادة (مثلاً يومين أو ثلاثة) ويحولها إلى ساعات (كل يوم يساوي 8 ساعات) ويضيفها للساعات الإضافية ويدفع عليها. صافي الأيام يُحدّ بـ 30 يوم بالضبط (240 ساعة). هالمنطق يطبّق على الموظفين الثابتين وعلى موظفي الأجر اليومي (اللي اسمهم أو وظيفتهم فيها "اجر" بدون "ث").
13. صافي الإضافي النهائي
صافي ساعات الإضافي هو: إجمالي الساعات الإضافية ناقص ما تم خصمه تعويض، زائد (إن وُجد) ساعات الأيام الزائدة عن 30. من صافي الساعات هذي يطلع مبلغ صافي الإضافي بضربها في أجر الساعة. قاعدة: إذا صافي الإضافي أقل من ساعة واحدة، يُعتبر صفر وما يدفع. النظام يتأكد من عدم وجود قيم سالبة أو قريبة من الصفر. موجود في لوحة التقارير، تصدير الإكسل، وتقرير الإضافي.
14. تحويل الأيام إلى ساعات عند إدخال الخصم أو المكافأة
في صفحة إضافة خصم أو مكافأة، إذا المستخدم يختار إن التعديل "بالأيام"، النظام يضرب العدد في 8 ويخزن الناتج كساعات. يعني لو أدخل "يومين" يُخزن 16 ساعة. التقارير تقرأ الرقم المخزن (ساعات) وتتعامل معاه مباشرة.
15. حساب الساعات في معالجة الرفع القديمة
في مسار قديم (process.php) إذا كان مستخدم: عند رفع الحضور يحسب ساعات العمل من وقت البداية للنهاية، والساعات الزيادة عن 8 تُحسب إضافي، والنقصان عن 8 يُحسب خصم. التقارير الحالية ما تعتمد هالطريقة؛ تعتمد على أول وآخر حركة حضور في اليوم (دخول وخرج) وتطبق كل القواعد الجديدة (تقريب، جمعة، مستحق وغير مستحق).
٥ — سير العمل من البداية للنهاية
  1. مصدر البيانات: من جدول الحضور ياخذ أول دخول وآخر خروج لكل يوم وكل موظف، ومن جدول الرواتب ياخذ آخر راتب مسجل، ومن جدول التعديلات ياخذ المكافآت والخصومات حسب الشهر.
  2. تصنيف الموظف: إذا اسمه أو وظيفته تنتهي بـ "ث" يعدّ ثابت (له جمعة إضافي ومكافأة جمعة وتعويض إذا صافي أيامه أقل من 30). إذا فيه "اجر" بدون "ث" يعدّ أجر يومي ويُحدّ بـ 30 يوم والزيادة تتحول إضافي.
  3. الساعات الأساسية: من الحضور يومياً، حد ثمان ساعات باليوم، وتقريب: سبع ساعات ونص أو أكثر تُحسب ثمان ساعات. أيام الجمعة للثابتين كلها إضافي ولا تدخل في الأساسي.
  4. التعديلات: المبالغ تُحوّل إلى ساعات بقسمتها على أجر الساعة وتُجمع مع التعديلات اللي بالساعات.
  5. مكافأة الجمعة: حسب عدد أيام الشغل: من 3 إلى 7 أيام تعطي 8 ساعات، من 8 إلى 14 تعطي 16 ساعة، من 15 إلى 19 تعطي 24 ساعة، من 20 إلى 30 تعطي 32 ساعة. هالساعات تُضاف للصافي.
  6. صافي الساعات والأيام: جمع الساعات الأساسية مع التعديلات ومكافأة الجمعة والتعويض. صافي الأيام = صافي الساعات مقسوم على 8.
  7. التعويض: للثابتين إذا صافي الأيام أقل من 30، ساعات الجمعة تُضاف للصافي وتُخصم من الإضافي.
  8. حد 30 يوم: إذا صافي الأيام أكثر من 30، الزيادة تتحول إلى ساعات إضافية ويُحدّ الصافي بـ 30 يوم.
  9. الإضافي المستحق: فقط الإضافي من بعد 2:30 ظهراً إلى 12 ليلاً ومن 12 ليلاً إلى 5 صباحاً يُدفع. وقت 1:30 إلى 2:24 ظهراً غير مستحق. في تصدير الإكسل الرئيسي كل ما فوق 8 ساعات يُحسب إضافي مدفوع.
  10. صافي الراتب وصافي الإضافي: صافي الراتب = صافي الساعات في أجر الساعة. صافي الإضافي = صافي ساعات الإضافي في أجر الساعة، وإذا أقل من ساعة يُعتبر صفر.