# تحليل نظام طلبات العقار - الوسيط العقاري
## Property Requests System Analysis - Real Estate Office

> **ملاحظة**: هذا التحليل مبني على دراسة `office/dashboard.php` وبنية الجداول الموجودة في قاعدة البيانات. **لا يتم إنشاء جداول جديدة** - جميع الجداول موجودة بالفعل.

---

## 📋 جدول المحتويات

1. [نظرة عامة](#نظرة-عامة)
2. [الجداول المسؤولة](#الجداول-المسؤولة)
3. [آلية عمل النظام](#آلية-عمل-النظام)
4. [كيفية استدعاء الطلبات](#كيفية-استدعاء-الطلبات)
5. [كيفية تقديم العروض](#كيفية-تقديم-العروض)
6. [المفاوضات](#المفاوضات)
7. [الهوية البصرية](#الهوية-البصرية)
8. [الاستعلامات الأساسية](#الاستعلامات-الأساسية)

---

## 🎯 نظرة عامة

نظام طلبات العقار يسمح بـ:
- **المستخدمون** (جميع المستخدمين): إنشاء طلبات عقارات (إيجار/بيع)
- **الوسطاء العقاريون** (جميع المكاتب): عرض جميع الطلبات النشطة وتقديم عروض عليها
- **المفاوضات**: التواصل بين المكاتب والمستخدمين حول العروض

### الميزات الرئيسية:
- ✅ عرض جميع طلبات العقارات النشطة (جميع المكاتب)
- ✅ فلترة الطلبات حسب المنطقة، المدينة، النوع، الميزانية
- ✅ تقديم عروض على الطلبات (ربط بعقار موجود أو وصف عقار جديد)
- ✅ متابعة حالة العروض (pending, accepted, rejected, negotiating, closed)
- ✅ نظام مفاوضات كامل بين المكتب والمستخدم
- ✅ إحصائيات شاملة في لوحة التحكم

---

## 🗄️ الجداول المسؤولة

### 1. جدول `property_request` (طلبات العقارات)

**الوصف**: جدول يحتوي على جميع طلبات العقارات التي ينشئها المستخدمون.

#### الحقول الرئيسية:

```sql
id                      INT(11)         -- معرف الطلب (Primary Key)
user_code               VARCHAR(50)     -- رمز المستخدم الذي أنشأ الطلب (FK إلى users.usercode)
office_id               INT(11)         -- معرف المكتب (NULL = متاح لجميع المكاتب)
```

#### معلومات الموقع:
```sql
region                  VARCHAR(255)    -- المنطقة
city                    VARCHAR(255)    -- المدينة
district                TEXT            -- الحي (JSON array)
```

#### معلومات العقار المطلوب:
```sql
typeofstrcture_id       INT(11)         -- نوع العقار (FK إلى typeofstrcture)
property_type_id        INT(11)         -- نوع الوحدة (FK إلى property_type)
family_type             TEXT            -- نوع الأفراد (JSON array: عوائل/عزاب)
request_type            ENUM            -- نوع الطلب: 'sale', 'rent', 'both'
```

#### الميزانية (للإيجار):
```sql
budget_monthly          DECIMAL(12,2)   -- المبلغ المتوقع شهرياً
budget_annual           DECIMAL(12,2)   -- المبلغ المتوقع سنوياً
rent_deposit            DECIMAL(12,2)   -- الضمان المطلوب
rent_advance            DECIMAL(12,2)   -- المقدم المطلوب
```

#### الميزانية (للبيع):
```sql
sale_price_min          DECIMAL(15,2)   -- السعر الأدنى المتوقع
sale_price_max          DECIMAL(15,2)   -- السعر الأعلى المتوقع
sale_payment_method     TEXT            -- طريقة الدفع المفضلة (JSON array)
```

#### المواصفات:
```sql
area_min                DECIMAL(10,2)   -- المساحة الدنيا (م²)
area_max                DECIMAL(10,2)   -- المساحة العليا (م²)
rooms_min               INT(3)          -- عدد الغرف الأدنى
rooms_max               INT(3)          -- عدد الغرف الأعلى
bathrooms_min           INT(2)          -- عدد دورات المياه الأدنى
bathrooms_max           INT(2)          -- عدد دورات المياه الأعلى
floors                  TEXT            -- الطوابق المطلوبة (JSON array)
```

#### الخدمات والمرافق:
```sql
furnished               TINYINT(1)      -- مفروش (0=لا, 1=نعم, NULL=لا يهم)
parking                 TINYINT(1)      -- موقف سيارات
elevator                TINYINT(1)      -- مصعد
balcony                 TINYINT(1)      -- شرفة
garden                  TINYINT(1)      -- حديقة
swimming_pool            TINYINT(1)      -- مسبح
direction               VARCHAR(50)    -- الاتجاه المطلوب
```

#### معلومات إضافية:
```sql
preferred_contact_time  TEXT            -- الأوقات المفضلة للتواصل (JSON array)
notes                   TEXT            -- ملاحظات إضافية
urgency_level           ENUM            -- مستوى الاستعجال: 'low', 'medium', 'high'
preferred_move_in_date  DATE            -- تاريخ الانتقال المفضل
```

#### الخصوصية:
```sql
hide_identity           TINYINT(1)      -- إخفاء الهوية (0=ظاهر, 1=مخفي)
hide_contact            TINYINT(1)      -- إخفاء معلومات الاتصال
```

#### الحالة والإدارة:
```sql
status                  ENUM            -- حالة الطلب:
                                        -- 'pending' = قيد المراجعة
                                        -- 'active' = نشط (متاح للعروض)
                                        -- 'matched' = تم التطابق
                                        -- 'closed' = مغلق
                                        -- 'cancelled' = ملغي
```

#### نظام الإبلاغ:
```sql
report_reason           ENUM            -- سبب الإبلاغ
report_description      TEXT            -- وصف الإبلاغ
reported_by             INT(11)         -- معرف المكتب الذي أبلغ
reported_at             TIMESTAMP       -- تاريخ الإبلاغ
report_status           ENUM            -- حالة الإبلاغ
```

#### الإحصائيات:
```sql
views                   INT(11)         -- عدد المشاهدات
created_at              TIMESTAMP       -- تاريخ الإنشاء
updated_at              TIMESTAMP       -- تاريخ آخر تحديث
```

---

### 2. جدول `property_request_offers` (عروض المكاتب)

**الوصف**: جدول يحتوي على العروض التي يقدمها المكاتب على طلبات العقارات.

#### الحقول الرئيسية:

```sql
id                      INT(11)         -- معرف العرض (Primary Key)
request_id              INT(11)         -- معرف طلب العقار (FK إلى property_request.id)
office_id               INT(11)         -- معرف المكتب الذي قدم العرض (FK إلى office.id)
offer_type              ENUM            -- نوع العرض: 'rent', 'sale'
offer_status            ENUM            -- حالة العرض:
                                        -- 'pending' = قيد الانتظار
                                        -- 'accepted' = مقبول
                                        -- 'rejected' = مرفوض
                                        -- 'negotiating' = قيد التفاوض
                                        -- 'closed' = مغلق
```

#### تفاصيل العرض (للإيجار):
```sql
rent_monthly            DECIMAL(12,2)   -- الإيجار الشهري المقترح
rent_annual             DECIMAL(12,2)   -- الإيجار السنوي المقترح
rent_deposit            DECIMAL(12,2)   -- الضمان المقترح
rent_advance            DECIMAL(12,2)   -- المقدم المقترح
rent_duration           INT(11)         -- مدة الإيجار بالأشهر
```

#### تفاصيل العرض (للبيع):
```sql
sale_price              DECIMAL(15,2)   -- سعر البيع المقترح
sale_payment_method     TEXT            -- طريقة الدفع المقترحة (JSON array)
```

#### ربط العقار:
```sql
property_id             INT(11)         -- معرف العقار المقترح (FK إلى properties.id)
                                        -- NULL = عقار جديد غير مسجل
property_description    TEXT            -- وصف العقار المقترح
```

#### معلومات إضافية:
```sql
notes                   TEXT            -- ملاحظات إضافية من المكتب
terms_conditions        TEXT            -- الشروط والأحكام
expires_at              DATE            -- تاريخ انتهاء صلاحية العرض
created_at              TIMESTAMP       -- تاريخ إنشاء العرض
updated_at              TIMESTAMP       -- تاريخ آخر تحديث
```

---

### 3. جدول `property_request_negotiations` (المفاوضات)

**الوصف**: جدول يحتوي على المحادثات والتفاوض بين المكاتب والمستخدمين حول العروض.

#### الحقول الرئيسية:

```sql
id                      INT(11)         -- معرف الرسالة (Primary Key)
request_id              INT(11)         -- معرف طلب العقار (FK إلى property_request.id)
offer_id                INT(11)         -- معرف العرض المرتبط (FK إلى property_request_offers.id)
office_id               INT(11)         -- معرف المكتب
user_code               VARCHAR(50)     -- رمز المستخدم صاحب الطلب
```

#### محتوى الرسالة:
```sql
message                 TEXT            -- نص الرسالة
message_type            ENUM            -- نوع الرسالة:
                                        -- 'text' = نص عادي
                                        -- 'offer_update' = تحديث العرض
                                        -- 'status_change' = تغيير الحالة
                                        -- 'file' = ملف مرفق
sender_type             ENUM            -- نوع المرسل: 'office', 'user'
```

#### المرفقات:
```sql
attachment_path         VARCHAR(500)    -- مسار الملف المرفق
attachment_name         VARCHAR(255)    -- اسم الملف المرفق
```

#### حالة القراءة:
```sql
is_read                 TINYINT(1)      -- تمت القراءة (0=غير مقروءة, 1=مقروءة)
read_at                 TIMESTAMP       -- تاريخ القراءة
```

#### نظام الإبلاغ:
```sql
report_reason           ENUM            -- سبب الإبلاغ
report_description      TEXT            -- وصف الإبلاغ
reported_by             INT(11)         -- معرف المكتب الذي أبلغ
reported_at             TIMESTAMP       -- تاريخ الإبلاغ
report_status           ENUM            -- حالة الإبلاغ
```

#### الطوابع الزمنية:
```sql
created_at              TIMESTAMP       -- تاريخ الإرسال
```

---

## 🔄 آلية عمل النظام

### 1. إنشاء الطلب (من المستخدم)

```
المستخدم → ينشئ طلب عقار → property_request
- user_code: رمز المستخدم
- office_id: NULL (متاح لجميع المكاتب)
- status: 'pending' → 'active'
```

### 2. عرض الطلبات (من المكتب)

```
المكتب → يستعرض جميع الطلبات النشطة → property_request
WHERE status IN ('pending', 'active')
AND office_id IS NULL (أو office_id = المكتب الحالي)
```

### 3. تقديم العرض (من المكتب)

```
المكتب → يقدم عرض على طلب → property_request_offers
- request_id: معرف الطلب
- office_id: معرف المكتب
- offer_status: 'pending'
- property_id: (ربط بعقار موجود) أو NULL (عقار جديد)
```

### 4. المفاوضات

```
المكتب ↔ المستخدم → تبادل الرسائل → property_request_negotiations
- request_id: معرف الطلب
- offer_id: معرف العرض (إن وجد)
- sender_type: 'office' أو 'user'
```

### 5. تحديث حالة العرض

```
المستخدم → يقبل/يرفض العرض → property_request_offers.offer_status
- 'accepted' = مقبول
- 'rejected' = مرفوض
- 'negotiating' = قيد التفاوض
```

---

## 📊 كيفية استدعاء الطلبات

### الاستعلام الأساسي (من dashboard.php)

```sql
SELECT 
    COUNT(*) as total_requests,
    SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active_requests,
    SUM(CASE WHEN urgency_level = 'high' AND status = 'active' THEN 1 ELSE 0 END) as urgent_requests
FROM property_request 
WHERE status IN ('pending', 'active')
```

### استعلام جلب الطلبات النشطة (للمكتب)

```sql
SELECT 
    pr.*,
    u.name as user_name,
    u.mobile as user_mobile,
    u.email as user_email,
    ts.theTypeOfStrecture as structure_type,
    pt.property_type as unit_type,
    (SELECT COUNT(*) FROM property_request_offers pro 
     WHERE pro.request_id = pr.id AND pro.office_id = ?) as my_offers_count,
    (SELECT COUNT(*) FROM property_request_offers pro 
     WHERE pro.request_id = pr.id) as total_offers_count
FROM property_request pr
LEFT JOIN users u ON pr.user_code = u.usercode
LEFT JOIN typeofstrcture ts ON pr.typeofstrcture_id = ts.id
LEFT JOIN property_type pt ON pr.property_type_id = pt.id
WHERE pr.status IN ('pending', 'active')
  AND (pr.office_id IS NULL OR pr.office_id = ?)
ORDER BY 
    CASE pr.urgency_level 
        WHEN 'high' THEN 1 
        WHEN 'medium' THEN 2 
        WHEN 'low' THEN 3 
    END,
    pr.created_at DESC
```

### فلترة الطلبات

#### حسب المنطقة:
```sql
WHERE pr.region = ?
```

#### حسب المدينة:
```sql
WHERE pr.city = ?
```

#### حسب نوع الطلب:
```sql
WHERE pr.request_type = ? -- 'sale', 'rent', 'both'
```

#### حسب الميزانية:
```sql
-- للإيجار
WHERE pr.budget_monthly BETWEEN ? AND ?

-- للبيع
WHERE pr.sale_price_min BETWEEN ? AND ?
```

#### حسب مستوى الاستعجال:
```sql
WHERE pr.urgency_level = ? -- 'low', 'medium', 'high'
```

---

## 💼 كيفية تقديم العروض

### 1. إنشاء عرض جديد

```sql
INSERT INTO property_request_offers (
    request_id,
    office_id,
    offer_type,
    offer_status,
    rent_monthly,        -- للإيجار
    rent_annual,         -- للإيجار
    rent_deposit,        -- للإيجار
    rent_advance,         -- للإيجار
    rent_duration,       -- للإيجار
    sale_price,          -- للبيع
    sale_payment_method, -- للبيع
    property_id,         -- ربط بعقار موجود (اختياري)
    property_description,-- وصف العقار (إذا لم يكن مربوطاً)
    notes,
    terms_conditions,
    expires_at
) VALUES (?, ?, ?, 'pending', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
```

### 2. ربط العرض بعقار موجود

```sql
-- عند تقديم العرض، يمكن ربطه بعقار من properties
UPDATE property_request_offers 
SET property_id = ? 
WHERE id = ?
```

### 3. تحديث حالة العرض

```sql
UPDATE property_request_offers 
SET offer_status = ? -- 'accepted', 'rejected', 'negotiating', 'closed'
WHERE id = ?
```

### 4. جلب عروض المكتب

```sql
SELECT 
    pro.*,
    pr.region,
    pr.city,
    pr.request_type,
    pr.user_code,
    u.name as user_name,
    p.main_title as property_title
FROM property_request_offers pro
JOIN property_request pr ON pro.request_id = pr.id
LEFT JOIN users u ON pr.user_code = u.usercode
LEFT JOIN properties p ON pro.property_id = p.id
WHERE pro.office_id = ?
ORDER BY pro.created_at DESC
```

---

## 💬 المفاوضات

### 1. إرسال رسالة (من المكتب)

```sql
INSERT INTO property_request_negotiations (
    request_id,
    offer_id,  -- (اختياري) إذا كانت الرسالة متعلقة بعرض
    office_id,
    user_code,
    message,
    message_type,
    sender_type,
    attachment_path,     -- (اختياري)
    attachment_name      -- (اختياري)
) VALUES (?, ?, ?, ?, ?, 'text', 'office', ?, ?)
```

### 2. جلب المحادثات

```sql
SELECT 
    prn.*,
    CASE 
        WHEN prn.sender_type = 'office' THEN o.officeName
        WHEN prn.sender_type = 'user' THEN u.name
    END as sender_name
FROM property_request_negotiations prn
LEFT JOIN office o ON prn.office_id = o.id AND prn.sender_type = 'office'
LEFT JOIN users u ON prn.user_code = u.usercode AND prn.sender_type = 'user'
WHERE prn.request_id = ?
  AND prn.office_id = ?
ORDER BY prn.created_at ASC
```

### 3. تحديث حالة القراءة

```sql
UPDATE property_request_negotiations 
SET is_read = 1, read_at = NOW()
WHERE id = ? AND sender_type = 'user'
```

---

## 🎨 الهوية البصرية

بناءً على `users/VISUAL_IDENTITY_GUIDE.md`:

### الألوان المستخدمة:

```css
/* الألوان الأساسية */
--primary-green: #598227;      /* الأزرار الأساسية */
--dark-green: #206843;         /* الحدود والتأكيدات */
--orange-primary: #ec750b;     /* Hover effects */
--orange-secondary: #ffa518;   /* علامات التبويب النشطة */

/* الألوان الثانوية */
--blue-primary: #1890ff;       /* معلومات، روابط */
--success-green: #52c41a;      /* حالات النجاح */
--warning-yellow: #faad14;     /* حالات الانتظار */
--error-red: #ff4d4f;          /* حالات الرفض */
```

### حالات الطلبات:

```css
/* طلب نشط */
.status-active {
    background-color: #52c41a !important;
    color: white !important;
}

/* طلب قيد المراجعة */
.status-pending {
    background-color: #faad14 !important;
    color: white !important;
}

/* طلب عاجل */
.urgency-high {
    border-left: 4px solid #ff4d4f;
    background: #fff2f0;
}
```

### حالات العروض:

```css
/* عرض قيد الانتظار */
.offer-pending {
    color: #faad14 !important;
    background: #fffbe6 !important;
    border-color: #ffe58f !important;
}

/* عرض مقبول */
.offer-accepted {
    color: #52c41a !important;
    background: #f6ffed !important;
    border-color: #b7eb8f !important;
}

/* عرض مرفوض */
.offer-rejected {
    color: #ff4d4f !important;
    background: #fff2f0 !important;
    border-color: #ffccc7 !important;
}

/* عرض قيد التفاوض */
.offer-negotiating {
    color: #1890ff !important;
    background: #e6f7ff !important;
    border-color: #91d5ff !important;
}
```

---

## 📝 الاستعلامات الأساسية

### 1. جلب جميع الطلبات النشطة للمكتب

```sql
SELECT 
    pr.id,
    pr.user_code,
    pr.region,
    pr.city,
    pr.request_type,
    pr.budget_monthly,
    pr.budget_annual,
    pr.sale_price_min,
    pr.sale_price_max,
    pr.urgency_level,
    pr.status,
    pr.views,
    pr.created_at,
    u.name as user_name,
    u.mobile as user_mobile,
    u.email as user_email,
    ts.theTypeOfStrecture as structure_type,
    pt.property_type as unit_type,
    (SELECT COUNT(*) FROM property_request_offers pro 
     WHERE pro.request_id = pr.id AND pro.office_id = ?) as my_offers_count,
    (SELECT COUNT(*) FROM property_request_offers pro 
     WHERE pro.request_id = pr.id) as total_offers_count,
    (SELECT MAX(pro.created_at) FROM property_request_offers pro 
     WHERE pro.request_id = pr.id AND pro.office_id = ?) as last_offer_date
FROM property_request pr
LEFT JOIN users u ON pr.user_code = u.usercode
LEFT JOIN typeofstrcture ts ON pr.typeofstrcture_id = ts.id
LEFT JOIN property_type pt ON pr.property_type_id = pt.id
WHERE pr.status IN ('pending', 'active')
  AND (pr.office_id IS NULL OR pr.office_id = ?)
ORDER BY 
    CASE pr.urgency_level 
        WHEN 'high' THEN 1 
        WHEN 'medium' THEN 2 
        WHEN 'low' THEN 3 
    END,
    pr.created_at DESC
```

### 2. جلب تفاصيل طلب معين

```sql
SELECT 
    pr.*,
    u.name as user_name,
    u.mobile as user_mobile,
    u.email as user_email,
    u.identity as user_identity,
    ts.theTypeOfStrecture as structure_type,
    pt.property_type as unit_type,
    JSON_EXTRACT(pr.district, '$') as districts_array,
    JSON_EXTRACT(pr.family_type, '$') as family_types_array,
    JSON_EXTRACT(pr.floors, '$') as floors_array
FROM property_request pr
LEFT JOIN users u ON pr.user_code = u.usercode
LEFT JOIN typeofstrcture ts ON pr.typeofstrcture_id = ts.id
LEFT JOIN property_type pt ON pr.property_type_id = pt.id
WHERE pr.id = ?
```

### 3. جلب عروض المكتب على طلب معين

```sql
SELECT 
    pro.*,
    p.main_title as property_title,
    p.Region as property_region,
    p.governorate as property_city,
    p.rental_price as property_rent,
    p.Sale as property_sale_price
FROM property_request_offers pro
LEFT JOIN properties p ON pro.property_id = p.id
WHERE pro.request_id = ?
  AND pro.office_id = ?
ORDER BY pro.created_at DESC
```

### 4. جلب جميع عروض المكتب

```sql
SELECT 
    pro.*,
    pr.region,
    pr.city,
    pr.request_type,
    pr.user_code,
    u.name as user_name,
    p.main_title as property_title,
    CASE 
        WHEN pro.property_id IS NOT NULL THEN 'عقار موجود'
        ELSE 'عقار جديد'
    END as offer_source
FROM property_request_offers pro
JOIN property_request pr ON pro.request_id = pr.id
LEFT JOIN users u ON pr.user_code = u.usercode
LEFT JOIN properties p ON pro.property_id = p.id
WHERE pro.office_id = ?
ORDER BY pro.created_at DESC
```

### 5. جلب المحادثات لطلب معين

```sql
SELECT 
    prn.*,
    CASE 
        WHEN prn.sender_type = 'office' THEN o.officeName
        WHEN prn.sender_type = 'user' THEN u.name
    END as sender_name,
    CASE 
        WHEN prn.sender_type = 'office' THEN o.id
        ELSE NULL
    END as sender_office_id
FROM property_request_negotiations prn
LEFT JOIN office o ON prn.office_id = o.id AND prn.sender_type = 'office'
LEFT JOIN users u ON prn.user_code = u.usercode AND prn.sender_type = 'user'
WHERE prn.request_id = ?
  AND prn.office_id = ?
ORDER BY prn.created_at ASC
```

### 6. إحصائيات شاملة للمكتب

```sql
SELECT 
    -- إجمالي الطلبات النشطة
    (SELECT COUNT(*) FROM property_request 
     WHERE status IN ('pending', 'active')) as total_active_requests,
    
    -- طلبات عاجلة
    (SELECT COUNT(*) FROM property_request 
     WHERE status IN ('pending', 'active') 
       AND urgency_level = 'high') as urgent_requests,
    
    -- عروضي المعلقة
    (SELECT COUNT(*) FROM property_request_offers 
     WHERE office_id = ? 
       AND offer_status = 'pending') as my_pending_offers,
    
    -- عروضي المقبولة
    (SELECT COUNT(*) FROM property_request_offers 
     WHERE office_id = ? 
       AND offer_status = 'accepted') as my_accepted_offers,
    
    -- عروضي قيد التفاوض
    (SELECT COUNT(*) FROM property_request_offers 
     WHERE office_id = ? 
       AND offer_status = 'negotiating') as my_negotiating_offers,
    
    -- رسائل غير مقروءة
    (SELECT COUNT(*) FROM property_request_negotiations 
     WHERE office_id = ? 
       AND sender_type = 'user' 
       AND is_read = 0) as unread_messages
```

---

## 🔗 العلاقات بين الجداول

### 1. property_request → users
```
property_request.user_code = users.usercode
```

### 2. property_request → typeofstrcture
```
property_request.typeofstrcture_id = typeofstrcture.id
```

### 3. property_request → property_type
```
property_request.property_type_id = property_type.id
```

### 4. property_request_offers → property_request
```
property_request_offers.request_id = property_request.id
```

### 5. property_request_offers → office
```
property_request_offers.office_id = office.id
```

### 6. property_request_offers → properties
```
property_request_offers.property_id = properties.id (اختياري)
```

### 7. property_request_negotiations → property_request
```
property_request_negotiations.request_id = property_request.id
```

### 8. property_request_negotiations → property_request_offers
```
property_request_negotiations.offer_id = property_request_offers.id (اختياري)
```

### 9. property_request_negotiations → office
```
property_request_negotiations.office_id = office.id
```

### 10. property_request_negotiations → users
```
property_request_negotiations.user_code = users.usercode
```

---

## 📊 Card طلبات العقار في Dashboard

### الموقع في الكود:
```javascript
// dashboard.php - السطر 2095
React.createElement('div', {
    key: 'property_requests',
    className: 'stat-card',
    style: { 
        cursor: 'pointer',
        border: '2px solid #1890ff',
        background: 'linear-gradient(135deg, #1890ff 0%, #096dd9 100%)',
        color: 'white'
    },
    onClick: () => {
        window.location.href = 'property/property_request/view_property_requests.php';
    }
}, [
    // المحتوى
])
```

### البيانات المعروضة:
- **العنوان**: "طلبات العقارات"
- **القيمة**: `stats.property_requests` (الطلبات النشطة)
- **الوصف**: "عرض الطلبات والتفاوض"
- **الرابط**: `property/property_request/view_property_requests.php`

### الإحصائيات المرتبطة:
```javascript
property_requests: <?php echo $property_requests_data['active_requests'] ?? 0; ?>,
property_requests_total: <?php echo $property_requests_data['total_requests'] ?? 0; ?>,
property_requests_urgent: <?php echo $property_requests_data['urgent_requests'] ?? 0; ?>
```

---

## 🎯 سيناريوهات الاستخدام

### السيناريو 1: المكتب يستعرض الطلبات

1. **المكتب يفتح صفحة طلبات العقارات**
2. **النظام يعرض جميع الطلبات النشطة** (`status = 'active'`)
3. **المكتب يفلتر حسب**:
   - المنطقة
   - المدينة
   - نوع الطلب (إيجار/بيع)
   - الميزانية
   - مستوى الاستعجال
4. **المكتب يختار طلباً ويرى تفاصيله**

### السيناريو 2: المكتب يقدم عرض

1. **المكتب يفتح تفاصيل الطلب**
2. **المكتب يختار**:
   - ربط بعقار موجود (`property_id`)
   - أو وصف عقار جديد (`property_description`)
3. **المكتب يدخل تفاصيل العرض**:
   - السعر/الإيجار
   - الشروط
   - الملاحظات
4. **النظام يحفظ العرض** في `property_request_offers`
5. **النظام يرسل إشعار للمستخدم**

### السيناريو 3: المفاوضات

1. **المستخدم يقبل/يرفض العرض**
2. **المكتب يرسل رسالة** في `property_request_negotiations`
3. **المستخدم يرد** في نفس الجدول
4. **النظام يحدث حالة العرض** (`offer_status = 'negotiating'`)

---

## 📁 البنية المقترحة للملفات

```
office/property/property_requests/
├── view_property_requests.php      # قائمة جميع الطلبات
├── request_details.php             # تفاصيل طلب معين
├── create_offer.php                 # إنشاء عرض جديد
├── my_offers.php                    # عروضي
├── offer_details.php                # تفاصيل عرض معين
├── negotiations.php                  # المفاوضات
└── api/
    ├── get_requests.php            # API لجلب الطلبات
    ├── create_offer_api.php         # API لإنشاء عرض
    ├── update_offer_status.php     # API لتحديث حالة العرض
    └── send_message.php             # API لإرسال رسالة
```

---

## 🎨 تطبيق الهوية البصرية

### مثال: صفحة عرض الطلبات

```jsx
// استخدام Ant Design Components
import { Card, Table, Tag, Button, Space, Statistic, Row, Col } from 'antd';

// الألوان حسب الهوية البصرية
const statusColors = {
    'active': '#52c41a',
    'pending': '#faad14',
    'closed': '#d9d9d9',
    'cancelled': '#ff4d4f'
};

const urgencyColors = {
    'high': '#ff4d4f',
    'medium': '#faad14',
    'low': '#52c41a'
};

// زر تقديم عرض
<Button 
    type="primary"
    style={{ background: '#598227', borderColor: '#598227' }}
    onClick={() => handleCreateOffer(request.id)}
>
    تقديم عرض
</Button>
```

---

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

### 1. الطلبات متاحة لجميع المكاتب
- `office_id = NULL` يعني أن الطلب متاح لجميع المكاتب
- كل مكتب يمكنه تقديم عرض على نفس الطلب
- المنافسة شريفة بين المكاتب

### 2. ربط العقار بالعرض
- يمكن ربط العرض بعقار موجود (`property_id`)
- أو وصف عقار جديد (`property_description`)
- العقار الجديد يمكن إضافته لاحقاً إلى `properties`

### 3. حالة الطلب
- `pending`: قيد المراجعة (قبل الموافقة)
- `active`: نشط (متاح للعروض)
- `matched`: تم التطابق (تم قبول عرض)
- `closed`: مغلق (تم إتمام الصفقة)
- `cancelled`: ملغي (من المستخدم)

### 4. حالة العرض
- `pending`: قيد الانتظار (في انتظار رد المستخدم)
- `accepted`: مقبول (قبل المستخدم العرض)
- `rejected`: مرفوض (رفض المستخدم العرض)
- `negotiating`: قيد التفاوض (جاري التفاوض)
- `closed`: مغلق (تم إتمام الصفقة)

---

## 🔄 التحديثات

### الإصدار 1.0.0 (2024-12-24)
- تحليل شامل لنظام طلبات العقار
- توثيق الجداول الثلاثة الرئيسية
- توثيق آلية العمل
- أمثلة على الاستعلامات
- تطبيق الهوية البصرية

---

**آخر تحديث**: 2024-12-24
**الإصدار**: 1.0.0

