📋 سجل التحديثات
v1.34.0 25-09-2026
  • تغيير🔴 الصفحة اتنقلت من bosta-shipped.html لـBosta-Orders-Shipped-Scanner.html — اسم الملف بقى مطابق حرفيًا لاسم ريبو الـ Worker المنفصل (Bosta-Orders-Shipped-Scanner) بدل الاسم المختصر. ⚠️ الرابط القديم ما بقاش شغّال — حدّث أي بوكمارك على أجهزة المخزن.
v1.33.0 25-09-2026
  • إصلاح🔴 تاب السجل كان بيتقصّ بصمت. .tbl-body-wrap كانت محدّدة بسقف بكسل ثابت (max-height:4000px) بـoverflow:hidden ومفيش scroll عمودي احتياطي — صفحة سجل بـ١٠٠ صف كانت بالكاد تحت السقف، وأي خلية بتلفّ سطرين كانت بتخطّيه فالصفوف الزيادة بتختفي من غير scrollbar ولا رسالة. الجدول بقى عنده scroll عمودي داخلي (max-height:65vh + هيدر sticky) فبيتمرّر جوّه نفسه بدل ما يتقصّ.
  • تغييرريبو Bosta-Orders-Shipped-Scanner بقى Worker وبس — واجهته المستقلة اتشالت بالكامل بقرار، ومفيش إعادة توجيه من رابطها القديم. Bosta-Orders-Shipped-Scanner.html هنا بقت الواجهة الوحيدة — صفر نقطة رجوع.
v1.23.0 13-09-2026
  • جديد🔴 طابور «جاهز لتسليم بوسطة» — صف تالت في الشاشة الرئيسية، وقايمة جوّه Bosta-Orders-Shipped-Scanner.html نفسها بدل الشاشة الفاضية. بيعدّ الأوردرات اللي الطرد بتاعها موجود على الرف فعلاً: مندوبه بوسطة · اتطبع واتغلّف · ووقت التغليف بعد وقت الطباعة.
  • تغيير🔴 الفلترة بقت على المندوب (custom.courier) مش على الزون. فيه ١٤٩ أوردر على المتجر زونهم «قاهرة+جيزة» وبيروحوا مع بوسطة عادي — الفلترة بالزون كانت هتسقّطهم من الطابور في صمت والموظف واقف ماسك الطرد.
  • تغيير🔴 وقت التغليف لازم يبقى بعد وقت الطباعة. العكس معناه إعادة طباعة بعد التغليف — يعني الأوردر اتعدّل، والفاتورة اللي جوّه الطرد لاغية، والطرد محتاج يتفتح ويتغلّف من أول. تسليمه لبوسطة كده بيخرّج طرد بمحتوى غلط بلا أي رسالة خطأ.
  • تغيير«سكانر الشحن» بقى «قسم تسليمات بوسطة»، والصفحة اتنقلت من shipped.html لـbosta-shipped.html. ⚠️ الرابط القديم ما بقاش شغّال — حدّث أي بوكمارك على أجهزة المخزن.
  • تغييرالسطر التوضيحي اتشال من مربعَي «قسم تسليمات بوسطة» و«سكانر المرتجعات» في قسم «أدوات» — زي مربعَي الصف الأول بالظبط.
v1.22.0 10-09-2026
  • جديدالأداة بقت صفحة جوّه مركز عمليات المخزن. الموظف بيدخل مرة واحدة من الشاشة الرئيسية وبيتنقّل بين الطباعة والتغليف وسكانر الشحن من غير ما يدخل تاني ومن غير تبويبات متفرقة. شاشة الدخول والهيدر والإعدادات والتوست وحارس النسخة كلهم بقوا من shared/shell.js — نسخة واحدة للهب كله
  • تغييرالسر بقى سر مجموعة warehouse_ops (warehouse_ops_worker_secret) بدل مفتاح خاص بالأداة — قيمة واحدة للست Workers، بتتلزق مرة واحدة على كل جهاز
  • تغييرالدخول والخروج بيتسجّلوا تحت warehouse_ops_center في D1 بدل bosta_tracker — أفعال الأداة نفسها ما اتغيّرتش ولسه تحت metafields_change بنفس extra.sourceTool، فالتاريخ ما اتكسرش
  • جديدزرار 🏠 الرئيسية في نص الهيدر، وزرار الموظف بقى هو زرار الخروج (الاسم ✕)
  • إصلاحالفحص الذاتي 🩺 بقى بيسمّي الـ Worker وبيعرض سطر «إزاي تصلّحها» (hint) تحت الفحص الفاشل بس — كان بيتبلع بالكامل
v3.5 07-09-2026
  • إصلاحالصف اللي اتحدّث بيتنزع سلاحه فورًا. قبل كده بعد دفعة ناجحة بالكامل الصفوف كانت بتفضل مختارة والزرار بيفضل مكتوب عليه نفس العدد — يعني الشاشة بعد النجاح شكلها زي قبل الضغط، فالضغطة التانية كانت بتبعت نفس الأوردرات تاني. دلوقتي الصف بيتشال من الاختيار وبيتقفل، وحالته في الجدول بتتحدّث للحالة الجديدة (Shipped)
  • جديدحالة ⏭ خلاص متعمل — أوردر حالته بالفعل هي الحالة المستهدفة بقى ليه بادج محايد وعدّاد مستقل ورسالة بالعربي ("الأوردر ده اتشحن خلاص")، بدل رسالة تقنية بلون رفض. دي كانت ٦ من كل ٧ صفوف رفض مسجّلة
  • جديدالتحديث بيتقسّم على مجموعات (١٥ أوردر للمجموعة) والجدول بيتلوّن أول بأول وشريط التقدّم بقى حقيقي. قبل كده الشاشة كانت بتقول 0 / 82 طول ٢٠-٣٥ ثانية
  • جديدفلترين جديدين في تاب السجل: النتيجة (تم · تم جزئيًا · فشل · مرفوض · خلاص متعمل) والماكينة (S1 / S2) — "وريني كل اللي فيه تحذير" ماكانش ليها طريقة قبل كده
  • إصلاحالترتيب في تاب السجل بقى على السجل كله مش على الصفحة المعروضة بس. قبل كده الضغط على رأس العمود كان بيرتّب ١٠٠ صف من أصل ١٢١٧ والشكل بيوعد بترتيب عام
  • إصلاحتصدير النتائج كان بيكتب — على الصف الأصفر (تم جزئيًا) — نفس قيمة صف ما اتحاولش أصلاً. بقى بيكتب "تم جزئيًا" ومعاه عمود ملاحظة النتيجة
  • إصلاحالسكانر: شرط التسريع ماكانش بيتحقق أبدًا فالتأخير كان دايمًا ٤٠٠ms (≈٣٣ ثانية ميتة في دفعة ٨٢). وبقى فيه حارس على طول الرقم بيمسك الباركودين اللي بيتلزقوا في رقم واحد لما السكان يبقى سريع
  • جديدمهلة ٩٠ ثانية على كل نداء — الـ Worker الواقف مابقاش يسيب الشاشة بتلف للأبد
v3.4 03-09-2026
  • جديدالأوردرات المرفوضة بقت بتتسجّل في السجل — صف D1 بنوع rejected فيه رقم الأوردر ورقم التتبع ونوع بوسطة والحالة اللي وقف عندها والسبب، من غير أي كتابة على شوبيفاي. قبل كده الأوردر المرفوض ماكانش بيسيب أي أثر، فسؤال "ليه ده ما اتشحنش؟" ماكانش ليه إجابة بعد ما الشاشة تتقفل
  • جديدنافذة الملخّص بقى فيها صندوق رابع ⛔ مرفوض + قايمة بتفاصيل كل أوردر مرفوض (رقم الأوردر · السبب · التتبع · نوع بوسطة · حالة بوسطة)، والعنوان بيتلوّن أصفر لو الدفعة فيها مرفوض
  • جديدفلتر "مرفوض (ما اتكتبش)" في تاب السجل + عمود السبب / ملاحظة في تصدير XLSX
  • تغييرلو كل الأوردرات مرفوضة، الزرار بيتحوّل لـ "⛔ تسجيل المرفوض" — بيسجّل بس ومابيكتبش على شوبيفاي. والرفض بيتسجّل مرة واحدة لكل سبب: إعادة الضغط مابتكرّرش الصف، والسبب لو اتغيّر بيتسجّل من جديد
  • إصلاحسبب الرفض بيتحسب من حالة شوبيفاي وقت التسجيل مش وقت الاستعلام — والأوردر اللي بقى متوافق في الوقت الفاصل مابيتسجّلش مرفوض، بيتحدّث في الجدول ورسالة بتقول إنه بقى جاهز للشحن
v3.3 03-09-2026
  • إصلاحزرار "استعلام بوسطة + شوبيفاي" بقى بيعمل إعادة استعلام حقيقية في كل ضغطة — الصف الموجود بيتستبدل بالبيانات الجديدة. قبل كده الأرقام اللي اتستعلم عنها قبل كده كانت بتتخطّى، فالزرار يبان إنه استعلم وهو بيعرض حالة قديمة
  • جديدزرار "تحديث شوبيفاي" بيعيد الاستعلام من بوسطة وشوبيفاي قبل أي كتابة، وبيقارن بآخر حالة معروضة — لو أي أوردر مختار اتغيّرت حالته (أو ما اتأكدتش) في الوقت الفاصل، الدفعة كلها بتتوقف من غير ما تُكتب، الجدول بيتحدّث، والصفوف المتغيّرة بتتشال من الاختيار مع بانر بيقول اتغيّر إيه بالظبط
  • جديدنافذة ملخّص بعد التحديث: الحالة المستهدفة + إجمالي الأوردرات + تلات صناديق (ناجح · محتاج مراجعة · فشل) وزراري "تفاصيل الأوردرات" و"تسجيل أوردرات جديدة" — العنوان بيتغيّر للأصفر/الأحمر لو فيه تحذير أو فشل
  • تغييرصف لرقم اتشال من قائمة المسح مابقاش يفضل معروض في جدول النتائج — كل صف معروض بقى مقروء من الاستعلام الأخير
v3.2 03-09-2026
  • إصلاحنتيجة كل صف بقت تلات حالات (تم / تم جزئيًا / فشل) جاية من الـ Worker كما هي — قبل كده أي صف مش فاشل كان بيتعرض ✓ أخضر حتى لو الفلفلمنت فشل
  • إصلاحفشل الاستعلام من بوسطة بقى بانر أحمر ووسم "⚠ تعذّر الاستعلام" على الصفوف — قبل كده كان بيتحوّل لـ "الشحنة غير موجودة"، رسالة كاذبة بتخلي الموظف يسيب شحنة موجودة
  • جديدسطر "ما تم فعليًا" تحت نتيجة كل صف + تنبيه لو العملية تمت وما اتسجلتش في السجل
  • تغييرتاب السجل اتحوّل لـ جدول بالمعيار الموحّد: كارت واحد للفلاتر والجدول، فلاتر multi-select، فلتر فترة (بدون افتراضي)، ترتيب على الأعمدة، وعمود "النتيجة"
  • إصلاحالتصدير المقصوص بقى يبان في بانر ثابت بالرقمين (المصدَّر / الإجمالي) — قبل كده كان بيدّي "تم تصدير ✓" خضرا على ملف ناقص
  • جديدزرار 🩺 فحص النظام في الإعدادات + حارس نسخة الـ Worker (حد أدنى، مش تطابق — فمفيش تحذير كاذب دائم)
  • تغييرحقلا WORKER URL و ADMIN WORKER URL اتشالوا من الإعدادات — بقوا constants في الكود، والـ Secret هو الحقل الوحيد المتبقي
  • تغييرالهيدر وشريط التابات بيتقفلوا مع السكرول بعتبة مقيسة (بدل رقم ثابت) — بيمنع فليكر القفل/الفتح
  • تغييرالطبقة البصرية: صفر لون حرفي خارج :root، خط واحد (خط الكود القديم اتشال)، وعرض الأداة 1200px
v3.1.0 18-08-2026
  • جديدبعد نجاح كتابة Shipped (S1 أو S2) بيتم عمل fulfillmentCreate تلقائيًا لكل fulfillmentOrder بحالة OPEN على نفس الأوردر — نفس الـ pattern المعتمد في أداة Order Status Updater
  • تغييرفشل الفلفلمنت لا يُلغي حالة S1/S2 اللي اتكتبت بنجاح — بيظهر كتحذير منفصل (🟠 الفلفلمنت فشل) تحت البادج الأخضر في عمود "تحديث شوبيفاي"، وبيتسجل في extra.fulfillment بسجل D1
  • تغييرعمود جديد "الفلفلمنت" في تصدير XLSX للنتائج
v3.0.3 18-08-2026
  • إصلاحفشل كتابة الميتافيلد على شوبيفاي — الـ mutation كانت بتطلب حقل ownerId غير موجود على النوع Metafield، والصحيح owner { ... on Order { id } }
v3.0.2 18-08-2026
  • إصلاحالسجل كان بيبان فاضي بعد التحديث — العمليات القديمة (نظام التاجات قبل v2.0.0) رجعت تظهر في تاب السجل والتصدير، ومعلّمة ببادج 🏷️ تاج (قديم) للتمييز
  • إصلاحسبب فشل التحديث على شوبيفاي أصبح يظهر تحت عمود "تحديث شوبيفاي" بدل كلمة "فشل" المجرّدة
  • تغييرالـ Worker بقى يمرّر أخطاء GraphQL الحقيقية (صلاحيات/throttle/أخطاء الحقول) بدل رسالة عامة كانت بتخفي السبب
v3.0.1 18-08-2026
  • إصلاحكل الأوردرات كانت تُرفض بـ "الأوردر غير موجود على شوبيفاي" رغم وجودها — السبب: بوسطة بيرجّع businessReference بالـ # (مثال #51154) بينما مفاتيح نتائج شوبيفاي كانت متخزّنة بدون #، فالمطابقة كانت بتفشل دايمًا
  • تغييرتوحيد تنظيف اسم الأوردر في دالة واحدة (cleanOrderName) تُستخدم في كل أماكن المطابقة — يمنع تكرار نفس نوع الخطأ
v3.0.0 17-08-2026
  • تغييرترحيل كامل للأداة لـ UI Standard v2 — CSS variables، الهيدر، النوافذ (About/Changelog على شِل .eco-modal)، والتابات الرئيسية (.main-tabs-bar)
  • تغييرشاشة الدخول أُعيد بناؤها بالكامل: خطوتان (progressive reveal)، زرار إعدادات أحمر/أخضر، كيباد + دخول بالكيبورد، صوت عند النجاح/الخطأ، shake animation عند الـ PIN الغلط
  • إصلاحz-index موحّد: شاشة الدخول 500، كل النوافذ 600، الـ toast 9999
  • تغييرصيغة عرض التاريخ+الوقت أصبحت 📅 DD/MM/YYYY 🕐 HH:MM بدل الصيغة القديمة
  • تغييرجدول النتائج أصبح بمحاذاة منتصف (centered) مع خطوط فاصلة رأسية خفيفة حسب معيار الجداول الموحّد
v2.0.0 17-08-2026
  • تغييراستبدال آلية إضافة التاج (tagsAdd) بتحديث ميتافيلد S1/S2 مباشرة (metafieldsSet) حسب نوع الشحنة من بوسطة
  • جديدفحص حالة الأوردر الحالية (S1/S2) على شوبيفاي أثناء الاستعلام نفسه — الأوردرات غير المتوافقة تُرفض تلقائيًا مع عرض السبب
  • جديدإعادة تحقق من الحالة وقت الضغط على "تحديث شوبيفاي" لمنع كتابة حالة أوردر اتغيّرت
  • جديدرقم الأوردر أصبح رابط مباشر لصفحة الأوردر على شوبيفاي
  • تغييرD1 logging لعمليات التحديث انتقل لـ tool = metafields_change بدل bosta_tracker/tagged
v1.1.0 13-05-2026
  • جديدServer-side search + Pagination في السجل — 100 نتيجة في الصفحة
  • جديدتصدير XLSX يجيب كل السجل المطابق للفلتر (حتى سقف الـ Worker) بشكل منفصل
  • إصلاححل مشكلة ظهور 498 نتيجة فقط بدل كل السجل بسبب الـ limit=500 القديم
v1.0.0 2025
  • جديدإطلاق الأداة — Migration كاملة من الحساب القديم
  • جديدLogin screen بنظام PIN + D1
ℹ️ عن الأداة — قسم تسليمات بوسطة (مركز عمليات المخزن)
📋 وصف الأداة

