📦 جاي من طابور التغليف
📋 سجل التحديثات
v1.25.0 14-09-2026
  • تغيير🎨 ثيم الصفحة بقى أحمر. كانت بتفتح زرقا زي أي صفحة عادية رغم إن مربعها في الشاشة الرئيسية أحمر — والأداة بتحذف بند من أوردر حي والبند المتحذف مالوش رجعة. اللون بيقول «انت فين» قبل ما تقرا.
  • ملاحظة⚠️ نافذة التأكيد بالتأكيدين الإلزاميين ما اتلمستش — الأحمر في باقي الشاشة chrome خفيف (حدود · فوكس)، والمساحات المصمتة فاضلة للزراير والنافذة.
v1.14.0 08-09-2026
  • جديدصفحة 🏷️ باركود SKU بقى ليها تاب «📜 سجل العمليات» — الأداة كانت مالهاش أي أثر لمين طبع إيه وإمتى.
  • تغييرليبل الباركود بقى سطرين: رقم الأوردر تحت الخطوط اتشال، وخط الليبل بقى محايد (Arial) بدل السيريف.
  • تغيير🔴 barcode.min بقى 1.2.0 — Promote مطلوب لـ order-sku-barcode-printer-worker v1.2.0 (السجل + [[d1_databases]]).
v1.8.0 07-09-2026
  • إصلاح🔴 سبب الإلغاء كان بيتكتب بقيمة مش موجودة أصلاً. الأداة كانت بتحط custom.cancel_manual_reason = «عطلان»، والقيمة دي مش ضمن الخيارات المعرّفة على شوبيفاي — فكل حذف كان بينجح في شيل البند ويفشل في كتابة الحالة/السبب برسالة Value does not exist in provided choices. القيمة المعتمدة بقت «المنتج غير متوفر».
  • جديد🔴 الحارس بيمنع العملية بالكامل قبل ما تحصل. الـ Worker بقى بيقرا تعريف الميتافيلد قبل أي كتابة، ولو أي قيمة هيكتبها مرفوضة من التعريف — العملية بتتلغي والأوردر ما بيتلمسش خالص. قبل كده الترتيب كان «احذف الأول واكتب بعدين»، والحذف مالوش رجعة.
  • تغيير⚠️ التحذير بقى نافذة مش توست. التوست بيختفي لوحده بعد ثوانٍ، والحالة دي بتسيب الأوردر ناقص ومحتاجة تدخّل يدوي — فالنافذة بتعرض القيمة المرفوضة وقائمة الخيارات المسموحة والمطلوب عمله، وبتتقفل بزرار صريح بس.
  • جديد🩺 فحص النظام بقى فيه بند metafieldValues — بيولّع أحمر لو قيمة الحالة/السبب مرفوضة من التعريف، قبل ما موظف يقف على أوردر حي.
  • تغيير🔴 Worker حذف المنتج لازم Promote لـ v1.4.0 — remover.min بقى 1.4.0. من غيره الحارس مش موجود والحذف بيفضل بلا حماية.
v1.7.0 07-09-2026
  • جديدزرار «إعادة 🖨» في طابور التغليف بقى بيشتغل فعلاً. كان بيفتح صفحة الطباعة مفلترة على أوردر مش موجود فيها — لأن طابور الطباعة بيفلتر على حالات «مؤكَّد»، وأوردر اتطبع خلاص حالته Ready. الموظف كان بيشوف «لا توجد أوردرات تطابق الفلاتر» وتوست بيقول إن الجدول اتفلتر عليه، والحل الوحيد كان إن حد يرجّع الحالة يدوي.
  • جديدكارت 🔁 إعادة طباعة الفاتورة بيطلع أوتوماتيك لما الأوردر مش في الطابور: الحالة · النوع · العميل · آخر طباعة · عدد مرات الطباعة، وبيعدّي على نفس بوابة المراجعة بتاعة الطباعة العادية.
  • تغيير🔴 الحالة مابتتغيّرش — أوردر Ready بيفضل Ready. اللي بيتحدّث: التاج + ميتافيلد وقت الطباعة بالوقت الجديد + صف جديد في السجل باسم الموظف. ⏱️ الثمن المُعلَن: عمود «الوقت منذ الطباعة» في طابور التغليف بيرجع لأول اليوم.
  • إصلاح🔴 لغم كان هيطبع فاتورة ببنود غلط: الـ Worker بيحدد نوع الفاتورة من status_2_r_e ∈ {Confirmed + RETURN, Confirmed + EXCHANGE} بس، فأوردر S2 حالته Ready كان هيتقري S1 — والنوع ده بيختار البنود نفسها، وبعدين بيتبعت لـ /track اللي بيكتب على ماكينة S1. النوع بقى بيتبعت صريح في مسار إعادة الطباعة بس.
  • تغيير🔴 Worker الطباعة لازم Promote لـ v2.4.0 — printer.min بقى 2.4.0. من غيره كارت إعادة الطباعة بيقول بالنص إن النسخة أقدم، وباقي الصفحة شغّال عادي.
v1.6.0 06-09-2026
  • جديدصفحة 🏷️ باركود SKU — طباعة ليبل ٢×١ إنش لأصناف أوردر، أو بالبحث المباشر بـ SKU/باركود من غير أوردر.
  • جديدorder-sku-barcode-printer-worker انضم لمجموعة السر warehouse_ops — نفس حقل السر بيخدم الأربعة.
v1.5.1 06-09-2026
  • إصلاحتاب «📜 سجل العمليات» في صفحة حذف منتج بقى موجود. شريط التابات كان ناقص من الـ HTML — البانل وswitchMainTab وكل §LOG-JS كانوا موجودين بالكامل بس مفيش أي زرار بينادي عليهم، فالتاب كان مستحيل يتفتح. واتضاف كمان تعبئة فلتر الموظف من get_employees — كانت أثر جانبي لشاشة الدخول اللي اتشالت من الصفحة.
v1.5.0 06-09-2026
  • جديدصفحة 📊 إحصائيات المخزن — أرقام الفترة · جدول الموظفين · توزيع ساعات الشغل · مؤشرات الجودة. قراءة سجل D1 بحتة، صفر تعديل Worker.
  • إصلاحسلّم «آخر تحديث» (agoInfo) اتنقل لـ shared/shell.js — كان نسخة في الشاشة الرئيسية لوحدها.
v1.4.0 06-09-2026
  • تغييرلوحة «آخر تحديث» بقت ملزوقة بزرار التحديث في الشاشة الرئيسية، وبنفس شكلها في صفحة التغليف بالحرف — صندوق بسطرين: اللافتة وعدّاد القِدَم فوق، وختم التاريخ والوقت تحت.
v1.3.0 06-09-2026
  • تغييرطوابير الشاشة الرئيسية بقت صفوف بعرض الشاشة بدل كروت جنب بعض — الرقم والتقسيمة والختم والزرار كلهم على سطر واحد، والأدوات بقت مربعات مضغوطة تحتيهم.
v1.2.0 06-09-2026
  • تغييرزرار 🏠 الرئيسية بقى مصمت أزرق وفي نص الهيدر — كان بنفس شكل باقي الزراير بالظبط.
  • تغييرزرار الموظف بقى «الاسم ✕» بدل «👤 الاسم — خروج».
  • جديدالشاشة الرئيسية بقى فيها تحديث تلقائي كل ١٥ دقيقة للأعداد + لوحة «آخر تحديث» بعدّاد بيلوّن نفسه.
v1.1.0 06-09-2026
  • جديدحارس الفاتورة اللاغية في صفحة الطباعة — أوردر رجع للطابور بعد ما اتطبع بيطلب تأكيد إن الورقة القديمة اتقطّعت، والمتغلّف بيتعلّم بشارة 📦.
  • تغييرحُرّاس ما قبل الطباعة اتجمعوا في نافذة مراجعة واحدة بدل نافذتين متتاليتين.
  • جديدكل فاتورة في آخرها سطر صغير بتاريخ ووقت الطباعة بتوقيت القاهرة واسم الموظف.
  • تغييرالحد الأدنى لـ Worker الطباعة بقى 2.3.0.
