# 📘 تحليل نظام تأجير المعدات (BRD + ERD + BPMN)

## 1) ملخص تنفيذي

هذا المستند يحول الواقع التشغيلي الظاهر في المستندات والصور إلى نموذج نظام رقمي قابل للتنفيذ داخل Laravel.

**طبيعة النشاط:**
- شركة تؤجر معدات/خدمات زراعية للشركات ومواقع العمل.
- الفوترة تعتمد على الكمية المنفذة (فدان/ساعة/مشوار) وسعر الوحدة.
- يوجد خصومات وتسويات مالية متعددة قبل الوصول لصافي المستخلص.

**المخرجات الأساسية المطلوبة من النظام:**
- دورة تشغيل موثقة من أمر التشغيل حتى القيد المحاسبي.
- مستخلصات جارية دقيقة وقابلة للتدقيق.
- ربط التشغيل بالمحاسبة والتقارير التنفيذية.

---

## 2) ترتيب الصور والمنطق التشغيلي (As-Is Flow)

### المرحلة 1: التسعير والاتفاق
1. **قوائم أسعار التوريد** (نماذج أسعار الأصناف/الخدمات).
2. **عروض الأسعار** للعملاء (سعر وحدة لكل بند خدمة).

### المرحلة 2: التشغيل الميداني
3. **أوامر تشغيل ورقية** (المعدة، السائق، التاريخ، المساحة/الساعات، الموقع).
4. **بيان تنفيذ مجمع** (تجميع يومي/أسبوعي للمنفذ لكل معدة/موقع).

### المرحلة 3: الفوترة والمستخلص
5. **مستخلص جاري** (قيمة الأعمال المنفذة = كميات × أسعار).
6. **تطبيق الخصومات** (دفعة مقدمة، ضمان أعمال، سولار، قطع غيار، سلف).
7. **حساب صافي المستخلص**.

### المرحلة 4: التسوية والحسابات
8. **كشف حساب العميل/المعدة** (حركات مالية: تحويلات، مصروفات، سلف، تسويات).
9. **تقارير نهائية** (نسبة إنجاز، مستحق، ربحية، أرصدة).

---

## 3) BRD (Business Requirements Document)

## 3.1 الأهداف
- تقليل الإدخال اليدوي المكرر بين الورقي والإكسل.
- توحيد رقم مرجعي واحد للعملية عبر كل المستندات.
- منع أخطاء الحساب والصيغ (مثل قسمة على صفر).
- استخراج مستخلصات وتقارير مالية دقيقة بزمن أسرع.

## 3.2 أصحاب المصلحة (Stakeholders)
- الإدارة العامة.
- إدارة التشغيل.
- مهندس/مشرف الموقع.
- إدارة الحسابات.
- مسؤول المخزن/الوقود/الصيانة.
- العميل (شركة/مقاول).

## 3.3 نطاق الإصدار الأول (MVP Scope)

### داخل النطاق
- إدارة بيانات أساسية: العملاء، المواقع، المعدات، السائقين، بنود الخدمة، الأسعار.
- تسجيل أمر تشغيل يومي.
- اعتماد أمر التشغيل من المشرف/الموقع.
- إنشاء بيان تنفيذ مجمع حسب الفترة.
- توليد مستخلص جاري تلقائيًا.
- تطبيق خصومات قابلة للتهيئة.
- توليد قيد محاسبي تلقائي.
- تقارير: تشغيل، مستخلصات، كشف حساب، ربحية مبدئية.

### خارج النطاق (حالياً)
- OCR تلقائي لقراءة الصور الورقية.
- تطبيق موبايل Offline متكامل.
- تتبع GPS للمعدات.

## 3.4 المتطلبات الوظيفية

### A) البيانات الأساسية (Master Data)
1. تعريف العملاء.
2. تعريف المواقع/البيفوتات وربطها بالعميل.
3. تعريف المعدات ونوعها وحالتها.
4. تعريف السائقين وربطهم بالمعدات.
5. تعريف بنود الخدمة ووحدة القياس.
6. تعريف قائمة أسعار تعاقدية (من/إلى تاريخ).

