المنطق المالي للأعمال
وحدة المال
كل المبالغ amount_cents أعداد صحيحة بوحدات صغرى. لا خلط عملات ولا تحويل FX داخل المحرك.
الأرصدة
Paid = بنود على دفعات status=paid Reserved = بنود على دفعات status=pending Available = max(0, due − Paid − Reserved)
إنشاء دفعة
- المسار:
POST /api/v1/admin/payments· صلاحيةpayments.create - الحالة دائمًا
pending(لا يُوثق التحصيل من المتصفح). - توزيع عام (waterfall) على أقساط نشطة بالأقدم استحقاقًا ثم
id. - الحجز عبر حالة pending — ليس جدولًا منفصلًا.
- لا قيد ledger ولا حركة محفظة عند الإنشاء.
التحصيل
- يدوي:
POST .../record-collection→staff_attestation+ قيود ledger. - بوابة: إشعار خادم موثوق فقط؛ الافتراضي معطّل.
إلغاء / انتهاء
يحرران الحجز دون ledger/wallet. التفاصيل في صفحة Phase 9.1.
الاسترداد
كامل فقط من paid بصلاحية payments.refund — قيد داخلي؛ ليس رد بطاقة تلقائيًا.
المحفظة
مستقلة: لا تتغير تلقائيًا مع دورة الدفع. الرصيد = مجموع الحركات. السالب مسموح حاليًا.
التسوية
تجميع قيود دفتر غير موسومة عبر مزوّد محلي. ليست تحويلًا بنكيًا حيًا.