v1.0.005-09-2026
  • إصلاحتصدير السجل بقى بيبلّغ لو اتقص — الرد فيه cap/total/truncated والواجهة بتعرض تحذير بدل القصّ الصامت عند ٢٠٠٠ صف
  • تغييرتوكن شوبيفاي بقى متكاش في ذاكرة الـ Worker (بدل توكن جديد لكل نداء) مع تجديد تلقائي عند 401
  • تغييردوال السجل المشتركة اتوحّدت مع باقي الأدوات — فلترة بقوايم موظفين/أنواع + فلتر تاريخ (dateFrom/dateTo) متاحين في الـ Worker
  • تغييرشاشة الإعدادات بقى فيها حقل واحد بس (WORKER SECRET) — رابط الـ Worker بقى ثابت في الكود ومش إعداد
  • تغييرWORKER_SECRET بقى مشترك مع طابعة الفواتير وأداة التغليف (مجموعة warehouse_ops) — و🩺 فحص النظام بيعرض بصمة السر للمقارنة
v1.2.003-09-2026
  • إصلاحزرار «⚠️ نسخة الـ Worker مختلفة» كان ظاهر على طول حتى والنسختين متطابقتين — الحارس بقى حد أدنى رقمي
  • إصلاححارس للـ WORKER_SECRET الغايب — قبل كده أي طلب بـ «Bearer undefined» كان بيعدّي المصادقة
  • تغييرأي متغيّر ناقص في الـ Worker بيوقف العملية برسالة باسمه بدل فشل غامض
v1.1.028-08-2026
  • تغييراسترجاع المخزون التلقائي بقى معطّل دائمًا وغير قابل للتعديل — الأداة مخصّصة فقط للمنتجات غير المتوفرة بالمخزن
  • جديدعند كل حذف: تحديث ميتافيلد الحالة custom.manual_status إلى "Pending Edit" وcustom.cancel_manual_reason إلى "عطلان" (لو الانتقال مسموح)
  • تغييرإعادة تصميم نافذة تأكيد الحذف بشِل eco-modal مع تأكيدين إلزاميين (مراجعة المخزون + قطع الفاتورة)
  • تغييربعد تنفيذ الحذف، الأداة ترجع تلقائيًا لوضعها الافتراضي (مربع البحث فاضي)
v1.0.026-08-2026
  • جديدإطلاق الأداة — بحث بالأوردر، عرض المنتجات Unfulfilled، حذف منتج مع استرجاع اختياري للمخزون
ℹ️ About — حذف منتج من الأوردر
🏭 الصفحة دي جوّه مركز عمليات المخزن

الصفحة دي جزء من الهب — الدخول بيحصل مرة واحدة في الشاشة الرئيسية، والهوية بتوصل هنا من sessionStorage.

🔴 الأداة دي هدّامة — حراسها ما اتلمستش

  • نافذة التأكيد بالتأكيدين الإلزاميين (مراجعة المخزون + قطع الفاتورة).
  • شرط displayFinancialStatus = PENDING (COD غير مسدد).
  • restock: false مفروضة من الواجهة والـ Worker — دفاع مزدوج.
  • الرجوع للوضع الافتراضي بعد أي حذف ناجح.
  • انتقال custom.manual_status → Pending Edit بشرطه، وcancel_manual_reason → المنتج غير متوفر.

الفتح التلقائي من طابور التغليف

⚠️ ?order= بيوصل لقايمة المنتجات بس — مش بيحذف ومش بيختار بند. قرب الأداة بضغطة من جدول التغليف معناه إنها هتتستخدم أكتر، يعني حراسها بقت أهم مش أقل.

📋 وصف الأداة

الهدف: إزالة منتج واحد لسه ما اتشحنش (Unfulfilled بالكامل) من أوردر معين، بدل إلغاء الأوردر كله — مفيد لو العميل رجع في منتج واحد بس من أوردر فيه أكتر من منتج.

المستخدمون المستهدفون: فريق خدمة العملاء / إدارة الأوردرات.

كيف تعمل — Workflow

  1. الموظف يدخل رقم الأوردر ويضغط بحث.
  2. الأداة تجيب الأوردر وتعرض بس المنتجات اللي حالتها Unfulfilled بالكامل.
  3. لو الأوردر مش مؤهل (متسدد أونلاين / ملغي / مقفول) — بانر أحمر واضح بالسبب، ومفيش حذف متاح.
  4. الموظف يختار منتج ويضغط "حذف من الأوردر" — نافذة تأكيد بتاعتين إلزاميتين: مراجعة المخزون + قطع الفاتورة.
  5. الأداة تنفّذ Order Editing (Shopify) لإزالة البند بالكامل — بدون استرجاع مخزون أبدًا.
  6. لو الانتقال مسموح: تحديث custom.manual_status إلى "Pending Edit" وcustom.cancel_manual_reason إلى "المنتج غير متوفر".
  7. النتيجة تظهر كـ toast وتتسجّل في سجل العمليات — نجاح / تحذير / فشل — والأداة ترجع لوضعها الافتراضي (مربع بحث فاضي).

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

