# SCOUT.md — م7 «Orders, Prescription, Results» codebase map (2026-07-08، read-only)

BE = `/home/moonui/moon-erp-be/Modules/Clinic` · FE = `/home/moonui/public_html/moon-erp/src/app/features/clinic`. Anchors = file:line.

## 0. TL;DR
- **L1 (intents) + decide + L3 (external-result)** مبنية وموصّلة end-to-end (doctor→reception→external result→ClinicalDocument). **REUSE.**
- whitelist النية = **lab/rad فقط** — `clinic_service` مش نية. تعميم النية/النتيجة للمستقل = **NET-NEW.**
- `clinic.lab_mode` (integrated|standalone) **مخزّن بس ماينقراش في أي لوجيك** — "Effects land in م7". توصيله = NET-NEW.
- **صفر favorites** في أي مكان (Clinic/LIS). NET-NEW بالكامل.
- مصدر الأدوية = **Core Products** (`products`)، مفيش كتالوج أدوية عيادي، مفيش `drug_categories`/`dosage_forms`/`dose_instruction_presets`. الكاسكيد/presets = NET-NEW.
- **«كرر آخر روشتة»** موجود على مستوى **previous-visits (م6 WP7)** فقط (ينسخ عبر ClinicPrescriptionService.create)، **مش** جوّه لوحة الروشتة. داخل اللوحة = NET-NEW.
- طباعة **slip أوامر lab/rad مش موجودة**؛ بس طباعة الروشتة موجودة. NET-NEW.

## 1. الطلبات/النوايا (lab+rad)
- **REUSE لوحات م6:** `orders/lab-orders.component.ts` (dual-mode `orderingMode` intent|immediate :79؛ per-row typeahead invSearch$/pkgSearch$ من `ClinicLabOrderService`؛ immediate `submitOrders()` :325؛ intent `recordIntents()` :372؛ free-text :299) · `orders/rad-orders.component.ts` (proc typeahead من `ClinicRadOrderService`؛ `recordIntents()` :270). **UX اليوم = typeahead per-row مش الشبكة القصوى ولا ودجت pick-multiselect.**
- **REUSE النية L1:** `Models/ClinicalIntent.php` (table `clinic_clinical_intents`؛ `externalRefKey()`=`intent:external:{id}`؛ `externalDocument()` :115) · migration `2026_07_02_100000_*` (kind lab|rad، catalog_ref_type lis_investigation|lis_package|rad_procedure، status، decision، service_order_line_id، TenantAware، soft-del) · `Http/Controllers/ClinicalIntentController.php` (store/destroy/forPatient/decide/storeExternalResult/download) · **whitelist `Http/Requests/StoreClinicalIntentRequest.php` CATALOG :26-30 = lis_investigation/lis_package/rad_procedure فقط؛ kind in:lab,rad :52 — `clinic_service` ممنوع (فجوة م7 الأساسية)** · `Actions/DecideClinicalIntent.php` (DB::transaction + lockForUpdate intent+encounter؛ here→OrderLabFromEncounter/CreateRadOrder على ServiceOrder مشترك؛ external→status؛ free-text ماينفّذش here :83).
- **`ordering_mode`:** `Support/OrderingMode.php` (KEY `clinic.ordering_mode`؛ abort 409 لو intent) · `EncounterResource.php:121` · FE `consultation.component.ts:114`.
- **REUSE الاستقبال:** `reception/reception-order.component.ts` — addLine عبر `ClinicOrderService.addLine` (lineTypeOptions consultation|clinic_service|lab|radiology :181) + worklist النوايا (pendingIntents/externalIntents + executeHere/markExternal/decline :564-666 + ExternalResultDialog). **مفيش شاشة طلب منفصلة.** routes `api.php:332-364`.
- **GAP:** مفيش طباعة slip أوامر (grep print/slip/pdf على LabOrderController/RadOrderController = صفر).

## 2. الروشتة
- **REUSE:** `prescription/prescription.component.ts` (DrugRow[] + per-row typeahead drugSearch$ :86 + حقول يدوية dose/frequency/duration/route/instructions؛ `issuePrescription()` :224؛ `printPrescription()` :266) · FE `services/clinic-prescription.service.ts` (**مصدر=Core Products**: `searchDrugs()`→`GET /core/products?search=` :117؛ print RTL HTML in-browser :95) · BE `PrescriptionController.php` ("drug_id→Core Product، لا كتالوج أدوية عيادي") · `Actions/IssuePrescription.php` (validate drug_id exists products :52؛ route in:MedicationRoute) · `Prescription.php`/`PrescriptionItem.php` (dose/freq/duration **free-text strings**).
- **الفلو الحالي:** كتير نقرات، **بلا cascade، بلا autosave**؛ rowValid يطلب drug+dose+freq+duration+route.
- **GAP:** repeat-last داخل اللوحة (NET-NEW) · presets tables (غائبة تمامًا).

## 3. النتايج في كل الأوضاع (تعميم L3)
- **REUSE L3:** FE `orders/external-result-dialog.component.ts` (dialog مشترك للـlab/rad/reception؛ value حر + file pdf/jpg/png ≤10MB؛ POST multipart؛ gate `clinic.results.external`) · BE `Actions/SubmitExternalResult.php` (fail-before-write؛ DB::transaction؛ Attachment polymorphic على intent؛ `updateOrCreate` ClinicalDocument على (company,encounter,ref_key) doc_type=external_result؛ intent External→Resulted؛ rollback على الفشل) · `Models/ClinicalDocument.php`/migration `2026_06_22_160000_*` (doc_type lab_report|rad_report|note|external_result؛ **unique(company,encounter,ref_key)**).
- **مايشتغلش للمستقل:** الإدخال gated على intent.status=external، والنوايا bس lab/rad LIS/free-text. **مفيش مسار نتيجة لـ`clinic_service` مستقل** = جوهر م7 NET-NEW.
- **GAP:** `clinic.lab_mode` معرّف (`ClinicSettingDefinitionSeeder` enum integrated|standalone default integrated group clinic_modes، الوصف: "Effects land in م7") لكن **grep app/ = صفر قراءات**. standalone lab/rad = صفوف `ClinicService` (service_type lab/rad) منفصلة عن LIS.

## 4. Favorites (per-doctor)
- **مش موجودة.** grep favorit/favourite على Clinic BE/FE + LIS = صفر. NET-NEW (migration+model+controller+FE).

## 5. الودجت القابلة لإعادة الاستخدام
- `shared/pick-multiselect/pick-multiselect.component.ts` (م6 WP6b): generic `<T extends {id:number}>`، inputs selected/searchFn/createFn/labelFn/sublabel/placeholder/disabled/minChars؛ outputs add/remove؛ debounce280 switchMap؛ magic-add؛ **dumb-about-persistence**. **chip picker مش grid.** الشبكة القصوى = مكوّن جديد.
- `shared/dynamic-field-renderer/*` موجود.

## 6. أخطاء معروفة (ملاحظة خفيفة)
- **lab tab-switch:** draft rows signals محلية بلا persistence؛ التبديل يعيد load ويفقد المسودة.
- **rad flow:** free-text rad ماينفّذش here (DecideClinicalIntent:83 → 422)؛ الاستقبال يعطّل executeHere للـfree-text (متسق)؛ تحقّق gates صلاحية الأشعة. rad list route `rad-orders`+`encounters/{e}/rad-orders` مختلف عن lab.
- external result **مش** gated على locked (بالقصد؛ إدخال بعد التوقيع مسموح) — نحافظ عليه.

## 7. migrations لمسّ الطلبات/الروشتة/الوثائق/النوايا (serialize الجديد ≥ `2026_07_08_*`)
service_orders(030001) · service_order_lines(030002) · clinical_documents(160000) · rad_procedures/orders/studies/reports(170001-4) · prescriptions(180001)/items(180002) · clinical_intents(2026_07_02_100000) · refund_flag(2026_07_02_160001) · assignment_cols_clinic_services(2026_07_02_170001) · is_followup(2026_07_07_000010) · cashier_disposition(2026_07_07_000020). (lab في Modules/LIS.)

## 8. أسئلة العقد (محسومة في LEDGER)
انظر `LEDGER.md` §القرارات.
