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
}
}
$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);
}
}
......@@ -383,21 +383,20 @@ class RegistrationWizardController extends Controller
private function determineStep(array $registration): int
{
// Step 1: Pay 100 EGP (single registration fee)
// Step 1: Pay registration fee
// Step 2: Photo capture
// Step 3: Select disciplines of interest
// 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;
}
if (!empty($registration['selected_disciplines'])) {
return 4;
}
if ((int) $registration['photo_captured'] === 1) {
if ((int) ($registration['photo_captured'] ?? 0) === 1) {
return 3;
}
$formPaid = ($registration['form_payment_status'] ?? 'unpaid') === 'paid';
if ($formPaid) {
if (($registration['form_payment_status'] ?? 'unpaid') === 'paid') {
return 2;
}
return 1;
......
......@@ -117,8 +117,8 @@ final class RegistrationWizardService
'player_type' => $playerType,
'member_id' => $memberId > 0 ? $memberId : null,
'national_id' => $nationalId ?: null,
'status' => $formAlreadyPaid ? 'completed' : 'in_progress',
'payment_status' => $formAlreadyPaid ? 'paid' : 'unpaid',
'status' => 'in_progress',
'payment_status' => 'unpaid',
'registration_fee' => $formAlreadyPaid ? 0 : $fees['registration_fee'],
'card_fee' => 0,
'form_fee' => 0,
......@@ -322,7 +322,7 @@ final class RegistrationWizardService
'payment_type' => 'sa_registration_fee',
'amount' => (string) $totalFee,
'description_ar' => $description,
'related_entity_type' => 'sa_registrations',
'related_entity_type' => 'sa_registration_form',
'related_entity_id' => $registrationId,
]);
......
......@@ -327,7 +327,14 @@ document.addEventListener('DOMContentLoaded', function() {
if (data.success && data.member_id) {
memberLookupBox.style.background = '#ECFDF5';
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);
} else {
memberLookupBox.style.background = '#FEF2F2';
......@@ -349,15 +356,23 @@ document.addEventListener('DOMContentLoaded', function() {
body: JSON.stringify({national_id: this.value, _csrf_token: csrfToken})
}).then(function(r){return r.json();}).then(function(data) {
if (data.success) {
if (data.is_member) {
var badge = '';
if (data.is_member || data.member_id) {
memberBadge.style.background = '#ECFDF5';
memberBadge.style.color = '#059669';
memberBadge.innerHTML = '<strong>عضو فعال</strong>' + (data.membership_number ? ' — رقم ' + data.membership_number : '');
badge = '<strong>عضو</strong>' + (data.membership_number ? ' — رقم ' + data.membership_number : '');
} else {
memberBadge.style.background = '#F3F4F6';
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 = '';
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