v2.8.0.New Order أو Confirmed ما اتطبعش كان بيفتح شاشة التغليف عادي وبلا أي تحذير. دلوقتي الأداة بتقول السبب: الحجب لما مفيش شغل ممكن (ملغي · مفيش قطعة تتغلّف)، وتحذير بإقرار لما فيه شغل بس محتاج مراجعة (ما اتطبعش · حالة مش من حالات التغليف · دورة استرجاع).2 → 2 → 0 اتشحنت · 2 → 0 → 0 اترجّعت أو اتلغت.Shipped · Cancelled · New Order) — معلومة غلط كانت بتخلّي الموظف يفتكرها بيانات ناقصة ويكمّل. دلوقتي بيسمّي الحالة الفعلية، وبيغطّي كل حالات التحذير مش unclear بس.complete_pack — حارس في الواجهة بس مش حارس. تاب مفتوح من ساعة والأوردر اتلغى في الوقت ده كان هيعدّي.pack.min بقى 2.6.0 — Promote مطلوب لـ orders-packing-checker-worker v2.6.0 (ومعاه v2.5.0 المعلّق).barcode.min بقى 1.2.0 — Promote مطلوب لـ order-sku-barcode-printer-worker v1.2.0 (السجل + [[d1_databases]]).Showroom وShow_Room و«شو روم».shared/shell.js §COURIER-GROUP، نسخة واحدة للصفحتين. صفر تغيير في سلوك المربعات هنا.Ready. الموظف كان بيشوف «لا توجد أوردرات تطابق الفلاتر» وتوست بيقول إن الجدول اتفلتر عليه، والحل الوحيد كان إن حد يرجّع الحالة يدوي.Ready بيفضل Ready. اللي بيتحدّث: التاج + ميتافيلد وقت الطباعة بالوقت الجديد + صف جديد في السجل باسم الموظف. ⏱️ الثمن المُعلَن: عمود «الوقت منذ الطباعة» في طابور التغليف بيرجع لأول اليوم.status_2_r_e ∈ {Confirmed + RETURN, Confirmed + EXCHANGE} بس، فأوردر S2 حالته Ready كان هيتقري S1 — والنوع ده بيختار البنود نفسها، وبعدين بيتبعت لـ /track اللي بيكتب على ماكينة S1. النوع بقى بيتبعت صريح في مسار إعادة الطباعة بس.printer.min بقى 2.4.0. من غيره كارت إعادة الطباعة بيقول بالنص إن النسخة أقدم، وباقي الصفحة شغّال عادي.order-sku-barcode-printer-worker انضم لمجموعة السر warehouse_ops — نفس حقل السر بيخدم الأربعة.switchMainTab وكل §LOG-JS كانوا موجودين بالكامل بس مفيش أي زرار بينادي عليهم، فالتاب كان مستحيل يتفتح. واتضاف كمان تعبئة فلتر الموظف من get_employees — كانت أثر جانبي لشاشة الدخول اللي اتشالت من الصفحة.agoInfo) اتنقل لـ shared/shell.js — كان نسخة في الشاشة الرئيسية لوحدها.pack_checker) ما اتغيّرش.2.3.0.custom.zone) اتشال نهائيًا من جدول الطابور والفلاتر — الأداة مش محتاجاه (قرار أحمد 05-09-2026)Bosta، و«مناديب» (أزرق) لأي مندوب تاني — حتى لو مفيش مندوب مسجل خالصBOSTA_API_KEY، ده إعداد ناقص — باقي الأداة شغّالة عادي، وافحصه من 🩺 فحص النظامcustom.zone) بعد رقم الأوردر: قاهرة وجيزة (أزرق) · محافظات (أحمر) · شو روم (أخضر) · ⚠ لا توجد منطقة مسجلة ⚠ (برتقالي) — والغايب زي BLANK، الاتنين تحذير مش خانة فاضيةالصفحة دي جزء من الهب — الدخول بيحصل مرة واحدة في الشاشة
الرئيسية، والهوية بتوصل هنا من sessionStorage
(بتموت مع قفل التاب، ولكل تاب لوحده).
Order-Item-Remover.html وOrder-Printer.html)
وبياخدوا رقم الأوردر معاهم. target="_blank" اتشال —
التنقل في نفس التاب + زرار «↩ رجوع للطابور».warehouse_ops_center، لكن
فعل التغليف نفسه (packed) لسه تحت
pack_checker زي ما هو — التاريخ ما اتكسرش.الهدف: التحقق من تغليف الأوردرات قطعة قطعة قبل الشحن، وتسجيل التغليف على الأوردر (ميتافيلد + tag) وفي سجل D1.
المستخدمون المستهدفون: موظفو التغليف في المخزن — بالسكانر أو بالإدخال اليدوي.
Ready واتطبعت ولسه ما اتغلّفتش. الجدول للعرض بس: الضغط على صف مابيفتحش التشييك، ورقم الأوردر لينك لشوبيفاي.custom.manual_status + custom.status_2_r_e.| action | الوصف |
|---|---|
get_order | جلب الأوردر + تحليل المرحلة + كشف التغيير بالبصمة |
complete_pack | كتابة الميتافيلدات + tag + تسجيل D1، وبترجّع status وactions |
get_ready_orders | طابور «جاهز للتغليف» — أوردرات S1+S2 حالتها Ready واتطبعت ولسه ما اتغلّفتش. قراءة بحتة، وبترجّع partial وs2Failed وs2Truncated. من Worker v2.3.0 بيرجّع كمان zone (custom.zone) — الواجهة بقت من v2.6.2 مابتقراهوش، عمود المنطقة اتشال نهائيًا |
get_logs · get_logs_count · get_logs_export | استعراض وتصدير سجل التغليف (فلترة server-side) |
diag · get_config | فحص ذاتي بدون كتابة · نسخة الـ Worker لحارس التوافق |
check_employee · register_pin · verify_employee · log_logout · get_employees | بلوك الدخول المشترك |
| الحالة | الإجراءات على الأوردر |
|---|---|
| تغليف S1 | كتابة custom.s1_packed_by + custom.s1_packing_date_time · إضافة tag S1=Packed · صف packed في D1 |
| تغليف S2 | كتابة custom.s2_packed_by + custom.s2_packing_date_time · إضافة tag S2=Packed · صف packed في D1 |
| إعادة تغليف بعد تعديل | نفس الإجراءات + edit_reason في السجل + extra.repack وextra.previousPackedBy |
| محاولة تغليف أوردر اتغلّف بالفعل | مفيش أي كتابة — رد 409 + conflict: true. لو البنود اتغيّرت: requiresReason: true لحد ما يتدخل سبب. |
§AUTH (Worker) — بلوك الدخول المشترك · §AUTH-JS (HTML) — شاشة الدخول والخروج§PACK::analyzeStage (Worker) — تحديد المرحلة من التلات إشارات§PACK::classifyOrderItems (Worker) — تصنيف المنتجات على fulfillableQuantity§PACK::buildFingerprint + readStoredFingerprint (Worker) — كشف التغيير§PACK::fetchOrderForPack (Worker) — تصفيح lineItems و returns + علم truncated§DIAG (Worker) — diag وget_config§SCAN (HTML) — سكانر الأوردر وسكانر الباركود · §SCAN::entryMode — المربع النشط والفوكس بيرجع له · ::scannerBinding — نفس سلوك السكانة للمربعين§BOSTA (Worker) — bostaSearch · cleanOrderName · resolveTrackingToOrderName — تحويل تراكينج بوسطة لرقم أوردر (قراءة بحتة)§TOOL-JS (HTML) — شاشة الفحص · النوافذ · نتيجة التغليف بـ ٣ حالات§LOG-JS (HTML) — جدول السجل · الفلاتر · الترتيب · الصفحات · تصدير XLSX§READY (Worker) — طابور «جاهز للتغليف»: get_ready_orders · isPrintedNotPacked · classifyS2Subtype · classifyS2Batch · shapeReadyOrder§TOOL::readyQueue (HTML) — الطابور تحت مربعات الإدخال · §READY-JS — الفلاتر · الترتيب · الجدول · تصدير XLSX§READY-JS::elapsed (HTML) — rdySincePrint · rdyOrderAgeText · rdyDayDiff — الأعمدة المحسوبة بالوقت (بتوقيت القاهرة، بفرق الأيام التقويمية)§READY-JS::ticker + ::freshness (HTML) — نبضة كل ٣٠ ثانية بتحدّث الأرقام النسبية في مكانها بدون أي نداء شبكة§READY-JS::autoRefresh (HTML) — rdyArmAutoRefresh · rdyAutoRefreshTick · rdyQueueVisible — التحديث التلقائي كل ١٥ دقيقة (النداء الدوري الوحيد في الأداة)§READY-JS::courier (HTML) — عرض المندوب بلونه (بوسطة أحمر · شو روم أخضر · غيرهم أزرق · فاضي رمادي)§READY-JS::courierChips (HTML) — مربعا «بوسطة/مناديب» فوق الجدول (v2.6.2، بدّلوا مربعات المنطقة اللي اتشالت): عدّ من الطابور كله وفلترة بضغطة، نفس حالة فلتر «المندوب»§LABEL-MACHINE (HTML · CSS + JS) — ماكينة الليبل المطبوع ٢×١ إنش: bcBuildLabel · bcFitLabelText · bcRenderLabels · bcFirePrint. 🔴 نسخة مكرّرة عن قصد — التوأم في Order-SKU-Barcode-Printer.html، والكتلتان متطابقتان بايت ببايت. الانحراف بيتمسك بـbash docs/label-twin-check.sh§PACK-LABELS (HTML) — packPrintLabels: زرار «🏷️ باركود المنتجات» في شاشة التشييك. بيطبع بنود المرحلة الجارية (currentItems) بصفر نداء للـ WorkerTOOL_VERSION — مصدر واحد لرقم نسخة الواجهة (الهيدر + الـ Changelog + شاشة الدخول)MIN_WORKER_VERSION — أقل نسخة Worker الواجهة دي بتشتغل معاها (مالهاش علاقة بـ TOOL_VERSION)shared/shell.js § CONFIG، مش في الإعدادات ولا في التخزين المحلي (Standards #28)LS_SECRET = 'pack_checker_worker_secret' — المفتاح الوحيد في localStoragecurrentEmployee — { username, displayName } في الذاكرة فقطlastEntryMode — آخر مربع إدخال اتشتغل منه (shopify · bosta · manual). في الذاكرة فقط، وبيتصفّر عند الخروج.msState — حالة فلاتر الاختيار المتعدد في تاب السجل (فلترة server-side)rdyMsState · rdyAllOrders · rdySortState — حالة فلاتر وترتيب الطابور (فلترة client-side). منفصلة عن اللي فوقها بالكامل — الاتنين شغّالين في نفس الصفحة.rdyDirty — «حصل تغليف والطابور بقى قديم». التحديث بيحصل عند الرجوع لشاشة الطابور، والفلاج مابيتصفّرش غير بعد جلب ناجح.rdyLastLoadedAt — ختم آخر جلب ناجح؛ منه بيتحسب «منذ كام» ولون الزرار.TOOL_NAME = 'pack_checker' — قيمة tool في جدول logsextra.fingerprint المخزّن؛ الصفوف القديمة بترجع لتحليل نص items — ولو التحليل فشل، النتيجة «فيه تغيير» (الافتراضي الآمن).items (SKU ×qty) مرتبطة بين complete_pack وget_order — الاتنين بيتغيّروا مع بعض.fulfillableQuantity هو مصدر الحقيقة الوحيد للتصنيف — ممنوع فلترة يدوية على الـ refunds.complete_pack بقى بيتحقق من شوبيفاي قبل أي كتابة: بيقرا الأوردر، بيحسب المرحلة بنفسه (أي stage جاي من الواجهة بيتجاهل)، وبيرجّع 409 + conflict لو الأوردر اتغلّف بالفعل. تاب مفتوح من ساعة أو ضغطة مزدوجة ماعادش يعدّي.§PACK::evaluatePackGuard: دالة واحدة بينادها get_order وcomplete_pack، فمستحيل يفترقوا في المنطق.dateFrom/dateTo بيتقارنوا بـ timestamp المخزّن (UTC) والعرض بتوقيت القاهرة (UTC+3) — فرق ٣ ساعات ممكن يحط عملية متأخرة في يوم UTC اللي بعده.edit_count لسه في schema الـ D1 للتوافق بس — مابيتكتبش من v1.3.0+.toCairo، لأن iso.slice(0,10) كان هيقفل اليوم الساعة ٣ صباحًا بتوقيتنا.data-rdy-since · data-rdy-age) مش بإعادة رسم الجدول — إعادة الرسم بتصفّر تمرير الجدول تحت إيد الموظف. النبضة بتقف عند الخروج (rdyStopTicker).rdyDefaultSort). الـ Worker لسه بيرجّع الأحدث أولاً — الترتيب الافتراضي قرار واجهة عشان يتغيّر من غير deploy للـ Worker.rdyDirty والجلب بيحصل أول ما الموظف يرجع، فمافيش استعلام على قايمة محدش شايفها ولا إعادة رسم تحت إيد موظف بيغلّف. العدّاد بيتسلّح من جديد بعد كل جلب ناجح — «١٥ دقيقة من آخر تحديث» مش من الدخول.Bosta بتتعرض «قاهرة» — يعني مندوب باسمه كان بيتقري غلط. دلوقتي النص من الميتافيلد كما هو، واللون هو اللي بيصنّف (بوسطة أحمر · شو روم أخضر · غيرهم أزرق)، والفاضي نصّه صريح «لا يوجد مندوب مسجل».custom.zone بيتجاب من Worker v2.3.0. القيمة الغايبة وBLANK الاتنين بيتعرضوا تحذير برتقالي مش خانة فاضية — منطقة ناقصة قرار شحن ناقص. وأي قيمة مش في الـ choice list بتتعرض زي ما هي ببادج محايد: ما بنترجمش قيمة معرفناهاش وما بنخبّيهاش.zone + zoneCls)، مش وقت الرسم. لو الرسم ترجم تاني، هيترجم نص عربي مترجم أصلاً والبادج هيفقد لونه.target="_blank") — مفيش أي أكشن على الأوردر ومفيش نداء للـ Worker. لو حد ضاف أكشن هناك بعدين، لازم يعدّي على حارس التغليف زي أي كتابة تانية.classifyS2Subtype بقت نسخة واحدة في الـ Worker. قبل الدمج كانت في ملفين، وده اللي خلّى إصلاح refundedIds يتعمل في أداة ويفضل مكسور في التانية لشهور.get_order?tracking=)، والـ Worker بينادي بوسطة قراءة بحتة، بيطلّع businessReference، بينضّفه من الـ # وبيكمّل بنفس مسار الاسم بالحرف — نفس التصنيف ونفس حارس «اتغلّف قبل كده». مفيش مسار تغليف تاني: مسار موازي كان معناه حارسين يفترقوا، وده اللي أنتج R3.BOSTA_API_KEY سر جديد مطلوب على الـ Worker. من غيره مدخل بوسطة بس هو اللي بيفشل، وبرسالة باسم المتغيّر مش بـ«الشحنة غير موجودة» — و🩺 فحص النظام بيعرض وجوده.lastEntryMode): موظف شغّال دفعة ملصقات بوسطة مايرجعش بإيده للمربع بعد كل أوردر. في ذاكرة الصفحة بس — مش في التخزين المحلي — فموظف جديد بيبدأ من الافتراضي.rdyMsToggleItem('zone', …) — حالة واحدة مع فلتر «المنطقة»، مش حالة موازية.orderLink() اللي في الجدول وتاب السجل. ولو الأوردر جه من غير id، بيتعرض نص عادي (.no-link) مش لينك مكسور.RDY_PRINT_ICON) بترث لون الزرار. الإيموجي 🖨 (U+1F5A8) مش مدعوم على أجهزة كتير وكان بيطلع مربع فاضي — ممنوع الرجوع لإيموجي هنا.custom.zone) اتشال نهائيًا من الجدول والفلاتر (قرار أحمد 05-09-2026) — مش موقوف مؤقتًا، محذوف. الـ Worker لسه بيرجّع zone في get_ready_orders، بس الواجهة بقت متجاهلاه تمامًا..courier-bosta) لو المندوب Bosta، و«مناديب» (أزرق، نفس .courier-other) لأي مندوب تاني حتى لو مفيش مندوب مسجل خالص. الشو روم بقى داخل «مناديب» هنا رغم إنه أخضر في عمود المندوب — التقسيم في المربعات ثنائي بس (بوسطة/غير بوسطة).rdyMsState.courier.selected، مش حالة موازية.Bosta-Orders-Shipped-Scanner، فالكود ده بقى في مكانين. أي إصلاح على شكل رد بوسطة أو على cleanOrderName لازم يتعمل في الاتنين — نفس عيلة خطر classifyS2Subtype.§LOG-JS و§READY-JS (الأول server-side والتاني client-side). أي تعديل على سلوك القوايم أو الترتيب لازم يتعمل في الاتنين.§LABEL-MACHINE مكرّرة عن قصد بين Orders-Packing-Checker.html وOrder-SKU-Barcode-Printer.html (قرار أحمد 16-09-2026). الفشل لو افترقوا مالوش صوت: الليبل بيتقص من تحت في صمت وبياكل من خطوط الباركود، والسكانر بيبطّل يقرا. أي تعديل يتعمل في الاتنين في نفس التمريرة، والتحقق بـbash docs/label-twin-check.sh.log_print ولا Worker الباركود خالص، وPAGE_WORKERS فضلت ['pack'].isPrintedNotPacked بتسأل «اتطبع بعد آخر تغليف؟» مش «متملّي ولا فاضي» — ميتافيلدات التغليف مبتتصفّرش بين دورات الإرجاع، والمقارنة بـ new Date() مش نصوص (printing_time بتيجي بصيغتين).| المنتج / SKU | الكمية |
|---|
| المنتج / SKU | الكمية |
|---|
| خيارات | رقم الأوردر | المندوب | تاريخ الطباعة | وقت الطباعة | الوقت منذ الطباعة | تاريخ الأوردر | نوع الأوردر | المحاولة |
|---|
| التاريخ | الوقت | الأوردر | المرحلة | الموظف | مُغلَّف بواسطة | عدد القطع | المنتجات | النتيجة | سبب الإعادة | ملاحظات |
|---|