-
DevPilot authored
fix(payments, cashier, treasury): void-type gaps, unpaid fines via queue, invisible guest payments, missing permission checks Payments/Installments: - PaymentLifecycleService::onPaymentVoided() ما كانتش بترجع حالة العضو إلا لـ membership_fee/down_payment بس — رغم إن foreign_membership_fee وsports_membership_fee وseasonal_fee كلهم بينشّطوا العضو، إلغاء أي واحدة منهم كان بيسيب العضو "فعال" للأبد من غير أي غطاء دفع حقيقي. MembershipPaymentGuard::deactivateMember() نفسها كانت أصلًا عارفة تتعامل مع الخمس أنواع صح — المشكلة كانت في القايمة اللي بتقرر تنادي عليها. - غرامة بتترسل لطابور الدفع (fine) كانت بتتحصّل وتتطبع إيصال، لكن صف الغرامة في جدول fines فضل زي ما هو "غير مسدد" للأبد — مفيش حد كان بيسمع الحدث ده أصلًا. أي فحص رصيد أو أهلية كارنيه كان هيفضل يقول إن الغرامة لسه مستحقة حتى بعد سدادها فعليًا. اتضاف مستمع بيقفل الغرامة المحددة. - GET /api/v1/payments كان مكسور تمامًا — بيفلتر بعمود is_archived مش موجود أصلًا في جدول payments (الصح is_voided). - شاشة كل المدفوعات والتقرير اليومي كانوا بيستخدموا INNER JOIN مع members، فأي دفعة لعميل زائر (member_id فاضي — زي تسجيل رياضي لغير عضو) كانت تختفي تمامًا من الشاشتين دول رغم إنها محصّلة فعليًا (23 دفعة بحوالي 41,800 جنيه في البيانات الحية). اتحول لـ LEFT JOIN. - زرار إلغاء الدفعة كان بيتحكم بصلاحية payment.void_receipt بينما الـ route بتاعه محتاج payment.void — محدش في الأدوار الحية عنده الصلاحية التانية، فكان عمليًا محدش غير super_admin يقدر يلغي دفعة من الشاشة دي. - عضوية موسمية بتتفعّل من كاشير مباشرة من غير ما تعدّي على activateIncludedDependents — يعني زوجة/أبناء العضو الموسمي المرفقين في نفس الرسم ما كانوش بيتفعّلوا معاه. - حذف DefaultChecker.php الميتة تمامًا (صفر استدعاء) — نفس منطق فحص التعثر بالظبط موجود وشغّال فعليًا في cron/jobs/InstallmentDefaultJob.php. Treasury/Cashier: - شاشات موديول Treasury بالكامل كانت من غير أي فحص can() على الإطلاق — كل الأزرار بتظهر لأي حد شايف الشاشة بغض النظر عن صلاحياته الحقيقية. اتأكد إن ده مش نظري: أدوار حية زي auditor وtreasury_manager وmain_cashier عندهم جزء من صلاحيات الخزنة بس مش كلها، فكانوا بياخدوا 403 على أزرار شايفينها. كل زرار دلوقتي بيتحقق من نفس صلاحية الـ route بتاعه. نفس الحاجة اتصلحت في زرار فتح/قفل وردية كاشير، وزرار طباعة الإيصال اللي كان بيتحكم بصلاحية receipt.print بدل payment.view الحقيقية. - عداد "طلبات معلقة" في لوحة الخزنة الفرعية كان بيستخدم قايمة أنواع دفع أقدم من القايمة الحقيقية المستخدمة في الطابور نفسه — ناقصة رسوم عضوية أجانب/رياضية وبعض أنواع الأنشطة الرياضية. Plus extreme-detail reference docs for Payments/Installments, Cashier, and Treasury.
366460fd
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| BalanceCalculator.php | ||
| PaymentLifecycleService.php | ||
| PaymentService.php |