Commit 54a87b2e authored by Administrator's avatar Administrator

Update 2 files via Son of Anton

parent ec96e7ed
......@@ -17,6 +17,18 @@ use App\Modules\Payments\Services\PaymentService;
class MemberController extends Controller
{
private static function isSuperAdmin(): bool
{
$employee = App::getInstance()->currentEmployee();
if (!$employee) return false;
$db = App::getInstance()->db();
$row = $db->selectOne(
"SELECT 1 FROM employee_roles er JOIN roles r ON r.id = er.role_id WHERE er.employee_id = ? AND r.role_code = 'super_admin' AND er.is_active = 1 LIMIT 1",
[(int) $employee->id]
);
return $row !== null;
}
public function index(Request $request): Response
{
$db = App::getInstance()->db();
......@@ -158,11 +170,9 @@ class MemberController extends Controller
]);
if (!$result['success']) return $this->redirect('/members/' . $id)->withError($result['error']);
// ── Post-payment: Assign membership number + activate ──
$membershipNumber = MemberNumberGenerator::assign((int) $id);
$member->update(['status' => 'active']);
// If installment, create plan
if ($paymentType === 'down_payment') {
$membershipValue = $member->membership_value ?? '0.00';
$remaining = bcsub($membershipValue, $amount, 2);
......@@ -252,17 +262,90 @@ class MemberController extends Controller
$db = App::getInstance()->db();
$member = Member::find((int) $id);
if (!$member) return $this->redirect('/members')->withError('العضو غير موجود');
return $this->view('Members.Views.edit', ['member' => $member, 'branches' => $db->select("SELECT id, name_ar FROM branches WHERE is_active = 1"), 'qualifications' => $db->select("SELECT id, name_ar FROM qualifications WHERE is_active = 1 ORDER BY sort_order"), 'governorates' => $db->select("SELECT code, name_ar FROM governorates WHERE is_active = 1"), 'countries' => $db->select("SELECT nationality_ar FROM countries WHERE is_active = 1 ORDER BY name_ar")]);
return $this->view('Members.Views.edit', [
'member' => $member,
'branches' => $db->select("SELECT id, name_ar FROM branches WHERE is_active = 1"),
'qualifications' => $db->select("SELECT id, name_ar FROM qualifications WHERE is_active = 1 ORDER BY sort_order"),
'governorates' => $db->select("SELECT code, name_ar FROM governorates WHERE is_active = 1"),
'countries' => $db->select("SELECT nationality_ar FROM countries WHERE is_active = 1 ORDER BY name_ar"),
'isSuperAdmin' => self::isSuperAdmin(),
]);
}
public function update(Request $request, string $id): Response
{
$member = Member::find((int) $id);
if (!$member) return $this->redirect('/members')->withError('العضو غير موجود');
$data = $request->all(); unset($data['_csrf_token']);
$data = $request->all();
unset($data['_csrf_token']);
$isSuperAdmin = self::isSuperAdmin();
$allowed = ['full_name_en','phone_home','phone_mobile','phone_international','email','emergency_name','emergency_phone','residence_type','residence_address','landmark','floor','apartment','area','governorate','correspondence_address','employment_type','occupation','job_title','employment_date','business_address','office_phone','office_fax','business_activity','referral_source','religion','marital_status'];
$update = [];
foreach ($allowed as $f) { if (array_key_exists($f, $data)) { $v = trim((string) ($data[$f] ?? '')); $update[$f] = $v === '' ? null : $v; } }
foreach ($allowed as $f) {
if (array_key_exists($f, $data)) {
$v = trim((string) ($data[$f] ?? ''));
$update[$f] = $v === '' ? null : $v;
}
}
// ── SuperAdmin-only fields: full_name_ar, national_id ──
if ($isSuperAdmin) {
$errors = [];
// Name change
if (array_key_exists('full_name_ar', $data)) {
$newName = trim((string) $data['full_name_ar']);
if ($newName !== '' && mb_strlen($newName) >= 5) {
$update['full_name_ar'] = $newName;
} elseif ($newName !== '') {
$errors[] = 'الاسم بالعربي يجب أن يكون 5 أحرف على الأقل';
}
}
// National ID change
if (array_key_exists('national_id', $data)) {
$newNid = trim((string) $data['national_id']);
if ($newNid === '') {
// Allow clearing NID (e.g., for passport-based members)
$update['national_id'] = null;
} elseif ($newNid !== ($member->national_id ?? '')) {
// Validate new NID
$parsed = NationalIdParser::parse($newNid);
if (!$parsed['is_valid']) {
$errors = array_merge($errors, $parsed['errors']);
} else {
// Check duplicate
$db = App::getInstance()->db();
$dup = $db->selectOne(
"SELECT id, full_name_ar FROM members WHERE national_id = ? AND is_archived = 0 AND id != ?",
[$newNid, (int) $id]
);
if ($dup) {
$errors[] = 'الرقم القومي مسجل بالفعل للعضو: ' . $dup['full_name_ar'];
} else {
$update['national_id'] = $newNid;
$update['date_of_birth'] = $parsed['dob'];
$update['age_years'] = $parsed['age_years'];
$update['age_months'] = $parsed['age_months'];
$update['gender'] = $parsed['gender'];
$update['governorate_code'] = $parsed['governorate_code'];
}
}
}
}
if (!empty($errors)) {
$session = App::getInstance()->session();
$session->flash('_alerts', array_map(fn($e) => ['type' => 'error', 'message' => $e], $errors));
return $this->redirect('/members/' . $id . '/edit');
}
}
if (!empty($update)) $member->update($update);
return $this->redirect('/members/' . $id)->withSuccess('تم تحديث البيانات');
}
......
......@@ -3,15 +3,41 @@
<?php $__template->section('content'); ?>
<form method="POST" action="/members/<?= (int) $member->id ?>">
<?= csrf_field() ?>
<?php if (!empty($isSuperAdmin)): ?>
<!-- ═══ SuperAdmin Only: Name & National ID ═══ -->
<div class="card" style="margin-bottom:20px;padding:20px;border-right:4px solid #DC2626;">
<div style="display:flex;align-items:center;gap:10px;margin-bottom:15px;">
<h3 style="color:#DC2626;margin:0;">🔒 صلاحيات المشرف العام</h3>
<span style="background:#FEF2F2;color:#DC2626;padding:3px 10px;border-radius:4px;font-size:11px;font-weight:600;">SUPER ADMIN ONLY</span>
</div>
<p style="color:#6B7280;font-size:13px;margin-bottom:15px;">⚠ تغيير هذه البيانات يؤثر على كل سجلات العضو — تأكد من صحة البيانات قبل الحفظ</p>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:15px;">
<div class="form-group">
<label class="form-label">الاسم بالعربي <span style="color:#DC2626;">*</span></label>
<input type="text" name="full_name_ar" value="<?= e($member->full_name_ar) ?>" class="form-input" style="font-size:16px;font-weight:600;border-color:#DC2626;" required minlength="5" maxlength="200">
</div>
<div class="form-group">
<label class="form-label">الرقم القومي</label>
<input type="text" name="national_id" value="<?= e($member->national_id ?? '') ?>" class="form-input" maxlength="14" style="direction:ltr;text-align:left;font-size:16px;letter-spacing:1px;border-color:#DC2626;">
<small style="color:#DC2626;font-size:11px;">تغيير الرقم القومي سيعيد حساب تاريخ الميلاد والنوع والمحافظة</small>
</div>
</div>
</div>
<?php endif; ?>
<div class="card" style="margin-bottom:20px;padding:20px;">
<h3 style="color:#0D7377;margin-bottom:15px;">البيانات الأساسية (للقراءة فقط)</h3>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:15px;">
<div class="form-group"><label class="form-label">الاسم بالعربي</label><input type="text" value="<?= e($member->full_name_ar) ?>" class="form-input" disabled style="background:#F3F4F6;"></div>
<div class="form-group"><label class="form-label">الرقم القومي</label><input type="text" value="<?= e($member->national_id ?: '—') ?>" class="form-input" disabled style="background:#F3F4F6;direction:ltr;text-align:left;"></div>
<?php if (empty($isSuperAdmin)): ?>
<div class="form-group"><label class="form-label">الاسم بالعربي 🔒</label><input type="text" value="<?= e($member->full_name_ar) ?>" class="form-input" disabled style="background:#F3F4F6;"></div>
<div class="form-group"><label class="form-label">الرقم القومي 🔒</label><input type="text" value="<?= e($member->national_id ?: '—') ?>" class="form-input" disabled style="background:#F3F4F6;direction:ltr;text-align:left;"></div>
<?php endif; ?>
<div class="form-group"><label class="form-label">تاريخ الميلاد</label><input type="text" value="<?= e($member->date_of_birth) ?>" class="form-input" disabled style="background:#F3F4F6;"></div>
<div class="form-group"><label class="form-label">النوع</label><input type="text" value="<?= e($member->getGenderLabel()) ?>" class="form-input" disabled style="background:#F3F4F6;"></div>
</div>
</div>
<div class="card" style="margin-bottom:20px;padding:20px;">
<h3 style="color:#0D7377;margin-bottom:15px;">البيانات القابلة للتعديل</h3>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:15px;">
......@@ -36,10 +62,7 @@
<div class="form-group"><label class="form-label">المنطقة</label><input type="text" name="area" value="<?= e($member->area ?? '') ?>" class="form-input"></div>
</div>
</div>
<div class="card" style="margin-bottom:20px;padding:20px;">
<h3 style="color:#0D7377;margin-bottom:15px;">إضافة ملاحظة</h3>
<textarea name="new_note" class="form-textarea" rows="3" placeholder="أضف ملاحظة جديدة..."></textarea>
</div>
<button type="submit" class="btn btn-primary">حفظ التعديلات</button>
<a href="/members/<?= (int) $member->id ?>" class="btn btn-outline">إلغاء</a>
</form>
......
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