دورة الرواتب الكاملة — Moon HR

من تعريف مكونات الراتب لحد الترحيل للمحاسبة — شرح كامل للوجيك

1

تعريف مكونات الراتب (Salary Components)

المكان: /hr/salary-components — أول حاجة تتعمل قبل أي حاجة.

مكون الراتب = أي عنصر بيأثر على الراتب (سواء بالزيادة أو الخصم).

نوعين رئيسيين:

النوعبالعربيالتأثيرأمثلة
earningمكسب / بدليزيد الراتببدل سكن، بدل مواصلات، بدل طعام، عمولة
deductionخصم / استقطاعينقص من الراتبتأمينات اجتماعية، تأمين طبي، ضريبة دخل، قسط قرض

طريقة الحساب:

الطريقةالشرحمثال
fixed (ثابت)مبلغ ثابت كل شهربدل مواصلات = 500 ريال
percentage (نسبة)نسبة من الراتب الأساسيبدل سكن = 25% من الأساسي

خصائص المكون:

  • إلزامي (is_mandatory): لو true → يتطبق على كل الموظفين تلقائي عند "تطبيق المكونات الإلزامية"
  • خاضع للضريبة (is_taxable): هل المكون ده يدخل في حساب الضريبة
  • ترتيب العرض (display_order): ترتيب ظهوره في كشف الراتب

مثال عملي — مكونات شركة:

الكودالمكونالنوعالحسابالقيمةإلزامي
HAبدل سكنمكسبنسبة25% من الأساسينعم ✅
TAبدل مواصلاتمكسبثابت500 رياللا
FAبدل طعاممكسبثابت300 رياللا
GOSIتأمينات اجتماعيةخصمنسبة9.75% من الأساسينعم ✅
MIتأمين طبيخصمثابت200 ريالنعم ✅
2

هيكل الراتب لكل موظف (Salary Structure)

المكان: /hr/salary-structures

هيكل الراتب = ربط مكونات الراتب بالموظف. كل موظف ممكن يكون عنده مكونات مختلفة بقيم مختلفة.

كيف يتعمل:

  1. تطبيق تلقائي: اضغط "تطبيق المكونات الإلزامية" ← كل المكونات اللي عليها is_mandatory = true تتطبق على كل الموظفين النشطين
  2. تعيين يدوي: اختار موظف ← اضغط "تعيين مكون" ← اختار المكون + القيمة + تاريخ السريان

حقول التعيين:

الحقلالشرح
salary_component_idالمكون (بدل سكن، تأمينات، إلخ)
calculation_typefixed أو percentage
amountالقيمة الثابتة (لو fixed)
percentage_valueالنسبة (لو percentage) — مثلاً 25%
effective_fromتاريخ بداية السريان
effective_toتاريخ نهاية السريان (فاضي = سارية لحد ما تتغير)
is_activeفعّال أم لا

مثال — هيكل راتب أحمد محمد (أساسي: 8,000 ريال):

المكونالنوعالحسابالقيمة الشهرية
الراتب الأساسي8,000
بدل سكنمكسب25% × 8000+2,000
بدل مواصلاتمكسبثابت+500
تأمينات (GOSI)خصم9.75% × 8000-780
تأمين طبيخصمثابت-200
إجمالي المكاسب10,500
إجمالي الخصومات-980
صافي الراتب9,520
💡 التاريخ مهم: لو غيرت راتب موظف من 8000 لـ 10000 — أعمل تعيين جديد بتاريخ السريان الجديد. الهيكل القديم يفضل موجود للمرجع.
3

حساب الرواتب (Payroll Calculation)

المكان: /hr/payroll ← "مسير جديد" ← "حساب"

الخطوات:

  1. إنشاء مسير: حدد الشهر + السنة + فترة البداية والنهاية ← الحالة: مسودة
  2. اضغط "حساب": النظام يحسب لكل موظف نشط

