منصة شرائح eSIM للسفر: تطبيق وخلفية تجارية ولوحة تشغيل
كلّف عميلٌ بايمنتري ببناء منتج يبيع شرائح eSIM للمسافرين: يختار العميل باقة بيانات للدولة التي يزورها، ويدفع، فتُصدر الشريحة وتُثبَّت على هاتفه، بالعربية أو الإنجليزية. لا يُذكر اسم العميل بناءً على طلبه. أُنجز نطاق التطوير الموصوف هنا وسُلِّم، وما يبقى قبل الإطلاق مذكور في القسم الأخير.
الحاجة
تبدو شريحة السفر بسيطة من الخارج: اختر وجهة، ادفع، امسح رمزًا. لكن خلف ذلك مزوّد جملة له كتالوجه وآلية إصداره، ومدفوعات بالبطاقة يجب ألا تُحصَّل قبل أن توجد الشريحة فعلًا، واستهلاك يُستعلم عنه من المزوّد ويُعرض بصدق، واستردادات تمس أموالًا حقيقية، وفريق تشغيل يحتاج رؤية كل ذلك دون أن يرى بيانات التفعيل أبدًا.
كان مطلوبًا أن يعمل المنتج بالعربية والإنجليزية على قدم المساواة، على iOS وAndroid، وأن تتمكن الشركة من إضافة مزوّد أو استبداله دون إعادة كتابة التطبيق.
ما الذي بُني؟
تطبيق الجوال
تطبيق Flutter لنظامي iOS وAndroid من 27 شاشة: بحث عن الوجهات بالدولة والمنطقة، مقارنة الباقات، شراء كضيف يمكن ترقيته إلى حساب، تثبيت برمز QR أو إدخال يدوي أو تثبيت مباشر حيث يسمح النظام، البيانات المتبقية لكل شريحة، إضافة رصيد، إشعارات، مقالات مساعدة، حل المشكلات، وتذاكر الدعم.
الخلفية التجارية
خدمة NestJS معيارية على PostgreSQL وRedis: مزامنة الكتالوج من المزوّد إلى نموذج باقات موحّد، محرك تسعير بتقريب لكل عملة، عروض أسعار بتثبيت مؤقت للسعر، طلبات بآلة حالة صريحة، مدفوعات بالتفويض ثم التحصيل، إصدار الشرائح، استعلام الاستهلاك بعتبات تنبيه، إضافة رصيد، استردادات، عروض ترويجية، إحالات، إشعارات، ومهام خلفية.
لوحة التشغيل
لوحة Next.js مُصيَّرة على الخادم من 17 قسمًا: الطلبات بحالة الدفع والإصدار، مخزون الشرائح، العملاء، طابور الدعم، المدفوعات، الاستردادات، التسعير، العملات، الباقات، المزوّدون، العروض، الويب هوكس، أعلام الميزات، الفريق، وسجل التدقيق. الصلاحيات تُفرض في كل صفحة بحسب الدور وتُفرض مرة أخرى في الواجهة البرمجية.
نظام التصميم
ملف Figma تُولَّد متغيراته الـ147 وأنماطه الـ34 من مصدر الرموز نفسه الذي يُبنى منه التطبيق واللوحة، فيوثّق الملف ما يُشحن فعلًا. أُعيد بناء الشاشات العربية من اليمين إلى اليسار بدل عكسها آليًا.
القرارات الهندسية
واجهة واحدة للمزوّد
لا يخاطب التطبيق ولا منطق العمل مزوّد الجملة مباشرة أبدًا. كل نداء للكتالوج أو الإصدار أو الاستهلاك يمر عبر واجهة محوّل واحدة لها تنفيذان: نسخة وهمية حتمية تستخدمها كل الاختبارات، والمزوّد الحقيقي مكتوب وفق عقده الموثّق ومُختبَر بردود مسجّلة. إضافة مزوّد تعني محوّلًا جديدًا لا إعادة كتابة.
أموال يصعب الخطأ فيها
المبالغ وحدات صغرى صحيحة في كل مكان. تُفوَّض البطاقة أولًا ولا تُحصَّل إلا بعد أن يُصدر المزوّد الشريحة، فلا يبقى عميل مدفوعًا منه بعد إصدار فاشل. لا يتجاوز الاسترداد ما حُصِّل، ويُفرض ذلك تحت قفل صف، ويحتاج شخصين: أحدهما يرفعه والآخر يعتمده.
حالات صريحة ومرة واحدة فقط
تتنقّل الطلبات عبر آلة حالة محدّدة تسجّل كل انتقال. تمر الأحداث الحرجة عبر صندوق صادر معاملاتي، ويحمل كل شراء وإضافة رصيد واسترداد مفتاح تكرار ببصمة معيارية، فلا يستطيع طلب مُعاد أن ينشئ طلبًا ثانيًا.
تثبيت يعمل على كل هاتف
المسار العام، رمز QR وبيانات التفعيل اليدوية، يُشحن دائمًا. أما التثبيت المباشر داخل التطبيق فيُتفاوض عليه وقت التشغيل ويبقى خلف علم ميزة، لأنه على iOS يعتمد على استحقاق لا تمنحه إلا Apple. ويتحقق التطبيق من توافق الجهاز قبل الشراء لا بعده.
استهلاك يُعرض بصدق
تُستعلم البيانات المتبقية من المزوّد وتُختم بوقتها وتُوسم بأنها قد تكون قديمة عند تأخرها. تطلق العتبات إشعارات، وتُعالج مهام مجدولة انتهاء الصلاحية، وتبدأ الباقة عند أول اتصال للشريحة في الوجهة لا عند الشراء. والتطبيق يقول ذلك صراحة.
الأمان افتراضيًا
كلمات المرور بخوارزمية Argon2id، ورموز التجديد تُدوَّر مع كشف إعادة الاستخدام، وأسرار المزوّدين للكتابة فقط في اللوحة، وبيانات التفعيل لا تُعرض في اللوحة أبدًا ولا حتى لمدير أعلى، وتشحن اللوحة سياسة أمان محتوى برمز فريد لكل طلب.
العربية لغةً أولى
العربية لغة أساسية لا طبقة ترجمة: 341 نصًا باللغتين دون أي نص غير مترجم، وبوابة بناء تفشل عند أي نص ظاهر للمستخدم مكتوب في الكود، وتدرّج خط لكل لغة، وعزل من اليسار إلى اليمين للأسعار والرموز والمعرّفات داخل الجمل العربية. كشفت مراجعة بصرية على الجهاز عيبين لم تستطع الاختبارات رؤيتهما، سعرًا يُقرأ بالمقلوب وأسهمًا تشير إلى الاتجاه الخطأ، وأُصلح كلاهما من الجذر.
لوحة التشغيل
اللوحة هي المكان الذي يُسمح فيه للتعقيد بالظهور. يستطيع المشغّلون تتبّع الطلب من الدفع إلى الإصدار، والبحث عن الشرائح برقم ICCID مقتطع دون رؤية بيانات التفعيل أبدًا، ومعالجة طابور الدعم، ورفع الاستردادات واعتمادها، وفحص صحة المزوّد ورصيده، ومزامنة الكتالوج، وقراءة سجل التدقيق لكل إجراء حساس.
الجودة والأمان
- اختبارات وحدة للعقود والواجهة البرمجية واللوحة، إضافة إلى 186 اختبار تكامل على PostgreSQL حقيقية و42 اختبار عقد للمزوّد على ردود مسجّلة تغطي النجاح وحدود المعدل والمهلات والويب هوكس المكررة وأعطال المزوّد.
- رحلة عميل من 79 خطوة تُنفَّذ من طرف إلى طرف على الواجهة الحية، بما فيها مسارات الفشل: بطاقات مرفوضة، انقطاع المزوّد، وتحصيل يفشل بعد الإصدار.
- 78 اختبار متصفح للوحة على الواجهة الحية، وفحص وصولية آلي لكل قسم، وبوابة تباين ألوان على أزواج الرموز الـ22 كلها.
- 121 اختبار وحدة وواجهات في Flutter، وتحليل ساكن، وبوابة التعريب الموصوفة أعلاه.
- تدقيق عدائي قبل التسليم رفع 46 ملاحظة وأكّد 36 منها بعد جولة دحض. كل واحدة كانت ادعاءً لم يفِ به الكود: استرداد جزئي يبقى معلّقًا للأبد، وتسليم دون تحصيل، ورمز ترويجي يُعاد استخدامه بعد حدّه. أُصلحت جميعها باختبارات شوهدت تفشل أولًا.
- نسخ احتياطية مشفّرة لقاعدة البيانات تحقّقت باستعادة كاملة في قاعدة مؤقتة مع مقارنة كل جدول، وأرشفة سجل الكتابة المسبق مؤكَّدة الفعالية.
ما الذي يقوله المنتج لمستخدميه؟
يقول التطبيق بوضوح ما هي شريحة السفر وما ليست: بيانات فقط، بلا مكالمات أو رسائل، وبلا رقم هاتف؛ تبدأ الباقة عند أول اتصال للشريحة لا عند الشراء؛ تُثبَّت الشريحة مرة واحدة ولا يجوز حذفها؛ يحتاج التثبيت إلى Wi-Fi، ولرمز QR إلى جهاز ثانٍ. يُفحص توافق الجهاز قبل الدفع، وتُوسم البيانات المتبقية عندما قد يكون الرقم غير محدّث.
النتيجة
سُلِّم وأُنجز: مصدر التطبيق والخلفية واللوحة؛ ملف Figma؛ مراجع قاعدة البيانات والواجهة البرمجية؛ إجراءات النشر والمراقبة والنسخ الاحتياطي والاستعادة؛ أصول المتاجر وقائمة الإصدار؛ وتوثيق لكل قرار اتُّخذ وكل قيد معروف.
يعتمد الإطلاق على حسابات لا يملك فتحها إلا العميل: حساب مزوّد الجملة، وحساب مزوّد الدفع، وحسابات المتاجر، وبيئة بناء Apple، واستحقاق eSIM من Apple. لم يُجرَ أي نداء حي للمزوّد أو للدفع؛ كلا التكاملين مُختبَر على ردود مسجّلة وموثّق على هذا الأساس. الشاشات في هذه الصفحة ببيانات تجريبية.
تبني منتج اتصالات أو اشتراكات؟
اشرح الحاجة والمزوّدين المعنيين. تُقيَّم قيود المزوّد والدفع والمتاجر قبل تحديد النطاق.
ناقش منتجك · البرمجة · الأعمال