Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
Clubphp
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Clubphp
Commits
7d252da8
Commit
7d252da8
authored
Apr 07, 2026
by
Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update 2 files via Son of Anton
parent
17e8255e
Changes
2
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
110 additions
and
91 deletions
+110
-91
SpouseController.php
app/Modules/Spouses/Controllers/SpouseController.php
+29
-43
create.php
app/Modules/Spouses/Views/create.php
+81
-48
No files found.
app/Modules/Spouses/Controllers/SpouseController.php
View file @
7d252da8
...
...
@@ -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,10 +32,12 @@ 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'
),
'nationality'
=>
'مصري'
,
'marriage_date'
=>
date
(
'Y-m-d'
),
]);
return
$this
->
view
(
'Spouses.Views.create'
,
[
...
...
@@ -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
app/Modules/Spouses/Views/create.php
View file @
7d252da8
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment