830 lines
54 KiB
HTML
830 lines
54 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ar" dir="rtl">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>دراسة الفرص والإضافات — منصة سيرو</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=Tajawal:wght@300;400;500;700;800&display=swap" rel="stylesheet">
|
|
<style>
|
|
:root {
|
|
--bg-color: #0d1117;
|
|
--surface-color: rgba(22, 27, 34, 0.7);
|
|
--text-primary: #c9d1d9;
|
|
--text-secondary: #8b949e;
|
|
--accent-color: #58a6ff;
|
|
--border-color: rgba(48, 54, 61, 0.5);
|
|
--highlight: #1f6feb;
|
|
--danger: #f85149;
|
|
--success: #2ea043;
|
|
--warning: #d29922;
|
|
}
|
|
|
|
body {
|
|
font-family: 'Tajawal', sans-serif;
|
|
background-color: var(--bg-color);
|
|
color: var(--text-primary);
|
|
line-height: 1.8;
|
|
margin: 0;
|
|
padding: 0;
|
|
background-image: radial-gradient(circle at top right, rgba(88, 166, 255, 0.15), transparent 40%),
|
|
radial-gradient(circle at bottom left, rgba(46, 160, 67, 0.1), transparent 40%);
|
|
background-attachment: fixed;
|
|
}
|
|
|
|
.container {
|
|
max-width: 900px;
|
|
margin: 0 auto;
|
|
padding: 40px 20px;
|
|
}
|
|
|
|
h1, h2, h3 {
|
|
color: #ffffff;
|
|
margin-top: 2em;
|
|
margin-bottom: 0.5em;
|
|
font-weight: 700;
|
|
}
|
|
|
|
h1 {
|
|
font-size: 2.5rem;
|
|
text-align: center;
|
|
margin-bottom: 1em;
|
|
background: -webkit-linear-gradient(0deg, #58a6ff, #a371f7);
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
}
|
|
|
|
h2 {
|
|
font-size: 1.8rem;
|
|
border-bottom: 1px solid var(--border-color);
|
|
padding-bottom: 10px;
|
|
color: #e6edf3;
|
|
}
|
|
|
|
h3 {
|
|
font-size: 1.3rem;
|
|
color: var(--accent-color);
|
|
margin-top: 1.5em;
|
|
}
|
|
|
|
p {
|
|
margin-bottom: 1.2em;
|
|
font-size: 1.1rem;
|
|
}
|
|
|
|
blockquote {
|
|
background: var(--surface-color);
|
|
border-right: 4px solid var(--accent-color);
|
|
margin: 1.5em 0;
|
|
padding: 15px 20px;
|
|
border-radius: 8px 0 0 8px;
|
|
backdrop-filter: blur(10px);
|
|
color: var(--text-secondary);
|
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
blockquote strong {
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
table {
|
|
width: 100%;
|
|
border-collapse: separate;
|
|
border-spacing: 0;
|
|
margin: 2em 0;
|
|
background: var(--surface-color);
|
|
border-radius: 12px;
|
|
overflow: hidden;
|
|
box-shadow: 0 8px 16px rgba(0,0,0,0.2);
|
|
backdrop-filter: blur(10px);
|
|
border: 1px solid var(--border-color);
|
|
}
|
|
|
|
th, td {
|
|
padding: 15px 20px;
|
|
text-align: right;
|
|
border-bottom: 1px solid var(--border-color);
|
|
}
|
|
|
|
th {
|
|
background-color: rgba(255, 255, 255, 0.05);
|
|
font-weight: 700;
|
|
color: #ffffff;
|
|
}
|
|
|
|
tr:last-child td {
|
|
border-bottom: none;
|
|
}
|
|
|
|
tr:hover {
|
|
background-color: rgba(255, 255, 255, 0.02);
|
|
transition: background-color 0.3s ease;
|
|
}
|
|
|
|
ul, ol {
|
|
margin-bottom: 1.5em;
|
|
padding-right: 20px;
|
|
}
|
|
|
|
li {
|
|
margin-bottom: 0.5em;
|
|
font-size: 1.05rem;
|
|
}
|
|
|
|
code {
|
|
font-family: monospace;
|
|
background-color: rgba(110, 118, 129, 0.4);
|
|
padding: 2px 6px;
|
|
border-radius: 4px;
|
|
font-size: 0.9em;
|
|
color: #ff7b72;
|
|
direction: ltr;
|
|
display: inline-block;
|
|
}
|
|
|
|
pre {
|
|
background-color: #161b22;
|
|
padding: 20px;
|
|
border-radius: 10px;
|
|
overflow-x: auto;
|
|
border: 1px solid var(--border-color);
|
|
direction: ltr;
|
|
text-align: left;
|
|
margin: 1.5em 0;
|
|
}
|
|
|
|
pre code {
|
|
background-color: transparent;
|
|
padding: 0;
|
|
color: #e6edf3;
|
|
display: block;
|
|
}
|
|
|
|
hr {
|
|
border: 0;
|
|
height: 1px;
|
|
background: var(--border-color);
|
|
margin: 3em 0;
|
|
}
|
|
|
|
a {
|
|
color: var(--highlight);
|
|
text-decoration: none;
|
|
transition: color 0.2s ease;
|
|
}
|
|
|
|
a:hover {
|
|
color: #79c0ff;
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.card {
|
|
background: var(--surface-color);
|
|
border-radius: 12px;
|
|
padding: 25px;
|
|
margin-bottom: 20px;
|
|
border: 1px solid var(--border-color);
|
|
backdrop-filter: blur(10px);
|
|
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
|
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
|
}
|
|
|
|
.card:hover {
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
|
|
border-color: rgba(88, 166, 255, 0.3);
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<h1>دراسة الفرص والإضافات — منصة سيرو</h1>
|
|
|
|
<blockquote>
|
|
<p><strong>التاريخ:</strong> 2026-08-06 · <strong>الأساس:</strong> قراءة مباشرة للكود الحالي على <code>main</code> (904 نقطة PHP، ~300 ألف سطر Dart، 4 تطبيقات، 3 قواعد بيانات، 5 خوادم)</p>
|
|
<p><strong>الغرض:</strong> لائحة فرص قابلة للفرز — كل بند مربوط بدليل من الكود، ومصنّف: فجوة مؤكدة / إضافة / فكرة خارج الصندوق.</p>
|
|
<p><strong>ملاحظة منهجية:</strong> هذه الدراسة لا تكرّر <a href="NEW_FEATURES_PROPOSAL_AR.md">NEW_FEATURES_PROPOSAL_AR.md</a> (18 ميزة، يوليو 2026). ما يظهر هنا إما فجوة لم تُغطَّ هناك، أو نفس الفكرة بزاوية تنفيذية مختلفة، أو خط عمل جديد كلياً.</p>
|
|
</blockquote>
|
|
|
|
<hr>
|
|
|
|
<h2>القسم صفر — الخلاصة في صفحة واحدة</h2>
|
|
|
|
<p>بعد قراءة الكود، النتيجة الجوهرية: <strong>سيرو ليست ناقصة ميزات، هي ناقصة طبقة قرار.</strong></p>
|
|
|
|
<p>البنية التحتية استثنائية لشركة بهذا الحجم: محرك تسعير آلي يراقب المنافسين، سوكيتات لحظية معزولة، محفظة موصولة بستة مزوّدي دفع في ثلاث دول، WebRTC + TURN مبني داخلياً، وحدة باصات مؤسسية، وحدة طعام شبه جاهزة، ومنصة تسويق آلية. لكن <strong>قلب المنتج — إسناد الرحلة للسائق — ما يزال "بثّ للجميع، وأول من يضغط يفوز"</strong> (<code>ride/rides/add_ride.php:18</code> → <code>broadcastRideToMarket</code>، ثم القفل التفاؤلي في <code>ride/rides/acceptRide.php:52-63</code>). هذه ليست تفصيلة تقنية: هي المتغيّر الذي يحدد وقت الانتظار، ونسبة الرفض، ودخل السائق، وهامش الشركة — أكثر من أي ميزة في اللائحة.</p>
|
|
|
|
<p><strong>الترتيب الذي أوصي به لو كان القرار قراري:</strong></p>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>البند</th>
|
|
<th>لماذا الآن</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>1</td>
|
|
<td>محرك إسناد بالدفعات بدل البثّ الحرّ</td>
|
|
<td>أعلى أثر على كل مؤشر تشغيلي، وصفر تكلفة تسويق</td>
|
|
</tr>
|
|
<tr>
|
|
<td>2</td>
|
|
<td>إغلاق التسرب خارج المنصة</td>
|
|
<td>تسرب مباشر من الإيراد، والأداة نصف مبنية أصلاً</td>
|
|
</tr>
|
|
<tr>
|
|
<td>3</td>
|
|
<td>سيرو للأعمال (حسابات الشركات)</td>
|
|
<td>أسرع إيراد جديد، بلا أصول ولا فريق ميداني</td>
|
|
</tr>
|
|
<tr>
|
|
<td>4</td>
|
|
<td>الحجز المسبق + رسوم الإلغاء</td>
|
|
<td>شريحة كاملة مفقودة + وقف نزيف وقت السائق</td>
|
|
</tr>
|
|
<tr>
|
|
<td>5</td>
|
|
<td>غرفة عمليات السلامة</td>
|
|
<td>زر SOS الحالي لا يصل لأحد داخل الشركة</td>
|
|
</tr>
|
|
<tr>
|
|
<td>6</td>
|
|
<td>إطلاق الطعام (المرحلة الخامسة)</td>
|
|
<td>مبني حتى المرحلة الرابعة ومتوقف على 3 نقاط فقط</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<hr>
|
|
|
|
<h2>القسم الأول — فجوات مؤكدة في قلب المنتج</h2>
|
|
|
|
<p>هذه ليست اقتراحات تحسين، هي أشياء غائبة فعلاً من الكود وتؤثر على التشغيل اليومي.</p>
|
|
|
|
<div class="card">
|
|
<h3>1.1 نظام الإسناد: بثّ حرّ بدل توزيع</h3>
|
|
|
|
<p><strong>الوضع المؤكد:</strong> عند إنشاء الرحلة، <code>broadcastRideToMarket()</code> ترسل الحمولة كاملة (السعر، نقطة البداية، <strong>الوجهة</strong>، المسافة، تقييم الراكب) إلى سوكيت السائقين، فتظهر لكل سائق قريب. ثم يتسابق الجميع على <code>acceptRide.php</code>، والقفل <code>WHERE status IN ('waiting','wait')</code> يعطيها لأول من وصل. الراكب من جهته يوسّع نطاق البحث تدريجياً (2400م → 3000م → 3100م) ويُعرض عليه "زيادة السعر" بعد 90 ثانية.</p>
|
|
|
|
<p><strong>ما الذي يفعله هذا فعلياً:</strong></p>
|
|
<ul>
|
|
<li><strong>الانتقائية (cherry-picking):</strong> السائق يرى الوجهة والسعر قبل القبول، فيرفض الرحلات القصيرة أو المتجهة لمناطق ميتة. الرحلات "غير المرغوبة" تدور في السوق حتى تنتهي مهلتها أو يرفع الراكب سعره — وهذه ضريبة يدفعها الراكب عن مشكلة توزيع، لا عن ندرة حقيقية.</li>
|
|
<li><strong>سباق يخسره الجميع:</strong> عشرة سائقين يضغطون، تسعة يحصلون على "Ride not available". هذا يُنتج إحباطاً متراكماً ويُدرّب السائق على تجاهل الإشعارات.</li>
|
|
<li><strong>لا اعتبار لزمن الوصول الفعلي:</strong> الفائز هو الأسرع ضغطاً على الشاشة، لا الأقرب للراكب. سائق على بُعد 8 دقائق قد يسبق سائقاً على بُعد دقيقتين.</li>
|
|
<li><strong>لا إنصاف في التوزيع:</strong> لا شيء يضمن أن السائق الذي انتظر ساعة يحصل على رحلة قبل من أنهى رحلة للتو.</li>
|
|
</ul>
|
|
|
|
<p><strong>الحل المقترح — محرك إسناد بالدفعات (Batched Dispatch):</strong></p>
|
|
|
|
<pre><code>بدل: بثّ فوري لكل السائقين → سباق
|
|
صار: نافذة تجميع 4-6 ثوانٍ → ترتيب المرشحين → عرض حصري متسلسل</code></pre>
|
|
|
|
<p>طبقة قرار بين <code>add_ride.php</code> والسوكيت، تحسب لكل مرشح درجة:</p>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>العامل</th>
|
|
<th>الوزن المقترح</th>
|
|
<th>مصدر البيانات (موجود)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>زمن الوصول الفعلي (ETA لا المسافة الهوائية)</td>
|
|
<td>40%</td>
|
|
<td><code>geo:drivers:available</code> في Redis + OSRM</td>
|
|
</tr>
|
|
<tr>
|
|
<td>معدّل القبول التاريخي</td>
|
|
<td>20%</td>
|
|
<td><code>driver_orders</code> + <code>canecl</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>التقييم</td>
|
|
<td>15%</td>
|
|
<td><code>ratingDriver</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>مدة الخمول (إنصاف)</td>
|
|
<td>15%</td>
|
|
<td><code>getDriverTimeOnline.php</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>ملاءمة الوجهة (اتجاه السائق المسجَّل)</td>
|
|
<td>10%</td>
|
|
<td><code>save_driver_destination.php</code> — <strong>موجود وغير مستغل</strong></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>ثم عرض حصري 8-12 ثانية للأول، وإن رفض أو تأخر ينتقل للثاني. الوجهة تُخفى حتى القبول (أو تُعرض كاتجاه عام فقط) — هذا وحده يقتل الانتقائية.</p>
|
|
|
|
<p><strong>الأثر المتوقع:</strong> انخفاض زمن الوصول 15-30%، انخفاض الرحلات الملغاة قبل القبول، انخفاض الضغط على "زيادة السعر" (أي حماية للراكب وللسمعة السعرية معاً — وهذا متوافق مع توجه ثبات السعر المعتمد أصلاً).</p>
|
|
|
|
<p><strong>التحذير الصادق:</strong> هذا التغيير حسّاس ويلمس أخطر مسار في النظام. يجب أن ينزل خلف مفتاح <code>DISPATCH_MODE=broadcast|batched</code> مع إمكانية التراجع الفوري، ويُجرَّب على مدينة أو نوع سيارة واحد أولاً.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>1.2 التسرب خارج المنصة — العدّاد موجود، والعلاج غائب</h3>
|
|
|
|
<p><strong>الوضع المؤكد:</strong> جدول <code>driver_ride_scam</code> و<code>ride/driver_scam/add.php</code> يسجّلان الحالة (سائق قبل، اتصل بالراكب، ثم أُلغيت الرحلة) ويعدّانها يومياً في Redis. هذا كل ما يحدث. <strong>لا عقوبة، لا حجب، لا احتساب مالي، لا مراجعة إدارية.</strong></p>
|
|
|
|
<p><strong>لماذا يهم:</strong> هذه أكثر طريقة مباشرة يخسر بها التطبيق إيراده — الرحلة تحصل فعلاً، والعمولة لا تصل. في أسواق النقد المهيمن (سوريا، الأردن) هذا ليس حالة نادرة بل سلوك اقتصادي منطقي للسائق ما دام بلا كلفة.</p>
|
|
|
|
<p><strong>الحل — ثلاث طبقات:</strong></p>
|
|
<ol>
|
|
<li><strong>إخفاء رقم الراكب نهائياً.</strong> البنية جاهزة: WebRTC + coturn مبنيان بالفعل، و<code>ride/call/turn_credentials.php</code> صريح أن نفس القناة تخدم "مكالمات الرحلات ومكالمات توصيل الطعام المقنّعة". المطلوب: منع تسرّب الرقم في حمولات الـ API قبل بدء الرحلة، والاكتفاء بالمكالمة داخل التطبيق. <em>(يستحق تدقيقاً: التحقق من كل نقطة تُرجع بيانات الراكب للسائق بعد القبول.)</em></li>
|
|
<li><strong>نموذج كشف بسيط وفعّال:</strong> قبول + مكالمة + إلغاء + عدم بدء الرحلة + تكرار نفس زوج (سائق، راكب) = إشارة عالية الثقة. لا يحتاج ذكاءً اصطناعياً، يحتاج استعلاماً واحداً وكروناً.</li>
|
|
<li><strong>سُلّم عقوبات آلي:</strong> تنبيه → خفض أولوية في الإسناد (يرتبط مباشرة ببند 1.1) → تعليق مؤقت → مراجعة بشرية. الترابط مع محرك الإسناد هو ما يجعل العقوبة موجعة بلا حظر.</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>1.3 لا رسوم إلغاء ولا سياسة عدم حضور</h3>
|
|
|
|
<p><strong>الوضع المؤكد:</strong> <code>ride/cancelRide/</code> فيه <code>add / get / update / delete / addCancelTripFromDriverAfterApplied</code> — تسجيل فقط. لا بحث عن رسم، غرامة، أو أثر مالي في المسار كله.</p>
|
|
|
|
<p><strong>ما يعنيه:</strong> السائق يقود 7 دقائق ثم يُلغى عليه، فيخسر وقتاً ووقوداً بلا تعويض. والراكب لا يتحمل شيئاً مقابل ذلك. هذه أحد أقوى أسباب هجران السائقين، وأرخص مشكلة في اللائحة إصلاحاً.</p>
|
|
|
|
<p><strong>الحل:</strong> رسم إلغاء متدرّج (مجاني قبل قبول السائق أو خلال أول دقيقتين، ثم رسم رمزي يذهب <strong>للسائق</strong> لا للشركة)، وعدّاد "عدم حضور" للراكب، وإعفاء تلقائي إذا كان السائق هو المتأخر (البيانات متاحة من التتبع). ربط الرسم بالمحفظة الموجودة أو خصمه من الرحلة التالية.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>1.4 لا حجز مسبق</h3>
|
|
|
|
<p><strong>الوضع المؤكد:</strong> لا جدول <code>scheduled_rides</code> في أي من <code>schema_primary.sql</code> / <code>schema_ride.sql</code> / <code>schema_tracking.sql</code>، ولا كرون للحجوزات ضمن الـ 25 كروناً في <code>backend/bot/</code>.</p>
|
|
|
|
<p><strong>الشريحة المفقودة:</strong> رحلات المطار، المواعيد الطبية، الدوام اليومي، رحلات الفجر. هذه أعلى شرائح الاستعداد للدفع وأكثرها ولاءً وأقلها حساسية للسعر — وهي بالضبط الشريحة التي لا يخدمها أحد جيداً في السوق المحلي.</p>
|
|
|
|
<p><strong>الزاوية الأهم (ولم تُذكر في المقترح السابق):</strong> الحجز المسبق ليس ميزة راكب فقط — هو <strong>مصدر توقّع طلب مؤكد</strong>. رحلة محجوزة لبعد 6 ساعات = معلومة يقينية عن الطلب، تُغذّي <code>cron_predictive_demand.php</code> و<code>heatmap</code> بشيء أدق من أي تنبؤ إحصائي، وتسمح بتوجيه السائقين قبل الذروة لا بعدها.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>1.5 زر SOS لا يصل لأحد داخل الشركة</h3>
|
|
|
|
<p><strong>الوضع المؤكد:</strong> في <code>siro_rider/lib/controller/home/map/ui_interactions_controller.dart</code> الزر (ومعه كشف الهزّ <code>Emergency shake</code>) ينتهي عند <code>_shareTripDetailsSOS()</code> التي تُرسل <strong>رسالة واتساب لجهة اتصال شخصية خزّنها الراكب</strong>. لا استدعاء API، لا سجل حادثة في قاعدة البيانات، لا تنبيه لغرفة عمليات، لا أثر يمكن مراجعته لاحقاً.</p>
|
|
|
|
<p><strong>ما يعنيه:</strong> لو حدثت واقعة حقيقية، الشركة لا تعرف بها ولا تملك دليلاً عنها ولا تستطيع التدخل. وهذا في الوقت نفسه أكبر مخاطرة سمعة وأقوى ورقة تسويق ضائعة.</p>
|
|
|
|
<p><strong>الحل — طبقة سلامة حقيقية (وهي منتج بحد ذاته):</strong></p>
|
|
<ul>
|
|
<li>نقطة <code>safety/incident.php</code> تُنشئ سجل حادثة فوراً: الرحلة، الموقع، السائق، الراكب، الوقت، آخر مسار.</li>
|
|
<li>تنبيه لحظي إلى لوحة إدارة (البنية موجودة: <code>Admin/monitor.php</code> + سوكيت الركاب).</li>
|
|
<li>تجميد آلي: قفل بيانات الرحلة، تثبيت التسجيل الصوتي (<code>AudioRecorderController</code> موجود) بدل حذفه، وقف إسناد رحلات جديدة للسائق حتى المراجعة.</li>
|
|
<li>زر "تحقّق من سلامتك" آلي عند الشذوذ: توقف طويل غير مبرر، انحراف كبير عن المسار، أو رحلة تجاوزت الزمن المتوقع بكثير — كل هذه البيانات تمرّ في <code>loction_server</code> أصلاً وغير مستغلة.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>1.6 دورة الشكاوى مبتورة ولا يوجد أداة تعويض</h3>
|
|
|
|
<p><strong>الوضع:</strong> <code>backend/serviceapp/</code> فيه <code>getComplaintAllData.php</code> و<code>update_complaint.php</code>، وتطبيق <code>siro_service</code> فيه شاشة تفاصيل الشكوى كهيكل شبه فارغ (مسجَّل في التدقيق السابق). ولا يوجد <strong>أي</strong> مسار استرجاع/تعويض في الرحلات — كلمة <code>refund</code> لا تظهر إلا في وحدة الطعام (<code>food/order/cancel.php</code>, <code>food/merchant_ops/reject.php</code>).</p>
|
|
|
|
<p><strong>الحل:</strong> أداة تسوية واحدة للموظف: استرجاع جزئي/كامل إلى المحفظة، رصيد اعتذار، تصنيف سبب، وSLA بسيط (زمن أول رد، زمن الإغلاق). هذا يحوّل الدعم من "استقبال شكاوى" إلى "إغلاق قضايا" — وهو الفرق بين تطبيق وشركة.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>1.7 التقييمات بلا حلقة إغلاق</h3>
|
|
|
|
<p>جداول <code>ratingDriver</code> و<code>ratingPassenger</code> و<code>ratingApp</code> موجودة وتُملأ. لكن لا شيء يستهلكها: لا أثر على الإسناد (لأنه لا يوجد إسناد أصلاً)، ولا عتبة تعليق، ولا تدريب، ولا مكافأة. التقييم بلا نتيجة يعلّم المستخدم أن التقييم بلا معنى، فتفسد جودة البيانات نفسها.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<h2>القسم الثاني — خطوط إيراد جديدة (بلا شراء أصول)</h2>
|
|
|
|
<div class="card">
|
|
<h3>2.1 سيرو للأعمال — الأسرع عائداً</h3>
|
|
|
|
<p><strong>لا يوجد أي أثر لحسابات الشركات في الكود</strong> (لا جدول، لا نقطة، لا شاشة).</p>
|
|
|
|
<p>المنتج: حساب مؤسسي بمستخدمين متعددين، رحلات على الشركة لا على الموظف، <strong>فاتورة شهرية واحدة</strong>، مراكز تكلفة، حدود صرف وسياسات (أوقات/مناطق/سقف)، وتقرير شهري. البنية المحاسبية نصف جاهزة: <code>invoice_records</code> و<code>invoicesAdmin</code> موجودان.</p>
|
|
|
|
<p><strong>لماذا هو الأعلى أولوية بين خطوط الإيراد:</strong></p>
|
|
<ul>
|
|
<li>طلب مضمون ومتكرر ومتوقّع (لا يتقلّب كطلب الأفراد).</li>
|
|
<li><strong>غير حساس للسعر إطلاقاً</strong> — الشركة تشتري ضبطاً وفاتورة موحدة وتقريراً، لا أرخص رحلة. أي أنه الخط الوحيد الذي يخرجك من حرب الأسعار مع كريم/أوبر بدل أن يزجّك فيها.</li>
|
|
<li>الشركة لا تنتقل لمنافس بسهولة بعد ربط محاسبتها بك (تكلفة تحوّل مرتفعة).</li>
|
|
<li>عملاء طبيعيون في السوق: الفنادق (وجدول <code>hotels</code> موجود أصلاً!)، المستشفيات، شركات الاتصالات، البنوك، الشركات الناشئة، السفارات والمنظمات الدولية.</li>
|
|
</ul>
|
|
|
|
<p><strong>التآزر:</strong> نفس الحساب المؤسسي يُستخدم لاحقاً لـ "مواصلاتي" (نقل الموظفين) ولتوصيل الطعام للمكاتب. عميل واحد، ثلاثة منتجات.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>2.2 اشتراك الراكب (Siro+) — إيراد متكرر</h3>
|
|
|
|
<p>المقترح السابق تناول <strong>اشتراك السائق</strong>. الزاوية المعاكسة أهم وأقل خطراً: اشتراك شهري رخيص للراكب يعطي خصماً ثابتاً أو أولوية في الإسناد أو إعفاء من رسوم الذروة.</p>
|
|
|
|
<p><strong>لماذا أفضل من اشتراك السائق:</strong> اشتراك السائق يستبدل إيراداً متغيراً (عمولة) بإيراد ثابت — قمار على حجم الرحلات، ويحرمك من الاستفادة من النمو. أما اشتراك الراكب فهو <strong>إيراد إضافي فوق العمولة</strong>، ويقفل الراكب معك (بعد أن يدفع اشتراكاً، فتح تطبيق منافس صار خسارة نفسية).</p>
|
|
|
|
<p>الربط الطبيعي: <code>promos</code> و<code>seferWallet</code> و<code>kazan</code> كلها موجودة — الاشتراك طبقة فوقها لا بناء من الصفر.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>2.3 الطرود والمشاوير (Parcel & Errands) — إعادة استخدام شبه كاملة</h3>
|
|
|
|
<p>وحدة الطعام في <code>backend/food/</code> بنَت بالفعل: <code>courier/offer_respond.php</code>، <code>picked_up.php</code>، <code>delivered.php</code>، قفل ذرّي <code>SET NX EX 20</code> ضد سباق القبول، <code>cron_order_timeouts.php</code> لإعادة العرض، وسوكيت مستقل للطلب. <strong>هذا هو 80% من نظام توصيل الطرود.</strong></p>
|
|
|
|
<p>المطلوب فوقها: منشئ طلب من الراكب (بدل المطعم)، رقم تتبع، إثبات تسليم (صورة + توقيع)، وتسعير بالحجم/الوزن. أرخص منتج جديد في اللائحة بفارق كبير، ويستهلك نفس الأسطول في ساعات الطلب المنخفض على الرحلات.</p>
|
|
|
|
<p>الامتداد الطبيعي بعدها: <strong>الصيدليات</strong> (وصفة تُصوَّر، صيدلية تسعّر، سائق يوصل) — هامش أعلى من الطعام وتنافس أقل بكثير.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>2.4 البيع الأبيض (White-label) — منتج قائم بلا اسم تجاري</h3>
|
|
|
|
<p>على نفس السيرفر تعمل نسخ <code>intaleq</code> و<code>tripz</code> بجانب <code>siro</code> (موثّق في تعليقات <code>docker/docker-compose.yml:197-200</code> حول تصادم منافذ MySQL)، وملف <code>docs/system_architecture_and_whitelabel_guide.md</code> يشرح المعمارية كدليل نشر مخصص، والـ README يذكر صراحة: "استنساخ عميل = <code>clone + .env + up</code>".</p>
|
|
|
|
<p><strong>أنتم تبيعون هذا فعلياً بلا أن تسمّوه منتجاً.</strong> تحويله إلى منتج مُعرَّف يحتاج: لوحة إدارة نسخ، عزل بيانات موثّق، اتفاقية مستوى خدمة، تسعير (رسم إعداد + شهري + نسبة)، ومسار تحديث لا يكسر نسخ العملاء.</p>
|
|
|
|
<p><strong>السوق:</strong> كل مدينة عربية متوسطة فيها من يريد "تطبيق نقل خاص به" ولا يستطيع بناءه. بيع نسخة بـ 15-40 ألف دولار إعداداً + شهري متكرر، هامشه أعلى من الرحلات نفسها ولا يستهلك أسطولاً ولا تسويقاً ميدانياً.</p>
|
|
|
|
<p><strong>الشرط الصادق:</strong> لا يُباع قبل إغلاق بنود الأمن المفتوحة في <a href="../08_security/التقرير_الأمني_Backend_Siro.md">التقرير_الأمني_Backend_Siro.md</a> — عميل مؤسسي واحد بمدقّق أمني واحد يكفي لإسقاط الصفقة والسمعة معاً.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>2.5 مواصلاتي كمنتج مؤسسي مستقل</h3>
|
|
|
|
<p>وحدة <code>backend/transit/</code> مبنية بالكامل (خطوط، محطات، جداول، مركبات، تسجيل أعضاء، تنبيهات اقتراب، لوحة <code>transit_dashboard</code>) والاستراتيجية موثّقة: برمجيات مجانية على أسطول المؤسسة نفسها — فراغ سوقي حقيقي لا تغطيه سويفل ولا سالك.</p>
|
|
|
|
<p><strong>الفجوات المعروفة (قبل أي بيع):</strong> IDOR، ربط السائق، اعتماد المسار — مفصّلة في <a href="../05_transit_mawasalati/mawasalati_full_system_review.md">mawasalati_full_system_review.md</a>.</p>
|
|
|
|
<p><strong>التوسعة خارج الجامعات (وهي الأسهل والأقرب):</strong> نفس المحرك حرفياً يخدم <strong>نقل موظفي المصانع والشركات</strong> — وهو سوق يدفع فعلاً وله ميزانية مقرّة، بخلاف الجامعات التي تحتاج بيعاً مؤسسياً بطيئاً. ومدارس القطاع الخاص (مع تتبّع ولي الأمر لطفله) خط ثالث بنفس الكود.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>2.6 المحفظة والدفع كأصل مستقل</h3>
|
|
|
|
<p><code>payment_server/v2/main/ride/</code> فيه تكاملات جاهزة: CLIQ، eCash، شام كاش، سيرياتيل، MTN، PayMob، ومحفظتان داخليتان. <strong>هذا أصل نادر جداً</strong> — بناء تكاملات الدفع في سوريا والأردن أصعب من بناء تطبيق النقل نفسه، وكل تكامل منها كلّف شهوراً وعلاقات.</p>
|
|
|
|
<p>الاستغلال الممكن: تحويلها لطبقة دفع تخدم التجار الصغار خارج سيرو (نقاط بيع صغيرة، متاجر إلكترونية محلية). <strong>ملاحظة تنظيمية جادة:</strong> هذا الخط يدخل نطاق ترخيص خدمات الدفع في كل دولة — لا يُطرح قبل مراجعة قانونية.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<h2>القسم الثالث — حلول لمشاكل السوق المحلي (خارج الصندوق)</h2>
|
|
|
|
<p>هذا القسم هو الأبعد عن نسخ ما تفعله أوبر، والأقرب لواقع الأسواق التي تعملون فيها.</p>
|
|
|
|
<div class="card">
|
|
<h3>3.1 طلب رحلة بلا إنترنت — SMS / USSD / مكالمة</h3>
|
|
|
|
<p><strong>المشكلة الحقيقية:</strong> في سوريا خصوصاً، الإنترنت متقطّع والكهرباء أسوأ. الراكب الذي لا يستطيع فتح التطبيق ليس راكباً "خارج الشريحة" — هو راكب موجود ماديّاً وعاجز تقنياً. لا يوجد اليوم أي مسار طلب بلا إنترنت (والبنية موجودة: <code>smsSender</code>، <code>webhook_sms</code>، <code>payment_server/v2/main/sms_webhook</code>).</p>
|
|
|
|
<p><strong>الحل:</strong> رقم قصير أو رقم واتساب يستقبل: "من [نقطة معروفة] إلى [نقطة معروفة]" → النظام يطابق النص مع <code>places</code> / <code>places_syria</code> / <code>palces11</code> (كلها موجودة) → ينشئ الرحلة → يرد برسالة فيها اسم السائق ورقم اللوحة والزمن المتوقع. السائق يعمل بالتطبيق عادياً.</p>
|
|
|
|
<p><strong>لماذا هذا قوي:</strong> ما من منافس دولي سيبني هذا — لأنه لا معنى له في أسواقهم. وهو يفتح شريحة كاملة (كبار السن، الهواتف البسيطة، مناطق التغطية الضعيفة) ويحوّل انقطاع الإنترنت من كارثة تشغيلية إلى ميزة تنافسية.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>3.2 رقمنة السرافيس والميكروباص بدل منافستها</h3>
|
|
|
|
<p><strong>الملاحظة:</strong> في دمشق وعمّان والقاهرة، الحصة الأكبر من التنقل ليست في التاكسي — هي في السرافيس والميكروباص على خطوط ثابتة. أنتم تنافسون على الشريحة الصغيرة وتتركون الكبيرة.</p>
|
|
|
|
<p><strong>الفكرة:</strong> طبقة تنظيم لا منافسة — خطوط ثابتة، مواقيت، حجز مقعد، دفع بالمحفظة، تتبّع لحظي. <strong>محرك <code>backend/transit/</code> يفعل هذا بالضبط اليوم</strong> (خطوط، محطات، جداول، تتبع، إشعار اقتراب) — الفرق أن العميل يصبح متعهد نقل بدل جامعة.</p>
|
|
|
|
<p><strong>نموذج الإيراد:</strong> رسم تنظيم صغير جداً على المقعد، أو اشتراك شهري للمتعهد. الحجم يعوّض الهامش: خط واحد قد ينقل أكثر مما تنقله عشرون سيارة.</p>
|
|
|
|
<p><strong>ولماذا هو استراتيجي:</strong> يعطيكم موقعاً تنظيمياً أمام البلديات ووزارات النقل — وهو الموقع الوحيد الذي لا تستطيع منصة أجنبية أخذه منكم.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>3.3 العنوان الذي لا يوجد</h3>
|
|
|
|
<p>في مناطق واسعة من الأسواق الثلاثة لا توجد عناوين قابلة للاستخدام: "بعد الفرن، ثالث بناية". عندكم <code>places</code> و<code>places_syria</code> و<code>palces11</code> و<code>getLocationParents.php</code> و<code>get_location_area_links.php</code> — أي بذرة نظام معالم موجودة.</p>
|
|
|
|
<p><strong>الفكرة:</strong> بناء <strong>طبقة معالم شعبية جماعية</strong> — كل رحلة تنتهي بنقطة التقاط/إنزال فعلية، ومع الوقت تتكوّن خريطة معالم بدقة تفوق خرائط جوجل محلياً، لأنها مبنية على سلوك حقيقي لا على مسح. هذه بيانات لا يستطيع أي منافس شراؤها، وهي أصل بحد ذاته (يُرخَّص لاحقاً لشركات التوصيل والطوارئ والتجارة الإلكترونية).</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>3.4 اقتصاد السائق: الوقود، الصيانة، والتمويل</h3>
|
|
|
|
<p>السائق في هذه الأسواق لا تكمن مشكلته في العمولة بل في <strong>رأس المال</strong>: الوقود يومياً، الصيانة فجأة، والسيارة نفسها.</p>
|
|
|
|
<ul>
|
|
<li><strong>محفظة وقود:</strong> اتفاق مع سلسلة محطات، خصم على السعر، خصم آلي من الأرباح. قيمة فورية ملموسة للسائق وأقوى من أي زيادة عمولة.</li>
|
|
<li><strong>صيانة بأسعار الأسطول:</strong> اتفاق مع ورش، ودفع بالتقسيط من الأرباح.</li>
|
|
<li><strong>تمويل شراء المركبة:</strong> بالضبط ما فعلته سويفل مع بنك ناصر الاجتماعي لتمويل كباتنها. السائق الممول = سائق مقفل معك لسنوات، والبيانات التي تملكها عن دخله تجعلك أفضل من أي بنك في تقييم جدارته الائتمانية. <strong>هذا أعمق خندق تنافسي في اللائحة كلها.</strong></li>
|
|
</ul>
|
|
|
|
<p><strong>تحذير:</strong> هذا الخط يقترب من التمويل المنظَّم — يجب أن يمرّ عبر شريك مرخّص لا عبر ميزانية الشركة مباشرة.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>3.5 التأمين بالرحلة</h3>
|
|
|
|
<p>جدول <code>driver_health_assurance</code> ووحدة <code>backend/driver_assurance/</code> موجودان — أي أن الفكرة بدأت وتوقفت. توسيعها إلى تغطية صغيرة لكل رحلة (للسائق والراكب) بمبلغ ضئيل مضمّن في السعر أو اختياري، عبر شريك تأمين محلي: إيراد بهامش عالٍ، ورسالة تسويقية قوية، وتكلفة تشغيل شبه صفرية.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<h2>القسم الرابع — البنية التحتية والمخاطر</h2>
|
|
|
|
<div class="card">
|
|
<h3>4.1 ثلاث قواعد بيانات شبه متطابقة</h3>
|
|
|
|
<p><code>schema_primary.sql</code> و<code>schema_ride.sql</code> و<code>schema_tracking.sql</code> تحتوي <strong>نفس قائمة الجداول تقريباً</strong> (الفروق: <code>passenger_opening_locations</code> في الأولى، و<code>driver_daily_summary</code>/<code>driver_daily_work</code> في الثالثة). والكود يكتب في الاثنتين عمداً (<code>acceptRide.php</code>: "ride DB هو المرجع، primary DB يتزامن بعده") مع تجاهل صريح لفشل المزامنة.</p>
|
|
|
|
<p><strong>الخطر:</strong> تباعد صامت بين القواعد. الاستعلام الإداري قد يقرأ من قاعدة والتشغيل من أخرى، والفرق لا يظهر إلا في تحقيق مالي. يستحق: تعريفاً مكتوباً لمصدر الحقيقة لكل جدول، وفحصاً دورياً للفروق.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>4.2 لا رصد ولا قياس</h3>
|
|
|
|
<p>25 كروناً في <code>backend/bot/</code> تعمل بلا لوحة صحة موحدة، ولا مقاييس (Prometheus/Grafana أو ما يعادلها)، ولا تنبيه عند فشل كرون. الدروس المسجَّلة سابقاً (السجلات المطفأة، الكرونات التي فقدت Redis بعد الانتقال لدوكر، المنفذ الذي تغيّر بصمت) كلها أعراض السبب نفسه: <strong>لا أحد يعرف أن شيئاً توقّف حتى يشتكي مستخدم.</strong></p>
|
|
|
|
<p>هذا أرخص استثمار في اللائحة كلها وأعلاها عائداً على راحة البال.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>4.3 لا اختبارات ولا تكامل مستمر</h3>
|
|
|
|
<p>904 نقطة PHP و~300 ألف سطر Dart بلا اختبارات آلية ولا خط CI. مع هذا الحجم، كل نشر مقامرة. الحد الأدنى المفيد: اختبارات دخان لمسار الرحلة الكامل (إنشاء → قبول → بدء → إنهاء → تسعير) تعمل قبل كل نشر.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>4.4 بنود يجب حسمها قبل أي عرض خارجي</h3>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>البند</th>
|
|
<th>الحالة</th>
|
|
<th>الأثر</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>phpMyAdmin على 8082 مكشوف لكل الواجهات بلا TLS</td>
|
|
<td>مؤكد في <code>docker-compose.yml:211-212</code></td>
|
|
<td>وصول جذر لقاعدة البيانات — انظر الحل أدناه</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>invest_code.php</code> بحجم 176KB في جذر الإنتاج</td>
|
|
<td>مؤكد</td>
|
|
<td>ملف ضخم غير مبرر في مسار عام</td>
|
|
</tr>
|
|
<tr>
|
|
<td>بنود التقرير الأمني المفتوحة</td>
|
|
<td>موثّقة</td>
|
|
<td>تسقط أي صفقة مؤسسية</td>
|
|
</tr>
|
|
<tr>
|
|
<td>سرديتان تمويليتان متعارضتان (180K$ سوريا / 200K$-22%)</td>
|
|
<td>موثّق في <code>docs/README.md</code></td>
|
|
<td>مخاطرة حوكمة أمام مستثمر</td>
|
|
</tr>
|
|
<tr>
|
|
<td>بنية التسويق الآلي (حسابات متعددة، حوار مفتعل بين حسابات وهمية)</td>
|
|
<td>مؤكدة في <code>marketing_engine</code> + <code>socialBot</code></td>
|
|
<td>مخاطرة قانونية وحظر منصات — يجب فصلها تماماً عن أي عرض استثماري</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>android_bot</code> يكشط أسعار المنافسين عبر AccessibilityService</td>
|
|
<td>مؤكد</td>
|
|
<td>مخالفة شروط استخدام المنافسين — ميزة حقيقية ومخاطرة حقيقية معاً</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<div class="card">
|
|
<h3>4.5 وحدة الطعام: مبنية وغير مطلقة</h3>
|
|
|
|
<p>المراحل صفر–الرابعة مكتملة على <code>feature/food-delivery-module</code>. المتبقي ثلاث نقاط مالية موثّقة في <code>backend/food/functions.php</code> نفسه: لا حجز حقيقي (خصم فوري + استرجاع)، معامل تحويل العملة غير مؤكد، ولا صرف آلي لأرباح السائقين. <strong>هذه أقرب قيمة جاهزة في المشروع كله</strong> — عمل أسابيع لا أشهر، وقيمته أعلى من أي ميزة جديدة تُبنى من الصفر.</p>
|
|
</div>
|
|
|
|
<hr>
|
|
|
|
<h2>القسم الخامس — مصفوفة الفرز</h2>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>الفرصة</th>
|
|
<th>الجهد</th>
|
|
<th>الأثر</th>
|
|
<th>المخاطرة</th>
|
|
<th>التصنيف</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>محرك الإسناد بالدفعات</td>
|
|
<td>متوسط</td>
|
|
<td><strong>عالٍ جداً</strong></td>
|
|
<td>متوسطة (يلمس المسار الحرج)</td>
|
|
<td>إصلاح جوهري</td>
|
|
</tr>
|
|
<tr>
|
|
<td>إغلاق التسرب خارج المنصة</td>
|
|
<td>منخفض</td>
|
|
<td>عالٍ</td>
|
|
<td>منخفضة</td>
|
|
<td>إصلاح جوهري</td>
|
|
</tr>
|
|
<tr>
|
|
<td>رسوم الإلغاء وعدم الحضور</td>
|
|
<td>منخفض</td>
|
|
<td>متوسط-عالٍ</td>
|
|
<td>منخفضة</td>
|
|
<td>إصلاح جوهري</td>
|
|
</tr>
|
|
<tr>
|
|
<td>غرفة عمليات السلامة</td>
|
|
<td>متوسط</td>
|
|
<td>عالٍ (سمعة)</td>
|
|
<td>منخفضة</td>
|
|
<td>إصلاح جوهري</td>
|
|
</tr>
|
|
<tr>
|
|
<td>أداة التعويض ودورة الشكوى</td>
|
|
<td>منخفض</td>
|
|
<td>متوسط</td>
|
|
<td>منخفضة</td>
|
|
<td>إصلاح جوهري</td>
|
|
</tr>
|
|
<tr>
|
|
<td>سيرو للأعمال</td>
|
|
<td>متوسط</td>
|
|
<td><strong>عالٍ جداً</strong></td>
|
|
<td>منخفضة</td>
|
|
<td>إيراد جديد</td>
|
|
</tr>
|
|
<tr>
|
|
<td>إطلاق الطعام (المرحلة 5)</td>
|
|
<td>منخفض-متوسط</td>
|
|
<td>عالٍ</td>
|
|
<td>متوسطة (مال حقيقي)</td>
|
|
<td>إيراد جاهز</td>
|
|
</tr>
|
|
<tr>
|
|
<td>الحجز المسبق</td>
|
|
<td>متوسط</td>
|
|
<td>عالٍ</td>
|
|
<td>منخفضة</td>
|
|
<td>ميزة + بيانات</td>
|
|
</tr>
|
|
<tr>
|
|
<td>الطرود والمشاوير</td>
|
|
<td>منخفض</td>
|
|
<td>متوسط-عالٍ</td>
|
|
<td>منخفضة</td>
|
|
<td>إيراد جديد</td>
|
|
</tr>
|
|
<tr>
|
|
<td>اشتراك الراكب (Siro+)</td>
|
|
<td>منخفض</td>
|
|
<td>متوسط</td>
|
|
<td>منخفضة</td>
|
|
<td>إيراد متكرر</td>
|
|
</tr>
|
|
<tr>
|
|
<td>البيع الأبيض كمنتج</td>
|
|
<td>متوسط</td>
|
|
<td>عالٍ</td>
|
|
<td><strong>عالية</strong> (يستوجب إغلاق الأمن أولاً)</td>
|
|
<td>إيراد عالي الهامش</td>
|
|
</tr>
|
|
<tr>
|
|
<td>مواصلاتي للشركات والمصانع</td>
|
|
<td>منخفض (الكود موجود)</td>
|
|
<td>عالٍ</td>
|
|
<td>متوسطة (فجوات معروفة)</td>
|
|
<td>توسعة سوق</td>
|
|
</tr>
|
|
<tr>
|
|
<td>الطلب عبر SMS/واتساب</td>
|
|
<td>متوسط</td>
|
|
<td>عالٍ (سوريا)</td>
|
|
<td>منخفضة</td>
|
|
<td>خارج الصندوق</td>
|
|
</tr>
|
|
<tr>
|
|
<td>رقمنة السرافيس</td>
|
|
<td>عالٍ</td>
|
|
<td><strong>عالٍ جداً</strong></td>
|
|
<td>عالية (تنظيمية)</td>
|
|
<td>رهان استراتيجي</td>
|
|
</tr>
|
|
<tr>
|
|
<td>محفظة الوقود والصيانة</td>
|
|
<td>منخفض-متوسط</td>
|
|
<td>عالٍ (ولاء السائق)</td>
|
|
<td>منخفضة</td>
|
|
<td>خارج الصندوق</td>
|
|
</tr>
|
|
<tr>
|
|
<td>تمويل المركبات</td>
|
|
<td>عالٍ</td>
|
|
<td><strong>عالٍ جداً</strong></td>
|
|
<td>عالية (تنظيمية)</td>
|
|
<td>رهان استراتيجي</td>
|
|
</tr>
|
|
<tr>
|
|
<td>طبقة المعالم الشعبية</td>
|
|
<td>متوسط</td>
|
|
<td>متوسط الآن / عالٍ لاحقاً</td>
|
|
<td>منخفضة</td>
|
|
<td>أصل بيانات</td>
|
|
</tr>
|
|
<tr>
|
|
<td>الرصد والقياس</td>
|
|
<td>منخفض</td>
|
|
<td>عالٍ (تشغيلي)</td>
|
|
<td>صفر</td>
|
|
<td>بنية تحتية</td>
|
|
</tr>
|
|
<tr>
|
|
<td>اختبارات الدخان + CI</td>
|
|
<td>منخفض</td>
|
|
<td>عالٍ</td>
|
|
<td>صفر</td>
|
|
<td>بنية تحتية</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<hr>
|
|
|
|
<h2>القسم السادس — ما لا أنصح به</h2>
|
|
|
|
<p>الصدق هنا أنفع من إطالة اللائحة:</p>
|
|
|
|
<ul>
|
|
<li><strong>Spotify / موسيقى / راديو / ألعاب داخل التطبيق:</strong> كلفة تكامل حقيقية مقابل أثر تجاري قريب من الصفر. لا أحد يختار تطبيق نقل بسبب الموسيقى، ولن يبقى أحد بسببها.</li>
|
|
<li><strong>ساعة ذكية / Wear OS:</strong> حجم المستخدمين في الأسواق المستهدفة لا يبرر أسبوعاً واحداً من العمل.</li>
|
|
<li><strong>اشتراك السائق بدل العمولة:</strong> يستبدل إيراداً ينمو بإيراد ثابت، ويكافئ السائق كثيف الرحلات بأقل هامش — عكس المطلوب.</li>
|
|
<li><strong>Carpool (مشاركة الرحلة) الآن:</strong> لا يعمل إلا بكثافة طلب عالية جداً في نفس المسار واللحظة. قبل حل الإسناد الأساسي (بند 1.1)، Carpool سيُنتج تجربة رديئة للطرفين ويحرق الفكرة سوقياً. أجّلها، لا تُلغِها.</li>
|
|
<li><strong>مساعد صوتي كامل:</strong> جهد كبير مقابل استخدام محدود. الجزء المفيد منه فقط (أمر صوتي واحد للسائق: "متاح / غير متاح") يمكن بناؤه في أيام.</li>
|
|
</ul>
|
|
|
|
<hr>
|
|
|
|
<h2>ملحق — تشغيل phpMyAdmin بأمان</h2>
|
|
|
|
<div class="card">
|
|
<p><strong>الوضع الحالي المؤكد</strong> (<code>docker/docker-compose.yml:205-216</code>): الخدمة معرَّفة أصلاً، منفذها <code>"8082:80"</code> — أي <strong>مربوط على كل الواجهات</strong>، بلا TLS، وبكلمة مرور جذر MySQL. ومع أن <code>docker-proxy</code> يلتفّ على قواعد UFW عادةً، فالأرجح أن المنفذ مفتوح للإنترنت فعلاً. أما MySQL نفسه فمربوط بشكل صحيح على <code>127.0.0.1:33062</code> فقط.</p>
|
|
|
|
<p><strong>الخيار الموصى به — نفق SSH (بلا أي كشف خارجي):</strong></p>
|
|
|
|
<ol>
|
|
<li>اقفل الربط على المضيف فقط في <code>docker-compose.yml</code>:
|
|
<pre><code>ports:
|
|
- "127.0.0.1:8082:80"</code></pre>
|
|
ثم <code>docker compose up -d phpmyadmin</code></li>
|
|
<li>من جهازك: <code dir="ltr">ssh -N -L 8082:127.0.0.1:8082 USER@SERVER</code></li>
|
|
<li>افتح <code>http://localhost:8082</code> — المستخدم <code>root</code> وكلمة <code>MYSQL_ROOT_PASSWORD</code> من <code>docker/.env</code></li>
|
|
</ol>
|
|
|
|
<p><strong>الخيار الأنظف (بلا phpMyAdmin أصلاً):</strong> نفق مباشر إلى MySQL واستخدام عميل سطح مكتب (TablePlus / Sequel Ace / DBeaver):</p>
|
|
<pre><code>ssh -N -L 3307:127.0.0.1:33062 USER@SERVER</code></pre>
|
|
<p>ثم الاتصال بـ <code>127.0.0.1:3307</code>. أسرع وأأمن، ولا يضيف حاوية ولا سطح هجوم.</p>
|
|
|
|
<p><strong>إن أردت وصولاً دائماً عبر المتصفح:</strong> نطاق فرعي خلف nginx المضيف (CloudPanel) بشهادة TLS + <code>Basic Auth</code> + قائمة IP مسموح بها، مع ضبط <code>PMA_ABSOLUTE_URI</code>، ومستخدم MySQL مخصص محدود الصلاحيات بدل <code>root</code>.</p>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html> |