الهدف: مسح أرقام تتبع بوسطة، التأكد من حالة الأوردر الحالية (S1/S2) على شوبيفاي، ثم كتابة الحالة التالية Shipped على الميتافيلد الصحيح فقط للأوردرات المتوافقة — وعمل Fulfill تلقائي للمنتجات المتبقية على الأوردر لو لسه فيه fulfillmentOrder بحالة OPEN.

المستخدمون المستهدفون: فريق المخزن/الشحن — لحظة تسليم الشحنات (ذاهبة أو مرتجع/استبدال) لمندوب بوسطة.

آلية التحديد (منطق العمل)

  1. نوع الشحنة من بوسطة orderType = "Send" → لازم S1 = Ready على شوبيفاي → يُكتب custom.manual_status = "Shipped".
  2. أي نوع تاني من بوسطة (Return / Exchange / ...) → لازم S1 = Delivered و S2 = Ready → يُكتب custom.status_2_r_e = "Shipped".
  3. أي أوردر في حالة تانية غير كده → يُرفض تحديثه فقط (باقي الأوردرات المحددة تتحدث عادي) مع عرض السبب في الجدول، ويتسجّل في D1 بنوع rejected بالسبب — من غير أي كتابة على شوبيفاي (v3.4).

كيف تعمل — Workflow

  1. الدخول بيحصل **مرة واحدة** في الشاشة الرئيسية للهب — الصفحة دي مالهاش شاشة دخول.
  2. مسح/كتابة أرقام التتبع.
  3. استعلام بوسطة + فحص شوبيفاي S1/S2 مع بعض في نفس الخطوة — وكل ضغطة على الزرار = إعادة استعلام كاملة، مش إضافة الجديد بس.
  4. مراجعة النتائج — الأوردرات المتوافقة محددة تلقائيًا، غير المتوافقة مرفوضة مع السبب.
  5. تحديث شوبيفاي — إعادة استعلام من بوسطة وشوبيفاي قبل الكتابة (لو حاجة اتغيّرت، الدفعة بتتوقف والجدول بيتحدّث) + إعادة تحقق تانية في الـ Worker وقت الكتابة + كتابة الميتافيلد + Fulfill تلقائي للأوردر (لو لسه محتاج) + تسجيل في D1، وفي الآخر نافذة ملخّص.
  6. الأوردرات المرفوضة في نفس الدفعة بتتبعت مع الطلب وتتسجّل بنوع rejected (بعد إعادة تحقق وقت التسجيل)، وتفاصيلها بتبان في نافذة الملخّص وفي تاب السجل.

الـ Endpoints الرئيسية

actionالوصف
lookupبوسطة + فحص شوبيفاي S1/S2 دفعة واحدة
updateإعادة تحقق + metafieldsSet + fulfillmentCreate (لو فيه OPEN fulfillmentOrders) + D1 log · وبياخد كمان rejected[] فيسجّلها بنوع rejected من غير كتابة
get_logs / get_logs_count / get_logs_exportسجل التحديثات — فلاتر server-side (employees · types · results · machines · search · dateFrom/dateTo) + صفحات + ترتيب server-side (sortBy/sortDir بقائمة بيضاء)، والتصدير بيرجّع cap/total/truncated
diagفحص ذاتي بدون كتابة — المتغيرات (اسم وطول فقط) · صلاحيات تطبيق شوبيفاي · بوسطة · D1 · الـ Origin
get_configبيرجّع WORKER_VERSION — الواجهة بتقارنه بـ MIN_WORKER_VERSION

⚙️ نتيجة كل صف — أربع حالات

الحالةمعناها
✓ تمالميتافيلد اتكتب واتأكد من رد شوبيفاي، والفلفلمنت (لو اتطلب) نجح
⚠ تم جزئيًاالحالة اتكتبت فعلًا على شوبيفاي لكن الفلفلمنت فشل — مفيش rollback، والسبب معروض تحت البادج
✗ فشلالميتافيلد ما اتكتبش (الحالة اتغيّرت قبل التحديث، أو خطأ من شوبيفاي) — السبب معروض
⏭ خلاص متعملحالة الأوردر هي الحالة المستهدفة أصلاً (اتشحن قبل كده) — لا نجاح ولا فشل ولا رفض: مفيش حاجة كانت مطلوبة. بتتسجّل بـ extra.result = 'already' بعدّاد مستقل
⛔ مرفوضالانتقال مكانش مسموح — مفيش أي كتابة اتحاولت. مش فشل: الصف اتسجّل في السجل بالسبب عشان يبقى ليه أثر. extra.stage بيقول اترفض من الاستعلام (lookup) ولا اتوقف وقت الكتابة (write)
⚠ تعذّر الاستعلامنداء بوسطة نفسه فشل — مش معناه إن الشحنة غير موجودة
🔧 تشريح الكود

