Hamza-AyedandClaude Sonnet 5 d4ac38ca87 feat: P1 — بوابات دفع حقيقية (PayMob) + إغلاق ثغرة webhook حرجة
الأهم أولاً: `PaymentsService.webhook()` كان يقبل أي جسم `{ payment_id }`
بلا أي تحقّق توقيع — من يعرف معرّف دفعة معلَّقة كان يستطيع تحويلها «ناجحة»
ويشحن رصيداً من عدم (محفظة راكب أو رصيد سائق تشغيلي). الآن كل تغيير حالة
محروس بـ`adapter.verifyWebhook(headers, payload, tenant)`، ولا شيء يُقرأ من
الحمولة قبل ذلك كقرار ثقة — قراءة المرجع لتحديد المستأجر ليست قراراً.

البنية (docs/07 · docs/24 — P1):
- `PaymentAdapter`: charge() يعيد instant (كاش) · redirect (بوابة API حقيقية)
  · invoice (بلا API، تسوية عبر P2).
- PayMob (مصر): تسلسل auth→order→payment_key→iframe حقيقي عبر fetch،
  وتحقّق HMAC-SHA512 على تسلسل حقول ثابت (بروتوكول PayMob الرسمي بالضبط)
  بمقارنة ثابتة الزمن. مفاتيح كل مستأجر مستقلة — حساب تاجر خاص به.
- كليق/شام كاش/MTN/سيرياتيل/زين كاش: محوّل مشترك واحد لأن سلوكها متطابق
  فعلياً في سيرو (`create_*_invoice.php` تُنشئ فاتورة فقط، لا نداء بوابة
  حيّاً) — مرجع + حساب استلام معروض، والتسوية عبر رسالة SMS لا webhook.
  MTN/سيرياتيل الحقيقيَّين (توكن+OTP) موثَّقان كبند مفتوح: لا نبني تكاملاً
  لا نملك اعتماداً حيّاً للتحقّق منه.
- `PATCH /payments/settings` لأدمن المستأجر: مفاتيح PayMob · حسابات
  الاستلام · سرّ webhook الرسائل — الاستجابة لا تُعيد الأسرار.

تنظيف: إزالة الإشارات المتبقّية لحاوية `martin` من docs/07 (أُزيلت فعلياً
سابقاً)، وتحديث هيكل الكود الموثَّق ليطابق ما هو مبنيّ فعلاً.

25 اختباراً جديداً (226 إجمالاً) — منها توقيع PayMob محسوب فعلياً ومُتحقَّق،
وتلاعبٌ بالحمولة بعد التوقيع يُرفض، وسبع حالات تثبت إغلاق ثغرة الـwebhook.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 15:50:05 +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%