### B) التشغيل
1. إنشاء أمر تشغيل يتضمن:
   - رقم أمر فريد.
   - التاريخ.
   - العميل + الموقع.
   - المعدة + السائق.
   - نوع الخدمة.
   - الكمية المنفذة.
   - ملاحظات وتوقيع.
2. حالات أمر التشغيل:
   - Draft → Submitted → Approved → Invoiced/Extracted.
3. منع اعتماد أمر تشغيل بدون البيانات الإلزامية.

### C) بيان التنفيذ
1. تجميع أوامر التشغيل المعتمدة حسب:
   - الفترة الزمنية.
   - العميل.
   - الموقع.
   - المعدة/نوع الخدمة.
2. عرض الكمية التعاقدية مقابل المنفذ ونسبة الإنجاز.

### D) المستخلصات
1. إنشاء مستخلص تلقائي من البيانات المعتمدة.
2. المعادلة الأساسية:
   - قيمة البند = الكمية المنفذة × سعر الوحدة.
3. احتساب خصومات متعددة (نسبة/قيمة ثابتة).
4. حفظ Snapshot للمستخلص عند الاعتماد (لمنع تغير تاريخي).

### E) الحسابات
1. توليد قيود تلقائية عند اعتماد المستخلص.
2. تسجيل السلف/المصروفات/السولار/الخصومات الخاصة.
3. تحديث كشف حساب العميل بشكل لحظي.

### F) التقارير
1. تقرير تشغيل يومي/أسبوعي/شهري.
2. تقرير مستخلصات (إجمالي، خصومات، صافي).
3. كشف حساب عميل.
4. تقرير أداء معدة (إيراد، تكلفة مباشرة، صافي).
5. تقرير انحراف بين التعاقد والمنفذ.

## 3.5 القواعد التجارية (Business Rules)
- كل أمر تشغيل يجب أن يرتبط بعميل وموقع وبند خدمة.
- لا يجوز ترحيل مستخلص بدون اعتماد تشغيل.
- الخصومات تحسب وفق أولوية محددة وقابلة للإعداد.
- أي تعديل بعد اعتماد المستخلص يتطلب نسخة جديدة (Revision).
- منع القسمة على صفر في نسب الإنجاز.

## 3.6 المتطلبات غير الوظيفية
- دعم العربية بالكامل (UTF-8 + واجهة RTL).
- سجل تدقيق (Audit Trail) لكل تعديل واعتماد.
- صلاحيات حسب الدور.
- أداء مقبول حتى 200K سجل تشغيل سنويًا.
- تصدير PDF/Excel للتقارير.

## 3.7 الصلاحيات (Roles)
- **Admin:** إعدادات النظام والاعتمادات النهائية.
- **Operations:** إدخال/اعتماد التشغيل الميداني.
- **Accountant:** المستخلصات، الخصومات، القيود.
- **Viewer/Client:** عرض التقارير المصرح بها فقط.

---

## 4) ERD مبدئي (Logical Data Model)

## 4.1 الكيانات الأساسية

1. **companies**
   - id, name, tax_no, phone, status

2. **sites**
   - id, company_id, name, code, region, status

3. **machines**
   - id, code, name, type, plate_no, ownership_type, status

4. **drivers**
   - id, name, phone, national_id, status

5. **services**
   - id, name, unit_type (feddan/hour/trip), description, status

6. **contracts**
   - id, company_id, contract_no, start_date, end_date, status

7. **contract_items**
   - id, contract_id, service_id, machine_type, agreed_qty, unit_price

8. **work_orders**
   - id, order_no, date, company_id, site_id, machine_id, driver_id, status, notes

9. **work_order_lines**
   - id, work_order_id, service_id, executed_qty, unit_price, amount

10. **execution_summaries**
    - id, summary_no, period_from, period_to, company_id, status

11. **execution_summary_lines**
    - id, execution_summary_id, contract_item_id, executed_qty, progress_pct, amount

12. **extracts**
    - id, extract_no, company_id, period_from, period_to, gross_amount, deductions_total, net_amount, status, revision_no