FEATURE MAP

  • shared/shell.js — الهوية والهيدر والإعدادات والتوست وحارس النسخة (نسخة واحدة مضمّنة للهب كله)
  • §TOOL-JS::startLookup/startUpdate — بوسطة + شوبيفاي S1/S2 + metafieldsSet
  • §TOOL-JS::renderQueryErrors — بانر أحمر لأخطاء الاستعلام، منفصل عن نتيجة الصفوف
  • §TOOL-JS::recheckBeforeUpdate — إعادة الاستعلام الإجبارية قبل الكتابة + بانر "اتغيّر إيه"
  • §TOOL-JS::resultModal — نافذة ملخّص ما بعد التحديث (تلات صناديق + الحالة المستهدفة + صندوق المرفوض وتفاصيله)
  • §TOOL-JS::pendingRejected — المرفوض اللي لسه ما اتسجلش بالسبب ده (حارس التكرار في السجل)
  • §TOOL-JS::chunkedUpdate — تقسيم الدفعة على مجموعات ١٥ + تقدّم حقيقي + نزع سلاح الصف بعد تنفيذه (doneInSession)
  • §SHOPIFY::fetchShopifyOrdersByNames (Worker) — مطابقة اسم الأوردر الراجع + رفض الاسم غير الصالح بدل تنظيفه بصمت
  • §UPDATE::seenOrders (Worker) — حارس تكرار الأوردر في نفس الدفعة (رقمين تتبع لأوردر واحد)
  • §CONFIG::esc — تهريب أي نص جاي من بوسطة/شوبيفاي قبل ما يتحط في innerHTML
  • §UPDATE::logRejectedItems (Worker) — إعادة تحقق من المرفوض وقت التسجيل + صف D1 بنوع rejected
  • §SHOPIFY::createFulfillment — fulfillmentCreate لكل OPEN fulfillmentOrder بعد نجاح كتابة Shipped (§UPDATE::fulfillAfterWrite)
  • §LOG-JS — القسم الموحّد: فلاتر multi-select + فترة سريعة + جدول بترتيب أعمدة + صفحات + تصدير
  • §LOG-JS::logParams — المصدر الوحيد لفلاتر التلات نداءات (get_logs / get_logs_count / get_logs_export)
  • §SHELL-JS::freezeOnScroll — قفل الهيدر وشريط التابات بعتبة مقيسة (measureSticky) مش رقم ثابت
  • checkWorkerVersion(PAGE_WORKERS) + wocRunDiag() (shell) — حارس نسخة الـ Worker وزرار 🩺 الفحص الذاتي، وبيسمّي الـ Worker بالاسم

KEY VARIABLES

  • currentEmployee — { username, displayName } جاي من sessionStorage عبر requireSession() — مش من شاشة دخول في الصفحة دي
  • TOOL_VERSION (shell) — نسخة الهب كله، مصدر واحد لكل الصفحات
  • WOC_WORKERS.shipped.min (shell) — أقل نسخة Worker مقبولة. مالهاش أي علاقة بـ TOOL_VERSION — اختلاف الرقمين وضع طبيعي
  • WOC_WORKERS.shipped.url (shell) — ثابت في الكود، مش حقل إعدادات ولا localStorage
  • LS_SECRET = 'warehouse_ops_worker_secret' (shell) — مفتاح مجموعة warehouse_ops، قيمة واحدة للست Workers
  • WOC_API_TIMEOUT_MS (shell) — مهلة ٩٠ ثانية على كل نداء (AbortController)
  • D1 logging للتحديثات: tool = "metafields_change" + extra.sourceTool = "bosta_orders_shipped_scanner" (يميّز سجل الأداة دي عن باقي الأدوات اللي بتكتب على نفس الـ tool). أحداث الدخول/الخروج تفضل تحت tool = "bosta_tracker".
  • extra.result — نتيجة العملية (success/warning/error/rejected/already) اللي عمود "النتيجة" في السجل بيقراها
  • extra.stage — للصف المرفوض: lookup (اترفض من الاستعلام) أو write (كان متوافق واتوقف وقت الكتابة — سباق بين موظفين)
  • doneInSession — علامة على الصف اللي اتنفّذ في الجلسة دي؛ بتمنع إعادة إرساله وبتتحافظ عليها عبر إعادة الاستعلام
  • TN_MIN_LEN / TN_MAX_LEN — حدود طول رقم التتبع (٨–١٣)، بتمسك الباركودين الملزوقين

