Update: 2026-07-14 19:10:36
This commit is contained in:
@@ -47,4 +47,4 @@ if ($httpCode) {
|
||||
$response = json_encode(['status' => 'error', 'message' => 'Failed to connect to Wallet Server']);
|
||||
}
|
||||
|
||||
echo $response;
|
||||
echo $response;
|
||||
@@ -0,0 +1,114 @@
|
||||
# 💰 دراسة كلفة إعادة بناء منصة Siro — شركة برمجيات في مصر (2026)
|
||||
|
||||
**السؤال:** لو طُلب من شركة برمجيات مصرية بناء هذا المشروع بالكامل، بنفس الجودة ونفس
|
||||
الميزات، مع استخدام الذكاء الاصطناعي ووكلائه في التطوير — كم المدة وكم التكلفة؟
|
||||
|
||||
**المنهجية:** النطاق مُقاس من الكود الفعلي (لا من وصف عام)، الجهد بالشهر-رجل
|
||||
(Person-Month)، معامل خصم للذكاء الاصطناعي مطبق بشكل انتقائي حسب طبيعة كل مكوّن،
|
||||
والأسعار بأسعار سوق القاهرة 2026.
|
||||
|
||||
---
|
||||
|
||||
## 1. النطاق المُقاس فعلياً
|
||||
|
||||
| المكوّن | الحجم المقاس | ملاحظات |
|
||||
|---|---|---|
|
||||
| تطبيق الراكب (Flutter) | ~97,000 سطر | خرائط مخصصة، سوكيت، WebRTC، SOS، خرائط أوفلاين، 13 لغة، Live Activities |
|
||||
| تطبيق السائق (Flutter) | ~111,500 سطر | الأكبر: مكافحة احتيال، CarPlay/Android Auto، تدرّج، خارطة تنبؤية |
|
||||
| تطبيق الإدارة (Flutter) | ~43,000 سطر | جيلان من اللوحات + مساعد توثيق AI |
|
||||
| تطبيق خدمة العملاء (Flutter) | ~34,000 سطر | |
|
||||
| الباك اند PHP | ~47,500 سطر / 504 ملفات | أمان مركزي، محرك رحلات، تسعير ديناميكي، مواصلاتي |
|
||||
| خدمة المدفوعات/المحفظة | ~12,500 سطر | 6+ بوابات دفع بثلاث دول |
|
||||
| خوادم الموقع والسوكيت | ~5,000 سطر | خادمان WebSocket + Redis Geo |
|
||||
| بوتات التسعير والسوشيال | ~3,500 سطر + بوت أندرويد | Accessibility bot + محرك انحدار Node |
|
||||
| **الإجمالي** | **~350,000 سطر كود يدوي** | بدون مكتبات أو كود مولّد |
|
||||
|
||||
## 2. تقدير الجهد (شهر-رجل)
|
||||
|
||||
الافتراض المعياري: مطوّر متمكّن ينتج 3,000–4,500 سطر كود إنتاجي شهرياً في Flutter
|
||||
(واجهات كثيفة)، و2,500–3,500 في باك اند به منطق مالي وأمني.
|
||||
|
||||
| البند | جهد تقليدي (PM) | خصم AI | جهد بعد AI (PM) |
|
||||
|---|---|---|---|
|
||||
| التطبيقات الأربعة | 68–75 | −45% (واجهات وCRUD تتسارع كثيراً) | 37–41 |
|
||||
| الباك اند + المدفوعات | 20–24 | −30% (منطق مالي يحتاج مراجعة بشرية) | 14–17 |
|
||||
| خوادم السوكيت + Redis Geo | 5–6 | −25% (ضبط أداء حقيقي على أجهزة) | 4–5 |
|
||||
| بوتات التسعير والسوشيال | 6–8 | −20% (هندسة عكسية وتجريب ميداني) | 5–6 |
|
||||
| مواصلاتي (لوحة ويب + تكامل) | 7–9 | −40% | 4–5 |
|
||||
| **مجموع التطوير** | **106–122** | | **64–74** |
|
||||
| QA على أجهزة حقيقية بثلاث دول (+15%) | | | 10–11 |
|
||||
| إدارة مشروع + DevOps + تصميم (+15%) | | | 10–11 |
|
||||
| **الإجمالي النهائي** | **~135–155 PM تقليدي** | **متوسط −38%** | **≈ 84–96 PM** |
|
||||
|
||||
> **لماذا الخصم ليس 70%؟** وكلاء الذكاء الاصطناعي يتفوقون في كتابة الكود الجديد، لكن
|
||||
> 40–50% من جهد هذا المشروع تحديداً ليس كتابة كود: تكامل بوابات دفع حقيقية (PayMob،
|
||||
> MTN، Syriatel — بيئات اختبار بطيئة وبيروقراطية)، اختبار GPS وسوكيتات على أجهزة فعلية
|
||||
> في الشارع، ضبط الأداء، ومراجعة بشرية إلزامية لأي كود مالي/أمني. هذه لا يسرّعها AI إلا قليلاً.
|
||||
|
||||
## 3. الفريق والمدة
|
||||
|
||||
**الفريق الأمثل (8 أشخاص):** 3 Flutter، 2 باك اند PHP/Node، 1 Full-stack (لوحات الويب
|
||||
والبوتات)، 1 QA، 1 قائد تقني/PM — جميعهم يعملون بأدوات AI-agents.
|
||||
|
||||
**المدة الواقعية: 11–13 شهراً** حتى تكافؤ كامل بالميزات على 3 دول.
|
||||
- الشهور 1–3: الأساس (مصادقة، خرائط، حجز أساسي، بنية دفع)
|
||||
- الشهور 4–7: دورة الرحلة الكاملة + المحفظة + تطبيق السائق المتقدم
|
||||
- الشهور 8–10: الإدارة، خدمة العملاء، بوتات التسعير، مواصلاتي
|
||||
- الشهور 11–13: تعدد الدول واللغات، تقوية أمنية، اختبار ميداني، إطلاق
|
||||
|
||||
أي وعد بأقل من 8 أشهر لنفس النطاق والجودة = قصّ نطاق مُقنَّع أو دين تقني مؤجل.
|
||||
|
||||
## 4. التكلفة (سوق القاهرة 2026)
|
||||
|
||||
الكلفة الشهرية الشاملة للعميل (رواتب + أعباء + هامش الشركة) للمطوّر الواحد في شركة
|
||||
برمجيات مصرية متوسطة-جيدة: **$2,000–3,000 شهرياً** (متوسط مرجّح $2,500).
|
||||
|
||||
| السيناريو | الحساب | التكلفة |
|
||||
|---|---|---|
|
||||
| **فريق مخصص (Dedicated Team) — الأدق** | 90 PM × $2,500 | **≈ $225,000** |
|
||||
| النطاق المتفائل | 84 PM × $2,000 | $168,000 |
|
||||
| النطاق المتحفظ | 96 PM × $3,000 | $288,000 |
|
||||
| **سعر مقطوعية (Fixed-Price) من شركة** | + هامش مخاطرة 25–35% | **$280,000–380,000** |
|
||||
| فريق مستقلّين (Freelancers) بقيادة جيدة | خصم ~35%، مخاطرة أعلى | $110,000–150,000 |
|
||||
| شركة من الصف الأول (حي المعادي/الذكية) | ضعف السعر تقريباً | $400,000–550,000 |
|
||||
|
||||
**تكاليف غير بشرية تُضاف لأي سيناريو (~$18,000–28,000):**
|
||||
سيرفرات وبيئات تطوير واختبار (~$500–900/شهر)، أجهزة اختبار حقيقية (15–20 جهاز)،
|
||||
رسوم متاجر التطبيقات، رسائل OTP الاختبارية، استهلاك APIs الذكاء الاصطناعي للتطوير
|
||||
(~$800–1,500/شهر لفريق بحجمنا)، تراخيص وأدوات.
|
||||
|
||||
### ✅ الرقم المرجعي النهائي
|
||||
|
||||
> **بناء مكافئ كامل لمنصة Siro في مصر (2026) بفريق يستخدم وكلاء الذكاء الاصطناعي:**
|
||||
> **$240,000–320,000 خلال 11–13 شهراً** (فريق مخصص 8 أشخاص)
|
||||
> — وبعقد مقطوعية من شركة محترمة: توقّع عرضاً بين **$280,000–380,000**.
|
||||
> بالجنيه المصري (~50 ج/دولار): **12–19 مليون جنيه**.
|
||||
|
||||
## 5. الكلفة التشغيلية بعد التسليم (شهرياً)
|
||||
|
||||
| البند | شهرياً |
|
||||
|---|---|
|
||||
| بنية تحتية (سيرفرات، Redis، سوكيتات، نسخ احتياطي) لثلاث دول | $1,500–3,500 |
|
||||
| رسائل OTP وواتساب API | حسب الحجم ($300–1,500) |
|
||||
| استهلاك AI (توثيق سائقين، شكاوى، بوتات) | $400–1,200 |
|
||||
| فريق صيانة وتطوير مستمر (2 مطوّر + نصف QA) | $6,000–9,000 |
|
||||
| **الإجمالي التشغيلي** | **≈ $8,000–15,000/شهر** |
|
||||
|
||||
## 6. ما لا يشتريه هذا المبلغ إطلاقاً — وهنا الحجة الاستثمارية
|
||||
|
||||
الـ $300 ألف تشتري **الكود المكافئ**، لكنها لا تشتري:
|
||||
|
||||
1. **معادلات تسعير المنافسين الفعلية** — تحتاج أشهراً من السحب الحي من السوق بعد الإطلاق.
|
||||
2. **القيم المضبوطة تشغيلياً** (12 ساعة قيادة، 90 ثانية للمفاوض، سقوف التسوية) — نتاج
|
||||
حوادث حقيقية، الشركة الجديدة ستدفع ثمن تعلّمها من جديد.
|
||||
3. **العلاقات والتراخيص**: اتفاقيات MTN وSyriatel وCliq وPayMob، ترخيص النقل السوري،
|
||||
حلول التوزيع تحت العقوبات — سنة إضافية على الأقل من العمل غير البرمجي.
|
||||
4. **القاعدة الفعلية**: 1,447 سائقاً و2,891 راكباً — أصل شبكي يحتاج ميزانية تسويق منفصلة
|
||||
بالكامل (عادة تفوق كلفة التطوير نفسها في هذا القطاع).
|
||||
|
||||
**الخلاصة الاستثمارية:** كلفة إعادة البناء (~$300K) + سنة زمن ضائع + كلفة اكتساب
|
||||
المستخدمين + المعرفة التشغيلية غير القابلة للشراء — هذا ما يجعل التقييم الضمني الموثق
|
||||
(~$909K) منطقياً وليس مبالغاً فيه، بل يجعل «الشراء/الاستثمار» أرخص من «البناء» لأي طرف جاد.
|
||||
|
||||
---
|
||||
*أُعدّت 2026-07-14 بقياس مباشر لحجم الكود الفعلي (~350 ألف سطر) وبأسعار سوق القاهرة الجارية.*
|
||||
@@ -66,6 +66,7 @@
|
||||
## 06_investors — وثائق المستثمرين ودراسات الجدوى
|
||||
| الملف | المحتوى |
|
||||
|---|---|
|
||||
| [rebuild_cost_estimate_egypt_2026.md](06_investors/rebuild_cost_estimate_egypt_2026.md) | ⭐ دراسة كلفة إعادة البناء في مصر (فريق + AI، 2026) |
|
||||
| [SIRO_INVESTOR_REPORT_AR.md](06_investors/SIRO_INVESTOR_REPORT_AR.md) | تقرير المستثمر الرئيسي |
|
||||
| [تقرير_المستثمر_الشامل_Siro.md](06_investors/تقرير_المستثمر_الشامل_Siro.md) | التقرير الشامل للمستثمر |
|
||||
| [Siro_Investors_Report_AR.md](06_investors/Siro_Investors_Report_AR.md) | تقرير مستثمرين (نسخة سابقة) |
|
||||
|
||||
@@ -558,39 +558,47 @@ class LoginController extends GetxController {
|
||||
// Check if location services are enabled
|
||||
serviceEnabled = await location.serviceEnabled();
|
||||
if (!serviceEnabled) {
|
||||
serviceEnabled = await location.requestService();
|
||||
if (Platform.isAndroid) {
|
||||
serviceEnabled = await location.requestService();
|
||||
}
|
||||
if (!serviceEnabled) {
|
||||
// Location services are still not enabled, handle the error
|
||||
// Location services are still not enabled, show a message
|
||||
mySnackbarError('Please enable location services in your device settings to continue.'.tr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the app has permission to access location
|
||||
permissionGranted = await location.hasPermission();
|
||||
|
||||
if (permissionGranted == loc.PermissionStatus.deniedForever) {
|
||||
mySnackbarError('Please go to app settings and grant location permission.'.tr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (permissionGranted == loc.PermissionStatus.denied) {
|
||||
|
||||
|
||||
permissionGranted = await location.requestPermission();
|
||||
if (permissionGranted != loc.PermissionStatus.granted) {
|
||||
if (permissionGranted != loc.PermissionStatus.granted && permissionGranted != loc.PermissionStatus.grantedLimited) {
|
||||
// Location permission is still not granted, handle the error
|
||||
permissionGranted = await location.requestPermission();
|
||||
if (permissionGranted != loc.PermissionStatus.granted) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize geofencing now that we have permission
|
||||
if (Platform.isAndroid || Platform.isIOS) {
|
||||
await SiroGeofencingService.initAndStart();
|
||||
mySnackbarError('Location permission is required to use the app. Please grant permission.'.tr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize geofencing now that we have permission
|
||||
if (Platform.isAndroid || Platform.isIOS) {
|
||||
await SiroGeofencingService.initAndStart();
|
||||
}
|
||||
|
||||
if (permissionGranted.toString() == 'PermissionStatus.granted' ||
|
||||
permissionGranted == loc.PermissionStatus.granted) {
|
||||
permissionGranted == loc.PermissionStatus.granted ||
|
||||
permissionGranted == loc.PermissionStatus.grantedLimited) {
|
||||
box.write(BoxName.locationPermission, 'true');
|
||||
}
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
// sendPassengerLocation: تسجيل موقع فتح التطبيق للراكب
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
|
||||
@@ -2,7 +2,7 @@ name: siro_rider
|
||||
description: "A new Flutter project."
|
||||
publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||
|
||||
version: 1.0.5+5
|
||||
version: 1.0.6+6
|
||||
|
||||
environment:
|
||||
sdk: ">=3.0.5 <4.0.0"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
--amber:#9A6B12; --amber-soft:#F6EDDA;
|
||||
--red:#B3362B; --red-soft:#F7E5E2;
|
||||
--good:#2E7D4F; --good-soft:#E4F1E8;
|
||||
--sans:"SF Arabic","Segoe UI",system-ui,-apple-system,"Noto Sans Arabic",Tahoma,sans-serif;
|
||||
--sans:-apple-system, BlinkMacSystemFont, "SF Pro Arabic", "Helvetica Neue", Arial, sans-serif;
|
||||
--mono:ui-monospace,"SF Mono",Consolas,monospace;
|
||||
}
|
||||
@media (prefers-color-scheme: dark){
|
||||
@@ -87,7 +87,9 @@
|
||||
|
||||
/* ===== Sticky TOC ===== */
|
||||
.tocbar{
|
||||
position:sticky; top:0; z-index:10; background:var(--bg);
|
||||
position:sticky; top:0; z-index:10;
|
||||
background:color-mix(in srgb, var(--bg) 75%, transparent);
|
||||
backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
|
||||
border-bottom:1px solid var(--line); padding:10px 0;
|
||||
}
|
||||
.tocbar .row{ display:flex; gap:8px; overflow-x:auto; scrollbar-width:none; padding:2px; }
|
||||
@@ -95,10 +97,10 @@
|
||||
.tocbar a{
|
||||
flex:none; text-decoration:none; font-size:.8rem; font-weight:700; color:var(--muted);
|
||||
border:1px solid var(--line); background:var(--surface); border-radius:99px; padding:5px 13px;
|
||||
white-space:nowrap;
|
||||
white-space:nowrap; transition: all 0.2s ease;
|
||||
}
|
||||
.tocbar a b{ color:var(--brand); font-weight:800; margin-inline-end:4px; font-variant-numeric:tabular-nums; }
|
||||
.tocbar a:hover{ border-color:var(--brand); color:var(--ink); }
|
||||
.tocbar a:hover{ border-color:var(--brand); color:var(--ink); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.05); }
|
||||
|
||||
/* ===== Sections ===== */
|
||||
section{ padding:46px 0 8px; }
|
||||
@@ -117,9 +119,10 @@
|
||||
.subhead::after{ content:""; flex:1; height:1px; background:var(--line); }
|
||||
|
||||
/* compact feature rows */
|
||||
.rows{ border:1px solid var(--line); border-radius:14px; background:var(--surface); overflow:hidden; }
|
||||
.row-item{ padding:13px 18px; border-top:1px solid var(--line); }
|
||||
.rows{ border:1px solid var(--line); border-radius:14px; background:var(--surface); overflow:hidden; box-shadow: 0 2px 10px rgba(0,0,0,0.02); }
|
||||
.row-item{ padding:13px 18px; border-top:1px solid var(--line); transition: all 0.2s ease; cursor: default; }
|
||||
.row-item:first-child{ border-top:none; }
|
||||
.row-item:hover{ background:var(--surface2); padding-inline-start:22px; }
|
||||
.row-item h4{ font-size:.95rem; font-weight:800; display:inline; }
|
||||
.row-item p{ display:inline; color:var(--muted); font-size:.9rem; }
|
||||
.row-item h4::after{ content:" — "; color:var(--faint); font-weight:400; }
|
||||
@@ -153,7 +156,8 @@
|
||||
/* ===== two-col mini grid ===== */
|
||||
.duo{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
|
||||
@media (max-width:640px){ .duo{ grid-template-columns:1fr; } }
|
||||
.panel{ border:1px solid var(--line); border-radius:14px; background:var(--surface); padding:16px 18px; }
|
||||
.panel{ border:1px solid var(--line); border-radius:14px; background:var(--surface); padding:16px 18px; transition: all 0.2s ease; cursor: default; }
|
||||
.panel:hover{ transform: translateY(-2px); box-shadow: 0 6px 16px rgba(0,0,0,0.04); border-color: color-mix(in srgb, var(--brand) 30%, var(--line)); }
|
||||
.panel h4{ font-size:.95rem; font-weight:800; margin-bottom:6px; }
|
||||
.panel p, .panel li{ color:var(--muted); font-size:.88rem; }
|
||||
.panel ul{ margin:6px 0 0; padding-inline-start:18px; display:flex; flex-direction:column; gap:5px; }
|
||||
@@ -163,7 +167,8 @@
|
||||
/* ===== tutorial modules ===== */
|
||||
.mods{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
|
||||
@media (max-width:640px){ .mods{ grid-template-columns:1fr; } }
|
||||
.mod{ border:1px solid var(--line); border-radius:14px; background:var(--surface); padding:16px 18px; position:relative; }
|
||||
.mod{ border:1px solid var(--line); border-radius:14px; background:var(--surface); padding:16px 18px; position:relative; transition: all 0.2s ease; cursor: default; }
|
||||
.mod:hover{ transform: translateY(-2px); box-shadow: 0 6px 16px rgba(0,0,0,0.04); border-color: color-mix(in srgb, var(--brand) 30%, var(--line)); }
|
||||
.mod .shots{ position:absolute; top:14px; inset-inline-end:16px; font-size:.7rem; font-weight:800;
|
||||
color:var(--brand-ink); background:var(--brand-soft); border-radius:99px; padding:2px 10px; font-variant-numeric:tabular-nums; }
|
||||
.mod h4{ font-size:.95rem; font-weight:800; padding-inline-end:70px; }
|
||||
|
||||
Reference in New Issue
Block a user