قرار تصميم · UX Decision — لا كود اتغيّر

إدخال الدواء: تبويب في فورم المنتج، ولا فورم «إضافة دواء» مستقلة، ولا زرار بيفتح نفس الفورم مهيّأة؟

سؤالك: «الأفضل فورم منتجات واحدة للشاشة، ولا نعمل زرار جديد في المنتجات اسمه "إضافة دواء" يكون فيه كل ما يخص الدواء في فورم واحد؟ أنهي أفضل؟» — الورقة دي بتعرض التلات احتمالات بصورهم، وتقارنهم بصراحة، وتقول لك في الآخر توصية واحدة واضحة مع سببها، وإيه اللي ممكن يغيّرها.

النطاق: واجهة فقط — الباك إند صفر تغيير التوصية: الخيار ج ٢ أغسطس ٢٠٢٦ · moonui2 · hazemdev2 الحالة: مستنّي قرارك

١ السؤال — والحقايق اللي بنقرر فوقها

السؤال بالبلدي:

الصيدلي اللي هيدخّل ٥٠ دواء — نسيبه في فورم المنتجات العادية بتبويب «دواء»، ولا نعمل له فورم مخصوصة اسمها «إضافة دواء» فيها كل حاجة في صفحة واحدة؟

الحقايق من الكود (مش رأي — واقع)

تبويبات فورم المنتج الحالية
5
مدخل الحفظ في الـAPI
1 بس
حجم كومبوننت المنتجات
~٢١٠٠ سطر
فورم موازية اتعملت قبل كده وانحرفت
WebStore

⚠ الدرس اللي اتحرقنا بيه قبل كده — وهو اللي بيحسم السؤال ده

عملنا قبل كده مسار منتجات موازٍ في موديول المتجر الإلكتروني (AdminProductRequest/AdminProductController جنب مسار الكور) — والاتنين انحرفوا عن بعض فعلًا: واحد بيتحقق من type بـRule::in والتاني بـRule::enum، وواحد بيقبل manufacturer_id والتاني لأ. ومعانا كمان يتيمين من نفس النوع: brands وmanufacturers — باك إند كامل من غير أي شاشة توصله (لحد قريب).

القاعدة المستخرجة: كل فورم تانية لنفس الكيان = مسار كود تاني، وكل حقل منتج جديد في المستقبل هيتضاف مرتين — أو ينسى في واحدة وينحرفوا في صمت. دي مش نظرية — دي حصلت عندنا بالفعل.

٢ أ الخيار أ — فورم واحدة بتبويب «دواء» (اللي متبني دلوقتي)

اللي الصيدلي بيشوفه النهارده: يفتح «منتج جديد» → يفعّل «دواء» في أول تبويب → تبويب الدواء يظهر خامسًا
منتج جديد
بيانات أساسيةتفاصيلمتغيّرات وأكثرمرفقات 💊 دواء
أوجمنتين ١جم
Augmentin 1g
منتج ▾
أدوية ▾
6221001234567
قرص ▾
هذا الصنف دواءلما يتفعّل — تبويب «دواء» بيظهر في آخر الصف.
مفعّلالصنف متاح للحركات.
مشكلة الـ٥٠ دواء: الصيدلي لازم يفعّل العلم بإيده كل مرة، ويلف على التبويبات (أساسية → متغيّرات → دواء)، ولما يحفظ النافذة بتقفل ويرجع للقايمة يدوّر على الزرار تاني. خمسين لفّة كاملة.
حفظإلغاء

ليه أ كويس

  • صفر تكلفة — متبني وشغّال خلاص.
  • مصدر حقيقة واحد: فورم واحدة، تحقق واحد، مسار حفظ واحد. أي حقل جديد يتضاف مرة واحدة.
  • تعديل دواء قديم وتعديل منتج عادي — نفس التجربة، مفيش «أنا أعدّله منين؟».
  • المنتجات العادية مش حاسّة بأي حاجة.

ليه أ مش كفاية لوحده

  • مش متصمّم لإدخال ٥٠ دواء ورا بعض: كل دواء = فتح نافذة + تفعيل علم + لفّ تبويبات + حفظ يقفل النافذة.
  • تبويب الدواء مستخبي لحد ما العلم يتفعّل — الصيدلي الجديد ممكن أصلًا ما يعرفش إنه موجود.
  • ترتيب الحقول ترتيب «منتج عام» مش ترتيب صيدلي: الهوية الدوائية آخر تبويب مش أولها.

٣ ب الخيار ب — فورم «إضافة دواء» مستقلة تمامًا (اقتراحك)

فورم منفصلة، صفحة أو نافذة واحدة، فيها «كل ما يخص الدواء». تعالى نرسمها بأمانة — ونشوف هي هتضطر تحتوي على إيه:

