Hamza-AyedandClaude Opus 4.8 8f6c46f0ac feat: D5 — OTP متعدد المزوّدين حسب الدولة (من سيرو) + قرار بلا كلمة مرور
مراجعة سيرو (auth/otp/): مصر تستعمل Kazumi SMS مع failover لواتساب،
وسوريا/الأردن Nabeh. عندنا كان مزوّد واحد فقط.

- integrations/otp/: واجهة OtpProvider + OtpDispatcher يوجّه حسب
  tenant.countryPack بسلسلة failover (eg: [kazumi, nabeh] · jo/sy: [nabeh])
- KazumiSmsProvider (مصر SMS) + NabehOtpProvider (غلاف على NabehService)
- كل مزوّد يرسل رمزاً نولّده نحن (Redis) — استبعدنا نمط Intaleq (يولّد الرمز
  بنفسه) حفاظاً على مصدر واحد للرمز
- موحَّد: AuthService.sendOtp و PayoutsService.issueOtp يمرّان بنفس المُوزِّع
  الآن — أُزيل كل استدعاء Nabeh مباشر. أي مسار يحتاج رسالة يستدعي الخدمة
  الموحّدة (طلب المالك)
- فشل السلسلة كاملة = ServiceUnavailable صريح، لا صمت

قرار المالك (2026-07-17): بلا كلمة مرور إطلاقاً. المصادقة = هاتف + OTP مرة
→ جلسة مربوطة بالجهاز (D2). التسجيل بالهاتف لا Google/Apple (محظوران في بعض
الدول). سيرو نفسه لا كلمة مرور حقيقية له (password = hash(email) وهمي،
ومقارنة نصّية غير آمنة في مسار التجربة). يطابق أوبر/كريم/inDrive.

مراجعة حدّ الطلبات في سيرو (RateLimiter.php): حدود مسمّاة لكل نوع + fallback
بملف عند تعطّل Redis (fail-closed). عندنا مسار OTP fail-closed أصلاً؛
تخزين Throttler على Redis مؤجَّل للتوسّع الأفقي الفعلي (موثّق في D4).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 19:24:01 +03:00
2026-07-16 16:01:28 +03:00

Tripz — منصة نقل ذكي متعددة المستأجرين (White-Label)

منصة SaaS لتأجير تطبيقات نقل بعلامة تجارية خاصة لكل مستأجر (مكتب تكسي / أسطول / مشغّل مرخّص) في دول متعددة. تُبنى لتكسر نموذج Onde عبر أربع فجوات: الشفافية السعرية، الاستضافة داخل الدولة (السيادة)، خرائط انطلق الذاتية (بلا فاتورة خرائط)، والعربية أولاً.

هذا الفولدر هو حجر الأساس التخطيطي للمشروع قبل كتابة أي كود. كل ملف هنا يجيب عن سؤال واحد: ماذا نبني، وكيف، وبأي ترتيب.


القرارات المحسومة (لا نقاش فيها عند البناء)

الطبقة القرار لماذا
الباك إند NestJS 11 + TypeORM + PostgreSQL/PostGIS + Redis باك إند انطلق مبني به أصلاً وفيه Tenant + Usage جاهزان
الـ Realtime Socket.IO Gateway (@nestjs/websockets) + redis-adapter لغة واحدة، فريق واحد، توسّع أفقي
الموبايل Flutter + flutter_bloc (Cubit افتراضياً، Bloc لدورة الرحلة والعروض) قابلية اختبار وتدقيق لمنتج يُرخّص + قرب من عقلية GetX
التوجيه/الحقن go_router + get_it معيار صناعي مقبول
الخرائط انطلق (Martin tiles + geocoding + routing ذاتي) الخندق التنافسي: بلا اعتماد على Google
الاستئجار قاعدة واحدة + tenant_id (قياسي)، ونسخة معزولة (وضع سيادة) أرخص تشغيلاً + منتج مضاد لثغرة Onde

تفاصيل كل قرار في docs/02-backend-plan.md وdocs/03-mobile-plan.md.


خريطة الوثائق

ابدأ من الأعلى للأسفل. كل ملف مستقل لكنه يشير للبقية.

# الملف يجيب عن
00 نظرة عامة الرؤية، الجمهور، التمايز، ما ليس ضمن النطاق
01 البنية كيف تتحدث الأنظمة معاً (مخطط عام)
02 الباك إند وحدات NestJS، الطبقات، الحرّاس
03 الموبايل هيكل فلاتر، الحالة، الشاشات، الـ flavors
04 محرك التعرفة كيف نسعّر الرحلة (JSON قواعد)
05 تسعير المنتج والفوترة الباقات وخوارزمية فاتورة المستأجر
06 نموذج الاستئجار tenant_id، وضع السيادة، حزم الدول
07 التكاملات الدفع، OTP/SMS، واجهة المنظّم، Webhooks
08 نموذج البيانات الجداول الأساسية والعلاقات
09 الطبقة الحية قنوات Socket، الحضور، الإسناد
10 خطة التنفيذ P0→P3 بالأسابيع وشروط الخروج
11 النشر والأتمتة CI، flavors، fastlane، البيئات
12 اللاندنج والبيع الموقع، قنوات البيع بلا إعلانات
13 المخاطر والقرارات المفتوحة ما يحتاج حسم المالك
14 اصطلاحات السيرفر والعزل قرارات تشغيلية محسومة: البادئة، Redis DB، سيرفر مشترك، سيرو
🌳 شجرة المستودع البنية الكاملة للمجلدات والملفات

البدء السريع (عند جهوزية القرار)

  1. اقرأ 00-overview → 01-architecture.
  2. احسم القرارات المفتوحة (الاسم، سوق الانطلاق، دور سيرو).
  3. نفّذ P0 — تأسيس الـ Monorepo.
  4. تابع الشجرة المرجعية في project-tree.

الحالة: تخطيط · آخر تحديث: 2026-07-16 · الاسم المؤقت: Tripz

S
Description
No description provided
Readme
110 MiB
Languages
Dart 56.8%
JavaScript 21.3%
PHP 12.3%
TypeScript 4%
Kotlin 1.8%
Other 3.5%