اللوجيك الكامل للرواتب — Moon HR

السحبات (العملية الأساسية) + التعديلات + القيود المحاسبية + القبض الجزئي + الموافقة الاختيارية

1

أنواع العمليات المالية على الراتب

كل عملية مالية بتأثر على الراتب لازم تتسجل بشكل صحيح — مش مجرد خصم من الراتب، لأن فيه فلوس بتتحرك فعلياً.

⚡ العملية الأساسية = السحب من المرتب (تحت حساب)
دي العملية الوحيدة اللي فلوس فعلاً بتتسحب من الخزنة — يعني لازم يتعملها قيد محاسبي فوراً وقت الصرف.
باقي العمليات (خصم إتلاف، جزاء، خصم تأخير...) دي خصومات حسابية فقط — مفيش فلوس بتتحرك — بتظهر بس في قيد المسير آخر الشهر.
النوعالشرحفلوس بتتحرك؟من فين؟التأثير على الراتب
سحب تحت حساب الموظف ياخد فلوس كاش من الخزنة أو تحويل قبل آخر الشهر نعم — فوراً الخزنة أو البنك يتخصم من الراتب آخر الشهر
سلفة مقدمة مبلغ كبير يتسدد على أقساط نعم — فوراً الخزنة أو البنك قسط شهري يتخصم تلقائي
خصم إتلاف / جزاء خصم بسبب إتلاف ممتلكات أو مخالفة لا — خصم فقط يتخصم من الراتب
حافز / مكافأة مبلغ إضافي لمرة واحدة حسب — ممكن نقدي أو مع الراتب مع الراتب أو من الخزنة يتضاف على الراتب
خصم تأخير / غياب خصم تلقائي من الحضور لا — تلقائي يتخصم تلقائي
بدلات ثابتة سكن، مواصلات، طعام (كل شهر) لا — مع الراتب يتضاف تلقائي
استقطاعات ثابتة تأمينات، ضريبة (كل شهر) لا — مع الراتب يتخصم تلقائي
2

تعديلات المسير — Payroll Adjustments (جدول جديد)

جدول جديد لتسجيل أي خصم أو إضافة لمرة واحدة على مسير محدد — بدل ما تعدل هيكل الراتب.

الفرق بين هيكل الراتب والتعديلات:

هيكل الراتب (Salary Structure)تعديلات المسير (Payroll Adjustments)
التكراركل شهر (دائم)مرة واحدة على مسير محدد
الأمثلةبدل سكن، تأميناتسحب تحت حساب، خصم إتلاف، حافز
التعديلمن شاشة هيكل الراتبمن شاشة المسير مباشرة
الربطمرتبط بالموظفمرتبط بالموظف والمسير

جدول payroll_adjustments:

الحقلالنوعالشرح
idbigint PK
payroll_idFK → payrollsالمسير
employee_idFK → employeesالموظف
typeenum(earning, deduction)إضافة أو خصم
categoryenum(advance, penalty, damage, bonus, incentive, other)تصنيف العملية
amountdecimal(12,3)المبلغ (موجب دائماً)
descriptiontextالوصف / السبب
reference_numbervarchar nullableرقم مرجعي (إيصال، أمر صرف)
payment_methodenum(cash, bank, from_salary) nullableكيف اتصرف المبلغ
cash_account_idFK → accounts nullableحساب الخزنة/البنك اللي اتصرف منه
journal_entry_idFK → journal_entries nullableالقيد المحاسبي (لو فيه فلوس اتحركت)
is_paid_outboolean default falseهل الفلوس اتصرفت فعلاً (للسحبات)
paid_attimestamp nullableتاريخ الصرف الفعلي
statusenum(pending, approved, rejected) default 'approved'حالة الموافقة — لو approval_required = false يتعمل approved مباشرة
approved_byFK → users nullableمين وافق
company_idFK
created_by / updated_byFK
timestamps

مثال — أحمد سحب 3 مرات في أبريل:

#التاريخالنوعالتصنيفالمبلغمن فيناتصرف؟
15 أبريلخصمسحب تحت حساب1,000الخزنةنعم ✅
212 أبريلخصمسحب تحت حساب500تحويل بنكينعم ✅
320 أبريلخصمخصم إتلاف300من الراتبلا (يتخصم آخر الشهر)
3

فلو السحب من المرتب — خطوة بخطوة

1. الموظف يطلب سحب من المرتب
2. HR يدخل التعديل على المسير
يختار: الموظف + المبلغ + السبب + من فين (خزنة/بنك/من الراتب)
3. الموافقة اختياري حسب الإعداد
لو approval_required = true → المدير يوافق أولاً
لو approval_required = false → يتصرف مباشرة (مرحلة واحدة — مناسب للمؤسسات الصغيرة)
↓ لو "من الخزنة" أو "تحويل بنكي"
4. ⭐ العملية الأساسية: صرف الفلوس فعلياً + القيد المحاسبي
وضع تلقائي (auto_journal = true): القيد يتعمل مباشرة مع تسجيل السحب — عملية واحدة من مكان واحد ✅
وضع يدوي (auto_journal = false): HR يسجل السحب → المحاسب يراجع ويعمل القيد منفصل
← قيد: مدين: سلف موظفين / دائن: الخزنة أو البنك
5. عند حساب المسير آخر الشهر
التعديلات تتضاف تلقائي على حساب الموظف
6. الراتب النهائي = الأساسي + البدلات - الخصومات الثابتة - التعديلات - الغياب + الإضافي
3.5

دورة الموافقة — اختيارية (حسب حجم المؤسسة)

الموافقة اختيارية وليست إجبارية — بعض المؤسسات الصغيرة عايزة تصرف مباشرة بدون دورة موافقة.

إعداد في hr_settings:

المفتاحالنوعالقيمة الافتراضيةالشرح
payroll_adjustment_approval_required boolean false هل تعديلات المسير (سحبات، خصومات...) تحتاج موافقة مدير قبل الصرف؟
payroll_adjustment_approval_roles json array ["hr_manager"] الأدوار اللي تقدر توافق (لو الموافقة مفعّلة)
payroll_adjustment_auto_journal boolean true هل القيد المحاسبي يتعمل تلقائي مع تسجيل السحب؟ أو يحتاج المحاسب يعمله يدوي؟

السلوك حسب الإعداد:

الإعدادالفلومناسب لـ
approval_required = false HR يضيف التعديل → يتصرف مباشرة (بدون موافقة) مؤسسات صغيرة، مالك واحد، فريق صغير
approval_required = true HR يضيف التعديل → المدير يوافق → المحاسب يصرف شركات كبيرة، فصل صلاحيات، رقابة مالية

سلوك القيد المحاسبي:

الإعدادالفلومناسب لـ
auto_journal = true HR يضيف السحب → القيد المحاسبي يتعمل أوتوماتيك فوراً — عملية واحدة من مكان واحد مؤسسات صغيرة، بدون محاسب منفصل
auto_journal = false HR يضيف السحب → المحاسب يراجع ويعمل القيد يدوي من شاشة القيود شركات كبيرة، فصل بين HR والمحاسبة
الافتراضي (المؤسسات الصغيرة): الموافقة معطلة + القيد تلقائي = HR يضيف السحب وكل حاجة تتعمل مرة واحدة. مفيش أي blocking — المحاسب أو HR يقدر يضيف سحب ويتعمل القيد فوراً.
4

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

كل موظف يكون له حساب فرعي خاص تحت كل حساب رئيسي بيتعامل معاه.
كده تقدر تعرف رصيد كل موظف مباشرة من شجرة الحسابات بدون ما تحتاج تقارير خاصة.

4.1 هيكل شجرة الحسابات:

الأصول المتداولة (1000)
├── الخزينة (1100)
├── البنك (1110)
│
├── مسحوبات موظفين — تحت حساب (1300)
│   ├── أحمد محمد (1300-EMP001)
│   ├── خالد علي (1300-EMP002)
│   └── سارة حسن (1300-EMP003)
│
├── قروض موظفين (1310)
│   ├── أحمد محمد (1310-EMP001)
│   ├── خالد علي (1310-EMP002)
│   └── سارة حسن (1310-EMP003)
│
└── ذمم موظفين — جزاءات وإتلاف (1320)
    ├── أحمد محمد (1320-EMP001)
    ├── خالد علي (1320-EMP002)
    └── سارة حسن (1320-EMP003)

المصروفات (4000)
├── مصروف رواتب وأجور (4100)
│   ├── أحمد محمد (4100-EMP001)
│   ├── خالد علي (4100-EMP002)
│   └── سارة حسن (4100-EMP003)
│
├── مصروف بدلات (4110)
│   ├── أحمد محمد (4110-EMP001)
│   ├── خالد علي (4110-EMP002)
│   └── سارة حسن (4110-EMP003)
│
├── مصروف حوافز ومكافآت (4200)
│   ├── أحمد محمد (4200-EMP001)
│   ├── خالد علي (4200-EMP002)
│   └── سارة حسن (4200-EMP003)
│
└── مصروف تأمينات (حصة الشركة) (4300)
    ├── أحمد محمد (4300-EMP001)
    ├── خالد علي (4300-EMP002)
    └── سارة حسن (4300-EMP003)

الالتزامات (2000)
├── رواتب مستحقة (2100)
│   ├── أحمد محمد (2100-EMP001)
│   ├── خالد علي (2100-EMP002)
│   └── سارة حسن (2100-EMP003)
│
├── تأمينات مستحقة (2200)
│   ├── أحمد محمد (2200-EMP001)
│   └── ...
│
└── ضرائب مستحقة (2300)
    ├── أحمد محمد (2300-EMP001)
    └── ...
    
الإنشاء تلقائي: لما موظف يتعمله أول عملية على أي حساب → النظام يعمل حساب فرعي تلقائي.
الكود: {parent_code}-{employee_number} — مثال: 1300-EMP001
الاسم: {اسم الحساب الرئيسي} — {اسم الموظف} — مثال: مسحوبات — أحمد محمد

4.2 الفوائد:

الفائدةالشرح
رصيد مباشرتفتح حساب أحمد في المسحوبات → تعرف عليه كام فوراً
تسوية نهاية خدمةلما الموظف يمشي → الرصيد المعلق واضح في حسابه
تقاريرالمدير المالي يشوف شجرة السلف ويعرف كل موظف رصيده
مراجعةالمراجع يطابق الحساب الفرعي مع كشف الموظف
ميزان المراجعةالحساب الرئيسي = مجموع الفرعيات تلقائي
5

القيود المحاسبية لكل نوع عملية — بحساب فرعي لكل موظف

⭐ العملية الأساسية = السحب تحت حساب
دي العملية الوحيدة اللي بتتحرك فيها فلوس فعلياً من الخزنة — فلازم يتعمل قيد محاسبي فوري.

5.1 سحب تحت حساب (من الخزنة) — ⭐ العملية الأساسية:

عند الصرف — يتعمل قيد فوراً (مثال: أحمد سحب 1,000 كاش):

الحسابمديندائن
مسحوبات — أحمد محمد (1300-EMP001)1,000
الخزينة (1100)1,000
إعداد القيد المحاسبي: حسب إعداد payroll_adjustment_auto_journal:
  • تلقائي (true — الافتراضي): القيد يتعمل أوتوماتيك لحظة تسجيل السحب — عملية واحدة من مكان واحد.
  • يدوي (false): HR يسجل السحب، والمحاسب يعمل القيد منفصل.

عند حساب الراتب (آخر الشهر):

السحب يتخصم من الراتب — قيد المسير يقفل حساب الموظف الفرعي:

الحسابمديندائن
مصروف رواتب — أحمد (4100-EMP001)8,000
مسحوبات — أحمد (1300-EMP001)1,000
رواتب مستحقة — أحمد (2100-EMP001)7,000

← كده حساب مسحوبات أحمد رصيده صفر — السحب اتقفل مع الراتب.

5.2 سحب تحت حساب (تحويل بنكي) — مثال: أحمد 500 تحويل:

الحسابمديندائن
مسحوبات — أحمد محمد (1300-EMP001)500
البنك (1110)500

5.3 قرض / سلفة مقسطة — مثال: أحمد سلفة 6,000 على 6 أشهر:

عند صرف السلفة:

الحسابمديندائن
قروض — أحمد محمد (1310-EMP001)6,000
الخزينة (1100)6,000

كل شهر (قسط 1,000 يتخصم من الراتب):

الحسابمديندائن
مصروف رواتب — أحمد (4100-EMP001)8,000
قروض — أحمد (1310-EMP001)1,000
رواتب مستحقة — أحمد (2100-EMP001)7,000

← كده كل شهر رصيد القرض بينقص 1,000 تلقائي لحد ما يخلص.

5.4 خصم إتلاف / جزاء (بدون صرف فوري):

مفيش قيد فوري — بيتخصم من الراتب آخر الشهر. مثال: أحمد عليه جزاء 300:

الحسابمديندائن
مصروف رواتب — أحمد (4100-EMP001)8,000
ذمم جزاءات — أحمد (1320-EMP001)300
رواتب مستحقة — أحمد (2100-EMP001)7,700

5.5 حافز / مكافأة (مع الراتب):

بيتضاف على الراتب — مثال: أحمد حافز 2,000 مع الراتب:

الحسابمديندائن
مصروف رواتب — أحمد (4100-EMP001)8,000
مصروف حوافز — أحمد (4200-EMP001)2,000
رواتب مستحقة — أحمد (2100-EMP001)10,000

5.6 حافز / مكافأة (نقدي فوري من الخزنة):

مثال: أحمد حافز 2,000 كاش من الخزنة:

الحسابمديندائن
مصروف حوافز — أحمد (4200-EMP001)2,000
الخزينة (1100)2,000

5.7 قيد المسير الكامل (مثال أحمد — أبريل):

لما المسير يتحسب ويترحّل، القيد الكامل بكل التفاصيل:

الحسابمديندائنالشرح
مصروف رواتب — أحمد (4100-EMP001)8,000الراتب الأساسي
مصروف بدلات — أحمد (4110-EMP001)2,500سكن 2000 + مواصلات 500
مصروف حوافز — أحمد (4200-EMP001)2,000حافز مبيعات
مسحوبات — أحمد (1300-EMP001)1,500سحب 1000 + سحب 500 (اتصرفوا قبل كده)
قروض — أحمد (1310-EMP001)500قسط السلفة الشهري
ذمم جزاءات — أحمد (1320-EMP001)300خصم إتلاف
تأمينات مستحقة — أحمد (2200-EMP001)780GOSI 9.75%
تأمين طبي مستحق200تأمين طبي
خصم غياب533.33غياب يومين
رواتب مستحقة — أحمد (2100-EMP001)7,186.67← المبلغ الفعلي المستحق (الصافي - المسحوبات)
إجمالي مدين: 12,500إجمالي دائن: 12,500 ✅
لاحظ: حساب "مسحوبات — أحمد" رصيده كان 1,500 مدين (من السحبات اللي اتصرفت خلال الشهر).
لما المسير اترحّل → الحساب اتدان 1,500 → الرصيد بقى صفر ← السحبات اتقفلت مع الراتب تلقائي.
6

حساب المسير الكامل مع التعديلات