الفورم المستقلة زي ما هتطلع فعلًا — لاحظ الجزء الأحمر
💊 إضافة دواء
الهوية الدوائية ✔ (ده الجزء «الدوائي» الحقيقي)
أوجمنتين ١جم
أموكسيسيلين ٨٧٥مج ✕كلافولانيك ١٢٥مج ✕
قرص مغلّف ▾
١٠٠٠ مج
J01CR02
أقل من ٢٥° ▾
⚠ وبعدين إجباريًا: كل اللي جاي منسوخ من فورم المنتج — لإن الدواء بيتخزّن ويتباع
أدوية ▾
6221001234567
شركة التوزيع ▾
١٤٪ ▾
الوحدةالمعاملباركودسعر شراءسعر بيعتُباعتُشترى
قرص١٠٫٤٨٠٫٩٦
شريط١٠62210…٤٫٥٠٨٫٩٠
علبة١٠٠62211…٢٤٫٠٠٤٨٫٠٠
هنا المقلب: «كل ما يخص الدواء» طلع هو ~٨٠٪ من فورم المنتج نفسها — الوحدات والأسعار والباركود والمورّد والضريبة كلهم «بيخصّوا الدواء». يعني الفورم «المستقلة» هي نسخة تانية من فورم المنتج بترتيب مختلف. ومن اليوم ده: أي حقل منتج جديد يتضاف مرتين، وأي إصلاح باج يتعمل مرتين — أو ينسى في واحدة. بالظبط زي ما حصل في WebStore.
حفظإلغاء

ليه ب مغري (بأمانة)

  • أوضح حاجة للصيدلي: زرار مكتوب عليه «إضافة دواء»، صفحة واحدة، ترتيب حقول صيدلي، مفيش تبويبات يلف عليها.
  • ممكن تتصمم من الأول لإدخال متتالي سريع.
  • لو افترضنا إن الدواء كيان مختلف فعلًا بدورة حياة مختلفة — كانت هتبقى الإجابة الصح. بس هو مش كده عندنا.

ليه ب غلط في نظامنا تحديدًا

  • مسار كود تاني كامل فوق مدخل API واحد: فورم تانية + تحقق تاني + حالة NgRx تانية أو ازدواج في نفس الكومبوننت الـ٢١٠٠ سطر.
  • الانحراف مضمون مش محتمل — عندنا الدليل الحي (WebStore) على إن نسختين لنفس الكيان بينحرفوا حتى في نفس الريبو.
  • يخلق سؤال دائم: «الدواء ده أعدّله من فورم الدواء ولا فورم المنتج؟» — والاتنين لازم يفضلوا شغّالين للأبد.
  • أغلى خيار تنفيذًا (أسابيع مش أيام) — وكل الفلوس دي بتشتري التزام صيانة مضاعف، مش قيمة.

٤ ج الخيار ج — زرار «إضافة دواء» بيفتح نفس الفورم مهيّأة للصيدلي

الفكرة: الصيدلي ياخد اللي عايزه من ب — زرار باسم «إضافة دواء» وتجربة مرتّبة له — من غير ما النظام يدفع تمن فورم تانية. نفس النافذة، نفس التحقق، نفس مسار الحفظ، نفس الـAPI. الفرق كله تهيئة: العلم متفعّل من الأول، تبويب الدواء ظاهر وجاهز، وزرار «حفظ + دواء تاني» بيخلّي الـ٥٠ دواء سلسلة مش ٥٠ لفّة. (دي نفس فلسفة «إدخال منتجات متعدد» الموجودة عندنا — سطح مركّز فوق نفس الكيان.)

٤-١ نقطة الدخول — في شاشة المنتجات

شريط أدوات قايمة المنتجات — الزرار الجديد جنب الموجودين
المنتجات 💊 إضافة دواء جديد + منتج جديد إدخال متعدد
🔍 بحث…
التصنيف: الكل ▾
النوع: الكل ▾
الكودالاسمالتصنيفالنوعسعر البيع
P-1042أوجمنتين ١جم 💊أدويةمنتج٤٨٫٠٠
P-1041بانادول أدفانس 💊أدويةمنتج١٨٫٠٠
P-0977شاش معقّم ١٠×١٠مستلزماتمنتج٧٫٥٠
الزرار الأخضر مش بيفتح فورم تانية — بيفتح نفس نافذة المنتج بس «مظبوطة على وضع الصيدلي».

٤-٢ الفورم بعد ما تتفتح من الزرار — نفس النافذة، متهيّأة

