Commit 0af2ed0b authored by Mahmoud Aglan's avatar Mahmoud Aglan

dgjfgj

parent 8db2a862
...@@ -34,10 +34,17 @@ final class PaymentRequestService ...@@ -34,10 +34,17 @@ final class PaymentRequestService
return ['success' => false, 'error' => 'المبلغ يجب أن يكون أكبر من صفر']; return ['success' => false, 'error' => 'المبلغ يجب أن يكون أكبر من صفر'];
} }
if ($entityType !== null && $entityId !== null) {
$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",
[$memberId, $paymentType, $entityType, (int) $entityId]
);
} else {
$existing = $db->selectOne( $existing = $db->selectOne(
"SELECT id FROM payment_requests WHERE member_id = ? AND payment_type = ? AND status IN ('pending','processing') AND is_voided = 0 LIMIT 1", "SELECT id FROM payment_requests WHERE member_id = ? AND payment_type = ? AND status IN ('pending','processing') AND is_voided = 0 LIMIT 1",
[$memberId, $paymentType] [$memberId, $paymentType]
); );
}
if ($existing) { if ($existing) {
return ['success' => false, 'error' => 'يوجد طلب دفع معلق بالفعل لنفس النوع']; return ['success' => false, 'error' => 'يوجد طلب دفع معلق بالفعل لنفس النوع'];
} }
......
...@@ -37,8 +37,12 @@ EventBus::listen('payment_request.completed', function (array $data) { ...@@ -37,8 +37,12 @@ EventBus::listen('payment_request.completed', function (array $data) {
$member = \App\Modules\Members\Models\Member::find($memberId); $member = \App\Modules\Members\Models\Member::find($memberId);
if (!$member) return; if (!$member) return;
if (in_array($member->status, ['potential', 'payment_pending', 'accepted', 'under_review'], true)) {
$membershipNumber = \App\Modules\Members\Services\MemberNumberGenerator::assign($memberId); $membershipNumber = \App\Modules\Members\Services\MemberNumberGenerator::assign($memberId);
$member->update(['status' => 'active']); $member->update(['status' => 'active']);
} else {
$membershipNumber = $member->membership_number;
}
if ($paymentType === 'down_payment') { if ($paymentType === 'down_payment') {
$request = $db->selectOne("SELECT * FROM payment_requests WHERE id = ?", [$requestId]); $request = $db->selectOne("SELECT * FROM payment_requests WHERE id = ?", [$requestId]);
...@@ -137,6 +141,15 @@ EventBus::listen('payment_request.completed', function (array $data) { ...@@ -137,6 +141,15 @@ EventBus::listen('payment_request.completed', function (array $data) {
\App\Core\Logger::info("Child activated via cashier", ['child_id' => $entityId]); \App\Core\Logger::info("Child activated via cashier", ['child_id' => $entityId]);
} }
if ($paymentType === 'seasonal_fee' && $entityType === 'seasonal_memberships') {
$db->update('seasonal_memberships', [
'status' => 'active',
'updated_at' => date('Y-m-d H:i:s'),
], '`id` = ?', [$entityId]);
EventBus::dispatch('seasonal.fee_paid', ['seasonal_id' => $entityId, 'member_id' => $memberId, 'payment_id' => $paymentId]);
\App\Core\Logger::info("Seasonal membership activated via cashier", ['seasonal_id' => $entityId]);
}
if ($paymentType === 'addition_fee' && $entityType === 'temporary_members') { if ($paymentType === 'addition_fee' && $entityType === 'temporary_members') {
$db->update('temporary_members', [ $db->update('temporary_members', [
'status' => 'active', 'status' => 'active',
......
...@@ -135,10 +135,14 @@ class MemberController extends Controller ...@@ -135,10 +135,14 @@ class MemberController extends Controller
$pendingRequests = PaymentRequestService::getForMember((int) $id); $pendingRequests = PaymentRequestService::getForMember((int) $id);
$pendingFormFee = null; $pendingFormFee = null;
$pendingMembership = null; $pendingMembership = null;
$pendingAdditions = [];
foreach ($pendingRequests as $pr) { foreach ($pendingRequests as $pr) {
if ($pr['status'] === 'pending' || $pr['status'] === 'processing') { if ($pr['status'] === 'pending' || $pr['status'] === 'processing') {
if ($pr['payment_type'] === 'form_fee') $pendingFormFee = $pr; if ($pr['payment_type'] === 'form_fee') $pendingFormFee = $pr;
if (in_array($pr['payment_type'], ['membership_fee', 'down_payment'], true)) $pendingMembership = $pr; if (in_array($pr['payment_type'], ['membership_fee', 'down_payment'], true)) $pendingMembership = $pr;
if ($pr['payment_type'] === 'addition_fee' && $pr['related_entity_type'] && $pr['related_entity_id']) {
$pendingAdditions[$pr['related_entity_type'] . ':' . $pr['related_entity_id']] = $pr;
}
} }
} }
...@@ -155,6 +159,7 @@ class MemberController extends Controller ...@@ -155,6 +159,7 @@ class MemberController extends Controller
'specialDiscount' => $specialDiscount, 'specialDiscount' => $specialDiscount,
'pendingFormFee' => $pendingFormFee, 'pendingFormFee' => $pendingFormFee,
'pendingMembership' => $pendingMembership, 'pendingMembership' => $pendingMembership,
'pendingAdditions' => $pendingAdditions,
]); ]);
} }
...@@ -202,6 +207,47 @@ class MemberController extends Controller ...@@ -202,6 +207,47 @@ class MemberController extends Controller
return $this->redirect('/members/' . $id)->withSuccess('تم إرسال طلب الدفع للخزينة — رقم الطلب: ' . $result['request_number']); return $this->redirect('/members/' . $id)->withSuccess('تم إرسال طلب الدفع للخزينة — رقم الطلب: ' . $result['request_number']);
} }
public function payAdditionFee(Request $request, string $id): Response
{
$db = App::getInstance()->db();
$member = Member::find((int) $id);
if (!$member) return $this->redirect('/members')->withError('العضو غير موجود');
$entityType = trim((string) $request->post('entity_type', ''));
$entityId = (int) $request->post('entity_id', 0);
if (!in_array($entityType, ['spouses', 'children', 'temporary_members'], true) || $entityId <= 0) {
return $this->redirect('/members/' . $id)->withError('بيانات غير صالحة');
}
$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('العنصر غير موجود');
$fee = $entity['addition_fee'] ?? '0.00';
if (bccomp($fee, '0.01', 2) < 0) return $this->redirect('/members/' . $id)->withError('لا توجد رسوم مستحقة');
$nameLabel = $entity['full_name_ar'] ?? '';
$typeLabel = match ($entityType) {
'spouses' => 'زوجة',
'children' => ($entity['gender'] ?? '') === 'male' ? 'ابن' : 'ابنة',
'temporary_members' => 'عضو مؤقت',
default => '',
};
$result = PaymentRequestService::createRequest([
'member_id' => (int) $id,
'amount' => $fee,
'payment_type' => 'addition_fee',
'related_entity_type' => $entityType,
'related_entity_id' => $entityId,
'description_ar' => 'رسوم إضافة ' . $typeLabel . ' — ' . $nameLabel,
]);
if (!$result['success']) return $this->redirect('/members/' . $id)->withError($result['error']);
return $this->redirect('/members/' . $id)->withSuccess('تم إرسال رسوم ' . $typeLabel . ' للخزينة — رقم الطلب: ' . $result['request_number']);
}
public function fillForm(Request $request, string $id): Response public function fillForm(Request $request, string $id): Response
{ {
$db = App::getInstance()->db(); $db = App::getInstance()->db();
......
...@@ -12,6 +12,7 @@ return [ ...@@ -12,6 +12,7 @@ return [
['POST', '/members/{id}/status', 'Members\Controllers\MemberController@changeStatus', ['auth'], 'member.change_status'], ['POST', '/members/{id}/status', 'Members\Controllers\MemberController@changeStatus', ['auth'], 'member.change_status'],
['POST', '/members/{id}/pay-form-fee', 'Members\Controllers\MemberController@payFormFee', ['auth'], 'member.pay_form_fee'], ['POST', '/members/{id}/pay-form-fee', 'Members\Controllers\MemberController@payFormFee', ['auth'], 'member.pay_form_fee'],
['POST', '/members/{id}/pay-membership', 'Members\Controllers\MemberController@payMembership',['auth'], 'member.pay_membership'], ['POST', '/members/{id}/pay-membership', 'Members\Controllers\MemberController@payMembership',['auth'], 'member.pay_membership'],
['POST', '/members/{id}/pay-addition', 'Members\Controllers\MemberController@payAdditionFee', ['auth'], 'member.pay_membership'],
['GET', '/members/{id}/fill-form', 'Members\Controllers\MemberController@fillForm', ['auth'], 'member.fill_form'], ['GET', '/members/{id}/fill-form', 'Members\Controllers\MemberController@fillForm', ['auth'], 'member.fill_form'],
['POST', '/members/{id}/fill-form', 'Members\Controllers\MemberController@saveFillForm', ['auth'], 'member.fill_form'], ['POST', '/members/{id}/fill-form', 'Members\Controllers\MemberController@saveFillForm', ['auth'], 'member.fill_form'],
['POST', '/api/members/parse-nid', 'Members\Controllers\MemberApiController@parseNid', ['auth'], 'member.create'], ['POST', '/api/members/parse-nid', 'Members\Controllers\MemberApiController@parseNid', ['auth'], 'member.create'],
......
This diff is collapsed.
...@@ -129,7 +129,7 @@ final class PaymentService ...@@ -129,7 +129,7 @@ final class PaymentService
'receipt_id' => $receiptId, 'receipt_id' => $receiptId,
'receipt_number' => $receiptNumber, 'receipt_number' => $receiptNumber,
'member_id' => ($memberId !== null && $memberId > 0) ? $memberId : 0, 'member_id' => ($memberId !== null && $memberId > 0) ? $memberId : 0,
'type' => $paymentType, 'payment_type' => $paymentType,
'amount' => $amount, 'amount' => $amount,
'method' => $paymentMethod, 'method' => $paymentMethod,
]); ]);
...@@ -217,7 +217,7 @@ final class PaymentService ...@@ -217,7 +217,7 @@ final class PaymentService
EventBus::dispatch('payment.voided', [ EventBus::dispatch('payment.voided', [
'payment_id' => $paymentId, 'payment_id' => $paymentId,
'member_id' => (int) $payment['member_id'], 'member_id' => (int) $payment['member_id'],
'type' => $payment['payment_type'], 'payment_type' => $payment['payment_type'],
'amount' => $payment['amount'], 'amount' => $payment['amount'],
'reason' => $reason, 'reason' => $reason,
]); ]);
......
...@@ -100,19 +100,19 @@ class SeasonalController extends Controller ...@@ -100,19 +100,19 @@ class SeasonalController extends Controller
return $this->redirect("/members/{$memberId}/seasonal/create"); return $this->redirect("/members/{$memberId}/seasonal/create");
} }
$hasFee = bccomp($fee, '0.00', 2) > 0;
$seasonal = SeasonalMembership::create([ $seasonal = SeasonalMembership::create([
'member_id' => (int) $memberId, 'member_id' => (int) $memberId,
'branch_id' => (int) $data['branch_id'], 'branch_id' => (int) $data['branch_id'],
'start_date' => $startDate, 'start_date' => $startDate,
'end_date' => $endDate, 'end_date' => $endDate,
'fee_amount' => $fee, 'fee_amount' => $fee,
'status' => 'active', 'status' => $hasFee ? 'pending_payment' : 'active',
'carnet_marking' => 'موسمي', 'carnet_marking' => 'موسمي',
'notes' => $data['notes'] ?? null, 'notes' => $data['notes'] ?? null,
]); ]);
// Send payment to cashier queue if ($hasFee) {
if (bccomp($fee, '0.00', 2) > 0) {
$payResult = PaymentRequestService::createRequest([ $payResult = PaymentRequestService::createRequest([
'member_id' => (int) $memberId, 'member_id' => (int) $memberId,
'amount' => $fee, 'amount' => $fee,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment