# تعديل تقارير الأقساط - عرض الأقساط من تاريخ اليوم فقط

## 📋 الفكرة من التعديل

تم تعديل تقارير **أقساط الشهر** و **أقساط الأسبوع** بحيث تعرض فقط الأقساط المستحقة **من تاريخ اليوم إلى نهاية الفترة**، بدلاً من عرض جميع أقساط الفترة من البداية.

## ❌ المشكلة القديمة

كانت التقارير تعرض:
- **تقرير أقساط الشهر:** جميع الأقساط من **بداية الشهر** إلى نهايته (سواء كانت متأخرة أو مستقبلية)
- **تقرير أقساط الأسبوع:** جميع الأقساط من **بداية الأسبوع** إلى نهايته (سواء كانت متأخرة أو مستقبلية)

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

## ✅ الحل المطبق

تم تعديل كلا التقريرين ليعرضا فقط:
- الأقساط من **تاريخ اليوم** إلى **نهاية الفترة** (الشهر أو الأسبوع)
- الأقساط المتأخرة (قبل اليوم) لن تظهر هنا، بل ستظهر في **تقرير الأقساط المتأخرة** المخصص لها

**الفوائد:**
- ✅ فصل واضح بين الأقساط المتأخرة والمستقبلية
- ✅ التركيز على الأقساط القادمة فقط
- ✅ تقارير أكثر دقة ووضوحاً

---

## 📁 الملفات المعدلة

### 1. تقرير أقساط الشهر
**المسار:** `app/Filament/Pages/InstallmentsDueMonth.php`

### 2. تقرير أقساط الأسبوع
**المسار:** `app/Filament/Pages/InstallmentsDueWeek.php`

---

## 🔧 التعديلات التفصيلية

### التعديل الأول: تقرير أقساط الشهر (InstallmentsDueMonth.php)

#### الكود القديم:
```php
public function mount(): void
{
    $startOfMonth = now()->startOfMonth()->format('Y-m-d');
    $endOfMonth = now()->endOfMonth()->format('Y-m-d');
    $today = now()->format('Y-m-d');
```

#### الكود الجديد:
```php
public function mount(): void
{
    $startOfMonth = now()->format('Y-m-d'); // من تاريخ اليوم بدلاً من بداية الشهر
    $endOfMonth = now()->endOfMonth()->format('Y-m-d');
    $today = now()->format('Y-m-d');
```

**التغيير:**
- `now()->startOfMonth()->format('Y-m-d')` ← `now()->format('Y-m-d')`
- الآن يبدأ من **تاريخ اليوم** بدلاً من **بداية الشهر**

---

### التعديل الثاني: تقرير أقساط الأسبوع (InstallmentsDueWeek.php)

#### الكود القديم:
```php
public function mount(): void
{
    $startOfWeek = now()->startOfWeek()->format('Y-m-d');
    $endOfWeek = now()->endOfWeek()->format('Y-m-d');
    $today = now()->format('Y-m-d');
```

#### الكود الجديد:
```php
public function mount(): void
{
    $startOfWeek = now()->format('Y-m-d'); // من تاريخ اليوم بدلاً من بداية الأسبوع
    $endOfWeek = now()->endOfWeek()->format('Y-m-d');
    $today = now()->format('Y-m-d');
```

**التغيير:**
- `now()->startOfWeek()->format('Y-m-d')` ← `now()->format('Y-m-d')`
- الآن يبدأ من **تاريخ اليوم** بدلاً من **بداية الأسبوع**

---

## 📊 مثال عملي

### سيناريو: تاريخ اليوم 20 أبريل 2026

#### تقرير أقساط الشهر:

**قبل التعديل:**
- يعرض الأقساط من **1 أبريل** إلى **30 أبريل** (49 قسط)
- يشمل:
  - 28 قسط متأخر (قبل 20 أبريل)
  - 21 قسط مستقبلي (من 20 أبريل لنهاية الشهر)

**بعد التعديل:**
- يعرض الأقساط من **20 أبريل** إلى **30 أبريل** (21 قسط فقط)
- يشمل فقط الأقساط المستقبلية
- الـ 28 قسط المتأخر انتقلوا لتقرير **الأقساط المتأخرة**

---

#### تقرير أقساط الأسبوع:

**قبل التعديل:**
- يعرض الأقساط من **18 أبريل** إلى **24 أبريل** (13 قسط)
- يشمل:
  - 1 قسط متأخر (قبل 20 أبريل)
  - 12 قسط مستقبلي (من 20 أبريل لنهاية الأسبوع)

**بعد التعديل:**
- يعرض الأقساط من **20 أبريل** إلى **24 أبريل** (12 قسط فقط)
- يشمل فقط الأقساط المستقبلية
- الـ 1 قسط المتأخر انتقل لتقرير **الأقساط المتأخرة**

---

## 🔍 ملاحظات مهمة

### 1. باقي الكود لم يتغير
التعديل يشمل فقط سطر واحد في كل ملف (تحديد تاريخ البداية). باقي المنطق والفلاتر والإحصائيات تعمل كما هي.

### 2. التوافق مع الفلاتر الموجودة
التقارير تحتوي على فلاتر (`$dateFilter`) تسمح بعرض:
- `all`: كل الأقساط في النطاق الجديد
- `past`: الأقساط المتأخرة (لن يكون لها معنى بعد التعديل)
- `today`: أقساط اليوم
- `future`: الأقساط المستقبلية

**ملحوظة:** بعد التعديل، فلتر `past` لن يعرض أقساط قبل بداية الشهر/الأسبوع، بل فقط ما كان في النطاق الجديد.