actionالوصف
lookup_orderالبحث عن أوردر بالاسم وجلب منتجاته Unfulfilled
remove_itemحذف بند من الأوردر (Order Editing API — quantity → 0، بدون استرجاع مخزون) + تحديث ميتافيلدات الحالة/السبب
get_logs / get_logs_count / get_logs_exportسجل العمليات — صفحات + تصدير XLSX
diagفحص ذاتي: الصلاحيات (write_order_edits) و تعريفات الميتافيلدز و D1 والاتصال

⚙️ إجراءات كل حذف

الإجراءالتفاصيل
حذف البندOrder Editing API — orderEditSetQuantity(quantity: 0) ثم Commit
استرجاع المخزونمعطّل دائمًا — restock: false مفروضة من السيرفر بغض النظر عن أي مدخل
تحديث الحالةcustom.manual_status → Pending Edit — بس لو الحالة الحالية Confirmed أو Ready (أو Pending Edit بالفعل)، وإلا يتم تخطيها مع تحذير
تحديث سبب الإلغاءcustom.cancel_manual_reason → المنتج غير متوفر — دايمًا، بغض النظر عن حالة الأوردر. القيمة لازم تكون ضمن خيارات تعريف الميتافيلد، والحارس بيتأكد من ده قبل الحذف

⚠️ قيود مهمة

  • الأداة تشتغل بس على أوردرات financial status = PENDING (يعني COD غير متسدد بعد) — الأوردرات المتسددة أونلاين ممنوع الحذف منها من هنا (قرار: منع كامل، لا استرجاع تلقائي مطبَّق).
  • بس البنود اللي كميتها كلها Unfulfilled (مفيش أي جزء اتشحن) هي القابلة للحذف الكامل.
  • استرجاع المخزون معطّل دائمًا — الأداة مخصّصة فقط للمنتجات المكتشف إنها غير متوفرة بالمخزن وقت التجهيز.
  • الحذف مش بيرجع تاني تلقائيًا — لو غلط، لازم يتضاف المنتج يدويًا للأوردر من شوبيفاي.
🔧 تشريح الكود

FEATURE MAP

  • §AUTH — Universal D1 Auth
  • §TOOL — بحث الأوردر + عرض المنتجات + حذف بند (Order Editing API)
  • §LOG — سجل العمليات (جدول + صفحات + تصدير)

KEY VARIABLES

  • currentEmployee — { username, displayName } في الذاكرة فقط
  • روابط الـ Workers — ثوابت في shared/shell.js § CONFIG (مش في التخزين المحلي — Standards #28)
  • LS_SECRET = 'order_item_remover_worker_secret' — المفتاح الوحيد في localStorage
  • TOOL_NAME = 'order_item_remover' — قيمة tool في جدول logs
  • currentOrder — آخر أوردر تم البحث عنه (في الذاكرة)

NOTES

  • الحذف بيتم عبر orderEditSetQuantity(quantity: 0) — مفيش mutation مباشرة لحذف بند في Shopify.
  • محتاج صلاحية write_order_edits + read_order_edits على تطبيق شوبيفاي — مختلفة عن write_orders العادية. استخدم زرار "فحص النظام" في الإعدادات للتأكد.
  • restock مفروضة false من الواجهة **و**من الـ Worker (دفاع مزدوج) — الشيك بوكس في الواجهة معطّل ومقفول دايمًا.
  • تحديث custom.manual_status بيتحقق من صحة الانتقال قبل الكتابة (ecommoda-order-lifecycle §1.4) — بيتخطى الكتابة بأمان لو الحالة الحالية مش Confirmed/Ready، بدل ما يكتب انتقال غير مسموح.
  • نوع الميتافيلد (type) بيتقرا ديناميكيًا من تعريف الحقل في شوبيفاي وقت التنفيذ — مش hardcoded.
⚠️ تأكيد حذف المنتج
المنتج—
SKU—
الأوردر—
—
رقم الأوردر