# H11.0-P11.1-R42.1 — Legacy KPI Column Ownership Hotfix & Live Diagnostic Closure

## السبب
بعد تطبيق R42 ظهرت أربعة مؤشرات في Hospital Pulse كشرطة `—`:
- Outpatient Visits
- Emergency Visits
- Follow-up Visits
- First Visits

بينما استمرت Admissions وDischarges وScheduled Operations وPerformed Operations كقيم رقمية.

## السبب الجذري
R42 قامت بتأهيل شرط Legacy غير المؤهل `Classcode = 2` بصورة غير صحيحة إلى:

```sql
r.classcode = 2
```

حيث `r` هو `RCP_SERVICE_RESERVATION`. لكن مصدر Legacy القديم استخدم العمود بلا alias، وبقية الكود القديم يوضح ارتباط `CLASSCODE` بجدول `RCP_VISIT` في هذا السياق. لذلك كان الاستعلام مرشحًا للفشل بـ `ORA-00904` ثم تقوم `safeNumber()` بإرجاع null، فتظهر `—` في الواجهة.

## الإصلاح
R42.1 لا تفترض الجدول عشوائيًا. تستخدم نفس Resolver الصارم الموجود لعقد Legacy:

```php
$classCodeExpr = $this->legacyVisitReservationColumnExpr('CLASSCODE');
```

ثم تطبق:

```sql
WHERE {$classCodeExpr} = 2
```

على المؤشرات الأربعة المتأثرة فقط.

## تحسين التشخيص
- أصبح logging لكل KPI يحمل سياقًا واضحًا مثل `legacy_kpi.opd` بدل `safeNumber` العامة.
- أصبحت reconciliation تعزل فشل كل مؤشر على حدة بدل إسقاط snapshot كله عند أول خطأ.

## الحدود
- Oracle schema changes: NONE
- Oracle business data writes by patch: NONE
- Summary refresh is required after apply.
- PASS النهائي يتطلب 8/8 exact live reconciliation ثم Browser acceptance.
- Static PASS ليس Live Oracle acceptance.
