From 822e4e8724b431218b7f91e5166e236c1ee2d399 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Fri, 24 Jul 2026 04:59:23 +0300 Subject: [PATCH] refactor: correct add-ons pricing, remove duplicate AI section, mark all modules as coming-soon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ تحسينات رئيسية: 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 --- docs/05-pricing-billing.md | 27 +++- docs/21-siro-audit.md | 15 ++- docs/33-addons-packaging.md | 4 + marketing/index.html | 240 +++++++++++++++++++++++++++--------- 4 files changed, 215 insertions(+), 71 deletions(-) diff --git a/docs/05-pricing-billing.md b/docs/05-pricing-billing.md index ad95df4..edde3a9 100644 --- a/docs/05-pricing-billing.md +++ b/docs/05-pricing-billing.md @@ -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 أعلى. diff --git a/docs/21-siro-audit.md b/docs/21-siro-audit.md index 1d98392..f7633d3 100644 --- a/docs/21-siro-audit.md +++ b/docs/21-siro-audit.md @@ -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/`) diff --git a/docs/33-addons-packaging.md b/docs/33-addons-packaging.md index 31102f2..78b7fc8 100644 --- a/docs/33-addons-packaging.md +++ b/docs/33-addons-packaging.md @@ -175,6 +175,10 @@ PayMob ✅ · CliQ · MTN/سيرياتيل كاش · شام كاش · كازان > **قاعدة أخلاقية وقانونية غير قابلة للتفاوض:** لا تُعرض ميزة كـ«متاحة» إن لم تكن تعمل فعلاً في نسخة إنتاج. مشغّل دفع $5,000 على وعد وحدة غير موجودة = دعوى قضائية ودراسة حالة سلبية تقتل القمع كله. الشارة الرمادية **تصنع شوقاً** وتحميك في آن واحد. +**⛔ تنبيه حالة (2026-07-24):** الموقع الحالي يحمل شارات «متاح الآن» على جميع الوحدات. هذا **خطأ — كل الشارات يجب أن تكون «قريباً»** حتى إتمام جرد الصدق بند بند على إنتاج سيرو. الشارة الوحيدة التي يمكن أن تبقى «متاحة» تحتاج اختبار: +- استخبارات التسعير $249 (لكن تحتاج رأي قانوني على جمع أسعار المنافسين) +- باقي الوحدات: كل واحدة تحتاج اختبار منفصل على إنتاج + ### 4.2 ربط الحاسبة بالوحدات أضف لقسم الحاسبة صف **«أضف وحدات»** بمربعات اختيار — يُحدَّث المجموع الشهري فوراً. هذا: - يرفع متوسط قيمة الصفقة المتصوّرة قبل أول مكالمة diff --git a/marketing/index.html b/marketing/index.html index 68111f3..ae479e0 100644 --- a/marketing/index.html +++ b/marketing/index.html @@ -337,6 +337,7 @@ html[dir=ltr] .plan .tag{transform:translateX(-50%)} .plan ul{list-style:none;display:flex;flex-direction:column;gap:11px;margin-bottom:24px;flex:1} .plan li{display:flex;gap:9px;font-size:14.5px;color:var(--text-soft)} .plan li .ck{color:var(--success-500);flex:none} +.plan-inherit{font-size:12.5px;color:var(--brand-500);font-weight:600;margin:-6px 0 12px;padding-bottom:10px;border-bottom:1px dashed var(--border)} .plan .btn{width:100%;justify-content:center} .gmv-note{margin-top:32px;text-align:center;color:var(--text-soft);font-size:15px} .contract-box{margin-top:40px;background:var(--bg-alt);border:1px dashed var(--brand-500);border-radius:var(--radius-card);padding:28px;display:grid;grid-template-columns:repeat(3,1fr);gap:22px} @@ -345,6 +346,33 @@ html[dir=ltr] .plan .tag{transform:translateX(-50%)} .founder{margin-top:24px;background:linear-gradient(120deg,var(--brand-500),var(--brand-600));color:#fff;border-radius:var(--radius-card);padding:22px 28px;display:flex;justify-content:space-between;align-items:center;gap:20px;flex-wrap:wrap} .founder .seats{background:rgba(255,255,255,.18);padding:6px 14px;border-radius:999px;font-weight:700;font-size:14px} +/* ============ ADD-ONS / MODULES ============ */ +.addons-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:24px;margin-top:44px} +.addon-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-card);padding:28px 24px; + display:flex;flex-direction:column;position:relative;transition:transform .3s var(--ease),box-shadow .3s,border-color .3s} +.addon-card:hover{transform:translateY(-6px);box-shadow:var(--shadow-md);border-color:var(--brand-500)} +.addon-card.featured{border-color:var(--signal-400);box-shadow:0 12px 32px var(--signal-glow)} +.addon-card.featured:hover{box-shadow:0 16px 40px var(--signal-glow)} +.addon-badge{position:absolute;top:-12px;inset-inline-start:16px;display:inline-flex;align-items:center;gap:5px; + font-size:11px;font-weight:700;padding:4px 10px;border-radius:999px;z-index:2;letter-spacing:.04em} +.addon-badge.available{background:rgba(18,183,106,.2);color:var(--success-500);text-transform:uppercase} +.addon-badge.coming-soon{background:rgba(152,162,179,.15);color:#9CA2B3;text-transform:uppercase} +.addon-ico{width:56px;height:56px;border-radius:14px;display:grid;place-items:center;margin-bottom:18px;margin-top:6px} +.addon-card h3{font-size:20px;margin-bottom:10px} +.addon-card p{color:var(--text-soft);font-size:15px;flex:1;margin-bottom:18px} +.addon-price{display:flex;align-items:baseline;gap:8px;margin-bottom:12px} +.addon-price .num{font-family:var(--font-lat);font-variant-numeric:tabular-nums;font-size:32px;font-weight:700} +.addon-price span:not(.num){color:var(--text-soft);font-size:14px} +.addon-setup{font-size:12px;color:var(--text-soft);margin-top:4px;font-weight:500} +@media(max-width:900px){ + .addons-grid{grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:20px} + .addon-card{padding:24px 20px} +} +@media(max-width:640px){ + .addons-grid{grid-template-columns:1fr} + .addon-card{padding:24px} +} + /* ============ COMPARISON ============ */ .cmp-table{width:100%;border-collapse:separate;border-spacing:0;font-size:15px} .cmp-table th,.cmp-table td{padding:16px 18px;text-align:start;border-bottom:1px solid var(--border)} @@ -471,7 +499,7 @@ footer{background:var(--midnight-900);color:#8A99C2;padding:64px 0 32px;border-t