عام · ليس للنشر بعد

المنطق المالي للأعمال

وحدة المال

كل المبالغ amount_cents أعداد صحيحة بوحدات صغرى. لا خلط عملات ولا تحويل FX داخل المحرك.

الأرصدة

Paid = بنود على دفعات status=paid
Reserved = بنود على دفعات status=pending
Available = max(0, due − Paid − Reserved)

إنشاء دفعة

  1. المسار: POST /api/v1/admin/payments · صلاحية payments.create
  2. الحالة دائمًا pending (لا يُوثق التحصيل من المتصفح).
  3. توزيع عام (waterfall) على أقساط نشطة بالأقدم استحقاقًا ثم id.
  4. الحجز عبر حالة pending — ليس جدولًا منفصلًا.
  5. لا قيد ledger ولا حركة محفظة عند الإنشاء.

التحصيل

  • يدوي: POST .../record-collection → staff_attestation + قيود ledger.
  • بوابة: إشعار خادم موثوق فقط؛ الافتراضي معطّل.

إلغاء / انتهاء

يحرران الحجز دون ledger/wallet. التفاصيل في صفحة Phase 9.1.

الاسترداد

كامل فقط من paid بصلاحية payments.refund — قيد داخلي؛ ليس رد بطاقة تلقائيًا.

المحفظة

مستقلة: لا تتغير تلقائيًا مع دورة الدفع. الرصيد = مجموع الحركات. السالب مسموح حاليًا.

التسوية

تجميع قيود دفتر غير موسومة عبر مزوّد محلي. ليست تحويلًا بنكيًا حيًا.