Amanti
- Java
- Spring Boot
- REST APIs
- MySQL
- Next.js
- Material UI
- Stripe
- Shopify (Remix)
- JUnit
- Mockito
- SonarQube
- Docker
في المغرب لا يترك الموزعون الطرود أمام الباب، لذلك يفشل التوصيل المنزلي حين لا يجد أحدًا في البيت. يوجّه Amanti الطرود إلى متاجر قريبة يرتادها الزبناء أصلًا، ليستلموها في الوقت الذي يناسبهم. بنيت المنصة التي تقف خلف ذلك: الواجهة الخلفية، ولوحة التحكم، والمدفوعات، والإضافة التي تدمجها في مسارات الشراء الإلكترونية.
المشكلة
في المغرب، يقوم التسوق الإلكتروني على الدفع عند الاستلام: تدفع للموزع حين يصلك الطرد. ولا يترك الموزعون الطرود أمام الباب كما يفعلون في الولايات المتحدة. فإذا لم يكن أحد في البيت حين يصل الموزع، يفشل التوصيل. يضطر للعودة في يوم آخر، ويتنقل الطرد ذهابًا وإيابًا، ويبقى الزبون ينتظر.
الفكرة
يمر معظم الناس كل يوم أمام متجر في حيّهم. يحوّل Amanti هذه المتاجر إلى نقاط استلام: يترك الموزع الطرد في متجر قريب من الزبون، ويأتي الزبون لاستلامه متى ناسبه ذلك.
كيف يتم التوصيل
- يطلب الزبون عبر الإنترنت. في صفحة الدفع المعتادة للمتجر الإلكتروني، يختار نقطة استلام قريبة منه بدل التوصيل إلى البيت.
- يستقبل Amanti الطلب تلقائيًا. يُبلغ المتجر Amanti لحظة إتمام الطلب، فتُنشأ عملية توصيل.
- يترك الموزع الطرد في المتجر. يُؤكَّد التسليم برمز QR وصورة، ليبقى دليل على وصول الطرد.
- يستلم الزبون طرده. يأتي متى ناسبه، ويُسجَّل التسليم بالطريقة نفسها، ويدفع للمتجر نقدًا كما كان سيدفع للموزع.
- يسوّي المتجر الحساب. من صفحته في Amanti، يرسل المتجر المال المحصَّل عبر Stripe، الذي يوزّعه تلقائيًا: يحصل المتجر الإلكتروني على ثمن الطلب، ويأخذ Amanti عمولته.
ما جرّبناه أولًا
- مطالبة الزبون بالدفع عبر الإنترنت مسبقًا. الدفع عند الاستلام هو القاعدة في المغرب، فكانت خطوة الدفع الإلكتروني تدفع الزبناء إلى التخلي عن طلباتهم.
- إضافة للمتصفح تضيف خيار نقطة الاستلام إلى صفحات المتاجر. كان ذلك يعني تشغيل شيفرتنا في متصفحات المتسوقين، وهي مخاطرة أمنية كبيرة جدًا.
الحل النهائي: إضافة في صفحة الدفع
بنينا إضافة أصلية لـ Shopify تضيف اختيار نقطة الاستلام مباشرة إلى صفحة الدفع الخاصة بالمتجر، دون أن يغادر الزبون صفحة يثق بها أصلًا. لم تكن Shopify سوى المنصة الأولى. أبقينا كل منطق التوصيل والدفع في الواجهة الخلفية لـ Amanti بدل الإضافة، حتى لا تتطلب إضافة منصة تجارة إلكترونية أخرى لاحقًا سوى إضافة صغيرة تتصل بالنظام نفسه.
ما بنيته
بنيت Amanti من الصفر مع مهندس آخر، خلال تدريبي في OpenTecc:
- الواجهة الخلفية بـ Spring Boot التي تدير كل عملية توصيل، من لحظة وصول الطلب إلى الدفع النهائي.
- التحكم في الصلاحيات لثلاثة أدوار مستخدمين، مع تسجيل كل إجراء تلقائيًا في سجل تدقيق. يعتمد على البرمجة الموجهة بالجوانب، حتى لا تفلت منه أي ميزة جديدة.
- تسجيل التسليم برمز QR وصورة، ليبقى دائمًا دليل على آخر من كان الطرد بحوزته.
- مدفوعات Stripe التي توزّع كل دفعة بين المتجر الإلكتروني وAmanti.
- إضافة Shopify ولوحة الإدارة بـ Next.js للطلبات والشحنات والمرتجعات والمدفوعات.
صمّمنا النظام بـ UML قبل كتابة أي شيفرة، ثم رفعت تغطية الاختبارات من 20% إلى 80% بـ JUnit وMockito، مع SonarQube لمتابعة جودة الكود.
التحليلات
توفر لوحة التحكم نظرة شاملة على صحة النشاط التجاري، مع تحليلات لحظية للطلبات والأداء والمدفوعات.





اللوجستيك
إدارة دورة حياة الشحنة كاملة بكفاءة، من الإنشاء إلى التسليم. يدعم النظام تتبعًا دقيقًا وسجلات تاريخية ومسارات استلام وتسليم آمنة.






الإرجاعات
مسار مبسط لمعالجة إرجاع المنتجات، يضمن رضا الزبون وكفاءة التشغيل.



المدفوعات
تكامل مالي متين مع Stripe، يتولى المعاملات الآمنة والتحويلات المالية.



الإعدادات
خيارات شاملة لإعداد النظام تشمل الضبط العام وإدارة الحساب والتخزين.



ما تعلمته
كان Amanti مشروعًا محوريًا علّمني كيف أسد الفجوة بين التعقيد التقني وراحة المستخدم. تعلمت التنقل في تعقيدات منظومة Spring Boot على نطاق واسع، وإدارة لوجستيك «الميل الأخير» بإدارة حالة متينة وتتبع لحظي. وكان أهم درس هو أهمية التصميم التكراري — الانتقال من إضافة متصفح إلى إضافة أصلية كان قرارًا صعبًا لكنه ضروري، حدد في النهاية نجاح المشروع.





