Commit 5da85db1 authored by Fares's avatar Fares

feat(seasonal): require manual seasonal membership number on creation

Seasonal memberships now require a manually entered temporary
membership number (رقم العضوية الموسمية) instead of using the
shared auto-increment sequence. The number is validated for
uniqueness and assigned to the member record immediately, so
the payment guard won't override it with an auto-generated one.
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 76ca34c3
...@@ -87,6 +87,23 @@ class SeasonalController extends Controller ...@@ -87,6 +87,23 @@ class SeasonalController extends Controller
$data = $request->all(); $data = $request->all();
unset($data['_csrf_token']); unset($data['_csrf_token']);
$seasonalNumber = trim((string) ($data['seasonal_number'] ?? ''));
if ($seasonalNumber === '') {
return $this->redirect("/members/{$memberId}/seasonal/create")->withError('رقم العضوية الموسمية مطلوب');
}
// Check uniqueness of seasonal number
$existingNumber = $db->selectOne("SELECT id FROM members WHERE membership_number = ? AND id != ?", [$seasonalNumber, (int) $memberId]);
if ($existingNumber) {
return $this->redirect("/members/{$memberId}/seasonal/create")->withError('رقم العضوية الموسمية مستخدم بالفعل');
}
// Assign the seasonal number to the member immediately
$db->update('members', [
'membership_number' => $seasonalNumber,
'updated_at' => date('Y-m-d H:i:s'),
], 'id = ?', [(int) $memberId]);
$nationalityType = in_array($data['nationality_type'] ?? '', ['egyptian', 'foreign'], true) $nationalityType = in_array($data['nationality_type'] ?? '', ['egyptian', 'foreign'], true)
? $data['nationality_type'] : 'egyptian'; ? $data['nationality_type'] : 'egyptian';
$durationMonths = (int) ($data['duration_months'] ?? 6); $durationMonths = (int) ($data['duration_months'] ?? 6);
......
...@@ -12,6 +12,11 @@ ...@@ -12,6 +12,11 @@
<div class="card" style="padding:20px;margin-bottom:20px;"> <div class="card" style="padding:20px;margin-bottom:20px;">
<h3 style="margin:0 0 15px;color:#0D7377;">1. نوع العضوية والمدة</h3> <h3 style="margin:0 0 15px;color:#0D7377;">1. نوع العضوية والمدة</h3>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:15px;"> <div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:15px;">
<div class="form-group">
<label class="form-label">رقم العضوية الموسمية <span style="color:#DC2626;">*</span></label>
<input type="text" name="seasonal_number" class="form-input" required placeholder="أدخل رقم العضوية الموسمية" style="direction:ltr;text-align:left;">
<small style="color:#6B7280;font-size:11px;margin-top:3px;display:block;">رقم مؤقت خاص بالعضويات الموسمية</small>
</div>
<div class="form-group"> <div class="form-group">
<label class="form-label">نوع الجنسية <span style="color:#DC2626;">*</span></label> <label class="form-label">نوع الجنسية <span style="color:#DC2626;">*</span></label>
<select name="nationality_type" id="nationalityType" class="form-select" required onchange="updatePricing()"> <select name="nationality_type" id="nationalityType" class="form-select" required onchange="updatePricing()">
......
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