تخطَّ إلى المحتوى
أعمال ودراسات حالة
تطبيق ويب

Hasanat

منصة تبرعات وزكاة لجمعية خيرية إسلامية في أستراليا: حملات مُسعّرة بوحدة أثر واضحة، وتبرع لمرة واحدة أو شهري، وزكاة وأضحية مرتبطتان بالتقويم الهجري، وStripe وPayPal يصبّان في سجل واحد، ولوحة تحكم — فوق Laravel API بثلاث لغات: الإنجليزية والعربية والفرنسية.

Hasanat — غلاف المشروع
الدور
تطوير Full-stack · Laravel وMySQL API وواجهة Next.js · تسليم مع فريق Borders And Gates
الخدمات
API بـ Laravel 11 وMySQL · واجهة Next.js ولوحة تحكم · سلة تبرعات ودفع كضيف · حاسبة زكاة قائمة على النصاب · حملة أضحية موسمية · تكامل Stripe وPayPal · تبرعات دورية وإيصالات PDF · محتوى بالعربية والإنجليزية والفرنسية مع RTL · تسجيل دخول عبر Google وFacebook وApple
التقنيات
Laravel 11 · PHP 8.2 · MySQL · Next.js 15 · React 19 · TypeScript · Tailwind v4 · Sanctum · Socialite · Stripe · PayPal · dompdf · ApexCharts · Swagger
العميل
Hasanat.org
المجال
العمل الخيري وغير الربحي
المدة الزمنية
32 أسبوعًا · 2026

01 / سياق العمل

المشكلة المطلوب حلّها

تجمع Hasanat التبرعات من أستراليا لحملات إغاثة في بنغلاديش وسوريا ولبنان واليمن وفلسطين، وسنتها الخيرية يشكّلها التقويم الهجري بقدر ما تشكّلها دورة الأزمات. كان على المنصة أن تجعل الحملة ملموسة بما يكفي للتبرع خلال ثوانٍ، وأن تتعامل مع الزكاة والأضحية كمنتجات حقيقية لا كصفحات موسمية، وأن تستقبل المال عبر بوابتَي دفع من دون أن ينقسم السجل إلى اثنين، وأن تبقى قابلة للتحرير من فريق الجمعية نفسه بثلاث لغات.

Hasanat.org جمعية خيرية إسلامية في أستراليا تدير حملات إغاثة وتنمية في الخارج، ولها مكتبان في سيدني وبريزبن. بنينا المنصة التي تجمع منها التبرعات: Laravel API فوق MySQL يحمل المشاريع والتبرعات وحسابات الزكاة وحجوزات الأضحية والمعاملات والإيصالات، وواجهة Next.js تضم الموقع العام وحساب المتبرع ولوحة التحكم التي يدير منها فريق الجمعية كل شيء — بالإنجليزية والعربية والفرنسية.

02 / من النطاق إلى الإطلاق

كيف تحرّك العمل؟

أصبح المنتج أوضح عبر قرارات محددة ونسخ عاملة وملاحظات مستمرة، لا عبر انتظار كشف نهائي طويل.

07 خطوات

  1. خطوة 01

    بدأنا من التبرع نفسه لا من الصفحة: تتبّعنا تبرعًا واحدًا من بطاقة الحملة إلى السلة، فبوابة الدفع، فالإيصال، وصولًا إلى تسوية الجمعية — واستخدمنا هذا المسار لتحديد ما يجب أن يكون سجلًا في قاعدة البيانات لا رقمًا على الشاشة.

  2. خطوة 02

    نمذجنا المجال كما تصفه الجمعية فعلًا — مشاريع لها أسباب ومناطق ودرجة إلحاح وهدف تمويلي، وتبرعات ومعاملات وإيصالات، وزكاة بأصول وخصوم وأسعار نصاب، وأضاحٍ بأنواع تختلف حسب الدولة — بدل تسطيح كل ذلك في «عملية دفع» عامة.

  3. خطوة 03

    بنينا مسار التبرع حول وحدة أثر ملموسة، فتُقرأ الحملة كـ«بيت خشبي مجهّز واحد = 1,250 دولارًا أستراليًا»، مع نسبة التمويل والمبلغ المتبقي ظاهرين، والمبالغ المقترحة مشتقة من الوحدة نفسها.

  4. خطوة 04

    دمجنا Stripe وPayPal كمسارَين يصبّان في سجل واحد، مع تسوية تتم من ردود الخادم ورسوم معاملات تُحسب حسب العملة، ثم أضفنا فوق نفس السجلات الخطط الدورية وطرق الدفع المحفوظة وإيصالات PDF.

  5. خطوة 05

    تعاملنا مع التقويم الهجري كجزء أصيل من المنتج: الأضحية وزكاة الفطر حالتا إتاحة يتحكم فيهما الأدمن، مع عدّاد تنازلي وأثر الموسم السابق وتسجيل تذكيرات، بدل صفحة تكذب بصمت.

  6. خطوة 06

    جعلنا الموقع ملكًا للجمعية في تشغيله: أقسام الصفحة الرئيسية والمشاريع والمدونات والمناطق والأسباب وأسعار النصاب وأنواع الأضاحي والتبرعات اليدوية تُدار كلها من لوحة التحكم، بصلاحيات لكل أدمن وسجل نشاط.

  7. خطوة 07

    أطلقنا ثلاث لغات بحفظ كل ترجمة على السجل نفسه واختيارها من لغة الطلب، بينما تطبّق الواجهة تفضيل اللغة — بما فيه RTL للعربية — على التطبيق كله.

03 / القرارات التي شكّلت المنتج

قرارات المنتج الأساسية

القرار 01

تسعير الحملة بالأثر لا بالمبلغ

سياق العمل
نموذج تبرع يطلب رقمًا فقط يترك المتبرع يخمّن ماذا يفعل ماله، ويترك الجمعية تتحدث عن الأثر بكلام لا يسنده شيء في النظام.
القرار
أعطينا كل مشروع وحدة أثر مخزّنة على السجل — طرد غذائي واحد، بيت خشبي مجهّز واحد — واشتققنا منها المبالغ المقترحة، وعرضنا بجانبها نسبة التمويل والمبلغ الذي ما زال ناقصًا.
لماذا
يحوّل ذلك الطلب المجرّد إلى ما يشبه الشراء، ولأن الوحدة والهدف بيانات لا نصًا تسويقيًا، لا يمكن أبدًا أن يفترق شريط التقدّم عن المبالغ المقترحة عن جملة الأثر.
القرار 02

سلة للحملات، ودفع لا يشترط حسابًا

سياق العمل
كثيرًا ما يتبرع الشخص لأكثر من حملة في الجلسة نفسها، ومطالبته بالتسجيل قبل الدفع هي أضمن طريقة لفقدان التبرع.
القرار
بنينا سلة تبرعات مرتبطة إما بمستخدم مسجّل أو بجلسة ضيف، ومسار دفع يجمع بيانات المتبرع عند الدفع لا خلف جدار تسجيل.
لماذا
يكتمل التبرع بشروط المتبرع، ويصبح الحساب شيئًا يريده لاحقًا — للخطط الدورية والإيصالات وسجل الزكاة — بدل أن يكون بوابة رسوم أمام ما جاء من أجله.
القرار 03

مساران للدفع، وسجل تبرع واحد

