# دورة الإقفال المالي — المواصفة المعتمدة
## يفكّ هذا المستند + الكود المرافق الشرطَ المعلّق على بوابة الاعتماد المحاسبي

**الكود التنفيذي المرافق:** `closing.php` (المنطق) + `closing_test.php` (9 اختبارات نجحت كلها بتنفيذ فعلي)

---

## 1. دورة حالات الشهر المالي

```
        softClosePeriod()              finalClosePeriod()
open ──────────────────► soft_closed ──────────────────► closed
  ▲                           │                       (لا رجعة أبدًا)
  └───────────────────────────┘
        reopenPeriod()
   (تنفيذي فأعلى + سبب موثّق)
```

| الحالة | ما المسموح فيها |
|---|---|
| **open** | كل العمليات طبيعية |
| **soft_closed** (إقفال مؤقت) | لا قيود جديدة اعتيادية؛ تسويات معتمدة فقط عبر إعادة فتح موثقة. الغرض: نافذة مراجعة قبل القفل النهائي |
| **closed** (نهائي) | لا شيء إطلاقًا — قاعدة البيانات نفسها ترفض أي قيد بتاريخ داخل الفترة (Trigger). أي تصحيح لاحق = قيد تسوية بتاريخ أول شهر مفتوح مع الإشارة للفترة الأصلية في الوصف |

## 2. مصفوفة الصلاحيات (متسقة مع مصفوفة اللجنة المعتمدة)

| الإجراء | الصلاحية الدنيا |
|---|---|
| إقفال مؤقت / نهائي للشهر | مدير المشاريع |
| إعادة فتح شهر soft_closed | المدير التنفيذي (سبب إلزامي يُسجَّل بالتدقيق) |
| إعادة فتح شهر closed | **لا أحد** — قاعدة مطلقة |
| إقفال السنة | المدير العام حصريًا، وبعد إقفال الأشهر الـ12 نهائيًا |

## 3. شروط الإقفال المؤقت (Pre-close Checklist)

يُرفض الإقفال المؤقت آليًا إن وُجد أي من:
1. **قيود مسودة** بتاريخ داخل الفترة (مطبَّق ومُختبر في الكود) — تُرحَّل أو تُلغى أولًا
2. مسير رواتب للفترة بحالة غير نهائية *(يُطبَّق عند بناء موديول الرواتب — المرحلة B)*
3. استلامات مخزون غير مفوترة أعمر من 30 يومًا دون قيد استحقاق *(المرحلة C)*
4. مستخلص معتمد غير مُقيَّد محاسبيًا *(المرحلة D)*

البند 1 مفروض الآن؛ البنود 2–4 تُضاف لنفس الدالة `softClosePeriod()` تباعًا مع بناء موديولاتها — **الهيكل جاهز لاستقبالها**.

## 4. تسلسل الإقفال الشهري التشغيلي (SOP)

1. اليوم 1–3 من الشهر التالي: ترحيل/إلغاء كل المسودات، تسويات الاستحقاق، تسوية بنكية
2. اليوم 4: **إقفال مؤقت** (مدير المشاريع) — تُطبع مسودة ميزان المراجعة للمراجعة
3. اليوم 5–7: مراجعة مالية؛ أي تصحيح = إعادة فتح موثقة ← تصحيح ← إقفال مؤقت مجددًا
4. اليوم 8: **إقفال نهائي** — يُعمَّم ميزان المراجعة المعتمد
5. نهاية السنة: بعد الشهر 12 وتسويات نهاية السنة (إهلاك، مخصصات، جرد سنوي) ← إقفال السنة (المدير العام) ← قيود الإقفال الختامية وترحيل الأرصدة

## 5. ما أثبته التنفيذ الفعلي (9/9 اختبارات)

- رفض الإقفال بوجود مسودات، ونجاحه بعد ترحيلها
- رفض الإقفال النهائي دون مؤقت
- منع مدير المشروع من الإقفال، ومنع مدير المشاريع من إعادة الفتح، وإلزام التنفيذي بسبب
- **قاعدة البيانات نفسها ترفض قيدًا بتاريخ شهر مقفل** (Trigger — يعمل حتى لو تجاوز الكودُ كلَّ الطبقات)
- استحالة إعادة فتح المقفل نهائيًا حتى من التنفيذي
- رفض إقفال السنة قبل اكتمال 12 شهرًا، وقصره على المدير العام
- كل عملية إقفال/فتح مسجَّلة في سجل التدقيق غير القابل للعبث