13. **extract_lines**
    - id, extract_id, contract_item_id, executed_qty, unit_price, line_amount

14. **deduction_types**
    - id, name, calc_method (percent/fixed), default_value, sequence, is_active

15. **extract_deductions**
    - id, extract_id, deduction_type_id, base_amount, value, amount

16. **account_entries**
    - id, entry_no, entry_date, reference_type, reference_id, description, total_debit, total_credit

17. **account_entry_lines**
    - id, account_entry_id, account_id, debit, credit, cost_center_id, notes

18. **advances_expenses**
    - id, company_id, machine_id, date, type (advance/fuel/spare/other), amount, reference_no, notes

## 4.2 العلاقات الرئيسية
- company 1—N sites
- company 1—N contracts
- contract 1—N contract_items
- work_order 1—N work_order_lines
- extract 1—N extract_lines
- extract 1—N extract_deductions
- account_entries 1—N account_entry_lines

## 4.3 مخطط ERD (Mermaid)

```mermaid
erDiagram
    companies ||--o{ sites : has
    companies ||--o{ contracts : has
    contracts ||--o{ contract_items : contains
    machines ||--o{ work_orders : used_in
    drivers ||--o{ work_orders : drives
    companies ||--o{ work_orders : receives
    sites ||--o{ work_orders : located_at
    work_orders ||--o{ work_order_lines : includes
    services ||--o{ work_order_lines : measured_by

    companies ||--o{ execution_summaries : has
    execution_summaries ||--o{ execution_summary_lines : includes
    contract_items ||--o{ execution_summary_lines : tracks

    companies ||--o{ extracts : billed_to
    extracts ||--o{ extract_lines : includes
    contract_items ||--o{ extract_lines : priced_by
    deduction_types ||--o{ extract_deductions : applied_as
    extracts ||--o{ extract_deductions : applies

    extracts ||--o{ account_entries : posts
    account_entries ||--o{ account_entry_lines : contains
    companies ||--o{ advances_expenses : incurs
    machines ||--o{ advances_expenses : consumes
```

---

## 5) BPMN (دورة العمل التشغيلية)

## 5.1 المسار الرئيسي

1. **Start**
2. إدخال/تحديث قائمة الأسعار أو العقد.
3. إنشاء أمر تشغيل ميداني.
4. مراجعة واعتماد أمر التشغيل.
5. تجميع التنفيذ للفترة.
6. إنشاء مستخلص جاري.
7. تطبيق الخصومات تلقائيًا.
8. مراجعة واعتماد المستخلص.
9. ترحيل القيد المحاسبي.
10. تحديث كشف الحساب والتقارير.
11. **End**

## 5.2 الاستثناءات
- أمر تشغيل مرفوض → يرجع للتعديل.
- مستخلص يحتاج تصحيح → إنشاء Revision جديد.
- خصم غير معرف → يوقف الاعتماد حتى إضافة نوع الخصم.

## 5.3 مخطط BPMN مبسط (Mermaid Flowchart)

```mermaid
flowchart TD
    A([Start]) --> B[تجهيز الأسعار/العقد]
    B --> C[إنشاء أمر تشغيل]
    C --> D{اعتماد التشغيل؟}
    D -->|لا| C1[تعديل أمر التشغيل] --> C
    D -->|نعم| E[تجميع التنفيذ للفترة]
    E --> F[إنشاء المستخلص]
    F --> G[تطبيق الخصومات]
    G --> H{اعتماد المستخلص؟}
    H -->|لا| F1[Revision جديد] --> F
    H -->|نعم| I[ترحيل القيود المحاسبية]
    I --> J[تحديث كشف الحساب والتقارير]
    J --> K([End])
```

---

## 6) معادلات قياسية مقترحة

- **قيمة البند** = الكمية المنفذة × سعر الوحدة
- **إجمالي المستخلص** = مجموع قيم البنود
- **قيمة الخصم النسبي** = قيمة الأساس × نسبة الخصم
- **إجمالي الخصومات** = مجموع كل الخصومات
- **صافي المستخلص** = إجمالي المستخلص − إجمالي الخصومات
- **نسبة الإنجاز** = (الكمية المنفذة ÷ الكمية التعاقدية) × 100