لكل موظف نشط:

  // ===== المكاسب =====
  earnings = basic_salary                         // 8,000

  // بدلات ثابتة (من هيكل الراتب)
  + housing_allowance (25% × 8000)                // +2,000
  + transport_allowance (ثابت)                     // +500

  // ساعات إضافية (من الحضور)
  + overtime (10h × 33.33 × 1.5)                  // +500

  // تعديلات إيجابية (من payroll_adjustments)
  + حافز مبيعات                                   // +2,000
  ---
  total_earnings = 13,000

  // ===== الخصومات =====
  deductions = 0

  // خصومات ثابتة (من هيكل الراتب)
  + GOSI (9.75% × 8000)                           // +780
  + medical_insurance (ثابت)                       // +200

  // خصم الغياب (من الحضور)
  + absent_deduction (2 × 266.67)                  // +533.33

  // تعديلات سلبية (من payroll_adjustments)
  + سحب تحت حساب 1                               // +1,000
  + سحب تحت حساب 2                               // +500
  + خصم إتلاف                                     // +300

  // أقساط القروض (من loans — تلقائي)
  + قسط سلفة                                      // +500
  ---
  total_deductions = 3,813.33

  // ===== الصافي =====
  net_salary = total_earnings - total_deductions
             = 13,000 - 3,813.33
             = 9,186.67

  // ===== المستحق الفعلي (بعد خصم اللي اتصرف) =====
  already_paid_out = 1,000 + 500                   // السحبات اللي اتصرفت فعلاً
  remaining_to_pay = net_salary - already_paid_out
                   = 9,186.67 - 1,500
                   = 7,686.67  ← ده اللي يتصرف آخر الشهر
    

كشف راتب أحمد — أبريل 2026:

المكاسب
الراتب الأساسي8,000.00
بدل سكن (25%)+2,000.00
بدل مواصلات+500.00
ساعات إضافية (10h)+500.00
حافز مبيعات ⭐+2,000.00
إجمالي المكاسب13,000.00
الخصومات
تأمينات اجتماعية (9.75%)-780.00
تأمين طبي-200.00
خصم غياب (2 يوم)-533.33
سحب تحت حساب (5 أبريل) ⭐-1,000.00
سحب تحت حساب (12 أبريل) ⭐-500.00
خصم إتلاف ⭐-300.00
قسط سلفة-500.00
إجمالي الخصومات-3,813.33
صافي الراتب9,186.67
الصرف
اتصرف مقدماً (سحبات)-1,500.00
المستحق الفعلي (يتصرف آخر الشهر)7,686.67
7

القبض الجزئي — صرف موظف بموظف

بدل ما تصرف كل الموظفين مرة واحدة — تقدر تصرف موظف واحد أو مجموعة.

حقول جديدة على payroll_items:

الحقلالنوعالشرح
payment_statusenum(unpaid, paid, held)حالة الصرف لهذا الموظف
paid_attimestamp nullableتاريخ الصرف
hold_reasontext nullableسبب الإيقاف (لو held)
already_paid_outdecimal(12,3) default 0المبلغ اللي اتصرف مقدماً (سحبات)
remaining_to_paydecimal(12,3)المستحق الفعلي = net_salary - already_paid_out

حالات المسير:

الحالةالمعنى
draftمسودة — لم يُحسب بعد
calculatedمحسوب — جاهز للمراجعة
approvedمعتمد — جاهز للترحيل
postedمرحّل — القيد المحاسبي اتعمل
partially_paidجديد — بعض الموظفين اتصرفوا
paidكل الموظفين اتصرفوا

APIs جديدة:

MethodEndpointالوظيفة
POST/payroll/{id}/pay-itemصرف موظف واحد — body: { payroll_item_id }
POST/payroll/{id}/hold-itemإيقاف صرف موظف — body: { payroll_item_id, reason }
POST/payroll/{id}/payصرف كل المتبقي (unpaid) دفعة واحدة
8

APIs تعديلات المسير (Payroll Adjustments)

MethodEndpointالوظيفة
GET/payroll/{id}/adjustmentsقائمة التعديلات لمسير محدد
POST/payroll/{id}/adjustmentsإضافة تعديل (خصم/إضافة) — body: { employee_id, type, category, amount, description, payment_method, cash_account_id }
PUT/payroll/{id}/adjustments/{adj_id}تعديل
DELETE/payroll/{id}/adjustments/{adj_id}حذف (قبل الحساب فقط)
POST/payroll/{id}/adjustments/{adj_id}/pay-outصرف المبلغ فعلياً (يعمل قيد محاسبي)

