Commit f239fadf authored by DevPilot's avatar DevPilot

docs(accounting): step-by-step tutorial for chains, accruals and gap tools

One walkthrough covering everything the three features do, aimed at the
accountant who has to run them and the developer who has to maintain
them. The two existing files stay as references; this is the guided path
through them.

21 Mermaid diagrams, all verified to parse:

  - what was broken, in three pictures
  - split vs move — why the allocation wizard could not express a chain
  - the settlement bug as a sequence, including why a balanced entry hid it
  - the accrue / collect / release cycle and where the double-count
    would have been
  - why a scanner beats event listeners, with the coach payroll listener
    as the worked example
  - the three-way match for procurement
  - first-run order, daily routine, monthly close
  - a troubleshooting decision tree and a table of the actual error
    messages
  - an ER diagram of the five new tables

Also states plainly the four things that still need a finance decision,
including the two that are deliberately left matching a mapping I
believe is wrong, because accrual and collection must agree.
Co-Authored-By: 's avatarClaude Opus 5 <noreply@anthropic.com>
parent caca1389
# مسار الفلوس والاستحقاقات — الدليل خطوة بخطوة
> **لمين الدليل ده؟** للمحاسب اللي هيشغّل النظام، وللمبرمج اللي هيصيّنه.
>
> **بيغطي إيه؟** تلات حاجات اتبنوا مع بعض: **مسار الفلوس** (الفلوس وهي بتتنقّل من
> حساب لحساب)، و**الاستحقاقات** (الفلوس اللي لينا قبل ما حد يدفع)، و**سد الفجوات**
> (الحاجات اللي النظام مش عارف يسعّرها لوحده).
---
## المحتويات
| # | القسم | لمين |
|---|---|---|
| ٠ | [الصورة الكبيرة](#٠--الصورة-الكبيرة) | الكل |
| ١ | [مسار الفلوس](#١--مسار-الفلوس) | محاسب + مبرمج |
| ٢ | [الاستحقاقات](#٢--الاستحقاقات) | محاسب + مبرمج |
| ٣ | [سد الفجوات](#٣--سد-الفجوات) | محاسب |
| ٤ | [التشغيل — أول مرة وبعدين كل يوم](#٤--التشغيل) | محاسب |
| ٥ | [لما حاجة تبوظ](#٥--لما-حاجة-تبوظ) | الكل |
| ٦ | [مرجع فني](#٦--مرجع-فني) | مبرمج |
---
## ٠ — الصورة الكبيرة
### كان فيه تلات مشاكل
```mermaid
flowchart TB
subgraph P1["١ — الفلوس بتتنقّل ومحدش بيتابع"]
A1["التحصيل بينزل حساب نقدية عام"]
A2["التسوية بتفضّي حساب تاني خالص"]
A3["النتيجة: النقدية اتعدّت مرتين<br/>وصندوق الدولار بالسالب"]
A1 --> A2 --> A3
end
subgraph P2["٢ — فلوس مستحقة والدفاتر ما تعرفش"]
B1["اشتراك اتولّد / ملعب اتحجز"]
B2["مفيش قيد لحد ما حد يدفع"]
B3["النتيجة: ٨٣٥ ألف مستحقات<br/>مش ظاهرة في الميزانية"]
B1 --> B2 --> B3
end
subgraph P3["٣ — حاجات مالهاش سعر أصلًا"]
C1["حجز مسجّل بصفر<br/>كارنيه من غير عمود مبلغ"]
C2["النظام مش هيخترع رقم"]
C3["النتيجة: إيراد ضايع<br/>ومفيش أداة تحله"]
C1 --> C2 --> C3
end
style A3 fill:#FEE2E2,stroke:#DC2626
style B3 fill:#FEE2E2,stroke:#DC2626
style C3 fill:#FEE2E2,stroke:#DC2626
```
### واتبنى تلات حلول
```mermaid
flowchart LR
S1["مسار الفلوس<br/>Posting Chains"] --> R1["كل خطوة بتفضّي<br/>اللي قبلها بالظبط"]
S2["ماسح الاستحقاقات<br/>Accrual Runner"] --> R2["بيقرا الجداول ويقيّد<br/>اللي لسه ما اتقيّدش"]
S3["سد الفجوات<br/>Gap Tools"] --> R3["المحاسب بيحدد التسعيرة<br/>ويشوف هينزل كام قبل ما يعتمد"]
style S1 fill:#DBEAFE,stroke:#2563EB
style S2 fill:#DBEAFE,stroke:#2563EB
style S3 fill:#DBEAFE,stroke:#2563EB
style R1 fill:#D1FAE5,stroke:#059669
style R2 fill:#D1FAE5,stroke:#059669
style R3 fill:#D1FAE5,stroke:#059669
```
### الشاشات الجديدة
| الشاشة | الرابط | بتعمل إيه |
|---|---|---|
| **مسار الفلوس** | `/accounting/posting-chains` | السلاسل وصحتها |
| **فين الفلوس دلوقتي** | `/accounting/posting-chains/parked` | الأرصدة الواقفة وأعمارها |
| **تصحيح التبويب** | `/accounting/posting-chains/reclassification` | تصحيح نقدية الخزائن القديمة |
| **الاستحقاقات** | `/accounting/accruals` | المستحق، والفحص اليدوي |
| **سد الفجوات** | `/accounting/gaps` | التسعيرات المعتمدة |
---
## ١ — مسار الفلوس
### ١.١ الفكرة
فيه فرق بين حاجتين، وخلطهم هو أصل المشكلة:
```mermaid
flowchart TB
subgraph T1["تقسيم — معالج توزيع المبالغ"]
D1["مبلغ ١٠٠٠"] --> D2["٧٠٠ قيمة عضوية"]
D1 --> D3["٢٠٠ تنمية"]
D1 --> D4["١٠٠ دمغة"]
D5["قيد واحد ✓"]
end
subgraph T2["تنقّل — مسار الفلوس"]
E1["نفس الـ١٠٠٠"] --> E2["في خزنة العضويات"]
E2 --> E3["بعد التسوية:<br/>في الخزنة الرئيسية"]
E3 --> E4["بعد الإيداع:<br/>في البنك"]
E5["تلات قيود مختلفة ✓"]
end
style T1 fill:#EFF6FF
style T2 fill:#F0FDF4
```
**القاعدة الذهبية:** كل خطوة **لازم تفضّي** الحساب اللي الخطوة اللي قبلها حطّت فيه
الفلوس. لو ما فضّتوش، يبقى فيه فلوس واقفة في النص ومحدش واخد باله.
---
### ١.٢ اللي كان بيحصل (ومهم تفهمه)
```mermaid
sequenceDiagram
autonumber
participant K as الكاشير
participant GL as الدفاتر
participant M as الخزنة الرئيسية
K->>GL: تحصيل ١٠٠٠ في خزنة العضويات
Note over GL: مدين ١٢٠٦٠١٠١ (نقدية عامة)<br/>مش حساب الخزنة!
K->>GL: تسوية الوردية
Note over GL: مدين ١٢٠٦٠١٠١ تاني ⚠️<br/>دائن ١٢٠٦٠١٠٢ (الصندوق بالدولار) ⚠️
GL-->>M: النقدية العامة زادت ٢٠٠٠ بدل ١٠٠٠
GL-->>M: صندوق الدولار بقى سالب ١٠٠٠
```
**ليه محدش خد باله؟** لأن القيد **متوازن**. ميزان المراجعة بيظبط، والشاشة بتقول
«تمت التسوية». الرقم غلط بس الشكل سليم.
**وكمان:** الخزائن الفرعية كانت مربوطة أصلًا بصناديق العملات الأجنبية:
| الخزنة | كانت بتنزل في | المبلغ اللي اتجمّع |
|---|---|---|
| خزنة الأنشطة الرياضية | `12060102` الصندوق بالدولار | ٦٣٬٢٨٩ |
| خزنة العضويات | `12060103` الصندوق باليورو | ٩٠٩٬٥٠٢ |
| | **الإجمالي** | **٩٧٢٬٧٩١ جنيه** |
---
### ١.٣ الحل — الطرف التاني ما بيتكتبش بالإيد
```mermaid
flowchart LR
S1["مرحلة ١<br/>التحصيل"] -->|"بتحجز في"| A1["حساب الخزنة<br/>اللي في المستند"]
S2["مرحلة ٢<br/>التسوية"] -->|"بتفضّي"| A1
S2 -->|"بتحجز في"| A2["حساب الخزنة<br/>المستقبِلة"]
S3["مرحلة ٣<br/>الإيداع"] -->|"بتفضّي"| A2
S3 -->|"بتحجز في"| A3["حساب البنك"]
style A1 fill:#FEF3C7,stroke:#D97706
style A2 fill:#FEF3C7,stroke:#D97706
style A3 fill:#D1FAE5,stroke:#059669
```
المرحلة **مش بتكتب** الحساب اللي هتفضّيه. بتقول: «أنا بفضّي المرحلة اللي قبلي».
والسيستم بيرجع للمرحلة دي ويسأل **نفس السؤال** اللي سأله وقت التحصيل، بنفس بيانات
المستند.
> يعني الطرف الدائن في قيد التسوية هو **حرفيًا نفس التعبير** اللي حدّد الطرف المدين
> وقت التحصيل. مش قاعدتين اتصادف إنهم متفقين — تعبير واحد اتحسب مرتين. عشان كده
> **مستحيل** تكتب سلسلة ما تتقفلش.
---
### ١.٤ السلاسل الأربعة
```mermaid
flowchart TB
subgraph C1["دورة النقدية — السلسلة بترحّلها"]
N1["الكاشير حصّل"] --> N2["تسوية الوردية"] --> N3["إيداع بنكي"]
end
subgraph C2["دورة الشيكات"]
K1["استلام الشيك<br/>أوراق قبض"] --> K2["إيداع برسم التحصيل<br/>تحت التحصيل"]
K2 --> K3["البنك حصّل ✓"]
K2 --> K4["الشيك ارتد ⚠️"]
end
subgraph C3["دورة مديونية الأعضاء"]
M1["استحقاق على العضو"] --> M2["التحصيل ✓"]
M1 --> M3["إسقاط الدين ⚠️"]
end
subgraph C4["دورة مستحقات الموردين"]
V1["اعتماد الفاتورة"] --> V2["السداد"]
end
style N3 fill:#D1FAE5
style K3 fill:#D1FAE5
style K4 fill:#FEF3C7
style M3 fill:#FEF3C7
```
> **بس دورة النقدية هي اللي السلسلة بترحّلها.** التلاتة التانية بترحّلهم خدمات
> موجودة أصلًا — والسلسلة بتعرّفهم عشان الشاشة تعرض الطريق كامل، والفحص يتأكد إن
> الطرفين متفقين، وتقرير الأعمار يعرف يراقب الحسابات الوسيطة.
---
### ١.٥ خطوة بخطوة — أول مرة تفتح الشاشة
```mermaid
flowchart TD
A["١ — افتح /accounting/posting-chains"]
B{"فيه خزائن<br/>من غير حساب؟"}
C["شغّل php cli.php migrate"]
D{"فيه نقدية<br/>محتاجة تصحيح؟"}
E["٢ — دوس «مراجعة التصحيح»"]
F["٣ — راجع الجدول:<br/>كل خزنة والمبلغ والفترة"]
G["٤ — حدد التاريخ واكتب السبب"]
H["٥ — «رحّل قيد التصحيح»"]
I["٦ — راجع صحة السلاسل"]
J{"فيه أخطاء<br/>حمرا؟"}
K["صلّحها — الرسالة بتقول<br/>بالظبط إيه الناقص"]
L["٧ — /posting-chains/parked<br/>شوف الأرصدة الواقفة"]
A --> B
B -->|أيوه| C --> D
B -->|لأ| D
D -->|أيوه| E --> F --> G --> H --> I
D -->|لأ| I
I --> J
J -->|أيوه| K --> I
J -->|لأ| L
style C fill:#FEE2E2,stroke:#DC2626
style H fill:#DBEAFE,stroke:#2563EB
style L fill:#D1FAE5,stroke:#059669
```
#### تفاصيل خطوة التصحيح
الشاشة هتوريك جدول كده:
| الخزنة | كانت نازلة في | هتروح لـ | السطور | المبلغ |
|---|---|---|---|---|
| خزنة الأنشطة | ١٢٠٦٠١٠٢ الصندوق بالدولار | ١٢٠٦٠١٠٤ خزنة الأنشطة | ٥٠ | ٦٣٬٢٨٩ |
| خزنة العضويات | ١٢٠٦٠١٠٣ الصندوق باليورو | ١٢٠٦٠١٠٥ خزنة العضويات | ٣٢ | ٩٠٩٬٥٠٢ |
> **٣ ضمانات مهمة:**
> 1. **القيود القديمة ما بتتغيّرش.** تعديل قيد مرحّل مش تصحيح — ده تزوير. التصحيح
> قيد جديد بتاريخ النهاردة.
> 2. **مش ممكن يتظبط مرتين.** القيد بيتوسم على مستوى السطر، والشاشة بتخصم اللي اتنقل.
> 3. **لو اتعكس، الشغل بيرجع يظهر تاني.** فينفع تعيده.
>
> والفلوس الأجنبية الحقيقية **ما بتتلمسش** — التطابق بيمشي على السطور اللي وراها
> **دفعة** مكتوب فيها **خزنة**.
---
### ١.٦ شاشة «فين الفلوس دلوقتي»
دي الشاشة اللي بتكشف السلسلة المكسورة **من غير ما تفتح دفتر الأستاذ**.
العمر محسوب **الأقدم يخرج الأول (FIFO)**:
```mermaid
flowchart LR
I1["دخل ٥٠٠٠<br/>من ٤٠ يوم"] --> Q["الطابور"]
I2["دخل ٣٠٠٠<br/>من ٩ أيام"] --> Q
I3["دخل ٢٠٠٠<br/>إمبارح"] --> Q
Q --> O["خرج ٦٠٠٠<br/>بالتسوية"]
O --> R1["أكل الـ٥٠٠٠ كلها"]
O --> R2["وأكل ١٠٠٠ من التانية"]
R2 --> F["الواقف فعلًا:<br/>٢٠٠٠ عمرهم ٩ أيام<br/>+ ٢٠٠٠ عمرهم يوم"]
style F fill:#FEF3C7,stroke:#D97706
```
يعني اللي قدامك مش «رصيد إجمالي» — دول المبالغ اللي **فعلًا** لسه واقفة، بتاريخها
ومستندها.
---
## ٢ — الاستحقاقات
### ٢.١ المشكلة
```mermaid
flowchart LR
A["اشتراك اتولّد<br/>على ٥٧٧ عضو"] --> B["مفيش قيد"]
B --> C{"حد دفع؟"}
C -->|أيوه| D["دلوقتي بس<br/>الإيراد بيتسجّل"]
C -->|لأ| E["الدفاتر عمرها<br/>ما هتعرف"]
style E fill:#FEE2E2,stroke:#DC2626
style D fill:#FEF3C7,stroke:#D97706
```
**النتيجة حاجتين والاتنين غلط:**
1. النادي بيقلّل اللي ليه — ٨٣٥ ألف مش ظاهرين
2. الإيراد بينزل في **الشهر الغلط** — شهر الدفع مش شهر الاستحقاق
---
### ٢.٢ ليه ماسح مش أحداث؟
```mermaid
flowchart TB
subgraph BAD["الطريقة الهشّة — أحداث"]
X1["الموديول يبعت حدث"] --> X2{"وصل؟"}
X2 -->|"الاسم غلط"| X3["ضاع للأبد ❌"]
X2 -->|"ما اتبعتش"| X3
X2 -->|"قبل الـcommit"| X3
end
subgraph GOOD["الطريقة المتينة — ماسح"]
Y1["الماسح يقرا الجدول"] --> Y2["يقارن بجدول الاستحقاقات"]
Y2 --> Y3["يقيّد الفرق بس"]
Y3 --> Y4["الجولة الجاية<br/>تلقط أي حاجة فاتت ✓"]
end
style X3 fill:#FEE2E2,stroke:#DC2626
style Y4 fill:#D1FAE5,stroke:#059669
```
> **ده مش كلام نظري.** مستمع رواتب المدربين في النظام ده كان مربوط على اسم حدث
> **محدش بيبعته** — وفضل كده شهور ومحدش واخد باله.
---
### ٢.٣ أهم نقطة في الملف كله — الإقفال بعد التحصيل
التحصيل في النظام ده بيسجّل الإيراد **على طول**. فلو قيّدنا الاستحقاق وسبناه،
الإيراد هيتعدّ **مرتين**:
```mermaid
sequenceDiagram
autonumber
participant S as الماسح
participant GL as الدفاتر
participant C as الكاشير
S->>GL: استحقاق — مدين مدينون ١٠٠ / دائن إيراد ١٠٠
Note over GL: الإيراد = ١٠٠ ✓
C->>GL: تحصيل — مدين نقدية ١٠٠ / دائن إيراد ١٠٠
Note over GL: الإيراد = ٢٠٠ ❌ مرتين!
S->>GL: إقفال — مدين إيراد ١٠٠ / دائن مدينون ١٠٠
Note over GL: الإيراد = ١٠٠ ✓<br/>المدينون = صفر ✓
```
قيد الإقفال هو **المرآة بالظبط** لقيد الاستحقاق — بيتبني بإعادة تطبيق **نفس القاعدة**
وقلب كل سطر. فلو التقسيمة مقسّمة على كذا حساب، بتتفك على نفس الحسابات.
> وبيشتغل من **جدول الاستحقاقات** مش من مسار الدفع — فمستحيل يشتغل على فلوس ما
> اتقيّدتش، ومستحيل يشتغل مرتين على نفس المستند.
---
### ٢.٤ الجولة الكاملة
```mermaid
flowchart TD
START["بداية الجولة"] --> A["١ — قيّد اللي لسه ما اتقيّدش<br/>(١٥ ماسح)"]
A --> B["٢ — اقفل اللي اتحصّل"]
B --> C["٣ — اعكس اللي اتلغى"]
C --> END["نهاية"]
A -.->|"لكل مستند"| A1{"موجود في<br/>posting_accruals؟"}
A1 -->|لأ| A2["قيّد المبلغ كامل"]
A1 -->|"أيوه بمبلغ أقل"| A3["قيّد الفرق بس"]
A1 -->|"أيوه بنفس المبلغ"| A4["اعمل حاجة ❌"]
style A4 fill:#F3F4F6
style A2 fill:#D1FAE5
style A3 fill:#DBEAFE
```
> **الترتيب مهم.** مستند اتعمل واتدفع بين جولتين لازم يتقيّد ويتقفل في **نفس**
> الجولة. لو الإقفال اتعمل الأول، الاستحقاق هيتقيّد بعده ومش هيلاقي حاجة تقفله —
> ويفضل مدين واقف على فلوس موجودة في البنك.
---
### ٢.٥ اللي اتوصّل
| المصدر | اللي اتقيّد |
|---|---|
| اشتراكات الأعضاء السنوية | ١٨٠٬٩٣٦ على ٥٧٧ |
| إيجار الأكاديميات | ٣١٥٬٠٠٠ على ٢ |
| اشتراكات النشاط الرياضي | ١٠٤٬٧٦٩ على ١٣٥ |
| غرامات تأخير الاشتراكات | ١٠٠٬٠٠٣ على ٣٨٦ |
| حجوزات الملاعب | ٧٤٬٨٨٤ على ٢٠ |
| تأمينات عقود الأكاديميات | ٥٠٬٠٠٠ على ٤ |
| رسوم التنمية + حجوزات + لوكرات | ٩٬٥٧٥ على ١٩٢ |
| **الإجمالي** | **١٬٣١٦ مطالبة بـ٨٣٥٬١٦٧ جنيه** |
**وفلوس خارجة كانت مش متسجّلة خالص:**
| العملية | القيد |
|---|---|
| صرف سلفة موظف | مدين **سلف عاملين** / دائن نقدية |
| نهاية الخدمة | مدين مكافأت ترك الخدمة / دائن نقدية |
| مستحقات المدربين | مدين مكافآت / دائن مصروفات مستحقة |
| استلام بضاعة | مدين مخزون / دائن **بضاعة لم ترد فاتورتها** |
| إهلاك الأصول | لكل فئة أصول على حدة |
| فروق الجرد | عجز = خسارة، زيادة = بالعكس |
| استبعاد أصل | التكلفة + المجمع + الربح/الخسارة |
| الإعفاء من غرامة | عكس قيد الاستحقاق |
> **السلفة أصل مش مصروف.** النادي مستنيها ترجع. لو اتسجّلت مصروف كانت هتقلّل
> الربح **والأصول** بالمبلغ كله.
> **التأمين مش إيراد.** فلوس النادي ماسكها ولازم يرجّعها — التزام. لو اتسجّلت إيراد
> كانت هتضخّم النتيجة وتخفي الالتزام.
---
### ٢.٦ المطابقة الثلاثية للمشتريات
```mermaid
flowchart LR
G["استلام البضاعة"] -->|"مدين"| INV["المخزون"]
G -->|"دائن"| CLR["بضاعة لم ترد<br/>فاتورتها"]
I["اعتماد الفاتورة"] -->|"مدين"| CLR
I -->|"دائن"| AP["الموردون"]
CLR --> Z["الرصيد بيتصفّر<br/>لما الاتنين ينزلوا ✓"]
style CLR fill:#FEF3C7,stroke:#D97706
style Z fill:#D1FAE5,stroke:#059669
```
> من غير الحساب الوسيط، الاتنين كانوا هيقيّدوا **المخزون** فيتحسب مرتين — عشان كده
> استلام البضاعة كان مش موصّل أصلًا. الفاتورة دلوقتي **بتشوف** لو فيه استلام اتقيّد
> وبتغيّر الطرف المدين لوحدها.
>
> واللي فاضل في الحساب الوسيط = **بضاعة عندنا ولسه محدش حاسبنا عليها**.
---
## ٣ — سد الفجوات
### ٣.١ الفكرة
فيه ٦ حاجات الماسح **رفض** يقيّدها لأن المبلغ مش متسجّل أصلًا.
> **الماسح مش هيخترع رقم — وده صح.** رقم غلط في الدفاتر أصعب في اكتشافه من رقم
> ناقص، وكمان بيبان إنه مظبوط.
>
> **بس «النظام مش عارف» مش معناها «محدش عارف».** إنت عارف الحارة بكام.
---
### ٣.٢ الخطوات الأربعة
```mermaid
flowchart TD
A["١ — افتح /accounting/gaps"]
B["٢ — اقرا الكارت:<br/>إيه المشكلة وكام مستند"]
C["٣ — حط رقم واختار الأساس"]
D["٤ — دوس «احسبلي هينزل كام»"]
E{"الرقم<br/>منطقي؟"}
F["غيّر الرقم أو الأساس"]
G["٥ — اكتب السبب<br/>وتاريخ السريان"]
H["٦ — احفظ"]
I["٧ — /accounting/accruals<br/>«شغّل الفحص دلوقتي»"]
J["القيد نزل ✓"]
A --> B --> C --> D --> E
E -->|لأ| F --> D
E -->|أيوه| G --> H --> I --> J
style D fill:#DBEAFE,stroke:#2563EB
style H fill:#FEF3C7,stroke:#D97706
style J fill:#D1FAE5,stroke:#059669
```
> **الشاشة مش بتقيّد حاجة.** بتسجّل **قرار**، وماسح الاستحقاقات ينفّذه في أول جولة.
> الفصل ده مقصود: شاشة بتقيّد ٣٠٠ ألف أول ما حد يكتب رقم في خانة كانت هتبقى مشكلة
> أكبر من الفجوة اللي بتحلها.
---
### ٣.٣ الفجوات وأدواتها
| المصدر | المشكلة | الأداة |
|---|---|---|
| `sa:pool_zone_booking` | ٧٣٠ حجز، سعر التذكرة وعدد الحاضرين فاضيين | تسعيرة لكل حجز |
| `sa:player_card` | الجدول مفيهوش عمود مبلغ | رسم الإصدار |
| `facility:pool_booking` | الكود بيسجّل كل حجز بصفر | تسعيرة مؤقتة |
| `facility:private_match` | المبلغ متسجّل بس من غير إيصال | «المبلغ المسجّل» |
| `academy:settlement` | ميزة متكررة في موديولين | نقل العقود |
| `academy:enrollment` | القيد مالوش رسوم | **مفيش مطلوب** |
---
### ٣.٤ ليه الحقول دي إجبارية؟
```mermaid
flowchart LR
R["رقم لوحده"] -->|"= تخمين ❌"| BAD["مالوش سند"]
R2["رقم + سبب + معتمِد"] -->|"= تقدير إداري ✓"| GOOD["أساس محاسبي مقبول"]
style BAD fill:#FEE2E2,stroke:#DC2626
style GOOD fill:#D1FAE5,stroke:#059669
```
| الحقل | ليه إجباري |
|---|---|
| **السبب** | ده اللي بيحوّل الرقم من تخمين لتقدير معتمد. المراجع هيسأل عنه. |
| **تاريخ السريان** | التسعيرة بتطبّق من التاريخ ده ورايح بس. من غيره كنت هتعيد كتابة نتائج فترات اتقفلت واتعرضت خلاص. |
> **الوقف مش بيعكس اللي اتقيّد.** لو رجعت وقفلت التسعيرة، اللي اتقيّد بيفضل زي ما
> هو. لو عايز تشيله، اعكس القيد من شاشة القيود.
---
### ٣.٥ أداة نقل عقود الأكاديميات
دي فجوة من نوع تاني خالص:
```mermaid
flowchart TB
subgraph NOW["الوضع الحالي"]
T1["academy_contracts<br/>(٠ عقد)"] --> E["محرك التسويات<br/>بيقرا من هنا"]
T2["sa_academy_contracts<br/>(١٣ عقد حقيقي)"] --> X["محدش بيقراه ❌"]
end
E --> N["مفيش أي تسوية اتحسبت<br/>ولا حصة نادي اتطالب بيها"]
style N fill:#FEE2E2,stroke:#DC2626
style X fill:#FEE2E2,stroke:#DC2626
```
**ليه مش مجرد تغيير اسم الجدول في الكود؟** لأن الجدولين **مش نسخة من بعض**:
| العمود | `academy_contracts` | `sa_academy_contracts` |
|---|---|---|
| `settlement_day` | ✓ | ✗ |
| `grace_period_days` | ✓ | ✗ |
| `penalty_rate_pct` | ✓ | ✗ |
والمحرك **بيحسب بيهم**. فالأداة **بتنسخ مش بتنقل**:
```mermaid
flowchart LR
A["اختار العقود"] --> B["حدد الشروط الناقصة:<br/>يوم التسوية / مهلة السماح / نسبة الغرامة"]
B --> C["انسخ"]
C --> D["العقود بقت في جدول التسويات ✓"]
C --> E["العقود الأصلية زي ما هي<br/>وشغّالة عادي ✓"]
style D fill:#D1FAE5,stroke:#059669
style E fill:#D1FAE5,stroke:#059669
```
> الشروط بتتطبّق على كل العقود المختارة. لو عقد ليه شروط مختلفة، عدّله بعد النقل
> من شاشة العقود.
---
## ٤ — التشغيل
### ٤.١ أول مرة — الترتيب مهم
```mermaid
flowchart TD
A["١ — php cli.php migrate<br/>php cli.php seed"]
B["٢ — عرّف حساب بنكي واربطه<br/>/accounting/bank-accounts"]
C["٣ — /accounting/posting-chains<br/>لازم ٤ سلاسل خضرا"]
D["٤ — تصحيح تبويب نقدية الخزائن"]
E["٥ — /accounting/gaps<br/>حدد التسعيرات (اختياري)"]
F["٦ — /accounting/accruals<br/>«شغّل الفحص دلوقتي»"]
G["٧ — راجع ميزان المراجعة"]
H["٨ — فعّل الكرون<br/>cron_enabled = 1"]
A --> B --> C --> D --> E --> F --> G --> H
style A fill:#FEE2E2,stroke:#DC2626
style C fill:#DBEAFE,stroke:#2563EB
style H fill:#D1FAE5,stroke:#059669
```
> **خطوة ٢ مش اختيارية لو عايز الإيداع البنكي يشتغل.** جدول `bank_accounts` فاضي
> دلوقتي، وفحص السلسلة بيقول كده صراحة.
> **خطوة ٨ آخر حاجة.** الكرون بيتشحن **مقفول** في النظام ده. شغّل الفحص بإيدك الأول
> وشوف النتيجة، وبعدين فعّله.
---
### ٤.٢ الروتين اليومي
```mermaid
flowchart LR
A["الكاشير بيقفل الوردية"] --> B["التسوية للخزنة الرئيسية"]
B --> C["الإيداع البنكي"]
C --> D["راجع «فين الفلوس دلوقتي»"]
D --> E{"فيه رصيد<br/>واقف متأخر؟"}
E -->|أيوه| F["شوف السبب:<br/>وردية ما اتسوّتش؟<br/>إيداع ما اتأكّدش؟"]
E -->|لأ| G["تمام ✓"]
style G fill:#D1FAE5,stroke:#059669
style F fill:#FEF3C7,stroke:#D97706
```
### ٤.٣ الروتين الشهري
| # | الخطوة | الشاشة |
|---|---|---|
| ١ | شغّل فحص الاستحقاقات | `/accounting/accruals` |
| ٢ | راجع أقدم المطالبات المفتوحة | نفس الشاشة |
| ٣ | راجع الحسابات الوسيطة | `/posting-chains/parked` |
| ٤ | شغّل الإهلاك الشهري | `/inventory/assets` |
| ٥ | راجع «خطوات فشلت» | `/accounting/posting-chains` |
| ٦ | ميزان المراجعة | `/accounting/reports/trial-balance` |
| ٧ | اقفل الفترة | `/accounting/period-closing` |
---
## ٥ — لما حاجة تبوظ
### ٥.١ شجرة القرار
```mermaid
flowchart TD
A{"إيه المشكلة؟"}
A -->|"سلسلة حمرا"| B["اقرا الرسالة — بتقول بالظبط<br/>إيه الناقص وفين تصلّحه"]
A -->|"رصيد واقف مش بيفضى"| C["/posting-chains/parked<br/>شوف أقدم مبلغ ومستنده"]
A -->|"الفحص ما قيّدش حاجة"| D{"فيه قاعدة<br/>ترحيل للمصدر؟"}
A -->|"خطوة فشلت"| E["الرسالة في جدول الخطوات<br/>صلّح وأعِد من المستند"]
A -->|"إيراد اتعدّ مرتين"| F["شوف هل الإقفال اشتغل —<br/>الحالة لازم تبقى settled"]
D -->|لأ| G["/accounting/revenue-mapping<br/>اربط المصدر"]
D -->|أيوه| H{"فجوة محتاجة<br/>تسعيرة؟"}
H -->|أيوه| I["/accounting/gaps"]
H -->|لأ| J["شوف الأخطاء في نتيجة الفحص"]
style B fill:#FEF3C7
style G fill:#DBEAFE
style I fill:#DBEAFE
```
### ٥.٢ رسائل شائعة
| الرسالة | معناها | الحل |
|---|---|---|
| «طرفا القيد نفس الحساب» | خزنتين على نفس الحساب | اعمل حساب لكل خزنة |
| «مفيش أي حساب بنكي معرّف» | `bank_accounts` فاضي | عرّف حساب واربطه بالدليل |
| «خزنة ملهاش حساب» | `gl_account_id` فاضي | شغّل الترحيلات |
| «المؤشر مالوش قاعدة مفعّلة» | المصدر مش مربوط | شاشة توزيع المبالغ |
| «اكتب سبب/مرجع التسعيرة» | السبب فاضي | اكتب مرجع القرار |
| «نوع الحركة بيحطّ الطرفين على نفس الجانب» | نوع الحركة مش مناسب للحسابات | راجع النوع أو الحسابات |
---
## ٦ — مرجع فني
### ٦.١ الجداول الجديدة
```mermaid
erDiagram
posting_chains ||--o{ posting_chain_steps : "بتحتوي"
posting_chains ||--o{ posting_chain_hops : "بتسجّل"
posting_chain_steps ||--o{ posting_chain_hops : "بتنفّذ"
posting_accruals }o--|| revenue_streams : "بتخص"
accrual_gap_settings }o--|| revenue_streams : "بتسعّر"
posting_accruals ||--o| accounts_receivable : "بتظهر كـ"
posting_chains {
string chain_code
enum domain
}
posting_chain_steps {
int step_no
enum hop_type
enum parks_resolver
int relieves_step_no
bool posted_by_chain
}
posting_chain_hops {
int journal_entry_id
enum outcome
}
posting_accruals {
string document_type
int document_id
decimal accrued_amount
enum status
}
accrual_gap_settings {
enum mode
decimal rate
string notes
int approved_by
}
```
| الجدول | الغرض |
|---|---|
| `posting_chains` | تعريف السلسلة |
| `posting_chain_steps` | خطواتها وحساباتها |
| `posting_chain_hops` | سجل كل حركة اتنفّذت |
| `posting_accruals` | **مفتاح عدم التكرار** — اللي الدفاتر اتقالها |
| `accrual_gap_settings` | التسعيرات المعتمدة |
> `posting_accruals` مش نفس `accounts_receivable`. الأخير `member_id` فيه **NOT NULL**،
> فمدرسة بتأجّر ملعب مالهاش مكان فيه — ولو استخدمناه كمفتاح كان هيعيد الترحيل كل ليلة.
---
### ٦.٢ الملفات
| الملف | مسؤول عن |
|---|---|
| `Services/Chain/ChainRegistry.php` | قراءة السلاسل وفحص صحتها |
| `Services/Chain/ChainAccountResolver.php` | «إزاي تلاقي الحساب» → حساب فعلي |
| `Services/Chain/ChainPostingService.php` | ترحيل الخطوة الواحدة |
| `Services/Chain/ClearingReconciliationService.php` | الأعمار (FIFO) |
| `Services/TreasuryAccountService.php` | حساب كل خزنة + تصحيح التبويب |
| `Services/Revenue/AccrualRunner.php` | الماسح |
| `Services/Revenue/AccrualService.php` | `single` / `batch` / `release` |
| `Services/Revenue/GapToolService.php` | التسعيرات والمعاينة |
| `Services/Revenue/AcademyContractImportService.php` | نقل عقود الأكاديميات |
| `Services/SubledgerService.php` | جدول الاستحقاقات + مديونية الأعضاء |
| `Services/OperationalPostingService.php` | الفلوس الخارجة والأصول |
| `cron/jobs/AccrualReconcileJob.php` | الجولة الليلية |
### ٦.٣ الصلاحيات
| الصلاحية | accountant | auditor |
|---|---|---|
| `accounting.chains.view` | ✓ | ✓ |
| `accounting.chains.manage` | ✓ | ✗ |
| `accounting.accruals.view` | ✓ | ✓ |
| `accounting.accruals.manage` | ✓ | ✗ |
| `accounting.gaps.view` | ✓ | ✓ |
| `accounting.gaps.manage` | ✓ | ✗ |
> **المراجع بيشوف ومش بيرحّل** — عن قصد. الفكرة كلها إن حد مستقل يقدر يشوف حساب
> وسيط وقف عن الفضي، من غير ما يقدر يرحّل قيد التصحيح بنفسه.
### ٦.٤ الترحيلات والبذور
```
database/migrations/
Phase_108_001_create_posting_chains.php
Phase_108_002_treasury_own_cash_accounts.php
Phase_109_001_create_posting_accruals.php
Phase_109_002_activity_receivable_account.php
Phase_109_003_goods_received_clearing.php
Phase_110_001_create_accrual_gap_settings.php
database/seeds/
Phase_108_001_seed_posting_chains.php
Phase_108_002_seed_chain_permissions.php
Phase_109_001_seed_accrual_rules.php
Phase_109_002_seed_operational_rules.php
Phase_110_001_seed_gap_rules.php
```
> كلها **idempotent** — تشغيلها كذا مرة ما بيغيّرش حاجة.
---
## ٧ — حاجات محتاجة قرار من المالية
| # | الموضوع | التفاصيل |
|---|---|---|
| ١ | **اشتراك العضو السنوي نازل على «٤١٠٢٠١ اكاديمية البادل»** | مش صح، بس عليه أكتر من ألف قيد قديم. قاعدة الاستحقاق اتعملت على **نفس الحساب** عن قصد عشان الاستحقاق والتحصيل يتقفلوا على بعض. لو اتغيّر لازم يتغيّر في الاتنين مع بعض. |
| ٢ | **`sa:monthly_subscription` نازل على «إيرادات متنوعه»** | نفس الكلام. |
| ٣ | **تقارير الأستاذ بتقرا `status = 'posted'` بس** | يعني قيد معكوس بيتشال **والعكس بينزل** — فالمبلغ بيتخصم مرتين. مفيش قيد اتعكس لحد دلوقتي فالمشكلة نايمة. الكود الجديد بيقرا `('posted','reversed')` صح. تغيير باقي التقارير بيغيّر أرقام منشورة. |
| ٤ | **١١ سطر على حسابات رئيسية** | من قيدين ٢٠٢٤/٢٠٢٥ قبل ما الحسابات دي تتعلّم رئيسية. مش من الشغل ده. |
---
## ملفات مرجعية تانية
| الملف | بيغطي |
|---|---|
| `docs/مسار-الفلوس-والحسابات-الوسيطة.md` | مرجع السلاسل بالتفصيل |
| `docs/الاستحقاقات-وربط-الإيرادات-الناقصة.md` | مرجع الاستحقاقات بالتفصيل |
| `docs/معالج-توزيع-المبالغ.md` | معالج التقسيم (اللي كان موجود قبل كده) |
| `docs/تعلّم-النظام-المحاسبي-خطوة-بخطوة.md` | أساسيات النظام المحاسبي |
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment