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