تعديل منطق الحساب:

عند POST /payroll/{id}/calculate:

  1. يحسب المكاسب والخصومات الثابتة (كالعادة)
  2. جديد: يجمع التعديلات من payroll_adjustments لهذا المسير
  3. التعديلات earning → تضاف على total_earnings
  4. التعديلات deduction → تضاف على total_deductions
  5. جديد: يحسب already_paid_out (مجموع التعديلات اللي is_paid_out = true)
  6. جديد: يحسب remaining_to_pay = net_salary - already_paid_out
9

الشاشات المطلوبة في الفرونت إند

8.1 شاشة المسير المحسّنة:

  • عند الضغط على "تفاصيل" → يعرض كل موظف بالتفصيل:
    • المكاسب بالاسم (بدل سكن: +2000، بدل مواصلات: +500)
    • الخصومات بالاسم (تأمينات: -780، تأمين طبي: -200)
    • التعديلات بالاسم (سحب: -1000، خصم إتلاف: -300، حافز: +2000)
    • خصم الغياب + الإضافي
    • المستحق الفعلي (بعد السحبات)
  • حالة الصرف لكل موظف (unpaid / paid / held)
  • زر "صرف" لكل موظف
  • زر "إيقاف" مع سبب
  • زر "صرف الكل" للمتبقي

8.2 شاشة تعديلات المسير (جديدة):

  • تفتح من داخل المسير — تاب أو dialog
  • جدول: الموظف | النوع (خصم/إضافة) | التصنيف | المبلغ | السبب | طريقة الصرف | اتصرف؟
  • زر "إضافة تعديل" → dialog: اختار موظف + النوع + التصنيف + المبلغ + السبب + من فين
  • زر "صرف" على كل سحب → يعمل قيد محاسبي ويعلّم كـ paid_out

8.3 تحسين كشف الراتب:

  • يعرض كل التفاصيل: مكاسب + خصومات ثابتة + تعديلات + غياب + إضافي
  • المستحق الفعلي (بعد السحبات) بشكل واضح
  • قابل للطباعة
10

المسير والفروع — Multi-Branch Payroll

المشكلة الحالية: المسير بيجيب كل موظفين الشركة مرة واحدة — مفيش فصل بالفرع.
لو شركة عندها 3 فروع (القاهرة 50 موظف، الإسكندرية 30، أسوان 20) → المسير بيحسب الـ 100 مع بعض.

10.1 الوضع الحالي في الباك إند:

المكانbranch_id موجود؟التفاصيل
الموظف (employees)نعم ✅branch_id موجود ومطلوب (required)
الأقسام (departments)نعم ✅branch_id على كل قسم
المسير (payrolls)لا ❌مفيش branch_id — بيجيب كل الموظفين
الحضور (attendance)نعم ✅مرتبط بالموظف اللي عنده فرع

10.2 المطلوب:

أ. حقل branch_id على جدول payrolls

الحقلالنوعالشرح
branch_idFK → branches, nullablenull = كل الفروع (مسير شامل)
قيمة محددة = فرع واحد فقط

ب. تعديل PayrollService::calculate()

// الحالي (خطأ):
$employees = Employee::where('company_id', $companyId)
    ->active()->get();

// المطلوب:
$query = Employee::where('company_id', $companyId)->active();

if ($payroll->branch_id) {
    $query->where('branch_id', $payroll->branch_id);
}

$employees = $query->get();
    

ج. فلتر المسيرات بالفرع

الشاشةالفلتر
قائمة المسيراتfilter by branch_id — المستخدم يشوف بس مسيرات فرعه (أو الكل لو super admin)
إنشاء مسيراختيار الفرع (أو "كل الفروع") عند الإنشاء
التقاريرتقرير الرواتب يدعم فلتر بالفرع

د. الـ Unique Constraint

حالياً: unique(company_id, month, year) — يعني مسير واحد بس في الشهر.

المطلوب: unique(company_id, branch_id, month, year) — مسير لكل فرع في الشهر.