إيه اللي بيحصل عند الحساب؟

لكل موظف نشط (Active):

  // 1. الأساسيات
  basic_salary = employee.basic_salary                    // 8000
  daily_rate = basic_salary / salary_calculation_days     // 8000/30 = 266.67
  hourly_rate = daily_rate / working_hours_per_day        // 266.67/8 = 33.33

  // 2. بيانات الحضور من فترة المسير
  absent_days = عدد أيام الغياب (status = absent)
  overtime_hours = إجمالي الساعات الإضافية

  // 3. حساب الخصومات والإضافات
  overtime_amount = overtime_hours × hourly_rate × overtime_multiplier
                  = 10h × 33.33 × 1.5 = 500 ريال
  absent_deduction = absent_days × daily_rate
                   = 2 × 266.67 = 533.33 ريال

  // 4. مكونات هيكل الراتب (الفعّالة في فترة المسير)
  لكل مكون في salary_structure:
    لو percentage: amount = basic_salary × percentage / 100
    لو fixed: amount = المبلغ الثابت
    لو earning → يضاف على المكاسب
    لو deduction → يضاف على الخصومات

  // 5. الإجمالي
  total_earnings = basic_salary + overtime + بدلات
  total_deductions = absent_deduction + تأمينات + ضرائب
  net_salary = total_earnings - total_deductions
    

مثال كامل — أحمد محمد (أبريل 2026):

المكاسب (Earnings)
الراتب الأساسي8,000.00
بدل سكن (25%)+2,000.00
بدل مواصلات (ثابت)+500.00
ساعات إضافية (10h × 33.33 × 1.5)+500.00
إجمالي المكاسب11,000.00
الخصومات (Deductions)
خصم الغياب (2 يوم × 266.67)-533.33
تأمينات اجتماعية (9.75%)-780.00
تأمين طبي (ثابت)-200.00
إجمالي الخصومات-1,513.33
صافي الراتب9,486.67
4

إعدادات الرواتب (Settings)

المكان: /hr/settings

الإعدادالقيمة الافتراضيةالشرح
salary_calculation_days30عدد أيام حساب الراتب (28 أو 30 أو 365)
working_hours_per_day8ساعات العمل اليومية
overtime_rate_multiplier1.5معامل أجر الساعة الإضافية (1.5 = 150%)
salary_expense_account_idحساب مصروف الرواتب (للترحيل المحاسبي)
salary_payable_account_idحساب الرواتب المستحقة
social_insurance_account_idحساب التأمينات الاجتماعية
medical_insurance_account_idحساب التأمين الطبي
income_tax_account_idحساب ضريبة الدخل
معادلة الراتب اليومي: daily_rate = basic_salary ÷ salary_calculation_days
معادلة الأجر بالساعة: hourly_rate = daily_rate ÷ working_hours_per_day
معادلة الإضافي: overtime_pay = overtime_hours × hourly_rate × overtime_multiplier
5

مسار الرواتب (Payroll Workflow)

مسودة
draft
محسوب
calculated
معتمد
approved
مرحّل
posted
مصروف
paid
المرحلةالزرإيه اللي بيحصل
مسودة 🔢 حساب يحسب الراتب لكل موظف نشط (المكاسب + الخصومات + الصافي). النتيجة تتخزن في payroll_items + payroll_item_details
محسوب ✅ موافقة المدير يراجع ويوافق. يسجل approved_by + approved_at
معتمد 📤 ترحيل للمحاسبة يعمل قيد محاسبي:
مدين: حساب مصروف الرواتب (إجمالي المكاسب)
دائن: حساب الرواتب المستحقة (صافي الراتب)
دائن: حساب التأمينات (لو موجود)
دائن: حساب ضريبة الدخل (لو موجود)
← يربط القيد بالمسير (journal_entry_id)
مرحّل 💳 صرف يعلّم الرواتب كمصروفة. يسجل paid_at. يمكن إنشاء قيد دفع إضافي (من البنك)
⚠️ مهم: لازم تضبط حسابات المحاسبة في الإعدادات (salary_expense_account_id + salary_payable_account_id) قبل الترحيل. بدونها الترحيل هيرجع خطأ.
6