### 3. استبعاد العقود المتوقفة
التقارير تستبعد الأقساط من العقود بحالة `stopped` (متوقفة) افتراضياً:

```php
->whereHas('contract', function ($query) {
    $query->whereIn('status', ['active', 'finished']);
    if ($this->excludeCashedOut) {
        $query->where('status', '!=', 'cashed_out');
    }
})
```

**إذا أردت إضافة العقود المتوقفة:**
```php
$query->whereIn('status', ['active', 'finished', 'stopped']);
```

---

## 🚀 خطوات التطبيق على مشروع جديد

### الخطوة 1: تحديد ملفات التقارير
ابحث عن الملفات التالية في مشروعك:
```
app/Filament/Pages/InstallmentsDueMonth.php
app/Filament/Pages/InstallmentsDueWeek.php
```

### الخطوة 2: تعديل تقرير أقساط الشهر
افتح `InstallmentsDueMonth.php` وابحث عن دالة `mount()`:

**استبدل السطر:**
```php
$startOfMonth = now()->startOfMonth()->format('Y-m-d');
```

**بـ:**
```php
$startOfMonth = now()->format('Y-m-d'); // من تاريخ اليوم بدلاً من بداية الشهر
```

### الخطوة 3: تعديل تقرير أقساط الأسبوع
افتح `InstallmentsDueWeek.php` وابحث عن دالة `mount()`:

**استبدل السطر:**
```php
$startOfWeek = now()->startOfWeek()->format('Y-m-d');
```

**بـ:**
```php
$startOfWeek = now()->format('Y-m-d'); // من تاريخ اليوم بدلاً من بداية الأسبوع
```

### الخطوة 4: حفظ واختبار
1. احفظ التعديلات
2. امسح الـ cache إذا لزم الأمر:
   ```bash
   php artisan cache:clear
   php artisan view:clear
   ```
3. افتح التقارير في المتصفح واختبرها

---

## 🧪 اختبار التعديلات

### اختبار يدوي:
1. افتح تقرير **أقساط الشهر**
2. تأكد أن الأقساط المعروضة تبدأ من **تاريخ اليوم** فصاعداً
3. تحقق من أن الأقساط السابقة لا تظهر
4. كرر نفس الاختبار مع **أقساط الأسبوع**

### اختبار باستخدام Tinker:
```php
php artisan tinker

use App\Models\Installment;
use Carbon\Carbon;

$today = now()->format('Y-m-d');
$endOfMonth = now()->endOfMonth()->format('Y-m-d');

// عرض الأقساط من اليوم لنهاية الشهر
$installments = Installment::whereBetween('due_date', [$today, $endOfMonth])
    ->where('is_paid', false)
    ->whereHas('contract', function($q) {
        $q->whereIn('status', ['active', 'finished']);
    })
    ->get();

echo "عدد الأقساط: " . $installments->count();
```

---

## 📈 الإحصائيات قبل وبعد التعديل

### مثال من المشروع الحالي (تاريخ: 20 أبريل 2026)

#### تقرير أقساط الشهر:
| المؤشر | قبل التعديل | بعد التعديل | الفرق |
|--------|-------------|-------------|-------|
| عدد الأقساط | 49 قسط | 21 قسط | -28 قسط (متأخر) |
| القيمة الإجمالية | 77,478 جنيه | 31,949 جنيه | -45,529 جنيه |
| الفترة | 1-30 أبريل | 20-30 أبريل | - |

#### تقرير أقساط الأسبوع:
| المؤشر | قبل التعديل | بعد التعديل | الفرق |
|--------|-------------|-------------|-------|
| عدد الأقساط | 13 قسط | 12 قسط | -1 قسط (متأخر) |
| القيمة الإجمالية | 17,580 جنيه | 15,575 جنيه | -2,005 جنيه |
| الفترة | 18-24 أبريل | 20-24 أبريل | - |

---

## ⚠️ تنبيهات

### 1. تأثير على الإحصائيات
بعد التعديل، الإحصائيات في أعلى الصفحة ستتغير:
- `pastInstallments` قد تكون فارغة أو تحتوي على قيم أقل
- التركيز سيكون على `todayInstallments` و `futureInstallments`

### 2. التوافق مع تقرير الأقساط المتأخرة
تأكد من وجود تقرير **الأقساط المتأخرة** (Overdue Installments) في النظام، لأن الأقساط السابقة ستنتقل إليه.

عادة يكون في:
```
app/Filament/Pages/InstallmentsOverdue.php
```

### 3. الفلاتر في الواجهة
إذا كان لديك فلتر "الأقساط السابقة" في الواجهة، قد تحتاج لإعادة النظر في جدواه بعد التعديل.

---

## 📝 خلاصة

**التعديل بسيط جداً:**
- سطر واحد في كل ملف
- تغيير `startOfMonth()` إلى `now()` و `startOfWeek()` إلى `now()`
- التأثير كبير على وضوح التقارير وتنظيمها

**الفائدة:**
- فصل الأقساط المتأخرة عن المستقبلية
- تقارير أكثر وضوحاً وتركيزاً
- سهولة متابعة الأقساط القادمة

---

## 📅 تاريخ التطبيق
- **التاريخ:** 20 أبريل 2026
- **الإصدار:** Laravel 11.x + Filament 3.x
- **المشروع:** نظام إدارة الأقساط

---

## 👤 ملاحظات إضافية

إذا احتجت تطبيق هذا التعديل على مشاريع مشابهة، ابحث عن:
1. الملفات التي تحتوي على `startOfMonth()` أو `startOfWeek()`
2. التقارير التي تعرض أقساط فترة زمنية محددة
3. تأكد من وجود تقرير للأقساط المتأخرة

---

**نهاية الملف**