branch_id = null (مسير شامل) يظل unique بـ (company_id, NULL, month, year).
لو عملت مسير لفرع القاهرة ومسير لفرع الإسكندرية في نفس الشهر → مسموح.
لو عملت مسيرين لنفس الفرع في نفس الشهر → ممنوع.

10.3 السيناريوهات:

سيناريو 1 — شركة صغيرة (فرع واحد أو مش عايز يفصل):

يعمل مسير بدون اختيار فرع (branch_id = null) → كل الموظفين يتحسبوا مع بعض. نفس السلوك الحالي.

سيناريو 2 — شركة متعددة الفروع:

  • مسير أبريل — فرع القاهرة (50 موظف) → branch_id = 1
  • مسير أبريل — فرع الإسكندرية (30 موظف) → branch_id = 2
  • مسير أبريل — فرع أسوان (20 موظف) → branch_id = 3
  • كل مسير مستقل: حساب، اعتماد، ترحيل، صرف — كل فرع لوحده

سيناريو 3 — مدير فرع:

مدير فرع القاهرة يدخل يشوف بس مسيرات فرعه — مش بيشوف الإسكندرية أو أسوان.

Super admin يشوف كل المسيرات من كل الفروع.

10.4 القيد المحاسبي والفرع:

لما المسير يترحّل — القيد المحاسبي يكون مرتبط بنفس الفرع:

الحسابمديندائنالفرع
مصروف رواتب — أحمد (4100-EMP001)8,000القاهرة
مصروف رواتب — خالد (4100-EMP002)6,000القاهرة
رواتب مستحقة — أحمد (2100-EMP001)8,000القاهرة
رواتب مستحقة — خالد (2100-EMP002)6,000القاهرة

كده التقارير المالية تقدر تفصل مصروفات الرواتب بالفرع.

11

ملخص كل التغييرات المطلوبة

Backend (أحمد):

#المهمةالأولوية
1جدول payroll_adjustments + migrationعاجل
2CRUD APIs للتعديلات + pay-out endpointعاجل
3تعديل PayrollService::calculate() ليشمل التعديلات + already_paid_outعاجل
4حقول payment_status + paid_at + hold_reason + remaining_to_pay على payroll_itemsعالي
5endpoints: pay-item + hold-item + حالة partially_paidعالي
6PayrollItemResource يشمل details + adjustmentsعالي
7⭐ قيد محاسبي تلقائي عند صرف السحب (pay-out) — دي العملية الأساسية. يدعم الوضعين: تلقائي (قيد فوري مع السحب) أو يدوي (المحاسب يعمله)عاجل
8إعدادات: payroll_adjustment_approval_required + payroll_adjustment_auto_journal + payroll_adjustment_approval_rolesعالي
9حسابات فرعية لكل موظف: إنشاء تلقائي لحساب فرعي تحت (1300 مسحوبات، 1310 قروض، 1320 جزاءات، 4100 رواتب، 4110 بدلات، 4200 حوافز، 2100 مستحقات) عند أول عملية — كود: {parent}-{emp_number}عاجل
10قيد المسير يستخدم الحسابات الفرعية لكل موظف (مش حساب عام واحد)عاجل
11دعم الفروع في المسير: إضافة branch_id (nullable FK) على payrolls + تعديل calculate() ليفلتر بالفرع + تعديل unique constraint لـ (company_id, branch_id, month, year) + فلتر المسيرات بفرع المستخدم + القيد المحاسبي يكون مرتبط بالفرععاجل

Frontend (حازم):

#المهمةالأولوية
1شاشة تعديلات المسير (إضافة/حذف خصومات وإضافات)عاجل
2تفاصيل كشف الراتب (مكاسب + خصومات بالاسم)عالي
3القبض الجزئي (صرف/إيقاف لكل موظف)عالي
4طباعة كشف الراتبمتوسط
5فلتر الفرع في شاشة المسير (إنشاء مسير لفرع محدد + فلتر القائمة بالفرع)عالي