# دليل نظام المزامنة الأوفلاين

## نظرة عامة

تم إضافة نظام مزامنة أوفلاين كامل لنظام Lab LIMS يتيح:
- ✅ العمل بدون إنترنت على اللابتوب
- ✅ حفظ البيانات محلياً في المتصفح (IndexedDB)
- ✅ مزامنة تلقائية عند عودة الإنترنت
- ✅ إشعارات عند نجاح/فشل المزامنة

## الملفات المضافة

1. **`api/offline_sync.php`** - API endpoints للمزامنة
2. **`js/offline-sync.js`** - مكتبة JavaScript للمزامنة
3. **`service-worker.js`** - محدث لدعم الكاش الذكي

## كيفية الاستخدام

### 1. في صفحات PHP (إنشاء مريض أوفلاين)

```javascript
// بدلاً من إرسال form مباشرة
document.querySelector('form').addEventListener('submit', async function(e) {
    e.preventDefault();
    
    const formData = new FormData(this);
    const patientData = {
        full_name: formData.get('full_name'),
        gender: formData.get('gender'),
        date_of_birth: formData.get('date_of_birth'),
        phone: formData.get('phone'),
        email: formData.get('email'),
        national_id: formData.get('national_id'),
        address: formData.get('address')
    };
    
    // التحقق من الاتصال
    if (navigator.onLine) {
        // إرسال مباشر للسيرفر
        try {
            const response = await fetch('api/offline_sync.php?action=sync_patients', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ patients: [patientData] })
            });
            const result = await response.json();
            if (result.success) {
                alert('تم حفظ المريض بنجاح');
                location.reload();
            }
        } catch (error) {
            // في حالة الخطأ، حفظ أوفلاين
            await window.offlineSync.createPatientOffline(patientData);
            alert('تم حفظ المريض محلياً. سيتم رفعه عند عودة الإنترنت');
        }
    } else {
        // حفظ أوفلاين مباشرة
        await window.offlineSync.createPatientOffline(patientData);
        alert('تم حفظ المريض محلياً. سيتم رفعه عند عودة الإنترنت');
    }
});
```

### 2. إنشاء طلب أوفلاين

```javascript
const orderData = {
    patient_id: 123,
    doctor_id: 45,
    branch_id: 1,
    tests: [1, 2, 3], // IDs الفحوصات
    package_id: 0
};

if (navigator.onLine) {
    // إرسال مباشر
    const response = await fetch('api/offline_sync.php?action=sync_orders', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ orders: [orderData] })
    });
} else {
    // حفظ أوفلاين
    await window.offlineSync.createOrderOffline(orderData);
}
```

### 3. حفظ نتيجة أوفلاين

```javascript
const resultData = {
    order_item_id: 456,
    result_value: '120',
    flag: 'normal',
    notes: 'ملاحظات'
};

if (navigator.onLine) {
    // إرسال مباشر
    const response = await fetch('api/offline_sync.php?action=sync_results', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ results: [resultData] })
    });
} else {
    // حفظ أوفلاين
    await window.offlineSync.saveResultOffline(resultData);
}
```

## المزامنة التلقائية

- النظام يتحقق من الاتصال كل 30 ثانية
- عند عودة الإنترنت، يتم مزامنة جميع العناصر المعلقة تلقائياً
- يمكن رؤية عدد العناصر المعلقة في badge بجانب حالة الاتصال

## واجهة المستخدم

- **حالة الاتصال**: تظهر في الـ header (🟢 متصل / 🔴 أوفلاين)
- **Badge المزامنة**: يظهر عدد العناصر المعلقة بجانب حالة الاتصال
- **الإشعارات**: تظهر تلقائياً عند نجاح/فشل المزامنة

## API Endpoints

### `GET api/offline_sync.php?action=get_reference_data`
جلب البيانات المرجعية (مرضى، أطباء، فحوصات، فروع) للعمل أوفلاين

### `POST api/offline_sync.php?action=sync_patients`
مزامنة المرضى
```json
{
  "patients": [
    {
      "temp_id": "temp_123",
      "full_name": "أحمد محمد",
      "phone": "07701234567",
      ...
    }
  ]
}
```

### `POST api/offline_sync.php?action=sync_orders`
مزامنة الطلبات
```json
{
  "orders": [
    {
      "temp_id": "temp_456",
      "patient_id": 123,
      "tests": [1, 2, 3],
      ...
    }
  ]
}
```

### `POST api/offline_sync.php?action=sync_results`
مزامنة النتائج
```json
{
  "results": [
    {
      "order_item_id": 456,
      "result_value": "120",
      "flag": "normal"
    }
  ]
}
```

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

1. **الأمان**: جميع الـ API endpoints تتطلب تسجيل دخول
2. **البيانات المرجعية**: يتم تحديثها تلقائياً عند المزامنة
3. **عدد المحاولات**: النظام يحاول المزامنة حتى 5 مرات قبل الفشل
4. **التوافق**: يعمل على جميع المتصفحات الحديثة التي تدعم IndexedDB و Service Workers

## الخطوات التالية (اختياري)

لتحسين النظام أكثر، يمكن:
- إضافة واجهة لعرض قائمة الانتظار
- إضافة إمكانية إعادة المحاولة يدوياً
- إضافة تصدير/استيراد البيانات المحلية
- إضافة تشفير للبيانات المحلية