الـ Workers اللي الصفحة دي بتناديهم

—

NOTES

  • الحالة بتتقرا من شوبيفاي تلات مرات: عند الاستعلام (للعرض)، وعند الضغط على "تحديث شوبيفاي" من الواجهة قبل أي كتابة (recheckBeforeUpdate — بيوقف الدفعة ويعرض اللي اتغيّر)، ومرة تالتة جوّه الـ Worker وقت الكتابة نفسها (الحارس الأخير).
  • تغيّر حالة بوسطة لوحده مش سبب إيقاف قبل الكتابة — صلاحية الانتقال متوقفة على نوع بوسطة + S1/S2 بس، والإيقاف على حاجة مالهاش أثر على القرار بيولّد تحذير كاذب متكرر الموظف بيتعلّم يتجاهله. بيتحدّث في الجدول بس.
  • الأوردرات المرفوضة غير قابلة للتحديد (checkbox معطّل) ومظللة بخلفية حمراء خفيفة.
  • الفلفلمنت بيحصل بعد كتابة الميتافيلد مباشرة — لو فشل، حالة S1/S2 تفضل مكتوبة (مش بترجع) والصف بياخد ⚠ تم جزئيًا، مش فشل كامل. لو مفيش OPEN fulfillmentOrders (الأوردر متعمله fulfill من قبل) بيتجاهل الخطوة دي بصمت.
  • صفوف السجل القديمة بتتعرض "—" في عمود النتيجة مش "✓" — الصفوف اللي اتكتبت قبل v3.2 مالهاش extra.result، وإحنا فعليًا مش عارفين إن كان الفعل تم بالكامل وقتها.
  • dateFrom/dateTo بيتقارنوا بالـ timestamp المخزّن (UTC) بينما العرض بتوقيت القاهرة (UTC+3) — فرق التلات ساعات ممكن يحط عملية بعد ٩ مساءً في يوم UTC اللي بعده. مقبول لفلتر بالأيام، ومكتوب هنا عشان مايتكتشفش كباج بعدين.
  • "النتائج" في السجل = العدّ الحقيقي من قاعدة البيانات (get_logs_count) مش عدد صفوف الصفحة — الفلترة كلها server-side. الترتيب على الأعمدة client-side على صفوف الصفحة الحالية.
  • الـ Worker بيرجّع أسماء وأطوال المتغيرات في diag بس — مفيش قيمة أي سر بتتعرض.
✅ تم التحديث بنجاح

الخطوة 1 — مسح أرقام التتبع

0 عدد الأوردرات
🚚 جاهز للتسليم لبوسطة
اتطبع واتغلّف · مندوبه بوسطة
— أوردر
آخر تحديث لسه ما اتحدّثش
—
⏳ جاري الاستعلام عن الأوردرات برجاء الانتظار ...
▲
نوع العملية
تحديد الكل
النتيجة
تحديد الكل
الماكينة
تحديد الكل
بحث برقم أوردر أو ملاحظة
🔍
فترة سريعة
اليوم✓
أمس✓
آخر 3 أيام✓
آخر 7 أيام✓
آخر 30 يوم✓
آخر 90 يوم✓
📅 شهر محدد‹
اختَر الشهر والسنة — يتطبّق الفلتر تلقائيًا بمجرد اختيار الاتنين. لسنة أقدم اختَر "سنة تانية..." واكتبها يدويًا.
الشهر الحالي✓
الشهر السابق✓
الربع الحالي✓
العام الحالي✓
العام السابق✓
من تاريخ
إلى تاريخ
الموظف
تحديد الكل
▲
النتائج: —
التاريخ الوقت الموظف رقم الأوردر الماكينة من → إلى النتيجة رقم التتبع نوع بوسطة
لا يوجد سجل بعد — اضغط تحديث