# تحليل الباك اند الكامل — Moon ERP LIS vs SENAITE

> تاريخ: 2026-03-28
> المصدر: قراءة مباشرة من كود الباك اند + مقارنة بـ SENAITE

---

## ١. حالات النتائج (ResultStatus)

```
الموجود: pending → entered → validated → approved → released

الرجوع: released → approved → validated → entered → pending (returnResult)
Reset: pending/entered → pending (يمسح القيمة)
```

## ٢. حالات التحاليل (InvestigationStatus)

```
pending → collected → received → in_progress → work_completed → results_added → reviewed → approved → published
+ rejected (terminal — مفيش رجوع)
```

## ٣. حالات العينات (SampleStatus)

```
pending → collected → delivered → ready → in_progress → completed → ready_for_result
+ sent_out, rejected
```

## ٤. حالات الطلبات (RequestStatus)

```
pending → sample_collected → in_progress → partial_result → completed
+ cancelled
(تلقائي — بتتحسب من حالة النتائج)
```

## ٥. الـ Events والـ Listeners

### شغالين:
- LabSampleCollected → يحدث حالة الطلب
- LabSampleReceived → ينشئ نتائج + كانبان + تحويلات خارجية
- LabResultEntered → يحدث حالة الطلب + يخصم كاشفات
- LabResultReleased → ينشر تلقائي لو كل النتائج مصدّرة

### **مسجلين بس مفيش listeners (ناقصين!):**
- **CriticalResultDetected** — مفيش إشعار للقيم الحرجة!
- **AllSamplesCollected** — مفيش حاجة بتحصل
- **LabRequestCompleted** — مفيش حاجة بتحصل

---

## ٦. الفجوات الأساسية مقارنة بـ SENAITE

### ناقص تماماً (Critical):

**① سحب النتيجة (Retract)**
- SENAITE: بيعمل نسخة جديدة + القديمة تتجمد
- عندنا: `returnResult` بيرجع حالة بس — مش بيعمل نسخة — بيعدل نفس السجل
- **المطلوب**: `POST /results/{id}/retract` + حالة `Retracted` جديدة + `retracted_from_id`

**② إعادة تحليل (Re-test)**
- SENAITE: بيصدق القديمة تلقائي + بيعمل نسخة جديدة
- عندنا: بس من الكانبان (بيرفض + يعمل عينة جديدة كاملة) — مفيش إعادة على مستوى النتيجة
- **المطلوب**: `POST /results/{id}/retest` + `retest_source_id`

**③ رفض نتيجة فردية (Reject Result)**
- SENAITE: بيرفض analysis واحد من العينة والباقي يكمل
- عندنا: الرفض بس على مستوى الـ investigation أو من الكانبان — مفيش رفض نتيجة مستقل
- **المطلوب**: `POST /results/{id}/reject` + حالة `Rejected`

**④ إبطال نتيجة منشورة (Invalidate)**
- SENAITE: بعد النشر — بيبطل + بيعمل عينة جديدة
- عندنا: **مش موجود خالص**
- **المطلوب**: `POST /results/{id}/invalidate` + حالة `Invalidated` + عينة جديدة

### ناقص (High Priority):

**⑤ عمليات بالجملة (Bulk Operations)**
- bulk-enter, bulk-validate, bulk-approve, bulk-release
- **الموجود**: بس bulk-release (وده مش شغال صح)

**⑥ تنبيه القيم الحرجة**
- الـ event `CriticalResultDetected` موجود بس **مفيش listener**
- **المطلوب**: listener يبعت notification

**⑦ حالات جديدة في ResultStatus**
- Retracted (بعد السحب)
- Rejected (بعد الرفض)
- Invalidated (بعد الإبطال)

---

## ٧. اللي الباك اند بيعمله كويس

- التحقق المزدوج (validate + approve) — أحسن من SENAITE اللي عنده verify واحد
- التقسيم التلقائي (auto-aliquot) + الكانبان
- Events architecture — كويسة بس محتاجة listeners
- المعادلات + delta check
- التحويلات الخارجية
- النشر التلقائي
- تتبع حالة التحليل بالتوازي مع حالة النتيجة

---

## ٨. الـ Endpoints الموجودة وشغالة

### النتائج:
- GET /results ✓ (بس مش بترجع request info ولا sample info)
- POST /results/{id}/enter ✓
- POST /results/{id}/validate ✓
- POST /results/{id}/approve ✓
- POST /results/{id}/release ✓
- POST /results/{id}/return ✓ (بس بيعدل نفس السجل — مش بيعمل نسخة)
- POST /results/{id}/reset ✓ (بس من pending/entered)
- POST /results/{id}/auto-verify ✓
- POST /results/{id}/send-out ✓

### العينات:
- كل الـ endpoints شغالة ✓

### الطلبات:
- كل الـ CRUD + إضافة/حذف تحاليل + تأمين + إلغاء ✓
- مفيش إلغاء تحليل فردي (بس حذف من الطلب)

### الكانبان:
- كل الـ endpoints شغالة ✓
- الرفض بيعمل عينة جديدة ✓

### التقارير:
- GET /result-reports/request/{id}/pdf ✓
- GET /result-reports/request/{id}/preview ✓
- POST /result-reports/publish ✓

---

## ٩. ملخص التاسكات المطلوبة للباك اند

| # | التاسك | الأولوية | التفاصيل |
|---|--------|---------|----------|
| 1 | إضافة `Retracted` + `Rejected` + `Invalidated` لـ ResultStatus | Critical | 3 حالات جديدة |
| 2 | endpoint `POST /results/{id}/retract` | Critical | ينشئ نسخة جديدة + يجمد القديمة |
| 3 | endpoint `POST /results/{id}/retest` | Critical | يصدق القديمة + ينشئ نسخة جديدة |
| 4 | endpoint `POST /results/{id}/reject` | Critical | يرفض نتيجة فردية |
| 5 | endpoint `POST /results/{id}/invalidate` | Critical | يبطل نتيجة منشورة + عينة جديدة |
| 6 | listener لـ CriticalResultDetected | High | إشعار للمشرف/الباثولوجي |
| 7 | bulk-enter, bulk-validate, bulk-approve | High | عمليات بالجملة |
| 8 | إصلاح bulk-release | High | مش شغال حالياً |
| 9 | إضافة request + sample في response النتائج | Medium | GET /results مش بيرجع بيانات الطلب والعينة |
| 10 | `retracted_from_id` + `retest_source_id` في lab_results | Critical | أعمدة جديدة لربط النسخ |
