
تجارة ذهب ومجوهرات، تجزئة وجملة
BTC
تطبيقان من قاعدة كود Flutter واحدة لأحد أكبر بيوت الذهب والمجوهرات في مصر: متجر للمستهلك وتطبيق طلبات جملة للتجّار، كلاهما فوق واجهة GraphQL نفسها.
التحدي
الشركة نفسها تبيع هدية بـ 1,200 جنيه لزبون عابر وسبيكة 50 جرامًا لتاجر، بأسعار تتحرّك مع سوق الذهب. جمهوران، ومساران للشراء، وكتالوج واحد — وشركة لا تريد جهدين هندسيين.
ما كان عليه أن يحققه
- متجر للأفراد وطلبات جملة للتجار من كتالوج واحد
- أسعار تتحرك مع سوق الذهب
- بلد التوصيل واللغة يُختاران في كل زيارة، فلا يتغيّر السعر عند الدفع
- جهد هندسي واحد، لا اثنان
دوري
مهندس منتج على التطبيقين وقاعدة الكود المشتركة بينهما.
كيف بنيته
- بناء متجر المستهلك — المجموعات والتصنيفات وحاسبة الادّخار والسلة وإتمام الشراء — مع اختيار دولة التوصيل واللغة في كل زيارة.
- بناء تطبيق التجّار لطلبات الجملة من قاعدة الكود نفسها والكتالوج نفسه.
- ربط التطبيقين بواجهة GraphQL بحيث يوجد السعر أو المنتج مرّة واحدة ويقرأه كلاهما.
- إطلاق التطبيقين على App Store و Google Play.
القرارات، ولماذا
قاعدة كود واحدة، ومنتجان — لا تطبيق واحد بمفتاح
التجزئة والجملة تتشاركان الكتالوج ولا شيء غيره: أسعار مختلفة، وكميات مختلفة، وإتمام شراء مختلف. تطبيق واحد يفصل بينهما بنوع الحساب كان سيضع أسعار الجملة على بُعد خطأ برمجي واحد من شاشة مستهلك. إصداران من قاعدة واحدة يُبقيان المشترك مشتركًا والمسارين منفصلين فعلًا.
GraphQL، لأن التطبيقين يسألان الكتالوج نفسه أسئلة مختلفة
المتجر يريد منتجًا بصوره وسعر التجزئة؛ وتطبيق التاجر يريد المنتج نفسه بشرائح الأسعار والمخزون. مع REST يعني ذلك مجموعتَي نقاط نهاية أو جلبًا زائدًا في الطرفين. رسم بياني واحد يتيح لكل تطبيق أن يطلب الشكل الذي يعرضه.
الدولة واللغة اختيار في كل زيارة لا إعداد جهاز
دولة التوصيل تحدّد السعر والتوافر، والمشتري ليس دائمًا في البلد الذي يشحن إليه. جعلهما محدّدين صريحين في الأعلى — بدل استنتاجهما من لغة الجهاز — يمنع عرض سعر يتغيّر عند إتمام الشراء.
التقنيات
من داخل المنتج
كل تعليق يشرح ما تفعله الشاشة — وبعض هذه المنتجات واجهته بالعربية فقط.



شاهده مباشرة
تبني شيئًا مشابهًا؟
أخبرني بما تريد إطلاقه وسأقول لك بصراحة إن كنت الشخص المناسب لبنائه.
وظّفني للشيء نفسه