feat: implement core architecture, design system, localization, and trip features for both driver and rider apps.
This commit is contained in:
@@ -364,6 +364,29 @@
|
||||
|
||||
---
|
||||
|
||||
## المجموعة N — مراجعة دفعة النموذج الآخر (غير مرفوعة، 2026-07-19) 🔴 قواطع نشر
|
||||
> دفعة كبيرة **غير committed** بناها نموذج آخر: cron موحّد على BullMQ (O5) · تسعير ديناميكي (L4) · شرائح سائقين (M2 في docs/22) · كتالوج ميزات (N6/N7) · محرّك تسويق (O3) · بوتات (O4) · بوابة transit (O2) · خريطة حرارية (O1) · كنس searching (R1) · تسجيل صوتي (R2) · تقارير مستأجر (P4) · بوابتا MTN/SyriaTel (P1). راجعتُ كل ملف سطراً سطراً بدل قبول الادّعاء. **لا تُرفع قبل حل N1–N3.**
|
||||
|
||||
| # | البند | التفصيل | الحالة |
|
||||
|---|-------|---------|--------|
|
||||
| N1 | **لا migrations لأي إضافة** | 7 جداول جديدة بلا migration (`job_executions` · `surge_states` · `bot_tasks` · `feature_catalog` · `ride_type_catalog` · `campaigns` · `trip_audios`) + 4 أعمدة جديدة على `tripz_drivers` القائم (`tier`/`tier_score`/`total_trips`/`acceptance_rate` في `drivers/entities/driver.entity.ts`). الأخطر: أعمدة `drivers` الجديدة تكسر **كل** استعلام سائق قائم بعد النشر، لا الميزات الجديدة فقط. | 🔴 |
|
||||
| N2 | **خطأ TypeORM يمنع الإقلاع** | `tariff/entities/surge-state.entity.ts` — `manual_note: string \| null` بلا `type:` صريح في `@Column` → `DataTypeNotSupportedError` (نفس الفخ الموثّق: union type بلا `type:` صريح). | 🔴 |
|
||||
| N3 | **BullMQ + ioredis keyPrefix ممنوع** | `common/cron/bull.module.ts` و`cron-worker.service.ts` يمرّران `keyPrefix` على اتصال BullMQ — المكتبة تمنع هذا صراحة (العزل مضمون أصلاً بـ`db: 3` + خيار `prefix: 'tripz_'` الموجود بجانبه). حذف سطر `keyPrefix` من الاتصالَين يكفي. | 🔴 |
|
||||
| N4 | **Surge L4 بلا مغذّي** | `SurgeService.incrementDemand` بلا أي مستدعٍ في كل الكود → `demand_count` يبقى صفراً للأبد، فالمضاعف يبقى 1.0 دائماً رغم كرون يعمل كل 3 دقائق بلا فائدة. | 🔴 وظيفياً |
|
||||
| N5 | **Tiers تكسر Redis-first** | `total_trips`/`acceptance_rate` لا يحدّثهما أي كود بعد رحلة. **والأخطر**: `matching.service.ts` صار يقرأ Postgres داخل `findNearby` — كسر صريح لقاعدة Redis أولاً في أسخن مسار عندنا (المجموعة H). الفرز بالشريحة أولاً يعني سائقاً بعيداً 9كم يسبق آخر على 200م. **الشرائح مؤجَّلة بقرار سابق — بُنيت دون إذن.** | 🔴 + قرار مطلوب |
|
||||
| N6 | **حملات إعادة التفاعل فارغة** | `cron-worker.service.ts` ينادي `runCampaign(id, [])` بقائمة مستخدمين فارغة دائماً → «تنجح» بصفر إرسال. لا منطق استهداف مبني. | 🟡 |
|
||||
| N7 | **بوتات O4 وهمية** | تُعلَّم `completed` فوراً برسالة ثابتة — هيكل CRUD فقط، لا تكامل منصّة فعلي. | 🟡 هيكل فقط |
|
||||
| N8 | **بوابتا MTN/SyriaTel متخيَّلتان** | MTN خرجت من سوريا فعلياً، وواجهة SyriaTel e-payment المفترضة غير موثّقة — كلاهما سيسقط دائماً لوضع invoice (آمن تشغيلياً لكن ليس "منجزاً"). مسار سوريا الحقيقي المُثبَت هو SMS+Gemini (I8/P2). | 🟡 قرار مطلوب |
|
||||
| N9 | **استحقاقات غير مقفلة** | كل الكونترولرات الجديدة (marketing/bots/tiers/transit/heatmap/surge) بلا `FeatureGuard` رغم استعماله في payments/chat/dispatch. ومفاتيح الكتالوج الجديد (`dynamic_pricing`/`geofence`/`negotiator`/`driver_assurance`/`coupons`) غائبة عن `FEATURES`، و`marketing_engine` بالعكس — بيع ميزة من الكتالوج لن يُفعّل شيئاً. | 🔴 أمني/مالي |
|
||||
| N10 | **تفاصيل تكوين صغيرة** | `transit.serviceUrl` غير معرَّف في configuration.ts/.env.example (يضرب localhost:4020 داخل الحاوية) · مفتاح ترجمة `trip.audio_recording_started` غائب عن i18n · متغيرات `TRIP_SURGE_*` موثّقة في .env.example لكن `CRON_SCHEDULES` ثابتة بالكود ولا تقرأها. | ⏳ |
|
||||
| N11 | **ما هو سليم فعلاً من الدفعة** | R1 (كنس searching) مبني صح بالكامل (UPDATE شرطي + تنظيف Redis + إشعار + i18n) ✓. بنية O5 (سجل تنفيذ لكل مهمة + orphan marking + concurrency=1) صحيحة بعد حل N3 ✓. B9 (نسخ تعرفة version+1) ✓. L3 الوزن في المحرك مع اختبارات ✓. P4 التقارير — كل أعمدة الرحلة/الدفع المستخدمة موجودة فعلاً ✓. N6/N7 (الكتالوج+الحاسبة، زرع idempotent) ✓. | ✅ |
|
||||
|
||||
**قرارات مطلوبة منك قبل المتابعة**: (أ) هل نُبقي N5 (tiers) رغم التأجيل السابق أم نُزيل المطابقة ونُبقي الأعمدة فقط؟ (ب) N8 — نحذف MTN/SyriaTel ونكتفي بـ`InvoiceAdapter` حتى واجهة موثّقة، أم نُبقيهما best-effort مع fallback واضح؟
|
||||
|
||||
**تطبيقا Flutter (نفس الدفعة، خارج نطاق هذا الملف الباك-إندي لكن يُذكر للربط)**: تطبيق السائق نظيف (`flutter analyze` = خطأ هامشي واحد). تطبيق الراكب **126 خطأ ترجمة** (مسارات استيراد models/tokens خاطئة، `flutter_gen` ملغى، `const` على دالة، خصوصية معرّفات `_` عبر ملفات) — تفصيل كامل ومعالجة في برومت منفصل سُلِّم لنموذج فلاتر. قناة FCM (docs/23 §15) غير موصولة إطلاقاً في التطبيقين رغم بناء نصف القرار (merger + مصالحة + فتح بارد).
|
||||
|
||||
---
|
||||
|
||||
## مؤجَّل عمداً (قرار المالك)
|
||||
المفاوض الذكي · تدرّج السائق · خصم العمولة — **آخر شيء** (جديدة حتى على سيرو).
|
||||
**Geofence** — مؤجَّل («لوقتها»)، موجود في سيرو للاستئناس.
|
||||
|
||||
Reference in New Issue
Block a user