> عند الكمية التعاقدية = 0، يتم إرجاع نسبة الإنجاز = 0 مع تنبيه، لمنع أخطاء القسمة.

---

## 7) خطة تنفيذ تدريجية (Laravel)

### Sprint 1
- Master Data + Work Orders + Approvals

### Sprint 2
- Execution Summary + Extracts + Deductions Engine

### Sprint 3
- Accounting Entries + Account Statements + Reports

### Sprint 4
- تحسينات الأداء + تصدير + صلاحيات تفصيلية + Audit كامل

---

## 8) مؤشرات نجاح (KPIs)

- تقليل زمن إعداد المستخلص الشهري بنسبة ≥ 50%.
- انخفاض أخطاء الحساب اليدوي بنسبة ≥ 80%.
- إمكانية تتبع 100% من البنود من التشغيل حتى القيد.
- تقليل زمن المراجعة المحاسبية لكل مستخلص.

---

## 9) ملحوظة تصميمية

الترتيب أعلاه بُني على المستندات المرفقة من التسعير إلى التشغيل إلى المستخلص إلى التسوية، وهو مناسب للتحويل إلى نظام ERP تشغيلي/محاسبي متدرج دون كسر الواقع الحالي للمستخدمين.

---

## 10) تحليل بند قطع الغيار (مخزن + صرف + تركيب على المعدة)

هذا البند يحقق المطلوب التشغيلي التالي:
- إدخال أي قطعة غيار للمخزن بكود واضح.
- صرف القطعة من المخزن مع تسجيل السبب.
- ربط القطعة المصروفة بالمعدة التي تم التركيب عليها.
- معرفة الرصيد المتبقي لحظيًا لكل قطعة.

## 10.1 دورة العمل المطلوبة (End-to-End)

1. **تعريف القطعة (Master Item)**
   - إنشاء كود قطعة فريد (SKU).
   - اسم القطعة + التصنيف + وحدة القياس + الحد الأدنى.

2. **توريد للمخزن (GRN / Stock In)**
   - تسجيل إذن إضافة مخزنية: المورد، الفاتورة، التاريخ، الكمية، سعر الشراء.
   - النظام يزيد الرصيد ويحسب متوسط تكلفة القطعة.

3. **طلب صرف (Issue Request)**
   - الفني/المشرف يطلب قطعة لمعدة محددة.
   - الطلب يحتوي: المعدة، العطل/سبب الصرف، الكمية.

4. **صرف فعلي من المخزن (Stock Out)**
   - أمين المخزن يصرف القطعة بعد الاعتماد.
   - النظام يخفض الرصيد ويولد حركة مخزنية مرجعية.

5. **تأكيد التركيب (Installation Confirmation)**
   - تسجيل أن القطعة تم تركيبها على معدة محددة (Machine ID).
   - حفظ تاريخ التركيب، العداد/ساعات التشغيل (إن وجدت)، اسم الفني.

6. **متابعة الأرصدة والتكلفة**
   - الرصيد المتاح = الوارد − المنصرف − المرتجع من المورد + مرتجع التشغيل.
   - تنبيه تلقائي عند وصول الرصيد للحد الأدنى.

## 10.2 المتطلبات الوظيفية لبند قطع الغيار

### A) بيانات أساسية
- تعريف صنف قطعة الغيار بكود إلزامي لا يتكرر.
- دعم بدائل القطعة (Original / Aftermarket) إن لزم.
- ربط القطعة بأنواع المعدات المتوافقة (Compatibility).

### B) حركات المخزن
- إذن إضافة مخزني (Purchase Receipt / Stock In).
- إذن صرف مخزني (Issue Voucher / Stock Out).
- إذن مرتجع مخزني (Return In/Out).
- جرد وتسوية مخزنية مع سبب التعديل.