سياق العمل
Stripe يناسب متبرعي البطاقات، وPayPal هو ما يثق به بالفعل جزء كبير من متبرعي الجمعيات، لكن ربط الاثنين ينتج عادةً تاريخين متوازيين لا يتصالحان إلا في ملف Excel.
القرار
جعلنا البوابتين تسوّيان من ردود الخادم داخل نفس جداول التبرعات والمعاملات والإيصالات، مع احتساب الرسوم مقابل العملة التي دفع بها المتبرع فعلًا.
لماذا
تسوّي الجمعية سجلًا واحدًا، ولا يحتاج إيصال أو تقرير أو سجل متبرع أن يسأل عبر أي مسار وصل المال — وهذا يعني أيضًا أن إضافة بوابة ثالثة لاحقًا تصبح مُهايئًا لا ترحيلًا.
القرار 04

الزكاة كحساب مخزَّن لا كحاسبة منسوخة

سياق العمل
الزكاة أصول ناقص خصوم مقيسة على نصاب يتحرك مع سعر الذهب أو الفضة ويختلف باختلاف العملة. نصاب مكتوب في الكود يصبح خاطئًا خلال أسابيع، وحاسبة تنسى مدخلاتها لا يمكن مراجعتها.
القرار
خزّنا أسعار النصاب لكل معدن ولكل عملة ولكل تاريخ، وحفظنا أصول المتبرع وخصومه كسجلات مرتبطة بحساب يستطيع العودة إليه.
لماذا
يبقى الرقم قابلًا للدفاع عنه ومحدَّثًا بلا نشر جديد، وتحدّث الجمعية الأسعار من لوحة التحكم مع حركة السوق، ويرى المتبرع كيف وصل رقمه بدل أن يُسلَّم إجماليًا عليه أن يثق به.
القرار 05

حملات موسمية تغلق نفسها وتحتفظ بالمتبرع

سياق العمل
الأضحية تُحجز في نحو أسبوعين حول عيد الأضحى، وزكاة الفطر في أواخر رمضان. وفي بقية العام تكون تلك الصفحات إما تقبل حجوزات لا ينبغي أن تقبلها، أو تختفي.
القرار
جعلنا الإتاحة حالة صريحة يتحكم فيها الأدمن: خارج الموسم تشرح الصفحة نفسها، وتعدّ تنازليًا حتى الفتح، وتعرض أثر الموسم السابق، وتلتقط طلب تذكير.
لماذا
في هذا المنتج التقويم ليس حالة استثنائية بل هو الإيقاع نفسه — والزيارات التي تصل مبكرًا تتحول إلى قائمة تفتح لها الجمعية الحملة، بدل أن تكون ارتدادًا.
القرار 06

الترجمات على السجل لا داخل الحزمة

سياق العمل
تنشر الجمعية الحملات والمدونات ومحتوى الأثر بالإنجليزية والعربية والفرنسية، والذي يكتبها هو فريقها لا مطوّر.
القرار
حفظنا كل لغة على سجل المحتوى نفسه واخترناها من لغة الطلب، فيُكتب عنوان المشروع ووصفه وجملة أثره واسم وحدته لكل لغة من لوحة التحكم.
لماذا
تصبح أي حملة جديدة بثلاث لغات لحظة حفظها، وتكون التجربة العربية — بما فيها RTL — هي المنتج نفسه لا قشرة مترجمة تتقادم أول مرة يعدّل فيها أحدهم النص الإنجليزي.

04 / المنتج أثناء الاستخدام

واجهات حقيقية عبر تجربة العميل والتشغيل.

صفحة المشاريع في Hasanat بفلاتر السبب والمنطقة ومبالغ تبرع مبنية على وحدة الأثر
Hasanatلقطة من المنتج 1
حملة الأضحية في Hasanat خارج الموسم مع عدّاد تنازلي وتسجيل للتذكير
Hasanatلقطة من المنتج 2
صفحة حملة في Hasanat توضّح التسعير بالوحدة ونسبة التمويل ولوحة التبرع
Hasanatلقطة من المنتج 3

05 / كيف تم بناؤه؟

