From ab77ed529a88a1be290e506adbce81d98f7173cd Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Tue, 14 Jul 2026 19:10:36 +0300 Subject: [PATCH] Update: 2026-07-14 19:10:36 --- .DS_Store | Bin 10244 -> 10244 bytes backend/nabeh/verify_payment.php | 2 +- .../rebuild_cost_estimate_egypt_2026.md | 114 ++++++++++++++++++ docs/README.md | 1 + .../lib/controller/auth/login_controller.dart | 38 +++--- siro_rider/pubspec.yaml | 2 +- siromove.com/report.html | 21 ++-- 7 files changed, 153 insertions(+), 25 deletions(-) create mode 100644 docs/06_investors/rebuild_cost_estimate_egypt_2026.md diff --git a/.DS_Store b/.DS_Store index e94c6e9eda27d276437c8973ca0ccd755d4a8bbc..964fdbfb2702369b9789ef5fb66851077a794795 100644 GIT binary patch delta 24 fcmZn(XbIS`MVQ^hQb)na*l_Y%5&O-*gt( delta 16 XcmZn(XbIS`MR@Wu5x331gt 'error', 'message' => 'Failed to connect to Wallet Server']); } -echo $response; +echo $response; \ No newline at end of file diff --git a/docs/06_investors/rebuild_cost_estimate_egypt_2026.md b/docs/06_investors/rebuild_cost_estimate_egypt_2026.md new file mode 100644 index 00000000..6660c916 --- /dev/null +++ b/docs/06_investors/rebuild_cost_estimate_egypt_2026.md @@ -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 ألف سطر) وبأسعار سوق القاهرة الجارية.* diff --git a/docs/README.md b/docs/README.md index bf929571..d7e8447f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -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) | تقرير مستثمرين (نسخة سابقة) | diff --git a/siro_rider/lib/controller/auth/login_controller.dart b/siro_rider/lib/controller/auth/login_controller.dart index 3c243b88..bcaa2f36 100644 --- a/siro_rider/lib/controller/auth/login_controller.dart +++ b/siro_rider/lib/controller/auth/login_controller.dart @@ -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: تسجيل موقع فتح التطبيق للراكب // ───────────────────────────────────────────────────────────── diff --git a/siro_rider/pubspec.yaml b/siro_rider/pubspec.yaml index 9afc0de1..0be3937f 100644 --- a/siro_rider/pubspec.yaml +++ b/siro_rider/pubspec.yaml @@ -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" diff --git a/siromove.com/report.html b/siromove.com/report.html index c1b5d472..9e47561c 100644 --- a/siromove.com/report.html +++ b/siromove.com/report.html @@ -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; }