barcode.min بقى 1.2.0 — Promote مطلوب لـ order-sku-barcode-printer-worker v1.2.0 (السجل + [[d1_databases]]).custom.cancel_manual_reason = «عطلان»، والقيمة دي مش ضمن الخيارات المعرّفة على شوبيفاي — فكل حذف كان بينجح في شيل البند ويفشل في كتابة الحالة/السبب برسالة Value does not exist in provided choices. القيمة المعتمدة بقت «المنتج غير متوفر».metafieldValues — بيولّع أحمر لو قيمة الحالة/السبب مرفوضة من التعريف، قبل ما موظف يقف على أوردر حي.remover.min بقى 1.4.0. من غيره الحارس مش موجود والحذف بيفضل بلا حماية.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 — كان نسخة في الشاشة الرئيسية لوحدها.2.3.0.cap/total/truncated والواجهة بتعرض تحذير بدل القصّ الصامت عند ٢٠٠٠ صفdateFrom/dateTo) متاحين في الـ WorkerWORKER SECRET) — رابط الـ Worker بقى ثابت في الكود ومش إعدادWORKER_SECRET بقى مشترك مع طابعة الفواتير وأداة التغليف (مجموعة warehouse_ops) — و🩺 فحص النظام بيعرض بصمة السر للمقارنةWORKER_SECRET الغايب — قبل كده أي طلب بـ «Bearer undefined» كان بيعدّي المصادقةcustom.manual_status إلى "Pending Edit" وcustom.cancel_manual_reason إلى "عطلان" (لو الانتقال مسموح)eco-modal مع تأكيدين إلزاميين (مراجعة المخزون + قطع الفاتورة)الصفحة دي جزء من الهب — الدخول بيحصل مرة واحدة في الشاشة
الرئيسية، والهوية بتوصل هنا من sessionStorage.
displayFinancialStatus = PENDING (COD غير مسدد).restock: false مفروضة من الواجهة والـ Worker — دفاع مزدوج.custom.manual_status → Pending Edit بشرطه،
وcancel_manual_reason → المنتج غير متوفر.⚠️ ?order= بيوصل لقايمة المنتجات بس — مش بيحذف ومش
بيختار بند. قرب الأداة بضغطة من جدول التغليف معناه إنها هتتستخدم
أكتر، يعني حراسها بقت أهم مش أقل.
الهدف: إزالة منتج واحد لسه ما اتشحنش (Unfulfilled بالكامل) من أوردر معين، بدل إلغاء الأوردر كله — مفيد لو العميل رجع في منتج واحد بس من أوردر فيه أكتر من منتج.
المستخدمون المستهدفون: فريق خدمة العملاء / إدارة الأوردرات.
custom.manual_status إلى "Pending Edit" وcustom.cancel_manual_reason إلى "المنتج غير متوفر".| 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 غير متسدد بعد) — الأوردرات المتسددة أونلاين ممنوع الحذف منها من هنا (قرار: منع كامل، لا استرجاع تلقائي مطبَّق).§AUTH — Universal D1 Auth§TOOL — بحث الأوردر + عرض المنتجات + حذف بند (Order Editing API)§LOG — سجل العمليات (جدول + صفحات + تصدير)currentEmployee — { username, displayName } في الذاكرة فقطshared/shell.js § CONFIG (مش في التخزين المحلي — Standards #28)LS_SECRET = 'order_item_remover_worker_secret' — المفتاح الوحيد في localStorageTOOL_NAME = 'order_item_remover' — قيمة tool في جدول logscurrentOrder — آخر أوردر تم البحث عنه (في الذاكرة)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 | ملاحظات |
|---|---|---|---|---|---|---|
| اضغط تحديث لتحميل السجل | ||||||