نفس نافذة المنتج بالظبط — الأخضر = الفرق اللي التهيئة عملته
💊 إضافة دواء (٣ من جلسة الإدخال)
💊 دواء + أساسياتمتغيّرات وأكثرتفاصيلمرفقات
علم «دواء» متفعّل تلقائيًا ✔ · تبويب الدواء ظاهر من أول لحظة ومفتوح · الحقول اللي الصيدلي بيبدأ بيها متجمّعة فوق.
١ — الاسم والتعريف
بروفين ٤٠٠
Brufen 400
6224000823141
٢ — الهوية الدوائية
إيبوبروفين ٤٠٠مج ✕ + إضافة…
قرص مغلّف ▾
٤٠٠ مج ▾
يُصرف بروشتة
مقيَّد/مخدِّر
أبوت ▾
أدوية ▾
٣ — العلبة والسعر (نفس جدول «متغيّرات وأكثر»)
الوحدةالمعاملباركودسعر شراءسعر بيع
قرص (أساسية)١٠٫٣٠٠٫٦٠
شريط١٠62240…٢٫٨٠٥٫٥٠
حفظ + دواء تاني ⏎ جديد حفظ وإغلاق إلغاء

اللي بيخلّي الـ٥٠ دواء سريعين فعلًا — مش الزرار، دول التلاتة:

ليه ج هو الصح

  • مصدر حقيقة واحد للأبد: نفس الفورم، نفس التحقق، نفس مسار الحفظ. أي حقل جديد يتضاف مرة واحدة ويظهر في الوضعين تلقائيًا.
  • الصيدلي شايف زرار «إضافة دواء» وواخد تجربة صيدلي — اللي كان هياخده من ب، من غير تمنها.
  • تنفيذ رخيص: واجهة بس، ملف واحد أساسًا، أيام مش أسابيع. الباك إند صفر تغيير.
  • تحسين «حفظ + تاني» بيفيد المنتجات العادية كمان ببلاش.

وبأمانة — سلبياته

  • الكومبوننت الـ٢١٠٠ سطر هيكبر شوية كمان (وضع تهيئة + منطق الحفظ-والتالي). قابل للإدارة، بس لازم نعترف بيه.
  • مش «صفحة صيدلي نقية» زي ب — الصيدلي لسه شايف تبويبات تفاصيل ومرفقات (حتى لو مأخّرين).
  • لو اتعمل زرار بس من غير «حفظ + تاني» والحقول اللاصقة — مكسب السرعة بيضيع وهترجع تطلب ب بعد شهر. فالتلاتة دول جزء من التعريف مش رفاهية.

٥ جدول المقارنة

المعيار أ تبويب دواء (الحالي) ب فورم مستقلة ج نقطة دخول مهيّأة
سرعة إدخال ٥٠ دواء بطيئةفتح + تفعيل علم + لفّ تبويبات + النافذة بتقفل بعد كل حفظ — ٥٠ مرة. سريعةلو اتصممت كويس — بس السرعة دي متاحة بالظبط في ج بجزء من التمن. سريعةحفظ + تاني ⏎ والحقول اللاصقة = سلسلة إدخال متواصلة.
وضوح للصيدلي متوسطتبويب الدواء مستخبي ورا علم لازم يعرفه ويفعّله. عاليزرار باسمه وصفحة على مقاسه. عالينفس الزرار باسمه — والفورم بتتفتح جاهزة من غير أي خطوة تحضير.
تكلفة الصيانة منخفضةفورم واحدة. مضاعفة للأبدكل حقل وكل باج وكل تعديل قانوني (ضريبة/تسعير) في مكانين. منخفضةفورم واحدة + منطق تهيئة صغير معزول.
خطر التعارض / الانحراف صفر مؤكَّد بالتجربةسابقة WebStore: نسختان في نفس الريبو انحرفتا فعلًا (Rule::in ضد Rule::enum، وmanufacturer_id). صفرمفيش نسخة تانية أصلًا عشان تنحرف.
أثره على المنتجات العادية لا شيء غير مباشرجهد الفريق بيتقسم على فورمين، وأي تحسين بيوصل لواحدة قبل التانية. مكسب«حفظ + تاني» والترتيب الأحسن بيتورّثوا لإدخال المنتجات العادية ببلاش.
تكلفة التنفيذ صفرموجود. أسابيعفورم كاملة + تحقق + حالة + اختبار وضعين للأبد. أيامواجهة فقط، ملف واحد أساسًا، باك إند صفر.

٦ التوصية — الخيار ج، بشرطه

✅ التوصية: زرار «إضافة دواء» يفتح نفس فورم المنتج مهيّأة — ومعاه إجباريًا «حفظ + دواء تاني» والحقول اللاصقة

السبب في جملة واحدة: سؤالك الحقيقي مش «فورم ولا فورمين» — سؤالك «إزاي الصيدلي يدخّل دواء بسرعة ووضوح». والإجابة دي بتتحقق كاملة من التهيئة (زرار باسمه + علم متفعّل + ترتيب صيدلي + إدخال متتالي) من غير ما نعمل أبدًا الحاجة الوحيدة اللي اتحرقنا بيها قبل كده: نسخة تانية من نفس الكيان.

وبشرط واضح: ج من غير «حفظ + دواء تاني» والحقول اللاصقة = زرار شكلي مش هيحل مشكلة السرعة، وهنرجع للنقاش ده تاني بعد شهر. التلات عناصر (الزرار + الحفظ-والتالي + اللاصقة) هم حزمة واحدة غير قابلة للتجزئة.

٧ إيه اللي يخلّيني أغيّر التوصية دي؟

عشان القرار يبقى قابل للمراجعة مش عناد — دي الحالات اللي لو حصلت، الميزان بيتغيّر:

لو حصل إن…يبقى الأصح ساعتها…
الدواء بقى له دورة حياة مختلفة فعلًا — مثلًا سير اعتماد خاص، أو استيراد آلي من سجل الأدوية القومي (EDA)، أو حقول تنظيمية إلزامية مالهاش علاقة بالمنتج ساعتها نعمل معالج (wizard) فوق نفس الـAPI — واجهة مختلفة، لكن برضه مش فورم تحقق تانية ولا مدخل تاني. حتى في أسوأ الحالات، ازدواج مسار الحفظ يفضل خطًا أحمر.
الصيدلية اشتغل فيها موظف إدخال ممنوع يشوف الأسعار أو المشتريات نهائيًا نخفي تبويبات/حقول بالصلاحية جوّه نفس الفورم — دي مشكلة صلاحيات مش مشكلة فورمين.
الإدخال الجماعي بقى هو الوضع الغالب (مش ٥٠ — آلاف الأصناف من ملف مورّد) الحل بيبقى استيراد Excel/CSV أو توسيع «الإدخال المتعدد» الموجود بأعمدة الدواء — مش أي فورم من التلاتة أصلًا. (ولو ده وضعك الحقيقي قول لي دلوقتي.)
الباك إند خطّط فعلًا لمدخل دواء منفصل بعقد مختلف يتعاد فتح النقاش — بس ده مش حاصل ومش مخطَّط، والعكس هو المؤكَّد: باب واحد.

نقطة اختلاف صريحة مع الطرح الأصلي

الميل المبدئي كان «ج» وأنا موافق على الاتجاه — بس بختلف في تعريف ج نفسه: ج المطروح كـ«نفس الفورم بالعلم متفعّل والتبويب مفتوح» مش كفاية لمشكلة الـ٥٠ دواء. اللي بيشتري السرعة فعليًا هو حلقة الإدخال: «حفظ + دواء تاني» اللي بيسيب النافذة مفتوحة + القيم اللاصقة بين دواء والتالي. من غيرهم ج بيبقى «أ بزرار مختصر» — تحسين وضوح بس، مش تحسين سرعة — وهيبان قصوره أول يوم إدخال حقيقي. عشان كده حطّيتهم جوّه تعريف ج كشرط، مش كإضافة اختيارية.

٨ الخطوة التالية لو وافقت — إيه هيتلمس وإيه هيفضل زي ما هو

اللي هيتعدّل (واجهة فقط — تقديرًا يومين لتلاتة شغل)

الملفالشغل تقريبًا
src/app/features/products/products.component.ts دالة فتح جديدة openDrugDialog(): نفس دالة الفتح الحالية + تفعيل is_drug مسبقًا + وضع «جلسة إدخال دواء» · منطق «حفظ + دواء تاني» (بعد نجاح الحفظ: تفضية الفورم مع الاحتفاظ بالقيم اللاصقة، والنافذة تفضل مفاتحة، وعدّاد الجلسة) · قايمة الحقول اللاصقة (تصنيف، شركة مصنِّعة، حرارة تخزين، ضريبة).
src/app/features/products/products.component.html زرار «💊 إضافة دواء» في شريط الأدوات · في وضع الدواء: تبويب الدواء ظاهر ومقدَّم وعنوان النافذة بيتغيّر · زراير «حفظ + دواء تاني / حفظ وإغلاق» في وضع الجلسة · إعادة ترتيب بسيطة تحط الباركود بدري لمسح القارئ.
ملفات الترجمة (ar/en) مفاتيح جديدة: «إضافة دواء»، «حفظ + دواء تاني»، نص عدّاد الجلسة.

اللي مش هيتلمس نهائيًا

المطلوب منك دلوقتي — قرار واحد:

موافق على ج بحزمته الكاملة (زرار «إضافة دواء» + الفورم المهيّأة + «حفظ + دواء تاني» + الحقول اللاصقة)؟ لو أيوه — بنحوّل القسم ٨ لحزمة شغل وننفّذ من غير ما الباك إند يتلمس. ولو الإدخال الجماعي من ملفات المورّدين هو الواقع الأكبر عندك، قول لي — لإن ساعتها الأولوية بتتغيّر لمسار الاستيراد.