# RESUME — variant-inventory-phase1-9257 (ISS-2026-9257)

**الحالة: ✅ مكتملة.** الأربع WPs + 3 جولات إصلاح + مراجعة شاملة. منشورة على /app (`main-YOIJOJJU.js`) ومستنّية تجربة العميل.

## اللي شُحن
| WP | المحتوى | الحالة |
|----|---------|--------|
| A | ورقة الجرد بحبيبة (منتج × متغيّر) + إنقاذ أي رصيد يتيم ≠ 0 | ✅ APPROVE |
| B | تنبيهات إعادة الطلب per-variant + **طبقة مشتركة** `ReorderGrainService` يستخدمها المخزون والإنتاج | ✅ APPROVE |
| C | كارت الصنف: فلتر `product_variant_id` ثلاثي القيمة + تحقّق مدخل | ✅ APPROVE |
| D | الواجهة: عرض اللون/المقاس + هوية صف صحيحة + حفظ على الصف الصح | ✅ APPROVE |

## الأرقام
- **اختبارات Inventory كاملة: 530 نجاح / 1 فشل** (خط الأساس 450/1) ⇒ **+80 اختبار، صفر فشل جديد**. الفشل الوحيد هو الـbaseline السابق `OpeningBalanceApiTest`.
- ProductionAlertsTest 14/14 · فلتر `Reorder|Grain|CountSheet|InventoryCount` **116/0**.
- تحقّق على **MySQL الحقيقي**: 17,151 صف متطابقة بايت-ببايت للمنتجات بلا متغيّرات، عبر **كل الـ16 مخزن**، وصفر منتج بيطلّع صف زيادة.
- مفيش migration. مفيش تغيير في `store()`/`finalize()`/`FinalizeCount`.

## العيوب اللي البوابات منعتها (كلها «رقم غلط شكله صح»)
1. ورقة الجرد بتضاعف المخزون لمنتجات «عرض فقط» (500 → 1000).
2. مخزون قديم مسجّل على المنتج بيختفي من العدّ ⇒ مضاعفة.
3. تنبيهات نفاد وهمية لمنتج فيه 500 قطعة (اقتراح شراء 200).
4. كارت الصنف بيعرض حركات لون تحت اسم لون تاني.
5. شاشة الإنتاج وشاشة المخزون بيتناقضوا (اتقفل بالطبقة المشتركة).
6. لون **محذوف** شايل 25 قطعة غير مرئي للتنبيهات (تباعد اتولد أثناء الشغل واتمسك باختبار تطابق جديد).
7. حمولة الإشعار بلا سقف ⇒ تفيض عمود الداتابيز (العربي 6 بايت/حرف) ⇒ 500 وتسليم جزئي للمستلمين.
8. الواجهة كانت بتبعت كل الصفوف بلا لون ⇒ كل الكميات تترحّل على المنتج الأساسي.

## استثناءات موثّقة (مقصودة، مغطّاة باختبار)
- رصيد مربوط بمتغيّر **غير موجود أو تابع لمنتج تاني** (بيانات فاسدة، صفر حالات على dev): ورقة الجرد بتسقطه · الخدمة بتضمّه في `product_wide` عشان تفضل تحذّر من مخزون العدّاد مش شايفه. الحماية الدائمة اتضافت في **الكتابة** (تحقّق ملكية المتغيّر في طلب الجرد).
- قاعدة «غير الصفري» بتتقيّم على النطاق المطلوب — فتطابق الحبيبتين عقد **لكل مخزن**.

## مؤجّلات (مسجّلة، خارج نطاق المرحلة)
- `StockBalanceController::productLots()` ثنائي القيمة عكس الكارت (كامن — الواجهة مابتبعتش «فاضي»).
- docblock بتاع `movements()` بيوحي إن الرصيد الجاري مقروء هناك (ترتيبها بالتاريخ فمش مقروء).
- عدسة «المنتج الأساسي» في واجهة كارت الصنف (القيمة الثالثة مش قابلة للوصول من الشاشة).
- الفرق البسيط: الخدمة بتحصر مصدر الأرصدة بالشركة وورقة الجرد مابتعملش (صف برصيد company_id غلط مرئي للورقة ومخفي عن التنبيهات).

## الخطوة الجاية
verification منشور على ISS-2026-9257 → العميل يجرّب على /app. بعد تأكيده: **`/fullpush`** (شغل المالك). المرحلة ٢ = ISS-2026-9258، المرحلة ٣ = ISS-2026-9259.