قرارات هندسية

  • Laravel 11 على PHP 8.2 فوق MySQL، مع توكنات Sanctum، وSocialite لتسجيل الدخول عبر Google وFacebook وApple، وdompdf للإيصالات، وتصدير Excel للتقارير، وتوثيق OpenAPI/Swagger لعقد الواجهة.

  • نمذجة صريحة للمجال بدل التعميم: مشاريع بأسباب ومناطق ودرجة إلحاح وأهداف تمويل، وتبرعات وعناصر سلة ومعاملات وإيصالات، واشتراكات للتبرع الدوري، وأضاحٍ بأنواع حسب الدولة وإيصالاتها، وأصول وخصوم وحسابات زكاة وأسعار نصاب.

  • سلة تبرعات تُحلّ مقابل مستخدم مسجّل أو معرّف جلسة ضيف، ومسار دفع يجمع بيانات المتبرع ويستقبل الدفع ويُنهي الجلسة بخطوات مرتبة.

  • Stripe وPayPal كمسارَين متوازيين مع معالجة النجاح والإلغاء على الخادم للتبرعات العادية والزكاة والأضاحي، ورسوم معاملات حسب العملة، وطرق دفع محفوظة ببطاقة افتراضية.

  • التبرعات الدورية كاشتراكات من الدرجة الأولى يستطيع المتبرع إيقافها واستئنافها، وتبرعات يدوية يسجّلها الأدمن ويكملها ليصل التحويل البنكي إلى نفس السجل الذي تصل إليه البطاقة.

  • حاسبة زكاة تعمل بأسعار نصاب مخزّنة لكل نوع معدن وعملة وتاريخ، مع حفظ أصول المتبرع وخصومه ضمن حساب يمكن استرجاعه.

  • الأضحية وزكاة الفطر كحملات موسمية بإتاحة يتحكم بها الأدمن، مع عدّادات تنازلية وإحصاءات أثر الموسم السابق والتقاط تذكيرات لمن يصل مبكرًا.

  • واجهة Next.js تحمل الموقع العام وحساب المتبرع ولوحة التحكم من قاعدة كود واحدة، والصفحة الرئيسية نفسها مكوَّنة من أقسام قابلة لإعادة الترتيب والإظهار والإخفاء من الجمعية.

  • ثلاث لغات محفوظة كحقول لكل لغة على كل سجل محتوى ويختارها Middleware من Accept-Language، بينما تطبّق الواجهة التفضيل — بما فيه RTL للعربية — على التطبيق كله.

06 / ما الذي تغيّر؟

النتيجة التي تم تسليمها

  • تدير Hasanat جمعها للتبرعات بنفسها: الحملات والتسعير بالوحدة وتكوين الصفحة الرئيسية والمدونات والمناطق والأسباب وأسعار النصاب وإتاحة الأضحية تُدار كلها من لوحة التحكم.

  • يتبرع الزائر خلال ثوانٍ من الصفحة الرئيسية، أو يفلتر حسب السبب والمنطقة والإلحاح ويدفع لعدة حملات معًا — كضيف أو بحساب.

  • تبرعات البطاقات وPayPal والخطط الدورية والزكاة والأضحية والتحويلات البنكية تتصالح كلها داخل سجل تبرعات واحد مع إيصالات PDF.

  • تُحسب الزكاة مقابل أسعار نصاب تُبقيها الجمعية محدَّثة بنفسها، ويستطيع كل متبرع مراجعة كيف وصل رقمه.

  • تفتح الحملات الموسمية وتغلق وفق جدول الجمعية، وتجمع تسجيلات تذكير في الشهور التي تكون مغلقة فيها بدل أن تفقد تلك الزيارات.

  • تُنشر الحملات والمدونات ومحتوى الأثر بالإنجليزية والعربية والفرنسية من نفس السجلات، مع تقديم العربية بـ RTL.

هل تواجه تحديًا مشابهًا في منتجك؟

ابدأ بالمشكلة. يمكننا تحديد المنتج الذي تحتاجه ومسار عملي للوصول إلى الإطلاق.