• DevPilot's avatar
    fix(payments, cashier, treasury): void-type gaps, unpaid fines via queue,... · 366460fd
    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
.claude Loading commit data...
Another ERP that we may want to cheat from Loading commit data...
HR requests Loading commit data...
Proposal Loading commit data...
Server Connection Data Loading commit data...
app Loading commit data...
config Loading commit data...
cron Loading commit data...
database Loading commit data...
docker Loading commit data...
docs Loading commit data...
public Loading commit data...
support_tickets_downloads/support_screenshots Loading commit data...
tests Loading commit data...
tools Loading commit data...
.dockerignore Loading commit data...
.editorconfig Loading commit data...
.env Loading commit data...
.env.example Loading commit data...
.gitignore Loading commit data...
.php-cs-fixer.php Loading commit data...
BalanceSheet.html Loading commit data...
CLAUDE.md Loading commit data...
Dockerfile Loading commit data...
Makefile Loading commit data...
SYSTEM_MAP.md Loading commit data...
Sports Module System Design DETAILED.md Loading commit data...
UPGRADE_PLAN.md Loading commit data...
captain-definition Loading commit data...
cli.php Loading commit data...
composer.json Loading commit data...
composer.lock Loading commit data...
interesting_features.md Loading commit data...
phpstan.neon Loading commit data...
phpunit.xml Loading commit data...
sports activity stuff .txt Loading commit data...
sports-activity-alignment-plan.md Loading commit data...
sports-activity-smart-filtering-plan.md Loading commit data...
trial_balance_2026-01-01_to_2026-05-10.csv Loading commit data...