### C) التركيب والصيانة
- كل حركة صرف يمكن ربطها بأمر صيانة أو مباشرة بمعدة.
- لا تعتبر القطعة "مستخدمة فعلياً" إلا بعد تأكيد التركيب.
- الاحتفاظ بتاريخ صيانة المعدة والقطع المركبة عليها.

### D) الضبط والرقابة
- منع الصرف إذا الرصيد غير كافٍ.
- صلاحيات منفصلة (طلب/اعتماد/صرف/تسوية).
- Audit Trail كامل لكل حركة وتعديل.

## 10.3 إضافة ERD لبند قطع الغيار

### جداول مقترحة

1. **spare_parts**
   - id, code, name, category_id, unit, min_qty, status

2. **spare_part_categories**
   - id, name, parent_id, status

3. **warehouses**
   - id, name, code, location, status

4. **stock_transactions**
   - id, trx_no, trx_date, warehouse_id, trx_type (in/out/adjust/return), reference_type, reference_id, notes, status

5. **stock_transaction_lines**
   - id, stock_transaction_id, spare_part_id, qty, unit_cost, total_cost

6. **machine_maintenance_orders**
   - id, order_no, date, machine_id, issue_desc, status, approved_by

7. **machine_part_installations**
   - id, maintenance_order_id, machine_id, spare_part_id, stock_transaction_line_id, installed_qty, install_date, technician_id, notes

8. **spare_part_balances** (View أو جدول مادي)
   - spare_part_id, warehouse_id, qty_on_hand, avg_cost, last_updated_at

### علاقات مهمة
- spare_parts 1—N stock_transaction_lines
- stock_transactions 1—N stock_transaction_lines
- machines 1—N machine_maintenance_orders
- machine_maintenance_orders 1—N machine_part_installations
- machine_part_installations N—1 spare_parts
- machine_part_installations N—1 machines

## 10.4 معادلات ومؤشرات قطع الغيار

- **الرصيد الحالي للقطعة** = مجموع الوارد − مجموع المنصرف ± التسويات
- **متوسط التكلفة** = قيمة المخزون الحالي ÷ الكمية الحالية
- **قيمة المنصرف للمعدة** = الكمية المركبة × تكلفة القطعة وقت الصرف
- **استهلاك المعدة من قطع الغيار** = مجموع قيمة القطع المركبة على المعدة خلال فترة

## 10.5 التقارير المطلوبة

1. تقرير أرصدة قطع الغيار (On Hand + حد إعادة الطلب).
2. تقرير حركة قطعة محددة (كارت صنف كامل).
3. تقرير قطع الغيار المصروفة لكل معدة.
4. تقرير تكلفة الصيانة لكل معدة (عمالة + قطع غيار).
5. تقرير أعطال متكررة لنفس المعدة/القطعة.

## 10.6 الربط المحاسبي المقترح

- عند الشراء:
  - مدين: مخزون قطع غيار
  - دائن: الموردين/الصندوق/البنك

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

- عند مرتجع المورد:
  - عكس قيد الشراء حسب الحالة.

## 10.7 قواعد تشغيل تمنع المشاكل الشائعة

- لا يوجد صرف بدون كود قطعة صالح.
- لا يوجد تركيب بدون رقم معدة.
- لا يوجد اعتماد لصرف يتجاوز الرصيد.
- كل صرف مربوط إما بأمر صيانة أو سبب مباشر موثق.
- أي تعديل كمي بعد الإقفال الشهري يتطلب إذن تسوية معتمد.

## 10.8 مخرجات تشغيلية مباشرة مطلوبة في الواجهة

- شاشة "تعريف قطعة غيار".
- شاشة "إذن إضافة مخزني".
- شاشة "طلب صرف" + "إذن صرف".
- شاشة "تأكيد تركيب على معدة".
- شاشة "كارت صنف" توضح المتبقي والحركات.

بهذا الشكل، النظام سيجاوب مباشرة على سؤالك:
- **المتبقي كام؟** من رصيد القطعة اللحظي.
- **القطعة دي راحت فين؟** من سجل الصرف والتركيب.
- **اتركبت على أنهي معدة؟** من شاشة التركيبات المرتبطة بالمعدة.
