الفرق بين «البنل» و«الباكدج» في شاشات Collect / Receive

وضّحت نقطة مهمة: الباكدج حاجة تجارية (مالهاش لازمة في المعمل)، والبنل حاجة معملية (تحليل واحد بأعضاء). الملف ده بيأكّد فهمي للفرق، بيوضّح إن إصلاحي الأخير جمّع بالغلط حسب الباكدج، وبيقترح التصحيح: التجميع بالبنل فقط — في Collect و Receive تظهر أسماء التحاليل (والبنل بأعضائه)، مش اسم الباكدج.

🗓️ 2026-06-09🧬 LIS — Collect / ReceiveBackend-first · Plan before implement

1 الفرق — زي ما فهمته منك

🧪 البنل (Panel) — مفهوم معملي

  • تحليل واحد (is_panel=1) مكوّن من مجموعة sub-tests.
  • في Collect/Receive: يظهر باسم البنل، وتحته أعضاؤه.
  • مثال: CBC → تحته WBC, RBC, HGB...

🛒 الباكدج (Package) — مفهوم تجاري

  • حزمة تجارية = مجموعة تحاليل تتباع مع بعض (للسعر/العرض).
  • ممكن تحتوي بنلات + تحاليل فردية (هرمونات + دم عادي...).
  • في Collect/Receive: اسم الباكدج مالوش لازمة → تظهر التحاليل نفسها.

القاعدة الذهبية

في المعمل (تجميع/استلام) بنفكّر بـالتحاليل والعينات — مش بالعروض التجارية. فالعرض يتجمّع بالبنل (معملي)، وما يتجمّعش أبداً بالباكدج (تجاري).

2 السلوك الصح (أمثلة)

مثال 1 — طلب فيه باكدج «Thyroid Panel» (TSH + FT4 + FT3 كتحاليل فردية)

❌ غلط (إصلاحي الأخير)
تيوب: Thyroid Panel
✅ صح
تيوب: TSH · FT4 · FT3 (بأسمائهم)

مثال 2 — طلب فيه بنل CBC

✅ تيوب: CBC
WBC · RBC · HGB · PLT ... (الأعضاء تحته)

مثال 3 — باكدج «فحص شامل» = CBC (بنل) + Glucose + TSH

✅ يظهر:
CBC (WBC · RBC ...)
Glucose
TSH
↑ اسم الباكدج «فحص شامل» ما بيظهرش — البنل بأعضائه، والباقي بأسمائه.

3 ليه إصلاحي الأخير طلع غلط

في الإصلاح اللي عملته، خلّيت العرض يتجمّع حسب المصدر سواء بنل أو باكدج. فالباكدج جمّع تحاليله تحت اسمه (Thyroid Panel) — وده عكس اللي إنت عايزه.

// اللي عملته (غلط): if (source_panel_id) → جمّع تحت البنل ✅ صح elseif (source_package_id) → جمّع تحت الباكدج ❌ غلط (الباكدج تجاري) // الصح: if (source_panel_id) → جمّع تحت البنل ✅ // الباكدج: مايتجمّعش — كل تحليل يظهر باسمه (أو بنله لو هو بنل)

4 رأيي + الخطة (التصحيح)

رأيي

فهمك صح 100% ومنطقي: المعمل يهمّه التحاليل، مش العروض. التصحيح بسيط ونظيف، وبيخلّي السلوك صح لكل الحالات.

مرحلة 1

تصحيح التجميع في الباك Backend

  • العرض (LabSampleResource + endpoints) يتجمّع بـsource_panel_id فقط (البنل) — ونتجاهل source_package_id في العرض.
  • تحاليل الباكدج الفردية (زي TSH/FT4/FT3) → تظهر بأسمائها.
  • أي بنل (سواء اتطلب مباشرة أو جوّه باكدج) → يتجمّع تحت اسمه. (الـsource_panel_id كمان بيحلّ مشكلة «العضو في بنلين»).
  • نسيب أعمدة المصدر زي ما هي (مفيدة للفوترة) — بس العرض مايستخدمش الباكدج.
مرحلة 2

عرض أعضاء البنل تحته Frontend (اختياري — لو عايز «تحته تفصيله» واضح)

  • في Collect/Receive: البنل يظهر باسمه + أعضاؤه مكتوبين تحته (مش بس في tooltip).
مرحلة 3

تحقّق Backend

  • باكدج Thyroid → Collect/Receive يعرض TSH · FT4 · FT3 (أفراد). ✅
  • بنل CBC → يعرض CBC + أعضاؤه. ✅
  • باكدج فيه بنل + أفراد → البنل بأعضائه + الأفراد بأسمائهم، بدون اسم الباكدج. ✅

5 محتاج تأكيدك

  1. تأكيد القاعدة: التجميع بالبنل فقط في Collect/Receive، والباكدج ما يظهرش (تحاليله بأسمائها)؟
  2. عايز أعضاء البنل مكتوبين تحته في الشاشة (مرحلة 2)، ولا الاسم + tooltip كفاية؟

أول ما توافق، أنفّذ مرحلة 1 فوراً (تصحيح الباك) — وهي رجوع نظيف لسلوك «البنل يتجمّع، الباكدج لأ». والفرونت يعكسها تلقائياً.