115 lines
13 KiB
Markdown
115 lines
13 KiB
Markdown
# 27 — كتالوج الميزات (قائمة المالك 2026-07-19) + جرد كرون سيرو الكامل
|
|
|
|
> مصدره: إملاء المالك (2026-07-19) لميزات التوليد والتفعيل، + قراءة مباشرة لكل ملفات cron في مستودع سيرو المحلي وجداول الجدولة في `Siro/docs/03_pricing/pricing_system_report.md`.
|
|
> هذا المستند يغذّي **N6** (جدول `feature_catalog` والتسعير) و**N7** (مولّد عرض السعر/الحاسبة) و**O5** (توحيد الكرون على BullMQ) و**§1.5 في docs/22** (أعلام `const` للتوليد).
|
|
|
|
---
|
|
|
|
## 1. الحاكمية — من يقرّر وماذا يسري
|
|
|
|
- **السوبر-أدمن** يحدّد الميزات بالاتفاق مع المستأجر/المالك **عند التعاقد**، وتوليد التطبيق (N3) يُخرج نسخة بهذه المواصفات حصراً.
|
|
- القاعدة الحاكمة (docs/22 §1.5): **`الفعّال = المبني في الـbinary (أعلام const) ∩ المانيفست الريموت ∩ استحقاقات السيرفر (FeatureGuard)`**. العلم في التطبيق قرار عرض؛ الحدّ الأمني يبقى السيرفر (docs/19).
|
|
- التسعير: كل ميزة مدفوعة لها **سعر شهري + رسم إعداد** في `feature_catalog` (N6 — ⬜ لم يُبنَ)، والحاسبة في لوحة السوبر-أدمن (N7 — ⬜) تُخرج عرض السعر وتكتب `tenants.features` آلياً عند الاعتماد. الباقات نناقشها بعد بناء الكتالوج.
|
|
|
|
---
|
|
|
|
## 2. الأساسيات الثابتة — في كل نسخة، ليست خيارات
|
|
|
|
| الميزة | حالة الباك إند |
|
|
|--------|----------------|
|
|
| Splash / Onboarding | — (فلاتر Q1) |
|
|
| تسجيل الدخول والتسجيل (هاتف + OTP، بلا كلمة مرور) | ✅ (D5، متعدد المزوّدين) |
|
|
| طلب الرحلة + عرض أسعار الفئات قبل الطلب | ✅ (`POST /tariff/quote` — مُثبَت 72 طلباً على السيرفر) |
|
|
| رسم البولي لاين على الخريطة | ✅ (route عبر سيرفرنا + كاش Redis) — الرسم نفسه فلاتر |
|
|
| تتبّع السائق الأساسي أثناء الرحلة | ✅ (المجموعة H — Redis فقط، عتبات سيرو) |
|
|
| الدفع كاش (الافتراضي الأساسي) | ✅ (`cash.adapter`) |
|
|
| التقييم + الدردشة + الإشعارات المترجمة | ✅ (A/F/G) |
|
|
|
|
---
|
|
|
|
## 3. الميزات القابلة للتفعيل والبيع (قائمة المالك)
|
|
|
|
| الميزة (بتسمية المالك) | المفتاح المقترح | حالة الباك إند | ملاحظات |
|
|
|------------------------|-----------------|----------------|----------|
|
|
| عدد/تشكيلة فئات السيارات المعروضة | `ride_classes_set` | ✅ | `ride_types` لكل مستأجر + تعرفة لكل فئة (M9). الحدّ بالعدد يُضاف كـentitlement رقمي (نمط `drivers_max`) |
|
|
| فئات أسعار | `tariff_engine_full` | ✅ | محرّك كامل: نوافذ محلية التوقيت + انتظار + حدّ أدنى مرساة (docs/17-M) |
|
|
| التتبّع اللحظي المتقدّم (بولي لاين حيّ يُعاد رسمه مع تغيّر الاتجاه) | `live_tracking_pro` | ✅ باك إند (H) | الضغط الحقيقي محلول (Redis + عتبات). الرسم وإعادة المسار في فلاتر Q2. يُسعَّر لأنه يستهلك route calls |
|
|
| التسجيل الصوتي داخل الرحلة | `trip_audio_recording` | ⬜ **بند جديد — لم يكن في أي خطة** | يحتاج: رفع مقاطع + تخزين + سياسة احتفاظ/حذف + إقرار قانوني بالإشعار للطرفين. يُسجَّل في الـbacklog |
|
|
| معالجة وثائق السائقين بالذكاء الاصطناعي | `ai_document_processing` | ✅ **مبني بالكود** | `integrations/gemini` + `documents.service` (`extractDocument` + `faceMatch`)، خلف `GEMINI_API_KEY`. `ai_data`/`user_input` (C3) جاهزان |
|
|
| معالجة المشاكل/الشكاوى بالذكاء الاصطناعي | `ai_complaints` | ⬜ | **وحدة complaints نفسها غير موجودة** (لوحظ في N5). تُبنى الوحدة أولاً ثم طبقة الـAI فوقها |
|
|
| الخريطة الحرارية (سائق) | `heatmap` | ⬜ O1 | المصدر جاهز (`driver_tracks` من H) — يلزم كرون توليد الكاش (نظير `cron_generate_heatmap_cache`) |
|
|
| الخريطة التنبؤية | `predictive_demand` | ⬜ O1 | نظير `cron_predictive_demand` (خلايا 0.01° × 4 أسابيع تاريخ) |
|
|
| Geofence (رسائل/إعلانات/برومو بالمنطقة + تسعير مناطق) | `geofence` | 🔵 **مبني بالكود** (a15e65c + fef1235) | Redis pub-sub + `geofence_promo` push عند دخول المنطقة + مضاعف تسعير في `tariff.engine`. ينقصه: واجهة أدمن لرسم المناطق + إثبات سيرفر |
|
|
| برومو كود عام | `coupons` | ✅ | محرّك الكوبونات (17-L) بسقوف العملات |
|
|
| البرومو المتخصص (استهداف شرائح/مناطق/حملات) | `targeted_promo` | 🔵 جزئي | `geofence_promo` موجود؛ محرّك الحملات المجدولة (نظير `auto_marketing_pusher` + `passenger_reengagement`) ⬜ |
|
|
| رسائل واتساب + بوت نبيه (تشغيل البوتات) | `whatsapp_campaigns` | 🔵 جزئي | قناة نبيه مبنية (OTP). استعمالها للحملات الجماعية ⬜ — يلزم صندوق حملات + حدود إرسال |
|
|
| محرّك التسويق (بوتات اجتماعية + مولّد تعليقات Gemini + تقارير) | `marketing_engine` | ⬜ O3/O4 | نقل `marketing_engine` + `socialBot` + `android_bot` كإضافة مدفوعة خلف الاستحقاقات |
|
|
| محرّك التسعير الديناميكي (استخبار المنافسين + surge + ضبط العمولة) | `dynamic_pricing` | ⬜ L4 | محرّكنا **يستقبل** المضاعف جاهزاً (`surge.multiplier` + مضاعف geofence موجودان). الناقص: البوت الذي **يكتب** المضاعف (نظائر `ai_engine`/`surge_opportunity`/`kazan_adjuster`/`pricing_stability`/`seasonal`) |
|
|
| المواصلات (خطوط باص) | `transit` | 🔵 **microservice مبني** (`backend-transit/`، f30209b) + لوحة مشرف | التكامل مع تطبيقي الراكب/السائق ووضع الباص ⬜ |
|
|
| الدفع بالمحفظة | `wallet_payment` | ✅ | I1 مُثبَت بتزامن حقيقي |
|
|
| الدفع عبر البنوك/المحافظ الخارجية | `payment_gateways` | 🔵 | PayMob مبني بالكود (d4ac38c) + registry محوّلات. CliQ · MTN/سيرياتيل · شام كاش ⬜ (P1) |
|
|
| التسوية بالرسائل (SMS خام + Gemini) | `sms_settlement` | ✅ **مبني بالكود** (da035e4) | `sms-settlement.service` + `raw_sms` + استخراج Gemini — نمط سيرو مع إغلاق ثغراته |
|
|
| المفاوض الذكي · شرائح السائقين · تأمين السائق | `negotiator` · `driver_tiers` · `driver_assurance` | ⬜ مؤجَّلة بقرار المالك («آخر شيء») | docs/22-M |
|
|
|
|
> **«الشيك القابل للإضافة والتعديل»** الذي ذكره المالك شفهياً: فُهم كوسيلة دفع إضافية قابلة للتفعيل — يُثبَّت تعريفه عند أول جلسة تسعير (بنية `payment_gateway.registry` تستوعب أي وسيلة جديدة كمحوّل).
|
|
|
|
---
|
|
|
|
## 4. جرد كرون سيرو الكامل (مقروء من المستودع + جداول سيرو نفسها)
|
|
|
|
> الهدف: **O5** — كل هذه تتوحّد عندنا في BullMQ (بادئة `tripz_`) بقفل ضد التشغيل المزدوج وسجل تنفيذ. لا `crontab` نظامي متناثر.
|
|
|
|
### bot/ (التسعير والذكاء) — كلها ضمن `dynamic_pricing` و`heatmap` و`predictive_demand` و`targeted_promo`
|
|
| الملف | الجدولة (من وثائق سيرو) | الوظيفة |
|
|
|-------|--------------------------|----------|
|
|
| `cron_ai_engine` | كل 3 ساعات | يقرأ معادلات المنافسين من pricing-engine ويطبّق تسعيراً ذكياً |
|
|
| `cron_pricing_stability_engine` | كل 3 ساعات | **shadow mode** — يصنّف انحراف الأسعار (برومو مؤقت / تغيير حقيقي / مستقر) بلا لمس kazan |
|
|
| `cron_seasonal_pricing` | كل ساعة | مواسم (إفطار رمضان ×1.25، أعياد) بتوقيت كل دولة |
|
|
| `cron_surge_opportunity` | كل 10 دقائق | يكتشف مناطق ذروة المنافسين ويكتب المضاعف في Redis |
|
|
| `cron_kazan_adjuster` | كل 5–10 دقائق | يخفّض العمولة ويضيف حوافز للسائقين في مناطق الذروة |
|
|
| `cron_generate_pricing_cache` | دوري | متوسط أسعار المنافسين لكل مربع 2.5كم → Redis |
|
|
| `cron_generate_heatmap_cache` | كل 16 دقيقة | كاش الخريطة الحرارية → Redis |
|
|
| `cron_predictive_demand` | كل ساعة | تنبّؤ الطلب (نفس اليوم/الساعة × 4 أسابيع) + FCM للسائقين القريبين |
|
|
| `cron_empty_results_to_db` | كل ساعة | تفريغ نتائج البوت من ملف إلى القاعدة |
|
|
| `cron_passenger_reengagement` | يومياً 10:00 | إشعار Gemini مخصص للخاملين ≥3 أيام (anti-spam 72س في Redis) |
|
|
| `cron_auto_marketing_pusher` | كل ساعة | رسالة تسويقية Gemini للّي فتحوا ولم يطلبوا خلال ساعتين |
|
|
| `cron_silent_push_inactive` | كل بضع ساعات | push صامت يوقظ التطبيق ليرفع الموقع |
|
|
| `cron_dashboard_snapshot` | ساعي/يومي/أسبوعي | أرشفة لقطات التحليلات JSON |
|
|
| `cron_weekly_health_report` | الأحد ليلاً | تقرير صحة السوق التنافسية |
|
|
| `cron_gemini_advisor` | دوري | تحليل استراتيجي للمعادلات المكتشفة عبر Gemini |
|
|
|
|
### marketing_engine/ — ضمن `marketing_engine`
|
|
| الملف | الجدولة | الوظيفة |
|
|
|-------|---------|----------|
|
|
| `cron_insert_task` | كل 4 ساعات | يزرع مهام `autonomous_scroll_and_reply` (فيسبوك/إنستغرام) للبوتات |
|
|
| `cron_weekly_report` | أسبوعي | تلخيص تقارير التسويق عبر Gemini |
|
|
| `telegram_scraper` | كل 3 ساعات | استخراج بيانات من المنصات |
|
|
| `generate_10_tasks_cli` | كل 15 دقيقة | توليد مهام مصغّرة للبوتات |
|
|
|
|
### transit/ — ضمن `transit`
|
|
| الملف | الجدولة | الوظيفة |
|
|
|-------|---------|----------|
|
|
| `cron_approaching_alerts` | كل دقيقة | تنبيه اقتراب الباص من المحطة (<2كم) |
|
|
| `cron_cleanup` | يومياً 03:30 | تنظيف الجلسات وسجل OTP المنتهي |
|
|
| `cron_sync_members` | يومياً 03:00 | إعادة بناء مجموعات الأعضاء في Redis من القاعدة |
|
|
|
|
### ride/ + payment_server/ — النواة
|
|
| الملف | الوظيفة | موقفنا |
|
|
|-------|----------|--------|
|
|
| `cron_ride_timeout` | تصفير الرحلات العالقة `waiting` بعد 15 دقيقة | 🔴 **فجوة مؤكّدة عندنا**: `expired`/`no_drivers` انتقالان شرعيان في آلة الحالة (`trips.service.ts`) لكن **لا شيء يطلقهما بمؤقّت** — رحلة `searching` بلا قبول تبقى معلّقة للأبد. المطلوب: sweeper بنمط `ScheduledTripsSweeper` |
|
|
| `deleteNewDriverGiftCronJob` | حذف التكرارات يومياً من `driverWallet` | **لا يُنقل** — ترقيع لغياب القيود؛ فهارسنا الفريدة (J6/L2) تمنع التكرار من الأصل |
|
|
|
|
---
|
|
|
|
## 5. بنود جديدة سُجّلت اليوم (لم تكن في أي مجموعة)
|
|
|
|
| # | البند | إلى أين |
|
|
|---|-------|---------|
|
|
| R1 | **sweeper مهلة البحث** (`searching` → `no_drivers`/`expired`) | نواة — يُبنى فوراً قبل فلاتر، فجوة تشغيلية لا ميزة |
|
|
| R2 | **التسجيل الصوتي داخل الرحلة** (رفع + تخزين + احتفاظ + إشعار قانوني) | ميزة مدفوعة — بعد قرار المالك في التخزين والمدة |
|
|
| R3 | **وحدة الشكاوى complaints** (أساس لوحة الخدمة N5 ولميزة `ai_complaints`) | نواة الإدارة |
|
|
| R4 | **واجهة أدمن لرسم مناطق Geofence** | مكمّل M3 |
|
|
|
|
---
|
|
← ذو صلة: [22-full-product-roadmap](22-full-product-roadmap.md) · [19-entitlements-licensing](19-entitlements-licensing.md) · [17-backend-backlog](17-backend-backlog.md)
|