Commit dff9df33 authored by Mahmoud Aglan's avatar Mahmoud Aglan

fix(sports): correct wizard step progression after form fee payment

Root cause: submitFormPayment used entity_type 'sa_registrations' which
triggered completeRegistration() on payment — jumping straight to step 4.

Fixes:
- Use entity_type 'sa_registration_form' so only form_payment_status is
  updated (not status/payment_status)
- Remove status='completed' for returning players — they still need photo
  + disciplines steps
- Fix determineStep: only jump to 4 on actual status=completed/assessed,
  not on payment_status=paid
- Lookup API now returns is_existing_player + registration_fee_paid flags
- Wizard badges show "لاعب مسجل بالفعل" and "الاستمارة مدفوعة" indicators
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent e90cb5f6
...@@ -71,6 +71,24 @@ class MemberLookupApiController extends Controller ...@@ -71,6 +71,24 @@ class MemberLookupApiController extends Controller
} }
} }
$db = \App\Core\App::getInstance()->db();
$existingPlayer = null;
if (!empty($result['national_id'])) {
$existingPlayer = $db->selectOne(
"SELECT id, full_name_ar, registration_fee_paid FROM sa_players WHERE national_id = ? AND is_archived = 0",
[$result['national_id']]
);
}
if (!$existingPlayer && $result['member_id']) {
$existingPlayer = $db->selectOne(
"SELECT id, full_name_ar, registration_fee_paid FROM sa_players WHERE member_id = ? AND is_archived = 0",
[(int) $result['member_id']]
);
}
$result['is_existing_player'] = $existingPlayer !== null;
$result['registration_fee_paid'] = $existingPlayer ? (bool) (int) ($existingPlayer['registration_fee_paid'] ?? 0) : false;
return $this->json($result); return $this->json($result);
} }
} }
...@@ -383,21 +383,20 @@ class RegistrationWizardController extends Controller ...@@ -383,21 +383,20 @@ class RegistrationWizardController extends Controller
private function determineStep(array $registration): int private function determineStep(array $registration): int
{ {
// Step 1: Pay 100 EGP (single registration fee) // Step 1: Pay registration fee
// Step 2: Photo capture // Step 2: Photo capture
// Step 3: Select disciplines of interest // Step 3: Select disciplines of interest
// Step 4: Complete (print form + generate card) // Step 4: Complete (print form + generate card)
if ($registration['status'] === 'completed' || ($registration['payment_status'] ?? '') === 'paid') { if (in_array($registration['status'], ['completed', 'assessed'], true)) {
return 4; return 4;
} }
if (!empty($registration['selected_disciplines'])) { if (!empty($registration['selected_disciplines'])) {
return 4; return 4;
} }
if ((int) $registration['photo_captured'] === 1) { if ((int) ($registration['photo_captured'] ?? 0) === 1) {
return 3; return 3;
} }
$formPaid = ($registration['form_payment_status'] ?? 'unpaid') === 'paid'; if (($registration['form_payment_status'] ?? 'unpaid') === 'paid') {
if ($formPaid) {
return 2; return 2;
} }
return 1; return 1;
......
...@@ -117,8 +117,8 @@ final class RegistrationWizardService ...@@ -117,8 +117,8 @@ final class RegistrationWizardService
'player_type' => $playerType, 'player_type' => $playerType,
'member_id' => $memberId > 0 ? $memberId : null, 'member_id' => $memberId > 0 ? $memberId : null,
'national_id' => $nationalId ?: null, 'national_id' => $nationalId ?: null,
'status' => $formAlreadyPaid ? 'completed' : 'in_progress', 'status' => 'in_progress',
'payment_status' => $formAlreadyPaid ? 'paid' : 'unpaid', 'payment_status' => 'unpaid',
'registration_fee' => $formAlreadyPaid ? 0 : $fees['registration_fee'], 'registration_fee' => $formAlreadyPaid ? 0 : $fees['registration_fee'],
'card_fee' => 0, 'card_fee' => 0,
'form_fee' => 0, 'form_fee' => 0,
...@@ -322,7 +322,7 @@ final class RegistrationWizardService ...@@ -322,7 +322,7 @@ final class RegistrationWizardService
'payment_type' => 'sa_registration_fee', 'payment_type' => 'sa_registration_fee',
'amount' => (string) $totalFee, 'amount' => (string) $totalFee,
'description_ar' => $description, 'description_ar' => $description,
'related_entity_type' => 'sa_registrations', 'related_entity_type' => 'sa_registration_form',
'related_entity_id' => $registrationId, 'related_entity_id' => $registrationId,
]); ]);
......
...@@ -327,7 +327,14 @@ document.addEventListener('DOMContentLoaded', function() { ...@@ -327,7 +327,14 @@ document.addEventListener('DOMContentLoaded', function() {
if (data.success && data.member_id) { if (data.success && data.member_id) {
memberLookupBox.style.background = '#ECFDF5'; memberLookupBox.style.background = '#ECFDF5';
memberLookupBox.style.color = '#059669'; memberLookupBox.style.color = '#059669';
memberLookupBox.innerHTML = '<strong>عضو فعال</strong> — ' + (data.name || ''); var badge = '<strong>عضو فعال</strong> — ' + (data.name || '');
if (data.is_existing_player) {
badge += ' <span style="background:#DBEAFE;color:#1D4ED8;padding:2px 6px;border-radius:4px;font-size:11px;margin-right:6px;">لاعب مسجل بالفعل</span>';
}
if (data.registration_fee_paid) {
badge += ' <span style="background:#D1FAE5;color:#065F46;padding:2px 6px;border-radius:4px;font-size:11px;margin-right:6px;">الاستمارة مدفوعة</span>';
}
memberLookupBox.innerHTML = badge;
fillMemberData(data); fillMemberData(data);
} else { } else {
memberLookupBox.style.background = '#FEF2F2'; memberLookupBox.style.background = '#FEF2F2';
...@@ -349,15 +356,23 @@ document.addEventListener('DOMContentLoaded', function() { ...@@ -349,15 +356,23 @@ document.addEventListener('DOMContentLoaded', function() {
body: JSON.stringify({national_id: this.value, _csrf_token: csrfToken}) body: JSON.stringify({national_id: this.value, _csrf_token: csrfToken})
}).then(function(r){return r.json();}).then(function(data) { }).then(function(r){return r.json();}).then(function(data) {
if (data.success) { if (data.success) {
if (data.is_member) { var badge = '';
if (data.is_member || data.member_id) {
memberBadge.style.background = '#ECFDF5'; memberBadge.style.background = '#ECFDF5';
memberBadge.style.color = '#059669'; memberBadge.style.color = '#059669';
memberBadge.innerHTML = '<strong>عضو فعال</strong>' + (data.membership_number ? ' — رقم ' + data.membership_number : ''); badge = '<strong>عضو</strong>' + (data.membership_number ? ' — رقم ' + data.membership_number : '');
} else { } else {
memberBadge.style.background = '#F3F4F6'; memberBadge.style.background = '#F3F4F6';
memberBadge.style.color = '#374151'; memberBadge.style.color = '#374151';
memberBadge.innerHTML = 'غير عضو'; badge = 'غير عضو';
}
if (data.is_existing_player) {
badge += ' <span style="background:#DBEAFE;color:#1D4ED8;padding:2px 6px;border-radius:4px;font-size:11px;margin-right:6px;">لاعب مسجل بالفعل</span>';
}
if (data.registration_fee_paid) {
badge += ' <span style="background:#D1FAE5;color:#065F46;padding:2px 6px;border-radius:4px;font-size:11px;margin-right:6px;">الاستمارة مدفوعة</span>';
} }
memberBadge.innerHTML = badge;
memberBadge.style.display = ''; memberBadge.style.display = '';
fillMemberData(data); fillMemberData(data);
} }
......
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