# إصلاح مشكلة Foreign Key Constraint في payment_voucher

## المشكلة

عند محاولة حذف عقار يحتوي على عقود مرتبطة، كان يحدث الخطأ التالي:

```
SQLSTATE[23000]: Integrity constraint violation: 1451 
Cannot delete or update a parent row: a foreign key constraint fails 
(`faradjwb_farsak`.`payment_voucher`, CONSTRAINT `fk_pv_contract` 
FOREIGN KEY (`contract_id`) REFERENCES `contracts` (`id`))
```

## السبب

جدول `payment_voucher` يحتوي على قيد Foreign Key (`fk_pv_contract`) يشير إلى `contracts.id`. عند محاولة حذف عقد من جدول `contracts`، يفشل الحذف لأن `payment_voucher` يحتوي على سجلات مرتبطة بهذا العقد.

## الحل

تم إصلاح المشكلة في `delete_property_safe.php` من خلال:

### 1. تعديل ترتيب الحذف

**قبل الإصلاح:**
- كان يتم حذف العقود مباشرة دون حذف `payment_voucher` المرتبطة بها أولاً

**بعد الإصلاح:**
- يتم حذف `payment_voucher` المرتبطة بكل عقد قبل حذف العقد نفسه
- يتم حذف `receipts_voucher` المرتبطة بالعقود أيضاً
- يتم حذف `bill_of_exchange` المرتبطة بالعقود أيضاً

### 2. ترتيب الحذف الصحيح

```php
// 1. حذف الجداول المرتبطة بالعقود (مثل contract_installments, contract_docment, etc.)
// 2. حذف payment_voucher المرتبطة بكل عقد (قبل حذف العقد)
// 3. حذف receipts_voucher المرتبطة بكل عقد (قبل حذف العقد)
// 4. حذف bill_of_exchange المرتبطة بكل عقد (قبل حذف العقد)
// 5. حذف العقود نفسها
// 6. حذف payment_voucher المرتبطة بالعقار مباشرة (وليس بالعقود)
// 7. حذف باقي الجداول الحرجة
// 8. حذف العقار نفسه
```

### 3. تحديث check_property_dependencies.php

تم تحديث ملف الفحص ليتحقق من:
- `payment_voucher` المرتبطة بالعقار مباشرة
- `payment_voucher` المرتبطة بالعقود المرتبطة بالعقار
- نفس الشيء لـ `receipts_voucher` و `bill_of_exchange`

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

1. **`delete_property_safe.php`**
   - إضافة حذف `payment_voucher` المرتبطة بالعقود قبل حذف العقود
   - إضافة حذف `receipts_voucher` المرتبطة بالعقود
   - إضافة حذف `bill_of_exchange` المرتبطة بالعقود
   - فصل حذف السندات المرتبطة بالعقود عن السندات المرتبطة بالعقار مباشرة

2. **`check_property_dependencies.php`**
   - إضافة فحص `payment_voucher` المرتبطة بالعقود
   - إضافة فحص `receipts_voucher` المرتبطة بالعقود
   - إضافة فحص `bill_of_exchange` المرتبطة بالعقود

## الاختبار

للتأكد من أن الإصلاح يعمل:

1. أنشئ عقاراً
2. أضف عقداً مرتبطاً بالعقار
3. أضف `payment_voucher` مرتبطاً بالعقد
4. حاول حذف العقار
5. يجب أن يتم الحذف بنجاح دون أخطاء Foreign Key

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

- يجب دائماً حذف الجداول الفرعية (Child Tables) قبل حذف الجداول الرئيسية (Parent Tables)
- ترتيب الحذف مهم جداً لتجنب أخطاء Foreign Key Constraint
- استخدام Transactions (`beginTransaction`, `commit`, `rollBack`) يضمن سلامة البيانات

## مشاكل إضافية تم إصلاحها

### 2. مشكلة cleaning_tenders و cleaning_requests

**المشكلة:**
```
Error deleting from cleaning_requests: SQLSTATE[23000]: Integrity constraint violation: 1451 
Cannot delete or update a parent row: a foreign key constraint fails 
(`faradjwb_farsak`.`cleaning_tenders`, CONSTRAINT `fk_ct_request` 
FOREIGN KEY (`request_id`) REFERENCES `cleaning_requests` (`id`) ON UPDATE CASCADE)
```

**السبب:**
- `cleaning_tenders` مرتبط بـ `cleaning_requests` عبر Foreign Key (`fk_ct_request`)
- يجب حذف `cleaning_tenders` قبل حذف `cleaning_requests`

**الحل:**
- إضافة خطوة لحذف `cleaning_tenders` المرتبطة بطلبات التنظيف قبل حذف `cleaning_requests`

## التاريخ

- **التاريخ:** 2025-11-19
- **المشكلة 1:** Foreign Key Constraint violation عند حذف عقار يحتوي على عقود (payment_voucher)
- **الحل 1:** تعديل ترتيب الحذف لحذف `payment_voucher` قبل حذف العقود
- **المشكلة 2:** Foreign Key Constraint violation عند حذف `cleaning_requests` (cleaning_tenders)
- **الحل 2:** حذف `cleaning_tenders` قبل حذف `cleaning_requests`

