diff --git a/docs/17-backend-backlog.md b/docs/17-backend-backlog.md index dfdc1ac..b99cc4c 100644 --- a/docs/17-backend-backlog.md +++ b/docs/17-backend-backlog.md @@ -338,6 +338,32 @@ --- +### M — التحديث الثاني: الأرقام من جدول `kazan` الحيّ (2026-07-19) — ✅ مُثبَتة على السيرفر + +بعد الحصول على جدول `kazan` من قاعدة سيرو، أُعيد بناء الأرقام منه لا من تقدير. العمولة (11٪ · 12٪ · 14٪) طابقت ما عندنا حرفياً؛ وثلاثة تصحيحات لزمت: + +| الاكتشاف | الدليل في البيانات | +|---|---| +| **محورا الأردن مقلوبان** | أعمدة الفئات تحمل سعر الدقيقة (0.043) وأعمدة النوافذ سعر الكيلومتر (0.184) — عكس مصر وسوريا. قراءتها كما هي = رحلة 27 كم بأقلّ من ديناريَن | +| **نِسَب مصر وسوريا معطوبة** | الكهربائي 0.23 والفان 0.25–0.40 من الاقتصادي — أي فان أرخص من اقتصادي. نِسَب الأردن وحدها متماسكة (0.86 → 1.51) فاعتُمدت للثلاثة | +| **لا فتحة عدّاد** | `startPrice = 0` في كل الصفوف. قرار المالك: **الحدّ الأدنى هو الآلية** («ما في رحلة أقل من 20 جنيهاً») لا رسم يُضاف فوق كل أجرة | + +**البنية النهائية** (وهي ما سيكتب فيه بوت استخبارات الأسعار): سعر الكيلومتر يتغيّر **بالفئة** فقط — رقم يعرفه السوق فلا يتذبذب بالساعة؛ وسعر الدقيقة يتغيّر **بالنافذة** فقط. `fuelPrice` محفوظ كمدخل للبوت. بنية سيرو تُمثَّل عندنا بلا خسارة، والعكس غير صحيح (لا منطقة زمنية ولا إصدارات ولا سماحية مسافة عنده). + +**تسريبان أغلقهما الاختبار الحيّ** (بموافقة المالك): +- **فئة مجهولة = رحلة مجانية**: `service_class` يأتي من الطلب بلا تحقّق، والاستثناء كان يُبتلع فتُنشأ رحلة بـ`quoted_fare = null` ثم تُسوّى بصفر. صار الطلب يُرفض بـ400. +- **`fixed` أُخرجت من الزرع**: سعر ثابت بلا جدول خطوط = رقم واحد لكل الوجهات — أظهر الاختبار رحلة 55.8 كم بـ2.5 ديناراً مقابل 23.2 للاقتصادي. + +**الإثبات على السيرفر (2026-07-19)**: 72 طلباً حقيقياً (8 فئات × 3 مسافات × 3 بلدان) بمسافات فعلية من انطلق (2.973 / 27.401 / 55.765 كم)، كلها رجعت سعراً مطابقاً للحساب اليدوي، و3 رفضات لـ`fixed` مؤكَّدة. السكربت: `scripts/verify-and-test.sh` (يفحص البيئة → يقلع → ينتظر `/health` → **يبطل كاش التعرفة** → يختبر). + +**درسان تشغيليان مثبَّتان في السكربت لا في الذاكرة**: +1. **كاش Redis ينجو من إعادة تشغيل الـapi** (حاوية منفصلة). تطبيق `tariffs.sql` مباشرةً يتجاوز إبطال التطبيق، فخدم النظام أسعاراً قديمة عبر **دورتَي نشر** وهو يعلن النجاح. +2. **`OTP_DEV_MODE=true` مع `NODE_ENV=production` يمنع الإقلاع** (`process.exit(1)` لا تحذير)، فيظهر العطل لاحقاً كـ`EAI_AGAIN` داخل الاختبار — أي في المكان الخطأ تماماً. + +**مؤجَّل بقرار**: جدول الخطوط الثابتة (أصل → وجهة → سعر) لتفعيل فئة `fixed`. + +--- + ## مؤجَّل عمداً (قرار المالك) المفاوض الذكي · تدرّج السائق · خصم العمولة — **آخر شيء** (جديدة حتى على سيرو). **Geofence** — مؤجَّل («لوقتها»)، موجود في سيرو للاستئناس.