@@ -36,16 +36,19 @@ final class PaymentRequestService
...
@@ -36,16 +36,19 @@ final class PaymentRequestService
if($entityType!==null&&$entityId!==null){
if($entityType!==null&&$entityId!==null){
$existing=$db->selectOne(
$existing=$db->selectOne(
"SELECT id FROM payment_requests WHERE member_id = ? AND payment_type = ? AND related_entity_type = ? AND related_entity_id = ? AND status IN ('pending','processing') AND is_voided = 0 LIMIT 1",
"SELECT id, status FROM payment_requests WHERE member_id = ? AND payment_type = ? AND related_entity_type = ? AND related_entity_id = ? AND is_voided = 0 AND status IN ('pending','processing','completed') ORDER BY FIELD(status,'pending','processing','completed') LIMIT 1",
@@ -246,6 +250,15 @@ class MemberController extends Controller
...
@@ -246,6 +250,15 @@ class MemberController extends Controller
return$this->redirect('/members/'.$id)->withError('بيانات غير صالحة');
return$this->redirect('/members/'.$id)->withError('بيانات غير صالحة');
}
}
// Block if a combined membership payment is already pending
$hasCombined=$db->selectOne(
"SELECT id FROM payment_requests WHERE member_id = ? AND payment_type IN ('membership_fee','down_payment') AND status IN ('pending','processing') AND is_voided = 0 LIMIT 1",
[(int)$id]
);
if($hasCombined){
return$this->redirect('/members/'.$id)->withError('يوجد طلب دفع مجمع في الخزينة بالفعل — الرسوم مشمولة فيه');
}
$entity=$db->selectOne("SELECT * FROM {$entityType} WHERE id = ? AND member_id = ? AND is_archived = 0",[$entityId,(int)$id]);
$entity=$db->selectOne("SELECT * FROM {$entityType} WHERE id = ? AND member_id = ? AND is_archived = 0",[$entityId,(int)$id]);
if(!$entity)return$this->redirect('/members/'.$id)->withError('العنصر غير موجود');
if(!$entity)return$this->redirect('/members/'.$id)->withError('العنصر غير موجود');
...
@@ -260,6 +273,14 @@ class MemberController extends Controller
...
@@ -260,6 +273,14 @@ class MemberController extends Controller
default=>'',
default=>'',
};
};
$breakdown=[
'👤 '.$typeLabel.': '.$nameLabel,
'📌 نوع الرسوم: رسوم إضافة تابع',
'💰 رسوم الإضافة: '.money($fee),
'═══════════════════════════',
'💵 الإجمالي: '.money($fee),
];
$result=PaymentRequestService::createRequest([
$result=PaymentRequestService::createRequest([
'member_id'=>(int)$id,
'member_id'=>(int)$id,
'amount'=>$fee,
'amount'=>$fee,
...
@@ -267,6 +288,7 @@ class MemberController extends Controller
...
@@ -267,6 +288,7 @@ class MemberController extends Controller
'related_entity_type'=>$entityType,
'related_entity_type'=>$entityType,
'related_entity_id'=>$entityId,
'related_entity_id'=>$entityId,
'description_ar'=>'رسوم إضافة '.$typeLabel.' — '.$nameLabel,
'description_ar'=>'رسوم إضافة '.$typeLabel.' — '.$nameLabel,