كشف الراتب (Payslip)

كشف الراتب لموظف واحد — يظهر لما تضغط "👁️ تفاصيل" على المسير.

البيانات:

  • بيانات المسير: الرقم، الشهر، السنة، الفترة
  • بيانات الموظف: الرقم، الاسم
  • الراتب الأساسي
  • أيام العمل = أيام الحساب - أيام الغياب
  • أيام الغياب
  • ساعات إضافية + قيمتها
  • خصم الغياب
  • تفاصيل المكونات: كل مكون باسمه ونوعه وقيمته
  • إجمالي المكاسب
  • إجمالي الخصومات
  • صافي الراتب
7

القيد المحاسبي (Accounting Entry)

عند الترحيل، النظام ينشئ قيد يومية في موديول المحاسبة:

مثال — مسير أبريل 2026 (5 موظفين):

الحسابمديندائن
مصروف الرواتب (4100)52,500.00
الرواتب المستحقة (2200)45,230.00
التأمينات الاجتماعية (2210)3,900.00
التأمين الطبي (2220)1,000.00
ضريبة الدخل (2230)2,370.00
الإجمالي52,500.0052,500.00

الآلية: النظام بيدور على اسم المكون (social insurance, medical insurance, income tax) ولو لقاله ويوجد حساب محاسبي مضبوط → يفصله في سطر منفصل. غير كده يتحط كله في "الرواتب المستحقة".

قيد الدفع (عند الصرف):

الحسابمديندائن
الرواتب المستحقة (2200)45,230.00
البنك (1100)45,230.00

ملخص الدورة

1. تعريف المكونات مرة واحدة
2. تعيين هيكل لكل موظف عند التعيين أو تغيير الراتب
3. إنشاء مسير الشهر كل شهر
4. حساب (يحسب لكل موظف) تلقائي
5. مراجعة وموافقة المدير
6. ترحيل للمحاسبة (قيد يومية) المحاسب
7. صرف الرواتب قيد دفع من البنك

8

خصومات وإضافات لمرة واحدة (One-Time Adjustments)

مش كل خصم أو إضافة بتتكرر كل شهر. فيه حالات بتكون لشهر واحد بس — زي خصم إتلاف أو حافز استثنائي أو سلفة.

السؤال: إزاي أعمل خصم أو إضافة لشهر واحد بس؟

⚠️ الحالة الحالية: النظام حالياً مفيهوش "خصومات/إضافات لمرة واحدة" كميزة منفصلة. لكن فيه 3 طرق تقدر تستخدمها:

الطريقة 1: هيكل الراتب بتاريخ محدد (الحل الحالي)

✅ شغالة دلوقتي بدون أي تعديل
  1. روح /hr/salary-structures
  2. اختار الموظف
  3. اضغط "تعيين مكون"
  4. اختار المكون (مثلاً "خصم إتلاف") أو أعمل مكون جديد في /hr/salary-components
  5. حدد القيمة
  6. حدد تاريخ البداية = أول الشهر (مثلاً 2026-04-01)
  7. حدد تاريخ النهاية = آخر الشهر (مثلاً 2026-04-30)
  8. بعد ما المسير يتحسب، المكون ده هيظهر في الشهر ده بس
💡 لما تاريخ النهاية يعدي، المكون ده مش هيتحسب في الشهور اللي بعده تلقائي.

الطريقة 2: القروض والسلف (للخصومات المتكررة)

✅ شغالة دلوقتي

لو الخصم بيتكرر على أقساط (زي سلفة أو دين):

  1. روح /hr/loans
  2. أعمل قرض جديد: المبلغ الكلي + القسط الشهري + عدد الأقساط
  3. اعتمد القرض ← يتخصم تلقائي من الراتب كل شهر

