尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Spir Lab Manager — إدارة مختبرات التحليلات المرضية منصة عربية (RTL) لتأجير برنامج إدارة المختبرات: محطات مجانية تعمل على الجهاز نفسه بلا إنترنت، ولوحة إدارة كاملة مدفوعة لكل مختبر بقاعدة بياناته، ومدير رموز للمالك يفعّل المختبرات ويتابعها. • الإطار: Next.js 16 (App Router) + React 19 + TypeScript • الواجهة: Tailwind CSS v4 — عربي RTL، فاتح/داكن، أرقام لاتينية • البيانات: المحطات في المتصفح (IndexedDB)؛ لوحة الإدارة والرموز على Postgres (PGlite مدمج محلياً، أو Postgres مستضاف مثل Neon / Supabase / Railway) • الاستضافة: Vercel查看完整 README ↗
منصة عربية (RTL) لتأجير برنامج إدارة المختبرات: محطات مجانية تعمل على الجهاز نفسه بلا إنترنت، ولوحة إدارة كاملة مدفوعة لكل مختبر بقاعدة بياناته، وصفحة «إدارة الرموز» للمالك تفعّل المختبرات ويتابعها.
خطة المشروع الأصلية ومواصفاته في
docs/PROJECT_REFERENCE.mdوdocs/Laboratory_App_Specification.pdf. استمرارية العمل إذا توقف الموقع:docs/CONTINUITY.md. موقعان مجانيان (Vercel وNetlify) بعنوان واحد ينتقل وحده إلى الاحتياطي إذا توقف الأساسي:docs/NETLIFY_STANDBY.md. استضافة احتياطية على Firebase بالعنوان نفسه إذا توقف Vercel:docs/FIREBASE_STANDBY.md.
تُفتح من صفحة الترحيب /welcome. كل محطة مستقلة تماماً، وبياناتها على الجهاز نفسه،
وتعمل بلا إنترنت بعد أول فتح (نسخة محفوظة عبر public/local-sw.js).
| المحطة | المسار | أبرز ما فيها |
|---|---|---|
| محطة المختبر | /station | إدخال النتائج مع «تمييز» نتيجة بلون على التقرير (وحقول الاستمارات أيضاً) وزر طباعة أسفل النتائج، الاستمارات (إدرار، خروج، سائل منوي، زرع)، تقرير A4/A5، باركود وملصقات أنابيب، سلة محذوفات، نسخ احتياطي |
| المخزن والمشتريات | /store | «المشتريات»، و«المخزن» (الموجود الآن ونتائج بانتظار الصرف)، و«الأصناف» (تحاليل «إدارة الفحوصات» وموادها والأنابيب)، والموردون وتقارير الشراء |
| محطة التدريب والمعلومات | /training | الدليل من الصفر، مكتبة الفحوصات (كل فحوصات محطة المختبر مشروحة)، البروسيجر المطبوع، وضع العرض، الاختبارات والشهادات |
| محطة الجودة والأجهزة | /qc | السيطرة النوعية والأجهزة |
| محطة الكادر والدوام | /roster | الكادر والمناوبات والدوام |
| محطة التواصل | /connect | محادثة داخلية بين حواسيب المختبر، ورسائل مشفّرة لمختبر آخر (اتصال مباشر أو ملف أو صندوق بريد مشفّر)، و«المحادثة العامة» بين كل المختبرات |
| محطة المزامنة | /sync | مزامنة بيانات المحطات بين حواسيب المختبر: بملف، أو تلقائياً عبر مكان المختبر على الخادم، مع زر «إيقاف المزامنة» للحماية — وفيها «رموز الأطباء» |
| نافذة الأطباء | /doctor | مستقلة مثل /license (لا رابط إليها من أي صفحة)، وتُفتح حصراً برمز تفعيل حساب الطبيب من «محطة المزامنة ← رموز الأطباء»، على جهاز الطبيب بلا رمز مختبر: نتائج المراجعين الذين أرسلهم للمختبر، برمز يعطيه إياه المختبر، للمدة التي يختارها المختبر |
| عن التطبيق | /about | شرح التطبيق وكل محطة وميزاتها بصور مبسّطة، البدء السريع، النصائح، الأسئلة الشائعة، البيانات والدعم — مفتوحة للجميع بلا رمز |
مظهر موحّد لكل المحطات: قائمة جانبية بالشكل نفسه (أقسام، ووصف تحت كل صفحة، وأيقونة في مربع، وأرقام تنبيه) — AppSidebar في المخزن والجودة والكادر والتواصل والمزامنة و«عن التطبيق»،
ولمحطة المختبر والتدريب وإدارة الرموز قائمتها الخاصة بالشكل نفسه؛ ولكل محطة لونها (المختبر أخضر مزرق، المخزن كهرماني،
التدريب نيلي، الجودة وردي، الكادر أزرق، التواصل أخضر زمردي، نافذة الأطباء سماوي، المزامنة بنفسجي، «عن التطبيق» أرجواني)، وعنوان كل صفحة بأيقونتها في مربع بلون المحطة
(globals.css). المظهر فقط — لم يتغير شيء في عمل الصفحات.
التنقل: صفحة الترحيب هي المدخل الوحيد للمحطات. لا تحوي أي محطة أو صفحة (ومنها «عن التطبيق» وإدارة الرموز) رابطاً إلى محطة أخرى، بل ترجع كلها إلى صفحة الترحيب. و«نافذة الأطباء» لا ترتبط بأي صفحة أخرى، فلا رابط فيها حتى إلى الترحيب. يتحقق pages.crawl.cjs من ذلك في كل الصفحات. هذا في التنقل فقط، أما ربط البيانات بين المحطات فباقٍ كما هو.
أسفل صفحة الترحيب: اختيار المظهر (فاتح — الافتراضي — أو غامق أو تلقائي حسب الجهاز) لصفحة الترحيب وإدارة الرموز ولوحة الإدارة. لكل محطة (ومنها نافذة الأطباء و«عن التطبيق») مظهرها من إعداداتها، والفاتح هو الافتراضي في كل النوافذ، ونبذة عن SPIR (شركة برمجة)، وسياسة الخصوصية وإخلاء المسؤولية («نحن لا نتحمل أي مسؤولية»).
التواريخ في كل المحطات بأرقام إنكليزية والأشهر أرقام (2026-09-30).
الإعدادات في كل محطة ولوحة الإدارة بنفس الشكل:
#report مثلاً)./license،
ويأخذه الجهاز بـ«نسيت الرمز؟ ← تحديث من المزوّد».محطة التواصل (/connect، تُفعَّل في رمز المختبر مثل باقي المحطات؛ src/lib/connect):
رموز الأطباء ونافذة الأطباء (src/lib/doctors؛ «محطة المزامنة ← رموز الأطباء» و/doctor):
/doctor) مستقلة مثل /license: لا بطاقة لها في صفحة الترحيب ولا رابط إليها من أي صفحة، والمختبر يرسل عنوانها مع الرمز.
لا يظهر فيها شيء قبل إدخال «رمز التفعيل» (رمز الطبيب لدى المختبر)، وإذا أوقف المختبر الرمز أو استبدله تعود شاشة التفعيل.
بعد التفعيل: نتائج كل المختبرات التي فعّل رموزها، مرتبة بالأحدث مع علامة «جديد»
وبحث وتصفية (اليوم / أسبوع / شهر)، وفتح الزيارة كتقرير باسم المختبر وتذييله مع طباعة؛ وإعداداتها رمز الدخول والمظهر و«خروج» يمسح كل شيء.
تعمل بلا إنترنت بآخر نتائج وصلت./license ← الإعدادات العامة مفتاح «نافذة الأطباء» (مفعّل افتراضياً) يوقف الرفع والعرض لكل المختبرات.إيقاف المزامنة («محطة المزامنة ← الإعدادات ← الحماية»): زر لكل حاسوب يوقف إرسال واستقبال أي بيانات — المزامنة التلقائية وملف المزامنة معاً — حتى تشغيلها؛ التعديلات أثناء الإيقاف تُرسل بعد التشغيل.
عن التطبيق (/about): محطة شرح بقائمة جانبية مثل باقي المحطات — نظرة عامة، البدء السريع، صفحة لكل محطة
(المختبر، التقرير المطبوع، المخزن والمشتريات، التدريب، الجودة، الكادر، التواصل، المزامنة، لوحة الإدارة)، البيانات والأمان، النصائح،
الأسئلة الشائعة، والتفعيل والدعم. النص ثابت في src/lib/about/content.ts والصور رسوم مبسّطة (src/components/about/Art.tsx)
تعمل بالمظهرين وبلا إنترنت. إعداداتها رمز الدخول (PIN) والمظهر وحجم الخط فقط، ولا يُعدَّل فيها شيء من المحتوى. لا تحتاج رمز مختبر.
الدليل (/training/guide، أول ما في محطة التدريب): دليل كامل من الصفر في 13 فصلاً (src/lib/training/guide.ts):
المختبر ورحلة العينة والوحدات، السلامة، الأجهزة والأدوات، التيوبات وترتيب السحب، سحب العينة، الفصل وجودة العينة،
أقسام الفحوصات وأهميتها والحزم الشائعة، طرق الفحص، ضبط الجودة (وستغارد)، قراءة النتيجة والقيم الحرجة وأنماط التشخيص،
كتابة التقرير، قاموس المصطلحات، وفهرس الفحوصات. أدوات المختبر وتيوباته وأقسامه وفهرسه تُملأ من بيانات المحطة نفسها.
يُتصفّح بفهرس جانبي وبحث، ويُطبع كتاباً (غلاف ومحتويات وكل فصل في صفحة جديدة) أو فصلاً واحداً.
training.guide.v1 (ومع النسخة الاحتياطية للمحطة)، و«النص الأصلي» يعيد فصلاً
أو الدليل كله. المكونات: GuideView.tsx (العرض والطباعة) وGuideEditor.tsx (التعديل)./training/manual).مكتبة التدريب: تأتي محطة التدريب بكل فحوصات محطة المختبر (92 فحصاً + صورة الدم الكاملة، src/lib/training/library*.ts) بأقسامها،
ولكل فحص: الغرض ومبدأ الطريقة، والعينة والحجم والتيوب وتحضير المريض والحفظ، وخطوات العمل (مع تحذيرات)، وملاحظات الخبرة،
والقيم الطبيعية (من قائمة محطة المختبر نفسها)، وأسباب الارتفاع والانخفاض، والربط بالفحوصات الأخرى، وحل المشاكل؛ مع التيوبات
والأجهزة اللازمة (محلل الأملاح، محلل المناعة، ELISA، الكاسيت، اللاتكس، أوساط الزرع…). المحطات القديمة تُضاف إليها الفحوصات
الناقصة مرة واحدة دون تغيير ما عدّلته، و«الإعدادات ← الجهاز والبيانات ← إضافة فحوصات المكتبة الناقصة» يعيد ما حُذف.
سجل المتدربين (/training/trainees): لكل متدرب أو موظف سجل الكفاءة وشهادة الإتمام (عند الاستقلالية)، ومعهما:
شهادة انتهاء التدريب (تاريخ الانتهاء، البرنامج، الساعات، التقدير، المشرف، ورقمها يُحفظ) مطبوعة بعرض A4،
وكتاب توصية لمتدرب أو موظف سابق (المسمى، الفترة، الجهة، نص مقترح يُعدَّل، اسم الموصي ومنصبه) مطبوع على ترويسة المحطة.
ربط المحطات (كلها عدا التدريب، على الحاسوب نفسه):
محطة المزامنة (/sync، بلون بنفسجي): نظرة عامة بلوحة حالة (متزامن / يحتاج مزامنة)، وهذا الحاسوب وسجلاته لكل محطة، وآخر العمليات؛
«المزامنة بملف» بإرسال واستقبال جنباً إلى جنب مع سحب الملف وإفلاته ومعاينة ما فيه ونتيجة بالأرقام؛ وسجل مجمّع بالأيام مع تصفية.
«ملف المزامنة» يُصدَّر من حاسوب ويُدخل في آخر (يُضاف الناقص، ويؤخذ الأحدث، ويُحذف ما حُذف لاحقاً)،
أو «المزامنة التلقائية» (كل 30 ثانية ما دامت السجلات تتغير، وتتباطأ حتى كل 5 دقائق إذا لم يتغير شيء، وفورية بعد أي تعديل) عبر مكان المختبر على الخادم (/api/company-sync، بالترخيص الموقّع للجهاز فقط)،
أو عبر «خادم الشبكة المحلية» (LAN_HUB_KEY) على حاسوب المختبر بلا إنترنت. من إعداداتها تُختار المحطات المشتركة.
كمية صنف المخزن لا تتبع «الأحدث يغلب»: كل حاسوب يحفظ ما أضافه وما صرفه، والكمية مجموعها، فإذا صرف حاسوب 2 واشترى آخر 10
قبل المزامنة تُجمع الحركتان معاً (src/lib/local/stockTally.ts). أما بقية حقول الصنف فيُؤخذ فيها الأحدث.
المخزن والمشتريات: بيانات المخزن مشتركة مع محطة المختبر والجودة على الجهاز نفسه:
/store، و/store/inventory تفتحها على المخزن) صفحة واحدة بتصميم محطة المورّد، و«الموردون» تحتها في القائمة:
بطاقات الأرقام (الأصناف، النفاد، قرب الانتهاء، قيمة المخزن، المصروف، غير المدفوع)، ثم «إدخال مخزني»: «شراء من مورّد» أو «رصيد افتتاحي / تسوية» (يدخل المخزن فقط)،
وفي الشراء «مدفوعة»، ثم جدول البنود — Enter في خانة المجموع يضيف سطراً.
اسم المورّد ورقم فاتورته مخفيان، ويظهران بخيار «اسم المورّد ورقم الفاتورة» في «الإعدادات ← خيارات إضافية» (ودائماً مع «ديون الموردين»)؛
والتاريخ تاريخ اليوم تلقائياً، وخانته تظهر بخيار «تاريخ الشراء». كل سطر: النوع صنف أو كت (قائمتان منفصلتان)،
الجهاز (اختياري، يُحفظ على الصنف ويأتي معه في الشراء التالي) والمادة في عمودين (يظهر رصيدها إن كانت في المخزن، أو «صنف جديد»)، العدد (مثلاً 1 كت ← «يُضاف إلى المخزن: كاشف × 30»)،
الاكسباير واللوت (اختياريان؛ يُكتبان على الصنف في المخزن، ويبقى أقرب اكسباير)، سعر الواحد والمجموع
(أيهما كُتب حُسب الآخر، وتغيير العدد يُبقي سعر الواحد؛ وللكت من صنف واحد يظهر سعر الوحدة التي فيه، مثلاً 60,000 ÷ 30 = 2,000).
الكت: اختيار «كت» يُظهر «عدد في الكت» — من تعريف الكت، أو يُكتب لمادة تُشترى بالكت (العدد × عدد الكتات يدخل المخزن،
ويأخذ الصنف سعر الوحدة). الاقتراحات: «الجهاز» يقترح أجهزة المختبر، و«المادة» بعد اختيار الجهاز موادّه المحفوظة ثم مواده
المقترحة من دليل المواد (فتملأ جهازها وتحاليلها)، والكتابة اليدوية لمادة جديدة متاحة. «التحاليل التي تستعمله» تحت كل سطر
(قائمة «الأصناف» نفسها، أقسامها تُطوى): يُحفظ الربط على الصنف فتحسم منه محطة المختبر مع النتائج.
«طلبية لم تصل بعد»: لا تدخل المخزن ولا تُحسب مصروفاً ولا ديناً حتى «استلام». ومع «الباركود» في الإعدادات: مسح بالقارئ
أو بالكاميرا، وباركود GS1 على العلبة يملأ اللوت والاكسباير ويُحفظ باركوداً للصنف.
تحتها تبويبان: «المخزن والأسعار» (جدول: الجهاز، المادة، الرصيد، الإكسباير، الكلفة، القيمة، الحد الأدنى، الحالة، «استلام كمية»، إضافة وصرف) و«سجل المشتريات» (جدول الأحدث أولاً، بحث بالمورّد أو الفاتورة أو الصنف، تصفية «الكل / غير مدفوعة / مدفوعة /
بانتظار الاستلام»، تحديد وحذف جماعي، «تم الدفع» والنقر على «مدفوعة» يرجعها، والنقر على البنود يعرض تفاصيلها)./store/inventory، تبويب «المخزن والأسعار» في صفحة «المشتريات والمخزن والأسعار» نفسها): كل صنف بكميته بخط كبير و«نفد / ناقص»، وتصفية «نفد أو ناقص» و«قرب الانتهاء»،
و«إضافة» و«صرف» في نافذة الكمية (1 افتراضياً، Enter للحفظ)، وزر سجل حركته وتعديله./store/items): «صنف جديد» (مع «الجهاز»)، و«كت جديد»، و**«مواد وأجهزة الفحوصات»**: دليل لكل جهاز في المختبر وموادّ فحوصاته
( — كاشف لكل فحص، وكواشف تشغيلة CBC والأملاح مربوطة بفحص واحد، والمواد اليومية «مستلزم»، والفحوص
المحسوبة بلا مواد)، تُضاف بكمية 0 مع جهازها وتحاليلها، والموجود يأخذ ما ينقصه. وعلامتا تبويب:
فحص الإدرار العام (G.U.E): الخلايا (القيح وكريات الدم الحمراء) والفحوص الكيميائية (الألبومين، السكر، الكيتون، الصفراء) بالإشارات Nil, +, ++, +++, ++++, More than (++++) — بدون أرقام وبدون Trace.
التقرير المطبوع في محطة المختبر (الإعدادات):
src/components/station/ReportWaves.tsx،
مرسومة SVG فتُطبع حادة بلا صور، ومثبّتة في الطباعة فتظهر في كل صفحة). ومعها ألوان «تيل وأزرق». الورق المطبوع مسبقاً يبقى بلا تصميم.src/lib/station/fillPage.ts): ملء ذكي يقيس الفراغ الفعلي في الورقة
ويكبّر الجدول حتى يملأه (ويبقى في صفحة واحدة)، التكبير حسب حجم الورق (أكثر على A4 وأقل على A5)، مربع ملاحظات
بأسطر للكتابة باليد فوق التوقيع، تكبير الترويسة ومعلومات المريض، عرض البطاقة لفحص أو فحصين (النتيجة بخط كبير)،
النتيجة السابقة عند وجود مساحة، ودرجة التكبير (خفيف / متوسط / كامل).//collect، للمدير والاستقبال ودور «ساحب الدم»):
/lab، للمدير والفني) — تعمل مثل محطة المختبر، بلا أسعار:
lab_settings).supabase/migrations/0030_desk_workflow.sql (تُضاف لقاعدة الموقع تلقائياً عند أول استعمال)./quality): المحاليل الضابطة بمستوياتها، السيطرة اليومية بقواعد Westgard (1-2s، 1-3s، 2-2s، R-4s، 4-1s، 10x)،
مخطط Levey-Jennings الشهري مع الإحصاء والطباعة، سجل درجات الحرارة صباحاً ومساءً (والإجراء عند الخروج عن الحدود)،
والأجهزة: الصيانة الدورية (يومي … سنوي)، المعايرة وموعدها، والأعطال حتى إصلاحها. والتشغيلات السريعة القديمة باقية./staff): الراتب، «جدول المناوبات» الأسبوعي (مناوبة كل موظف في كل يوم أو عطلة، والمناوبات وأوقاتها تُعدَّل،
وعدد كل مناوبة في كل يوم، والطباعة — 0032_staff_schedule.sql)، «الحضور والانصراف» بضغطة (وبداية الدوام للتأخير)، «الإجازات والسُّلف»،
و«الرواتب» الشهرية: الراتب − (الغياب والإجازة بدون راتب × الراتب ÷ 30) − سُلف الشهر، مع الطباعة./license/licenses يحوّل إلى /license.)SPIR-RENEW.…): يُنسخ من تفاصيل الرمز (أو يُرسل بزر «إرسال بواتساب») ويُلصق في خانة الرمز على جهاز مقفل فيفتحه دون الاتصال بالموقع./sync/backup): كل المحطات في ملف واحد، و«الحفظ التلقائي» في مجلد يومياً أو أسبوعياً (آخر 10 نسخ)،
وتذكير في المحطات بعد أسبوع بلا نسخة، وزر تنزيلها في شاشة القفل. بها ينتقل المختبر إلى حاسوب أو عنوان آخر.
«كلمة مرور النسخ» (اختيارية لكل جهاز) تشفّر كل نسخة شاملة منه (XChaCha20-Poly1305 من @noble، فتعمل على عنوان http:// في الشبكة أيضاً)، وتُطلب عند الاستعادة./about/status): ما يعمل الآن على الجهاز، وما يبقى يعمل إن توقف الموقع وبدائله.scripts/local/start-lab.cmd / )، و لاستضافة بديلة.npm install
npm run dev
admin / admin123.LICENSE_ADMIN_PASSWORD، فتفتح المحطات بلا رمز.انظر .env.example للتفاصيل. أهمها:
| المتغير | الغرض |
|---|---|
DATABASE_URL | Postgres المستضاف للموقع. بدونه: PGlite (مؤقت على Vercel). |
AUTH_SECRET | سر توقيع الجلسات وتشفير روابط قواعد المختبرات ومفتاح الرموز. إلزامي في الإنتاج. بدونه (مثل النسخة المحلية) تُوقَّع الجلسات بسرّ عشوائي يُنشأ مرة واحدة ويُحفظ في قاعدة بيانات الموقع (الجدول app_secrets)، لا بمفتاح مكتوب في الكود. |
LICENSE_ADMIN_PASSWORD | كلمة مرور المالك لـ /license، ووجوده يشغّل منظومة الرموز. |
LICENSE_URL | قاعدة مستقلة للرموز (مستحسن). بدونه تُستخدم DATABASE_URL. |
LICENSE_2FA_OFF | 1 لإيقاف التحقق بخطوتين مؤقتاً عند فقدان الهاتف. |
STATION_ACTIVATION_CONTACT | سطر التواصل على شاشة التفعيل (يُعدَّل أيضاً من /license). |
NEXT_PUBLIC_BASE_URL | عنوان الموقع لروابط QR (يُستنتج تلقائياً إن لم يُضبط). |
NEXT_PUBLIC_STATION_SYNC | 1 لإظهار مزامنة المحطات مع قاعدة المختبر (موقوفة افتراضياً). |
ANTHROPIC_API_KEY / ANTHROPIC_MODEL | المساعد الذكي في لوحة الإدارة (اختياري). |
WHATSAPP_CLOUD_TOKEN / WHATSAPP_PHONE_ID | واتساب Cloud API الرسمي (اختياري؛ بدونه روابط wa.me). |
LAB_POOL_IDLE_MIN / LAB_POOLS_MAX | إغلاق اتصالات قواعد المختبرات الخاملة وحدّها الأقصى. |
PGSSL / PGPOOL_MAX / PGLITE_DATA_DIR | ضبط الاتصال بـ Postgres ومكان بيانات PGlite. |
لا تُكتب قيم الأسرار في المستودع أو في المحادثات؛ تُضبط في إعدادات Vercel فقط.
DATABASE_URL.LICENSE ← LICENSE_URL.AUTH_SECRET (openssl rand -base64 48) وLICENSE_ADMIN_PASSWORD.main؛ كل تغيير يمر بطلب دمج تُشغَّل عليه الاختبارات.الهجرات تحت supabase/migrations تُطبَّق تلقائياً على قاعدة الموقع وعلى قاعدة كل مختبر
(جداول لوحة الإدارة فقط؛ جداول الرموز تبقى في قاعدة الرموز).
npx tsc --noEmit # الأنواع
npm run lint # ESLint (الأخطاء تُفشل الفحص، والتحذيرات تُعرض فقط)
npm run build
اختبارات المتصفح (Playwright) تعمل على خادم مشغَّل:
# الرموز موقوفة: المحطات والاستمارات والصفحات ولوحة الإدارة
PORT=3456 npm start &
E2E_BASE=http://localhost:3456 npm run test:e2e
# الرموز مفعّلة: إدارة الرموز وقواعد المختبرات (يحتاج Postgres في E2E_PG_URL)
PORT=3457 LICENSE_ADMIN_PASSWORD=… AUTH_SECRET=… LAB_DB_ALLOW_PRIVATE=1 npm start &
E2E_BASE=http://localhost:3457 E2E_PG_URL=postgresql://… npm run test:e2e:codes
.github/workflows/tests.yml) تشغّل كل ذلك على كل دفع وطلب دمج، مع خدمة
Postgres 16.security.yml) أسبوعياً وعند كل تغيير في الحزم.src/app/ الصفحات والمسارات (المحطات، لوحة الإدارة، /license، /api)
src/components/ مكونات الواجهة (station/ للمحطة، local/ للمحطات المحلية، training/ …)
src/lib/db/ الاتصال بقواعد البيانات وتوجيه كل مختبر إلى قاعدته أو قسمه
src/lib/license/ منظومة الرموز والأجهزة وقواعد لوحة الإدارة
src/lib/station/ بيانات محطة المختبر وقوالب الاستمارات وشكل التقرير
supabase/ الهجرات والبيانات التجريبية
public/local-sw.js النسخة المحفوظة للعمل بلا إنترنت (بعد حفظها تُفتح الصفحات منها دائماً، والتحديث يُعرف من /api/build)
tests/e2e/ اختبارات المتصفح
src/lib/purchasing/catalog.ts/store/count) بتصميم محطة المورّد: لكل جهاز موادّه، وما صُرف في الفترة (منذ آخر جرد افتراضياً، أو كل المدة، أو من — إلى)
والمتبقي في السجل، ثم العدد الفعلي (اختياري) والفرق؛ «أعمدة إضافية»: الإكسباير، الوارد، قيمة المتبقي، الكلفة. «حفظ الجرد» يصحّح المعدود فقط
مع تاريخه وملاحظته، والفروقات في «سجل الحركة»؛ و«سجل الجرد» بمحضر لكل جرد، و«طباعة ورقة الجرد» للعدّ بالقلم./store/reorder): المواد عند حدّها الأدنى أو التي لا تكفي صرف N يوماً (حسب معدّل آخر 90 يوماً)، مجمّعة حسب آخر مورّد؛
الكمية والمورّد يُعدَّلان، و«طلب شراء» للطباعة، و«إرسال إلى المشتريات» يسجّلها طلبية «بانتظار الاستلام»./store/moves): كل تغيّر في الكمية (شراء، حذف شراء، نتائج، سيطرة، إضافة/صرف يدوي، جرد، تعديل) مع الكمية بعده
(station.stockMoves.v1، آخر 3000 حركة).station.stockUsed.v1 وstation.stockUsedQc.v1)./inventory/referrers/codes، للمدير): رمز لكل طبيب محيل يحفظه المختبر، فيختم الخادم نتائج مراجعيه المعتمدة
ويرفعها لـ«نافذة الأطباء» عند كل اعتماد وتسليم (بلا حاجة لحاسوب يبقى مفتوحاً)./settings/import، للمدير): ملف النسخة الاحتياطية لمحطة المختبر — فحوصاتها (الناقص يُضاف للكتالوج)،
ومراجعوها وأطباؤها وزياراتها بنتائجها، كل زيارة مرة واحدة، بلا أسعار وبلا خصم من المخزون.supabase/migrations/0031_quality_staff_stock.sql./cashbox): الداخل لليوم (دفعات الفواتير، والطلبات المعلَّمة «مدفوع» عند الاستقبال بلا فاتورة) حسب طريقة الدفع،
والمصروف (يُضاف من الصفحة نفسها)، والصافي، والمتوقع نقداً في الصندوق؛ «إغلاق اليوم» بالمعدود والفرق (cash_closings) مع إعادة الفتح؛
وملخص الشهر: الداخل والمصروفات (حسب التصنيف) والمشتريات والصافي، وجدول الأيام بحالة إغلاقها؛ مع الطباعة./debts): الفواتير غير المدفوعة أو المدفوعة جزئياً مجمّعة لكل مريض، الباقي ومنذ كم يوم، وتذكير بواتساب برقمه./referrers/commissions): نسبة لكل طبيب محيل (referrers.commission_pct)، وإحالاته في الشهر وما فُوتر عليها
وحصته، وكشف شهري لكل طبيب للطباعة بخانتي التوقيع./login).lab_<id>).src/lib/license/flags.ts)،
فيعمل كل مختبر في قسمه المستقل حتى تُربط قاعدته./verify/<token>.start-lab.shDockerfiledocs/CONTINUITY.md.netlify.toml) خلف عنوان واحد على Cloudflare Workers (deploy/failover-worker/)
يحوّل وحده عند توقف Vercel، بالقاعدة نفسها: docs/NETLIFY_STANDBY.md.apphosting.yaml) بالقاعدة والعنوان نفسيهما: docs/FIREBASE_STANDBY.md./signup)، سجل الأخطاء./doctor.