bosta-shipped.html لـBosta-Orders-Shipped-Scanner.html — اسم الملف بقى مطابق حرفيًا لاسم ريبو الـ Worker المنفصل (Bosta-Orders-Shipped-Scanner) بدل الاسم المختصر. ⚠️ الرابط القديم ما بقاش شغّال — حدّث أي بوكمارك على أجهزة المخزن..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 هنا بقت الواجهة الوحيدة — صفر نقطة رجوع.Bosta-Orders-Shipped-Scanner.html نفسها بدل الشاشة الفاضية. بيعدّ الأوردرات اللي الطرد بتاعها موجود على الرف فعلاً: مندوبه بوسطة · اتطبع واتغلّف · ووقت التغليف بعد وقت الطباعة.custom.courier) مش على الزون. فيه ١٤٩ أوردر على المتجر زونهم «قاهرة+جيزة» وبيروحوا مع بوسطة عادي — الفلترة بالزون كانت هتسقّطهم من الطابور في صمت والموظف واقف ماسك الطرد.shipped.html لـbosta-shipped.html. ⚠️ الرابط القديم ما بقاش شغّال — حدّث أي بوكمارك على أجهزة المخزن.shared/shell.js — نسخة واحدة للهب كلهwarehouse_ops (warehouse_ops_worker_secret) بدل مفتاح خاص بالأداة — قيمة واحدة للست Workers، بتتلزق مرة واحدة على كل جهازwarehouse_ops_center في D1 بدل bosta_tracker — أفعال الأداة نفسها ما اتغيّرتش ولسه تحت metafields_change بنفس extra.sourceTool، فالتاريخ ما اتكسرشالاسم ✕)hint) تحت الفحص الفاشل بس — كان بيتبلع بالكامل0 / 82 طول ٢٠-٣٥ ثانية— على الصف الأصفر (تم جزئيًا) — نفس قيمة صف ما اتحاولش أصلاً. بقى بيكتب "تم جزئيًا" ومعاه عمود ملاحظة النتيجةrejected فيه رقم الأوردر ورقم التتبع ونوع بوسطة والحالة اللي وقف عندها والسبب، من غير أي كتابة على شوبيفاي. قبل كده الأوردر المرفوض ماكانش بيسيب أي أثر، فسؤال "ليه ده ما اتشحنش؟" ماكانش ليه إجابة بعد ما الشاشة تتقفل:root، خط واحد (خط الكود القديم اتشال)، وعرض الأداة 1200pxShipped (S1 أو S2) بيتم عمل fulfillmentCreate تلقائيًا لكل fulfillmentOrder بحالة OPEN على نفس الأوردر — نفس الـ pattern المعتمد في أداة Order Status Updaterextra.fulfillment بسجل D1ownerId غير موجود على النوع Metafield، والصحيح owner { ... on Order { id } }businessReference بالـ # (مثال #51154) بينما مفاتيح نتائج شوبيفاي كانت متخزّنة بدون #، فالمطابقة كانت بتفشل دايمًاcleanOrderName) تُستخدم في كل أماكن المطابقة — يمنع تكرار نفس نوع الخطأ.eco-modal)، والتابات الرئيسية (.main-tabs-bar)📅 DD/MM/YYYY 🕐 HH:MM بدل الصيغة القديمةtagsAdd) بتحديث ميتافيلد S1/S2 مباشرة (metafieldsSet) حسب نوع الشحنة من بوسطةtool = metafields_change بدل bosta_tracker/taggedالهدف: مسح أرقام تتبع بوسطة، التأكد من حالة الأوردر
الحالية (S1/S2) على شوبيفاي، ثم كتابة الحالة التالية Shipped
على الميتافيلد الصحيح فقط للأوردرات المتوافقة — وعمل Fulfill تلقائي
للمنتجات المتبقية على الأوردر لو لسه فيه fulfillmentOrder
بحالة OPEN.
المستخدمون المستهدفون: فريق المخزن/الشحن — لحظة تسليم الشحنات (ذاهبة أو مرتجع/استبدال) لمندوب بوسطة.
orderType = "Send" → لازم
S1 = Ready على شوبيفاي → يُكتب custom.manual_status = "Shipped".S1 = Delivered و S2 = Ready → يُكتب
custom.status_2_r_e = "Shipped".rejected بالسبب — من غير أي كتابة على
شوبيفاي (v3.4).rejected (بعد إعادة تحقق وقت التسجيل)، وتفاصيلها
بتبان في نافذة الملخّص وفي تاب السجل.| 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) |
| ⚠ تعذّر الاستعلام | نداء بوسطة نفسه فشل — مش معناه إن الشحنة غير موجودة |
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 بالاسمcurrentEmployee — { username, displayName } جاي من sessionStorage عبر requireSession() — مش من شاشة دخول في الصفحة ديTOOL_VERSION (shell) — نسخة الهب كله، مصدر واحد لكل الصفحاتWOC_WORKERS.shipped.min (shell) — أقل نسخة Worker مقبولة. مالهاش أي علاقة بـ TOOL_VERSION — اختلاف الرقمين وضع طبيعيWOC_WORKERS.shipped.url (shell) — ثابت في الكود، مش حقل إعدادات ولا localStorageLS_SECRET = 'warehouse_ops_worker_secret' (shell) — مفتاح مجموعة warehouse_ops، قيمة واحدة للست WorkersWOC_API_TIMEOUT_MS (shell) — مهلة ٩٠ ثانية على كل نداء (AbortController)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 — حدود طول رقم التتبع (٨–١٣)، بتمسك الباركودين الملزوقينrecheckBeforeUpdate — بيوقف الدفعة ويعرض اللي اتغيّر)،
ومرة تالتة جوّه الـ Worker وقت الكتابة نفسها (الحارس الأخير).extra.result، وإحنا فعليًا مش
عارفين إن كان الفعل تم بالكامل وقتها.dateFrom/dateTo بيتقارنوا بالـ timestamp
المخزّن (UTC) بينما العرض بتوقيت القاهرة (UTC+3) — فرق التلات ساعات
ممكن يحط عملية بعد ٩ مساءً في يوم UTC اللي بعده. مقبول لفلتر بالأيام، ومكتوب
هنا عشان مايتكتشفش كباج بعدين.get_logs_count)
مش عدد صفوف الصفحة — الفلترة كلها server-side. الترتيب على الأعمدة client-side
على صفوف الصفحة الحالية.diag بس — مفيش قيمة
أي سر بتتعرض.| رقم الأوردر | العميل | رقم تتبع بوسطة | عدد القطع | الإجمالي | تاريخ الأوردر | وقت التغليف | غلّفه |
|---|
| رقم الأوردر | رقم التتبع | نوع بوسطة | حالة بوسطة | الحالة الحالية | التحديث المطلوب | تحديث شوبيفاي |
|---|
| التاريخ | الوقت | الموظف | رقم الأوردر | الماكينة | من → إلى | النتيجة | رقم التتبع | نوع بوسطة |
|---|---|---|---|---|---|---|---|---|
| لا يوجد سجل بعد — اضغط تحديث | ||||||||