الطريقة 3: تعديل يدوي على المسير (مقترح — غير موجود حالياً)

⚠️ غير موجودة — محتاج تطوير

الحل الأمثل: إضافة ميزة "تعديلات يدوية" على المسير — تضيف خصم أو إضافة لموظف معين في شهر معين بدون ما تعدل الهيكل.


أمثلة عملية:

الحالة 1: خصم إتلاف (لمرة واحدة)

السيناريو: أحمد أتلف جهاز كمبيوتر — خصم 1,500 ريال من راتب أبريل.

الحل:

  1. أعمل مكون جديد: "خصم إتلاف" → نوع: خصم → ثابت → مش إلزامي
  2. في هيكل الراتب: عيّن "خصم إتلاف" لأحمد → المبلغ: 1500 → من: 2026-04-01 → إلى: 2026-04-30
  3. لما تحسب مسير أبريل ← الخصم هيظهر ← في مايو مش هيظهر
الراتب الأساسي8,000
بدل سكن+2,000
تأمينات-780
خصم إتلاف (أبريل فقط)-1,500
الصافي7,720

الحالة 2: سحب من المرتب تحت حساب (سلفة)

السيناريو: سارة طلبت سلفة 3,000 ريال — تتخصم على 3 أشهر (1,000/شهر).

الحل:

  1. روح /hr/loans ← "قرض جديد"
  2. النوع: سلفة (advance) | المبلغ: 3000 | القسط: 1000 | الأقساط: 3 | البداية: أبريل
  3. اعتمد السلفة ← يتخصم 1000 من أبريل + 1000 من مايو + 1000 من يونيو تلقائي

الحالة 3: سداد جزء من دين سابق

السيناريو: محمد عليه دين سابق 5,000 ريال — عايز يسدد 2,000 من راتب الشهر ده.

الحل:

  1. أعمل مكون: "سداد دين" → خصم → ثابت
  2. عيّنه لمحمد → المبلغ: 2000 → من: 2026-04-01 → إلى: 2026-04-30
  3. أو أعمله كقرض (loan) لو هيتسدد على أقساط

الحالة 4: حافز/مكافأة لشهر واحد

السيناريو: فريق المبيعات حقق التارجت — حافز 2,000 ريال لكل واحد في أبريل بس.

الحل:

  1. أعمل مكون: "حافز مبيعات" → نوع: مكسب → ثابت → مش إلزامي
  2. عيّنه لكل موظف في الفريق → المبلغ: 2000 → من: 2026-04-01 → إلى: 2026-04-30
  3. في مسير أبريل هيظهر كإضافة ← في مايو مش هيظهر
الراتب الأساسي8,000
بدل سكن+2,000
حافز مبيعات (أبريل فقط)+2,000
تأمينات-780
الصافي11,220

الحالة 5: خصم تأخير / غياب

السيناريو: الموظف تأخر أو غاب.

الحل: تلقائي! — النظام بيحسب خصم الغياب تلقائي من بيانات الحضور:

خصم الغياب = أيام الغياب × (الراتب الأساسي ÷ أيام الحساب)
2 يوم غياب × (8000 ÷ 30) = 533.33 ريال

مش محتاج تعمل أي حاجة يدوي — بس تأكد إن الحضور مسجل صح.

ملخص الحلول:

الحالةالطريقةالمكان
خصم/إضافة لشهر واحدهيكل راتب بتاريخ (من-إلى)/hr/salary-structures
سلفة/دين على أقساطقرض (loan/advance)/hr/loans
خصم غياب/تأخيرتلقائي من الحضور/hr/attendance
حافز لمرة واحدةمكون مكسب بتاريخ محدد/hr/salary-structures
سداد دينمكون خصم بتاريخ أو قرض/hr/salary-structures أو /hr/loans