أساليب الدفع الديناميكية — تحليل وخطة قبل التنفيذ

Moon ERP — وحدة المختبر (LIS) · من «ثابتة» إلى «تُدار من الإعدادات»

الهدف

دلوقتي أساليب الدفع (كاش / فيزا / تمارا / تابي / تحويل) ثابتة (static) ومكتوبة في الكود. المطلوب أخليها ديناميكية تقدر من الإعدادات:

➕ تضيف أسلوب➖ تشيل أسلوب⏸️ تعطّل أسلوب🎨 تحدد اسم + أيقونة🔗 تربطه بخزنة/حساب↕️ ترتيب

فهمك صح: أسلوب الدفع = اسم + أيقونة + خزنة (حساب) الفلوس بتروح لها. فالديناميكية معناها تعريف القايمة دي وتعديلها من السيتنج.

1 الوضع الحالي (إزاي شغّال دلوقتي)

الطبقةالحالة الآن
الواجهة (شاشة التحصيل + الويزارد)ليستة ثابتة في الكود: cash, visa, tamara, tabby, bank_transfer
الباك-إند: نوع البيانLabPaymentMethod = enum ثابت (5 قيم)
التحقق (validation)Rule::enum(LabPaymentMethod) — يرفض أي قيمة برّه الـ5
عمود الداتابيزpayment_method varchar(30) مرن ✅ (مش enum في الـDB)
ربط الأسلوب بالحسابإعداد lis.method_accounts = {method: account_id} (والكاش بقى per-branch)
الخبر الكويس: عمود الـDB varchar مش enum — يعني نقدر نضيف أساليب جديدة من غير migration كل مرة ومن غير ما نلخبط أي دفعات قديمة. القيود بس في الـenum + الـvalidation + الليستة الثابتة في الواجهة — وكلها هنشيلها.

2 التصميم المقترح

نفصل مفهومين:

① أساليب الدفع (الجديد — الديناميكي)

تعريف كل أسلوب: key + اسم (AR/EN) + icon + is_active + sort. يتدار من السيتنج (إضافة/حذف/تعطيل/ترتيب).

② ربط الأسلوب بالخزنة/الحساب (موجود)

method_accounts: كل أسلوب → حساب الخزنة اللي بيروح لها (والكاش per-branch). نحتفظ بيه زي ما هو.

📦 مكان التخزين — جدول مخصّص lab_payment_methods (موصى به)

-- جدول جديد
lab_payment_methods(
  id, company_id,
  key          // slug: cash / visa / stcpay …
  label_ar, label_en,
  icon,                 // pi-money-bill / pi-credit-card / pi-wallet …
  account_id (nullable),// الخزنة/الحساب المربوط (اختياري)
  is_cash (bool),       // علشان توجيه per-branch للكاش
  is_active (bool),
  sort_order,
  timestamps
)

بديل أخف: نوسّع إعداد method_accounts ليبقى list of objects بدل map — لكن الجدول أنضف للـCRUD والترتيب والأيقونات.

3 اللي هيتعمل بالظبط

⚙️ Backend

  1. جدول + موديل + Resource لـ lab_payment_methods + seeder للأساليب الحالية (cash/visa/tamara/tabby/bank_transfer) عشان التوافق.
  2. CRUD endpoints: list / create / update / delete (أو toggle active) — صلاحية lis.settings.
  3. إلغاء قيد الـenum: الـvalidation تتأكد إن الأسلوب ضمن الأساليب المفعّلة (من الجدول) بدل Rule::enum. عمود الـDB يفضل varchar. القيمة المخزّنة = key الأسلوب.
  4. حل اللابل: عرض اسم الأسلوب في الردود يتقرأ من الجدول (AR/EN) بدل الـenum.
  5. endpoint التوجيه /payments/routing يرجّع الأساليب المفعّلة (key + label + icon) + الـresolved map زي ما هو.

🎨 Frontend

  1. شاشة التحصيل + الويزارد: يقرأوا الأساليب ديناميكياً من الـrouting (اسم + أيقونة، المفعّلة بس) بدل الليستة الثابتة.
  2. تبويب «أساليب الدفع» في إعدادات المعمل: جدول بأزرار إضافة/تعديل/حذف + سويتش تفعيل + اختيار أيقونة + ربط بالخزنة + ترتيب بالسحب.

🔁 التوافق مع القديم

4 أمثلة على المرونة بعد التنفيذ

الخطوة التالية

راجع الخطة. لو موافق أبدأ بـ جدول lab_payment_methods + CRUD + seeder ثم الواجهة (تحصيل ديناميكي + تبويب الإعدادات).

سؤال قبل التنفيذ: تمشي على جدول مخصّص (الموصى به)؟ ولا تفضّل الأخف (توسيع إعداد JSON)؟ وقول لي «ابدأ».