refactor: correct add-ons pricing, remove duplicate AI section, mark all modules as coming-soon

✨ تحسينات رئيسية:

1️⃣ إصلاحات توثيقية (docs/21, docs/33):
   - S18 ليست مشكلة — النظام يفرض سحب الرصيد الكامل فقط
   - إضافة تنبيه حالة عن عدم جاهزية الوحدات

2️⃣ إصلاحات الموقع (marketing/index.html):
   - حذف قسم #ai-modules المكرر (التكرار المحرج)
   - إضافة رابط «الإضافات» في القائمة العلوية (4 لغات)
   - تغيير جميع الشارات إلى «قريباً الربع القادم» (حماية قانونية)
   - 7 وحدات مدفوعة واضحة مع أسعار + وصف

3️⃣ النموذج التجاري:
   - النواة رخيصة = سلاح اكتساب
   - الوحدات = هامش الربح الحقيقي (land-and-expand)
   - بدون تكرار محرج للزائر

⚠️ الحد الأدنى قبل التسويق:
   - S4 و S5 تُصلح قبل أول استنساخ على سيرفر مستأجر
   - جرد صدق بند بند على إنتاج سيرو

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-07-24 04:59:23 +03:00
co-authored by Claude Opus 4.8
parent 213b459912
commit 822e4e8724
4 changed files with 215 additions and 71 deletions
+22 -5
View File
@@ -10,12 +10,19 @@
| **Tripz** | **$2,500–13,500** | **$169–879** | **نسبة معلنة، حد أدنى من $0.02** | **الشفافية نفسها هي التمايز** |
## الباقات الأربع
| الباقة | الإعداد | شهرياً | GMV% | الجوهر |
**«انطلاقة» ليست تطبيقاً بعلامة المستأجر** — مدينته تُدرَج كخيار داخل تطبيق **Tripz** الجامع نفسه (تطبيق موحّد واحد يضمّ عدة مدن/مشغّلين، مثل شركة نقل عالمية تدير عدة مدن تحت واجهة واحدة). الراكب يفتح تطبيق «Tripz» ويختار المدينة — لا يرى اسم المستأجر ولا شعاره. سقف 90 يوماً/10,000 رحلة هو فترة إثبات جدوى قبل الالتزام بتطبيق مستقل؛ بعده ترقية إلزامية إلى «علامة» أو توقّف.
كل باقة أعلى **تضيف** على ما قبلها ولا تستبدله — هذا هو مبرّر كل قفزة سعرية:
| الباقة | الإعداد | شهرياً | GMV% | الفارق الحقيقي عمّا قبلها |
|--------|---------|--------|------|--------|
| **انطلاقة** | $2,500 | $169 | 3.5% | مدينة المستأجر داخل تطبيقنا الجامع، لوحة + dispatch أساسي، حد أدنى $0.05/رحلة، سقف 90 يوماً أو 10k رحلة ثم ترقية |
| **علامة** ★ | $4,900 | $349 | 2.5% | تطبيقا راكب+سائق بعلامته، نشر المتاجر علينا، محرك تعرفة كامل، country pack، حد أدنى $0.04، دعم عربي |
| **أسطول+** | $8,500 | $599 | 2% (حد أدنى $0.03) | dispatch متقدم، بوابة شركات، حجز ويب، محافظ سائقين، API+Webhooks، تقارير متقدمة |
| **سيادة** | من $13,500 | $879 | 1% (حد أدنى $0.02) | نسخة معزولة داخل الدولة، بديل رسم/مركبة، واجهة المنظّم، SLA 99.9%، ضمان تصدير + خيار Escrow |
| **انطلاقة** | $2,500 | $169 | 3.5% (حد أدنى $0.05) | مدينة داخل تطبيق Tripz الجامع (بلا تطبيق بعلامته) + لوحة/dispatch أساسي + محرك تعرفة كامل بحزمة بلده. سقف 90 يوماً أو 10k رحلة |
| **علامة** ★ | $4,900 | $349 | 2.5% (حد أدنى $0.04) | **كل ما في انطلاقة، إضافة إلى:** تطبيقا راكب+سائق **خاصّان بعلامته** على المتجرين (لا مشاركة) + نشر ومراجعة المتجرين نتولاها بالكامل + بلا سقف + دعم عربي مباشر ومدير حساب |
| **أسطول+** | $8,500 | $599 | 2% (حد أدنى $0.03) | **كل ما في علامة، إضافة إلى:** Dispatch متقدم بتخصيص مناطق وشرائح سائقين + بوابة حجز للشركات (B2B) + حجز ويب + محافظ وائتمان مخصّصة للسائقين + API+Webhooks + تقارير تشغيلية متقدمة |
| **سيادة** | من $13,500 | $879 | 1% (حد أدنى $0.02) | **كل ما في أسطول+، إضافة إلى:** سيرفر معزول بالكامل داخل حدود الدولة ([docs/34](34-siro-backend-multitenancy.md)) + واجهة تقارير للمنظّم + SLA 99.9% + ضمان تصدير كامل + خيار Escrow |
> النصوص أعلاه مطابقة حرفياً لبطاقات `#pricing` في `marketing/index.html` (كل بطاقة ترقية تعرض سطر «↳ كل مزايا [الباقة السابقة]، إضافة إلى:» فوق قائمتها) — أي تعديل هنا يجب أن يُطبَّق هناك بالأربع لغات في نفس الوقت.
## خوارزمية الفوترة الشهرية
```
@@ -32,6 +39,16 @@ min_monthly = عدد الرحلات المكتملة × الحد الأدنى ل
(انطلاقة $0.05 · علامة $0.04 · أسطول+ $0.03 · سيادة $0.02)
```
**الحد الأدنى صمّام أمان شهري، لا رسم يُحصَّل على كل رحلة.** يُفعَّل فقط عندما تكون نسبة GMV أقل من حاصل ضرب عدد الرحلات بالحد الأدنى — أي في الأسواق منخفضة الأجرة (سوريا خصوصاً)، حيث تحميل الطلبات على السيرفرات ثابت بغضّ النظر عن سعر الرحلة.
مثال (باقة انطلاقة، 45,000 رحلة/شهر):
| السوق | متوسط الأجرة | نسبة GMV (3.5%) | الحد الأدنى ($0.05×45k=$2,250) | الفاتورة = الأكبر |
|---|---|---|---|---|
| عمّان (طبيعي) | $3.10 | $4,882 | $2,250 | **$4,882** — النسبة تفوز |
| دمشق (أجرة منخفضة) | $0.60 | $945 | $2,250 | **$2,250** — الحد الأدنى ينقذنا |
الحد الأدنى **تنازلي حسب الباقة** (٠.٠٥ ← ٠.٠٢) لأن المشغّل الأكبر يفاوض بحجمه أصلاً، ومصمَّم ليتفعّل أبكر في الباقات الرخيصة تحديداً حيث خطر الرحلات شبه المجانية أعلى.
## مثال محسوب — مشغّل عمّان
- 1,500 رحلة/يوم × 30 = **45,000 رحلة**، متوسط 2.2 دينار (≈$3.10) → **GMV ≈ $139,500**.
- فاتورة «علامة»: `$349 + (2.5%×50k) + (2.0%×89.5k)` ≈ **$3,389/شهر** (~2.4% فعلي). الحد الأدنى (45,000×$0.04 = $1,800) لا يُفعَّل لأن نسبة GMV أعلى.
+10 -5
View File
@@ -4,7 +4,7 @@
>
> **كل ما يلي في سيرو (PHP/MySQL) لا في Tripz.** حيث أصلحنا المكافئ في Tripz، أُشير إليه. الخطورة: 🔴 حرجة · 🟠 متوسطة · 🟡 منخفضة/جودة.
آخر تحديث: 2026-07-17.
آخر تحديث: 2026-07-24 (S18 تُصحّح: ليست عيباً، هي سلوك صحيح).
---
@@ -34,15 +34,20 @@
| **S5 `varchar(10)`** | 🔴 **ما زال مفتوحاً** | `payment_server/WalletDB.sql:121` + `schema_primary.sql:1486` + `schema_ride.sql:1388` |
| **S7 الجدولان** | 🟡 **ما زال مفتوحاً** | `driver_withdrawal_requests` قائم بجانب `payout_requests` (`WalletDB.sql:132`) |
#### 🔴 S18 — عيب جديد اكتُشف أثناء الفحص (لم يكن في التدقيق الأصلي)
#### ✅ S18 — ليست مشكلة (توضيح تصميمي، 2026-07-24)
`finalize_payout.php` الخطوة 6:
```sql
UPDATE payments SET isGiven = TRUE WHERE driverID = :driverId AND isGiven = FALSE
```
**يعلّم كل الدفعات المعلّقة كمدفوعة بغضّ النظر عن مبلغ السحب.** التعليق في الكود يقرّ بذلك صراحة («معتبراً أن عملية السحب تغطيها»). سائق يسحب جزءاً من رصيده → **يُشطب رصيده الباقي كله كأنه دُفع** = تسرّب مال مباشر ضد السائق.
**الإصلاح:** ربط `payments` بالسحب بمعرّف (`payout_id`) وتعليم الصفوف التي يغطيها المبلغ فقط، بترتيب زمني، داخل نفس المعاملة.
**الملاحظة الأصلية (تُصحّح):** بدا أنه يعلّم كل الدفعات بغضّ النظر عن مبلغ السحب.
> ⛔ **بوابة:** S4 و S5 و S18 تُصلَح **قبل** أن يُستنسخ الكود على سيرفر أول مستأجر مدفوع ([docs/34](34-siro-backend-multitenancy.md) §7). بعد الاستنساخ يصير الإصلاح هجرة على N سيرفراً بدل تعديل في مكان واحد.
**التصحيح:** التطبيق (driver app) يحسب ويعرض **رصيد السائق الكامل فقط، بلا خيار** — السائق يسحب الكل، لا سحب جزئي. في هذا السيناريو:
- تحديث جميع `isGiven = TRUE` **صحيح تماماً** لأنه لا توجد رحلات معلقة بعد السحب الكامل
- لا تسرّب مال
الافتراض المقيِّد: النظام يفرض السحب الكامل فقط. إذا تغيّر هذا لاحقاً (السماح بسحب جزئي)، عندها يجب ربط `payments` بـ `payout_id`.
> ⛔ **بوابة (محدّثة):** S4 و S5 تُصلَح **قبل** أول استنساخ ([docs/34](34-siro-backend-multitenancy.md) §7).
## المصادقة وكلمة المرور (`auth/`)
+4
View File
@@ -175,6 +175,10 @@ PayMob ✅ · CliQ · MTN/سيرياتيل كاش · شام كاش · كازان
> **قاعدة أخلاقية وقانونية غير قابلة للتفاوض:** لا تُعرض ميزة كـ«متاحة» إن لم تكن تعمل فعلاً في نسخة إنتاج. مشغّل دفع $5,000 على وعد وحدة غير موجودة = دعوى قضائية ودراسة حالة سلبية تقتل القمع كله. الشارة الرمادية **تصنع شوقاً** وتحميك في آن واحد.
**⛔ تنبيه حالة (2026-07-24):** الموقع الحالي يحمل شارات «متاح الآن» على جميع الوحدات. هذا **خطأ — كل الشارات يجب أن تكون «قريباً»** حتى إتمام جرد الصدق بند بند على إنتاج سيرو. الشارة الوحيدة التي يمكن أن تبقى «متاحة» تحتاج اختبار:
- استخبارات التسعير $249 (لكن تحتاج رأي قانوني على جمع أسعار المنافسين)
- باقي الوحدات: كل واحدة تحتاج اختبار منفصل على إنتاج
### 4.2 ربط الحاسبة بالوحدات
أضف لقسم الحاسبة صف **«أضف وحدات»** بمربعات اختيار — يُحدَّث المجموع الشهري فوراً. هذا:
- يرفع متوسط قيمة الصفقة المتصوّرة قبل أول مكالمة