Commit 7d252da8 authored by Administrator's avatar Administrator

Update 2 files via Son of Anton

parent 17e8255e
......@@ -22,7 +22,6 @@ class SpouseController extends Controller
return $this->redirect('/members')->withError('العضو غير موجود');
}
// BLOCK: membership_value must be set
$membershipValue = $member['membership_value'] ?? '0.00';
if (bccomp($membershipValue, '0.01', 2) < 0) {
return $this->redirect('/members/' . $memberId)
......@@ -33,7 +32,9 @@ class SpouseController extends Controller
$countries = $db->select("SELECT nationality_ar FROM countries WHERE is_active = 1 ORDER BY name_ar");
$spouseOrder = Spouse::getNextOrder((int) $memberId);
// Pre-calculate fee estimate for display
// Spouse gender is the OPPOSITE of member gender
$spouseGender = ($member['gender'] === 'male') ? 'female' : 'male';
$feeEstimate = SpouseFeeCalculator::calculate((int) $memberId, [
'nationality' => 'مصري',
'marriage_date' => date('Y-m-d'),
......@@ -44,6 +45,7 @@ class SpouseController extends Controller
'qualifications' => $qualifications,
'countries' => $countries,
'spouseOrder' => $spouseOrder,
'spouseGender' => $spouseGender,
'feeEstimate' => $feeEstimate,
]);
}
......@@ -56,7 +58,6 @@ class SpouseController extends Controller
return $this->redirect('/members')->withError('العضو غير موجود');
}
// BLOCK: membership_value must be set
$membershipValue = $member['membership_value'] ?? '0.00';
if (bccomp($membershipValue, '0.01', 2) < 0) {
return $this->redirect('/members/' . $memberId)
......@@ -70,9 +71,11 @@ class SpouseController extends Controller
if (empty(trim($data['full_name_ar'] ?? ''))) $errors[] = 'اسم الزوج/ة مطلوب';
if (empty($data['date_of_birth'] ?? '')) $errors[] = 'تاريخ الميلاد مطلوب';
if (empty($data['gender'] ?? '')) $errors[] = 'النوع مطلوب';
if (empty($data['marriage_date'] ?? '')) $errors[] = 'تاريخ الزواج مطلوب';
// ── Gender validation: only male/female, must be opposite of member ──
$requiredSpouseGender = ($member['gender'] === 'male') ? 'female' : 'male';
// Max spouse check
$existingCount = Spouse::countActiveForMember((int) $memberId);
$maxSpouses = ($member['gender'] === 'male') ? 4 : 1;
......@@ -91,6 +94,14 @@ class SpouseController extends Controller
$data['age_years'] = $parsed['age_years'];
$data['age_months'] = $parsed['age_months'];
$data['gender'] = $parsed['gender'];
// Validate gender from NID matches required
if ($parsed['gender'] !== $requiredSpouseGender) {
$memberGenderAr = $member['gender'] === 'male' ? 'ذكر' : 'أنثى';
$requiredAr = $requiredSpouseGender === 'male' ? 'ذكر' : 'أنثى';
$parsedAr = $parsed['gender'] === 'male' ? 'ذكر' : 'أنثى';
$errors[] = "العضو {$memberGenderAr} — يجب أن يكون الزوج/ة {$requiredAr} — الرقم القومي يشير إلى {$parsedAr}";
}
}
// Cannot be the member themselves
......@@ -103,6 +114,9 @@ class SpouseController extends Controller
if ($dup) {
$errors[] = 'الرقم القومي مسجل بالفعل: ' . ($dup['data']['full_name_ar'] ?? '');
}
} else {
// No NID — force correct gender
$data['gender'] = $requiredSpouseGender;
}
// Calculate age
......@@ -140,7 +154,6 @@ class SpouseController extends Controller
}
$spouseOrder = $feeCalc['spouse_order'] ?? Spouse::getNextOrder((int) $memberId);
$joinDate = date('Y-m-d');
$spouse = Spouse::create([
'member_id' => (int) $memberId,
......@@ -152,7 +165,7 @@ class SpouseController extends Controller
'date_of_birth' => $data['date_of_birth'],
'age_years' => (int) ($data['age_years'] ?? 0),
'age_months' => (int) ($data['age_months'] ?? 0),
'gender' => $data['gender'],
'gender' => $requiredSpouseGender,
'nationality' => $data['nationality'] ?? 'مصري',
'religion' => $data['religion'] ?? null,
'qualification_id' => ($data['qualification_id'] ?? '') !== '' ? (int) $data['qualification_id'] : null,
......@@ -161,7 +174,7 @@ class SpouseController extends Controller
'work_phone' => $data['work_phone'] ?? null,
'mobile' => $data['mobile'] ?? null,
'marriage_date' => $data['marriage_date'],
'join_date' => $joinDate,
'join_date' => date('Y-m-d'),
'classification' => 'working',
'addition_fee' => $feeCalc['total_fee'] ?? '0.00',
'status' => 'active',
......@@ -174,10 +187,6 @@ class SpouseController extends Controller
'fee' => $feeCalc['total_fee'] ?? '0.00',
]);
// Build success message with full breakdown
$breakdown = $feeCalc['breakdown'] ?? [];
$breakdownText = !empty($breakdown) ? "\n" . implode("\n", $breakdown) : '';
$msg = 'تم إضافة الزوج/الزوجة بنجاح';
$msg .= ' — الترتيب: #' . $spouseOrder;
$msg .= ' — الرسوم: ' . money($feeCalc['total_fee'] ?? '0');
......@@ -195,10 +204,8 @@ class SpouseController extends Controller
if (!$spouse || (int) $spouse->member_id !== (int) $memberId) {
return $this->redirect("/members/{$memberId}")->withError('بيانات الزوج/ة غير موجودة');
}
$db = App::getInstance()->db();
$member = $db->selectOne("SELECT * FROM members WHERE id = ?", [(int) $memberId]);
return $this->view('Spouses.Views.show', ['member' => $member, 'spouse' => $spouse]);
}
......@@ -208,17 +215,13 @@ class SpouseController extends Controller
if (!$spouse || (int) $spouse->member_id !== (int) $memberId) {
return $this->redirect("/members/{$memberId}")->withError('بيانات الزوج/ة غير موجودة');
}
$db = App::getInstance()->db();
$member = $db->selectOne("SELECT * FROM members WHERE id = ?", [(int) $memberId]);
$qualifications = $db->select("SELECT id, name_ar FROM qualifications WHERE is_active = 1 ORDER BY sort_order");
$countries = $db->select("SELECT nationality_ar FROM countries WHERE is_active = 1 ORDER BY name_ar");
return $this->view('Spouses.Views.edit', [
'member' => $member,
'spouse' => $spouse,
'qualifications' => $qualifications,
'countries' => $countries,
'member' => $member, 'spouse' => $spouse,
'qualifications' => $qualifications, 'countries' => $countries,
]);
}
......@@ -228,10 +231,8 @@ class SpouseController extends Controller
if (!$spouse || (int) $spouse->member_id !== (int) $memberId) {
return $this->redirect("/members/{$memberId}")->withError('بيانات الزوج/ة غير موجودة');
}
$data = $request->all();
unset($data['_csrf_token']);
$updateData = [];
foreach (['full_name_en', 'occupation', 'work_address', 'work_phone', 'mobile', 'religion'] as $field) {
if (array_key_exists($field, $data)) {
......@@ -242,11 +243,7 @@ class SpouseController extends Controller
if (isset($data['qualification_id'])) {
$updateData['qualification_id'] = ($data['qualification_id'] !== '') ? (int) $data['qualification_id'] : null;
}
if (!empty($updateData)) {
$spouse->update($updateData);
}
if (!empty($updateData)) $spouse->update($updateData);
return $this->redirect("/members/{$memberId}")->withSuccess('تم تحديث بيانات الزوج/ة');
}
......@@ -256,29 +253,18 @@ class SpouseController extends Controller
if (!$spouse || (int) $spouse->member_id !== (int) $memberId) {
return $this->redirect("/members/{$memberId}")->withError('بيانات الزوج/ة غير موجودة');
}
$reason = trim((string) $request->post('reason', ''));
if ($reason === '') {
return $this->redirect("/members/{$memberId}")->withError('يجب إدخال سبب الإزالة');
}
if ($reason === '') return $this->redirect("/members/{$memberId}")->withError('يجب إدخال سبب الإزالة');
$employee = App::getInstance()->currentEmployee();
$db = App::getInstance()->db();
$db->update('spouses', [
'is_archived' => 1,
'archived_at' => date('Y-m-d H:i:s'),
'is_archived' => 1, 'archived_at' => date('Y-m-d H:i:s'),
'archived_by' => $employee ? (int) $employee->id : null,
'status' => 'inactive',
'updated_at' => date('Y-m-d H:i:s'),
'status' => 'inactive', 'updated_at' => date('Y-m-d H:i:s'),
], '`id` = ?', [(int) $id]);
EventBus::dispatch('spouse.removed', [
'member_id' => (int) $memberId,
'spouse_id' => (int) $id,
'reason' => $reason,
]);
EventBus::dispatch('spouse.removed', ['member_id' => (int) $memberId, 'spouse_id' => (int) $id, 'reason' => $reason]);
return $this->redirect("/members/{$memberId}")->withSuccess('تم إزالة الزوج/ة');
}
}
\ No newline at end of file
This diff is collapsed.
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