إدخال الدواء: تبويب في فورم المنتج، ولا فورم «إضافة دواء» مستقلة، ولا زرار بيفتح نفس الفورم مهيّأة؟
سؤالك: «الأفضل فورم منتجات واحدة للشاشة، ولا نعمل زرار جديد في المنتجات اسمه "إضافة دواء" يكون فيه كل ما يخص الدواء في فورم واحد؟ أنهي أفضل؟»
— الورقة دي بتعرض التلات احتمالات بصورهم، وتقارنهم بصراحة، وتقول لك في الآخر توصية واحدة واضحة مع سببها، وإيه اللي ممكن يغيّرها.
النطاق: واجهة فقط — الباك إند صفر تغييرالتوصية: الخيار ج٢ أغسطس ٢٠٢٦ · moonui2 · hazemdev2الحالة: مستنّي قرارك
١ السؤال — والحقايق اللي بنقرر فوقها
السؤال بالبلدي:
الصيدلي اللي هيدخّل ٥٠ دواء — نسيبه في فورم المنتجات العادية بتبويب «دواء»، ولا نعمل له فورم مخصوصة اسمها «إضافة دواء» فيها كل حاجة في صفحة واحدة؟
الحقايق من الكود (مش رأي — واقع)
تبويبات فورم المنتج الحالية
5
مدخل الحفظ في الـAPI
1 بس
حجم كومبوننت المنتجات
~٢١٠٠ سطر
فورم موازية اتعملت قبل كده وانحرفت
WebStore
المنتج بيتضاف من نافذة (dialog) جوّه شاشة القايمة نفسها — مفيش صفحة /products/new أصلًا. النافذة فيها ٥ تبويبات: بيانات أساسية · تفاصيل · متغيّرات وأكثر · مرفقات · دواء (بيظهر بس لما علم «دواء» يتفعّل).
الدواء عندنا منتج عادي ١٠٠٪: ليه مخزون ووحدات وأسعار وباركود وموردين وتصنيفات — تبويب الدواء بيضيف الهوية الدوائية بس (المواد الفعّالة، الشكل الدوائي، التركيز، روشتة/مقيَّد، حرارة التخزين، ATC، الشركة المصنِّعة). ولا حاجة فيه عن الشرا ولا التخزين ولا البيع.
السيرفر ليه باب واحد: POST/PUT /api/core/products بياخد is_drug وdrug_details وactive_ingredients[]. مفيش مدخل دواء منفصل ومش مخطَّط له.
فيه سابقة عندنا خلاص: نافذة «إدخال منتجات متعدد» — سطح إدخال مركّز فوق نفس الكيان ونفس الـAPI، من غير ما حد يعمل كيان تاني. دي بالظبط الفكرة اللي الخيار ج بيبني عليها.
⚠ الدرس اللي اتحرقنا بيه قبل كده — وهو اللي بيحسم السؤال ده
عملنا قبل كده مسار منتجات موازٍ في موديول المتجر الإلكتروني (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
شاش معقّم ١٠×١٠
مستلزمات
منتج
٧٫٥٠
✎
الزرار الأخضر مش بيفتح فورم تانية — بيفتح نفس نافذة المنتج بس «مظبوطة على وضع الصيدلي».
٤-٢ الفورم بعد ما تتفتح من الزرار — نفس النافذة، متهيّأة
نفس نافذة المنتج بالظبط — الأخضر = الفرق اللي التهيئة عملته
💊 إضافة دواء (٣ من جلسة الإدخال)✕
💊 دواء + أساسياتمتغيّرات وأكثرتفاصيلمرفقات
علم «دواء» متفعّل تلقائيًا ✔ · تبويب الدواء ظاهر من أول لحظة ومفتوح · الحقول اللي الصيدلي بيبدأ بيها متجمّعة فوق.
مش «صفحة صيدلي نقية» زي ب — الصيدلي لسه شايف تبويبات تفاصيل ومرفقات (حتى لو مأخّرين).
لو اتعمل زرار بس من غير «حفظ + تاني» والحقول اللاصقة — مكسب السرعة بيضيع وهترجع تطلب ب بعد شهر. فالتلاتة دول جزء من التعريف مش رفاهية.
٥ جدول المقارنة
المعيار
أ تبويب دواء (الحالي)
ب فورم مستقلة
ج نقطة دخول مهيّأة
سرعة إدخال ٥٠ دواء
بطيئةفتح + تفعيل علم + لفّ تبويبات + النافذة بتقفل بعد كل حفظ — ٥٠ مرة.
سريعةلو اتصممت كويس — بس السرعة دي متاحة بالظبط في ج بجزء من التمن.
سريعةحفظ + تاني ⏎ والحقول اللاصقة = سلسلة إدخال متواصلة.
وضوح للصيدلي
متوسطتبويب الدواء مستخبي ورا علم لازم يعرفه ويفعّله.
عاليزرار باسمه وصفحة على مقاسه.
عالينفس الزرار باسمه — والفورم بتتفتح جاهزة من غير أي خطوة تحضير.
تكلفة الصيانة
منخفضةفورم واحدة.
مضاعفة للأبدكل حقل وكل باج وكل تعديل قانوني (ضريبة/تسعير) في مكانين.
منخفضةفورم واحدة + منطق تهيئة صغير معزول.
خطر التعارض / الانحراف
صفر
مؤكَّد بالتجربةسابقة WebStore: نسختان في نفس الريبو انحرفتا فعلًا (Rule::in ضد Rule::enum، وmanufacturer_id).
صفرمفيش نسخة تانية أصلًا عشان تنحرف.
أثره على المنتجات العادية
لا شيء
غير مباشرجهد الفريق بيتقسم على فورمين، وأي تحسين بيوصل لواحدة قبل التانية.
مكسب«حفظ + تاني» والترتيب الأحسن بيتورّثوا لإدخال المنتجات العادية ببلاش.
تكلفة التنفيذ
صفرموجود.
أسابيعفورم كاملة + تحقق + حالة + اختبار وضعين للأبد.
أيامواجهة فقط، ملف واحد أساسًا، باك إند صفر.
٦ التوصية — الخيار ج، بشرطه
✅ التوصية: زرار «إضافة دواء» يفتح نفس فورم المنتج مهيّأة — ومعاه إجباريًا «حفظ + دواء تاني» والحقول اللاصقة
السبب في جملة واحدة: سؤالك الحقيقي مش «فورم ولا فورمين» — سؤالك «إزاي الصيدلي يدخّل دواء بسرعة ووضوح».
والإجابة دي بتتحقق كاملة من التهيئة (زرار باسمه + علم متفعّل + ترتيب صيدلي + إدخال متتالي) من غير ما نعمل أبدًا الحاجة الوحيدة اللي اتحرقنا بيها قبل كده: نسخة تانية من نفس الكيان.
ليه مش ب: لما رسمنا فورم «كل ما يخص الدواء» بأمانة (قسم ٣) طلعت هي نفسها ٨٠٪ من فورم المنتج — لإن الدواء عندنا منتج بمخزون وأسعار ووحدات. يعني ب مش «فورم دواء»، ب هي «فورم منتج تانية» — والسيرفر أصلًا ليه باب واحد. وسابقة WebStore بتقول إن النسختين هينحرفوا مش ممكن ينحرفوا.
وليه مش أ زي ما هو: إدخال ٥٠ دواء بالوضع الحالي عذاب حقيقي (٥٠ فتحة نافذة و٥٠ تفعيل علم). اللي بنى التبويب بنى الهوية الدوائية صح — بس ما بناش سير العمل. ج هو اللي بيكمّل الناقص ده.
وبشرط واضح: ج من غير «حفظ + دواء تاني» والحقول اللاصقة = زرار شكلي مش هيحل مشكلة السرعة، وهنرجع للنقاش ده تاني بعد شهر. التلات عناصر (الزرار + الحفظ-والتالي + اللاصقة) هم حزمة واحدة غير قابلة للتجزئة.
٧ إيه اللي يخلّيني أغيّر التوصية دي؟
عشان القرار يبقى قابل للمراجعة مش عناد — دي الحالات اللي لو حصلت، الميزان بيتغيّر:
لو حصل إن…
يبقى الأصح ساعتها…
الدواء بقى له دورة حياة مختلفة فعلًا — مثلًا سير اعتماد خاص، أو استيراد آلي من سجل الأدوية القومي (EDA)، أو حقول تنظيمية إلزامية مالهاش علاقة بالمنتج
ساعتها نعمل معالج (wizard) فوق نفس الـAPI — واجهة مختلفة، لكن برضه مش فورم تحقق تانية ولا مدخل تاني. حتى في أسوأ الحالات، ازدواج مسار الحفظ يفضل خطًا أحمر.
الصيدلية اشتغل فيها موظف إدخال ممنوع يشوف الأسعار أو المشتريات نهائيًا
نخفي تبويبات/حقول بالصلاحية جوّه نفس الفورم — دي مشكلة صلاحيات مش مشكلة فورمين.
الإدخال الجماعي بقى هو الوضع الغالب (مش ٥٠ — آلاف الأصناف من ملف مورّد)
الحل بيبقى استيراد Excel/CSV أو توسيع «الإدخال المتعدد» الموجود بأعمدة الدواء — مش أي فورم من التلاتة أصلًا. (ولو ده وضعك الحقيقي قول لي دلوقتي.)
الباك إند خطّط فعلًا لمدخل دواء منفصل بعقد مختلف
يتعاد فتح النقاش — بس ده مش حاصل ومش مخطَّط، والعكس هو المؤكَّد: باب واحد.
نقطة اختلاف صريحة مع الطرح الأصلي
الميل المبدئي كان «ج» وأنا موافق على الاتجاه — بس بختلف في تعريف ج نفسه: ج المطروح كـ«نفس الفورم بالعلم متفعّل والتبويب مفتوح» مش كفاية لمشكلة الـ٥٠ دواء.
اللي بيشتري السرعة فعليًا هو حلقة الإدخال: «حفظ + دواء تاني» اللي بيسيب النافذة مفتوحة + القيم اللاصقة بين دواء والتالي. من غيرهم ج بيبقى «أ بزرار مختصر» — تحسين وضوح بس، مش تحسين سرعة — وهيبان قصوره أول يوم إدخال حقيقي. عشان كده حطّيتهم جوّه تعريف ج كشرط، مش كإضافة اختيارية.
٨ الخطوة التالية لو وافقت — إيه هيتلمس وإيه هيفضل زي ما هو
اللي هيتعدّل (واجهة فقط — تقديرًا يومين لتلاتة شغل)
الملف
الشغل تقريبًا
src/app/features/products/products.component.ts
دالة فتح جديدة openDrugDialog(): نفس دالة الفتح الحالية + تفعيل is_drug مسبقًا + وضع «جلسة إدخال دواء» · منطق «حفظ + دواء تاني» (بعد نجاح الحفظ: تفضية الفورم مع الاحتفاظ بالقيم اللاصقة، والنافذة تفضل مفاتحة، وعدّاد الجلسة) · قايمة الحقول اللاصقة (تصنيف، شركة مصنِّعة، حرارة تخزين، ضريبة).
src/app/features/products/products.component.html
زرار «💊 إضافة دواء» في شريط الأدوات · في وضع الدواء: تبويب الدواء ظاهر ومقدَّم وعنوان النافذة بيتغيّر · زراير «حفظ + دواء تاني / حفظ وإغلاق» في وضع الجلسة · إعادة ترتيب بسيطة تحط الباركود بدري لمسح القارئ.
الباك إند بالكامل — POST/PUT /api/core/products زي ما هو، مفيش مدخل جديد ولا تحقق جديد.
NgRx — نفس الـactions/effects/services؛ «حفظ + تاني» بيستخدم نفس أكشن الإنشاء الموجود.
هيكل التبويبات الخمسة وفورم التحقق — بيتعاد ترتيبهم للعرض في وضع الدواء بس، مفيش حقل بيتكرر ولا بيتنقل من مكانه في النموذج.
نافذة «إدخال منتجات متعدد» — زي ما هي (وممكن في مرحلة تانية تاخد أعمدة دواء لو الإدخال الجماعي بقى مطلوبًا).
شاشة تفاصيل المنتج products/:id — زي ما هي.
المطلوب منك دلوقتي — قرار واحد:
موافق على ج بحزمته الكاملة (زرار «إضافة دواء» + الفورم المهيّأة + «حفظ + دواء تاني» + الحقول اللاصقة)؟
لو أيوه — بنحوّل القسم ٨ لحزمة شغل وننفّذ من غير ما الباك إند يتلمس. ولو الإدخال الجماعي من ملفات المورّدين هو الواقع الأكبر عندك، قول لي — لإن ساعتها الأولوية بتتغيّر لمسار الاستيراد.