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
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
...
@@ -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,10 +32,12 @@ class SpouseController extends Controller
...
@@ -33,10 +32,12 @@ 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'
),
]);
]);
return
$this
->
view
(
'Spouses.Views.create'
,
[
return
$this
->
view
(
'Spouses.Views.create'
,
[
...
@@ -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
app/Modules/Spouses/Views/create.php
View file @
7d252da8
<?php
$__template
->
layout
(
'Layout.main'
);
?>
<?php
$__template
->
layout
(
'Layout.main'
);
?>
<?php
$__template
->
section
(
'title'
);
?>
إضافة زوج/
زوج
ة —
<?=
e
(
$member
[
'full_name_ar'
])
?><?php
$__template
->
endSection
();
?>
<?php
$__template
->
section
(
'title'
);
?>
إضافة زوج/ة —
<?=
e
(
$member
[
'full_name_ar'
])
?><?php
$__template
->
endSection
();
?>
<?php
$__template
->
section
(
'content'
);
?>
<?php
$__template
->
section
(
'content'
);
?>
<?php
$memberGenderAr
=
$member
[
'gender'
]
===
'male'
?
'ذكر'
:
'أنثى'
;
$spouseGenderAr
=
$spouseGender
===
'male'
?
'زوج'
:
'زوجة'
;
$spouseGenderFullAr
=
$spouseGender
===
'male'
?
'ذكر'
:
'أنثى'
;
?>
<div
class=
"card"
style=
"margin-bottom:15px;padding:15px;display:flex;justify-content:space-between;align-items:center;"
>
<div
class=
"card"
style=
"margin-bottom:15px;padding:15px;display:flex;justify-content:space-between;align-items:center;"
>
<div>
<div>
<strong>
العضو:
</strong>
<?=
e
(
$member
[
'full_name_ar'
])
?>
<strong>
العضو:
</strong>
<?=
e
(
$member
[
'full_name_ar'
])
?>
(
<?=
$memberGenderAr
?>
)
|
<strong>
رقم العضوية:
</strong>
<?=
e
(
$member
[
'membership_number'
]
??
'لم يُحدد'
)
?>
|
<strong>
رقم العضوية:
</strong>
<?=
e
(
$member
[
'membership_number'
]
??
'لم يُحدد'
)
?>
|
<strong>
ترتيب الزوج/الزوجة:
</strong>
#
<?=
(
int
)
$spouseOrder
?>
|
<strong>
قيمة العضوية:
</strong>
<?=
money
(
$member
[
'membership_value'
]
??
'0'
)
?>
|
<strong>
ترتيب ال
<?=
$spouseGenderAr
?>
:
</strong>
#
<?=
(
int
)
$spouseOrder
?>
</div>
</div>
<a
href=
"/members/
<?=
(
int
)
$member
[
'id'
]
?>
"
class=
"btn btn-outline"
>
← العودة للعضو
</a>
<a
href=
"/members/
<?=
(
int
)
$member
[
'id'
]
?>
"
class=
"btn btn-outline"
>
← العودة للعضو
</a>
</div>
</div>
<form
method=
"POST"
action=
"/members/
<?=
(
int
)
$member
[
'id'
]
?>
/spouses"
id=
"spouse-form"
>
<!-- Fee Estimate -->
<?php
if
(
!
empty
(
$feeEstimate
)
&&
empty
(
$feeEstimate
[
'error'
]))
:
?>
<div
class=
"card"
style=
"margin-bottom:15px;padding:15px;background:#EFF6FF;border:1px solid #BFDBFE;"
>
<strong
style=
"color:#0284C7;"
>
💰 تقدير الرسوم:
</strong>
<?php
foreach
(
$feeEstimate
[
'breakdown'
]
??
[]
as
$line
)
:
?>
<div
style=
"font-size:13px;color:#4B5563;margin-top:3px;"
>
<?=
e
(
$line
)
?>
</div>
<?php
endforeach
;
?>
</div>
<?php
endif
;
?>
<form
method=
"POST"
action=
"/members/
<?=
(
int
)
$member
[
'id'
]
?>
/spouses"
>
<?=
csrf_field
()
?>
<?=
csrf_field
()
?>
<div
class=
"card"
style=
"margin-bottom:20px;"
>
<div
class=
"card"
style=
"margin-bottom:20px;"
>
<div
style=
"padding:15px 20px;border-bottom:1px solid #E5E7EB;"
><h3
style=
"margin:0;color:#0D7377;"
>
بيانات الزوج/الزوجة
</h3></div>
<div
style=
"padding:15px 20px;border-bottom:1px solid #E5E7EB;"
>
<h3
style=
"margin:0;color:#0D7377;"
>
بيانات ال
<?=
$spouseGenderAr
?>
</h3>
</div>
<div
style=
"padding:20px;display:grid;grid-template-columns:1fr 1fr;gap:15px;"
>
<div
style=
"padding:20px;display:grid;grid-template-columns:1fr 1fr;gap:15px;"
>
<div
class=
"form-group"
style=
"grid-column:1/-1;"
>
<div
class=
"form-group"
style=
"grid-column:1/-1;"
>
<label
class=
"form-label"
>
الاسم بالكامل (عربي)
<span
style=
"color:#DC2626;"
>
*
</span></label>
<label
class=
"form-label"
>
الاسم بالكامل (عربي)
<span
style=
"color:#DC2626;"
>
*
</span></label>
<input
type=
"text"
name=
"full_name_ar"
value=
"
<?=
e
(
old
(
'full_name_ar'
))
?>
"
class=
"form-input"
required
minlength=
"
10
"
maxlength=
"200"
>
<input
type=
"text"
name=
"full_name_ar"
value=
"
<?=
e
(
old
(
'full_name_ar'
))
?>
"
class=
"form-input"
required
minlength=
"
5
"
maxlength=
"200"
>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
الاسم بالإنجليزي
</label>
<label
class=
"form-label"
>
الاسم بالإنجليزي
</label>
<input
type=
"text"
name=
"full_name_en"
value=
"
<?=
e
(
old
(
'full_name_en'
))
?>
"
class=
"form-input"
>
<input
type=
"text"
name=
"full_name_en"
value=
"
<?=
e
(
old
(
'full_name_en'
))
?>
"
class=
"form-input"
style=
"direction:ltr;text-align:left;"
>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
الرقم القومي
</label>
<label
class=
"form-label"
>
النوع
</label>
<input
type=
"text"
name=
"national_id"
id=
"spouse_nid"
value=
"
<?=
e
(
old
(
'national_id'
))
?>
"
class=
"form-input"
maxlength=
"14"
pattern=
"\d{14}"
style=
"direction:ltr;text-align:left;"
placeholder=
"14 رقم"
>
<input
type=
"text"
value=
"
<?=
$spouseGenderFullAr
?>
"
class=
"form-input"
style=
"background:#F3F4F6;font-weight:700;color:#0D7377;"
readonly
disabled
>
<div
id=
"nid-feedback"
style=
"margin-top:5px;font-size:12px;"
></div>
<input
type=
"hidden"
name=
"gender"
value=
"
<?=
e
(
$spouseGender
)
?>
"
>
<small
style=
"color:#6B7280;"
>
يُحدد تلقائياً — العضو
<?=
$memberGenderAr
?>
فالزوج/ة
<?=
$spouseGenderFullAr
?>
</small>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
رقم جواز السفر
</label>
<label
class=
"form-label"
>
الرقم القومي
</label>
<input
type=
"text"
name=
"passport_number"
value=
"
<?=
e
(
old
(
'passport_number'
))
?>
"
class=
"form-input"
style=
"direction:ltr;text-align:left;"
>
<input
type=
"text"
name=
"national_id"
id=
"spouse_nid"
value=
"
<?=
e
(
old
(
'national_id'
))
?>
"
class=
"form-input"
maxlength=
"14"
style=
"direction:ltr;text-align:left;font-size:16px;letter-spacing:1px;"
placeholder=
"14 رقم"
>
<div
id=
"spouse-nid-feedback"
style=
"margin-top:5px;font-size:12px;"
></div>
</div>
</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>
...
@@ -40,25 +61,21 @@
...
@@ -40,25 +61,21 @@
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
السن
</label>
<label
class=
"form-label"
>
السن
</label>
<input
type=
"text"
id=
"spouse_age"
class=
"form-input"
style=
"background:#F3F4F6;"
readonly
>
<input
type=
"text"
id=
"spouse_age
_display
"
class=
"form-input"
style=
"background:#F3F4F6;"
readonly
>
<input
type=
"hidden"
name=
"age_years"
id=
"spouse_age_years"
value=
"
<?=
e
(
old
(
'age_years'
))
?>
"
>
<input
type=
"hidden"
name=
"age_years"
id=
"spouse_age_years"
>
<input
type=
"hidden"
name=
"age_months"
id=
"spouse_age_months"
value=
"
<?=
e
(
old
(
'age_months'
))
?>
"
>
<input
type=
"hidden"
name=
"age_months"
id=
"spouse_age_months"
>
</div>
</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=
"gender"
id=
"spouse_gender"
class=
"form-select"
required
>
<input
type=
"date"
name=
"marriage_date"
value=
"
<?=
e
(
old
(
'marriage_date'
))
?>
"
class=
"form-input"
required
max=
"
<?=
e
(
date
(
'Y-m-d'
))
?>
"
>
<option
value=
""
>
-- اختر --
</option>
<option
value=
"male"
<?=
old
(
'gender'
)
===
'male'
?
'selected'
:
''
?>
>
ذكر
</option>
<option
value=
"female"
<?=
old
(
'gender'
)
===
'female'
?
'selected'
:
''
?>
>
أنثى
</option>
</select>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
الجنسية
<span
style=
"color:#DC2626;"
>
*
</span>
</label>
<label
class=
"form-label"
>
الجنسية
</label>
<select
name=
"nationality"
class=
"form-select"
>
<select
name=
"nationality"
class=
"form-select"
>
<option
value=
"مصري"
selected
>
مصري
</option>
<option
value=
"مصري"
selected
>
مصري
</option>
<?php
foreach
(
$countries
as
$c
)
:
?>
<?php
foreach
(
$countries
as
$c
)
:
?>
<?php
if
(
$c
[
'nationality_ar'
]
!==
'مصري'
)
:
?>
<?php
if
(
$c
[
'nationality_ar'
]
!==
'مصري'
)
:
?>
<option
value=
"
<?=
e
(
$c
[
'nationality_ar'
])
?>
"
<?=
old
(
'nationality'
)
===
$c
[
'nationality_ar'
]
?
'selected'
:
''
?>
>
<?=
e
(
$c
[
'nationality_ar'
])
?>
</option>
<option
value=
"
<?=
e
(
$c
[
'nationality_ar'
])
?>
"
>
<?=
e
(
$c
[
'nationality_ar'
])
?>
</option>
<?php
endif
;
?>
<?php
endif
;
?>
<?php
endforeach
;
?>
<?php
endforeach
;
?>
</select>
</select>
...
@@ -67,27 +84,26 @@
...
@@ -67,27 +84,26 @@
<label
class=
"form-label"
>
الديانة
</label>
<label
class=
"form-label"
>
الديانة
</label>
<select
name=
"religion"
class=
"form-select"
>
<select
name=
"religion"
class=
"form-select"
>
<option
value=
""
>
-- اختر --
</option>
<option
value=
""
>
-- اختر --
</option>
<option
value=
"muslim"
<?=
old
(
'religion'
)
===
'muslim'
?
'selected'
:
''
?>
>
مسلم
</option>
<option
value=
"muslim"
>
مسلم/ة
</option>
<option
value=
"christian"
<?=
old
(
'religion'
)
===
'christian'
?
'selected'
:
''
?>
>
مسيحي
</option>
<option
value=
"christian"
>
مسيحي/ة
</option>
<option
value=
"other"
<?=
old
(
'religion'
)
===
'other'
?
'selected'
:
''
?>
>
أخرى
</option>
</select>
</select>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
المؤهل
الدراسي
</label>
<label
class=
"form-label"
>
المؤهل
</label>
<select
name=
"qualification_id"
class=
"form-select"
>
<select
name=
"qualification_id"
class=
"form-select"
>
<option
value=
""
>
-- اختر --
</option>
<option
value=
""
>
-- اختر --
</option>
<?php
foreach
(
$qualifications
as
$q
)
:
?>
<?php
foreach
(
$qualifications
as
$q
)
:
?>
<option
value=
"
<?=
(
int
)
$q
[
'id'
]
?>
"
<?=
old
(
'qualification_id'
)
==
$q
[
'id'
]
?
'selected'
:
''
?>
>
<?=
e
(
$q
[
'name_ar'
])
?>
</option>
<option
value=
"
<?=
(
int
)
$q
[
'id'
]
?>
"
>
<?=
e
(
$q
[
'name_ar'
])
?>
</option>
<?php
endforeach
;
?>
<?php
endforeach
;
?>
</select>
</select>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
ال
وظيف
ة
</label>
<label
class=
"form-label"
>
ال
مهن
ة
</label>
<input
type=
"text"
name=
"occupation"
value=
"
<?=
e
(
old
(
'occupation'
))
?>
"
class=
"form-input"
>
<input
type=
"text"
name=
"occupation"
value=
"
<?=
e
(
old
(
'occupation'
))
?>
"
class=
"form-input"
>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
رقم
المحمول
</label>
<label
class=
"form-label"
>
المحمول
</label>
<input
type=
"tel"
name=
"mobile"
value=
"
<?=
e
(
old
(
'mobile'
))
?>
"
class=
"form-input"
style=
"direction:ltr;text-align:left;"
maxlength=
"11
"
>
<input
type=
"tel"
name=
"mobile"
value=
"
<?=
e
(
old
(
'mobile'
))
?>
"
class=
"form-input"
style=
"direction:ltr;text-align:left;"
placeholder=
"01XXXXXXXXX
"
>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
تليفون العمل
</label>
<label
class=
"form-label"
>
تليفون العمل
</label>
...
@@ -95,18 +111,14 @@
...
@@ -95,18 +111,14 @@
</div>
</div>
<div
class=
"form-group"
style=
"grid-column:1/-1;"
>
<div
class=
"form-group"
style=
"grid-column:1/-1;"
>
<label
class=
"form-label"
>
عنوان العمل
</label>
<label
class=
"form-label"
>
عنوان العمل
</label>
<input
type=
"text"
name=
"work_address"
value=
"
<?=
e
(
old
(
'work_address'
))
?>
"
class=
"form-input"
>
<textarea
name=
"work_address"
class=
"form-textarea"
rows=
"2"
>
<?=
e
(
old
(
'work_address'
))
?>
</textarea>
</div>
<div
class=
"form-group"
>
<label
class=
"form-label"
>
تاريخ الزواج
<span
style=
"color:#DC2626;"
>
*
</span></label>
<input
type=
"date"
name=
"marriage_date"
value=
"
<?=
e
(
old
(
'marriage_date'
))
?>
"
class=
"form-input"
required
>
</div>
</div>
</div>
</div>
</div>
</div>
<div
style=
"display:flex;gap:10px;"
>
<div
style=
"display:flex;gap:10px;"
>
<button
type=
"submit"
class=
"btn btn-primary"
>
إضافة الزوج/الزوجة
</button>
<button
type=
"submit"
class=
"btn btn-primary"
style=
"padding:12px 30px;font-size:16px;"
>
💍 إضافة ال
<?=
$spouseGenderAr
?>
</button>
<a
href=
"/members/
<?=
(
int
)
$member
[
'id'
]
?>
"
class=
"btn btn-outline"
>
إلغاء
</a>
<a
href=
"/members/
<?=
(
int
)
$member
[
'id'
]
?>
"
class=
"btn btn-outline"
style=
"padding:12px 20px;"
>
إلغاء
</a>
</div>
</div>
</form>
</form>
...
@@ -117,16 +129,17 @@
...
@@ -117,16 +129,17 @@
document
.
addEventListener
(
'DOMContentLoaded'
,
function
()
{
document
.
addEventListener
(
'DOMContentLoaded'
,
function
()
{
var
nidInput
=
document
.
getElementById
(
'spouse_nid'
);
var
nidInput
=
document
.
getElementById
(
'spouse_nid'
);
var
dobInput
=
document
.
getElementById
(
'spouse_dob'
);
var
dobInput
=
document
.
getElementById
(
'spouse_dob'
);
var
ageDisplay
=
document
.
getElementById
(
'spouse_age'
);
var
ageDisplay
=
document
.
getElementById
(
'spouse_age
_display
'
);
var
ageYears
=
document
.
getElementById
(
'spouse_age_years'
);
var
ageYears
=
document
.
getElementById
(
'spouse_age_years'
);
var
ageMonths
=
document
.
getElementById
(
'spouse_age_months'
);
var
ageMonths
=
document
.
getElementById
(
'spouse_age_months'
);
var
genderSelect
=
document
.
getElementById
(
'spouse_gender
'
);
var
feedback
=
document
.
getElementById
(
'spouse-nid-feedback
'
);
var
feedback
=
document
.
getElementById
(
'nid-feedback'
)
;
var
requiredGender
=
'
<?=
e
(
$spouseGender
)
?>
'
;
nidInput
.
addEventListener
(
'input'
,
function
()
{
nidInput
.
addEventListener
(
'input'
,
function
()
{
var
val
=
this
.
value
.
replace
(
/
\D
/g
,
''
);
var
val
=
this
.
value
.
replace
(
/
\D
/g
,
''
);
this
.
value
=
val
;
this
.
value
=
val
;
if
(
val
.
length
===
14
)
{
if
(
val
.
length
===
14
)
{
feedback
.
innerHTML
=
'<span style="color:#0284C7;">جاري التحقق...</span>'
;
var
formData
=
new
FormData
();
var
formData
=
new
FormData
();
formData
.
append
(
'national_id'
,
val
);
formData
.
append
(
'national_id'
,
val
);
var
csrfToken
=
document
.
querySelector
(
'input[name="_csrf_token"]'
);
var
csrfToken
=
document
.
querySelector
(
'input[name="_csrf_token"]'
);
...
@@ -141,18 +154,38 @@ document.addEventListener('DOMContentLoaded', function() {
...
@@ -141,18 +154,38 @@ document.addEventListener('DOMContentLoaded', function() {
ageDisplay
.
value
=
p
.
age_years
+
' سنة و '
+
p
.
age_months
+
' شهر'
;
ageDisplay
.
value
=
p
.
age_years
+
' سنة و '
+
p
.
age_months
+
' شهر'
;
ageYears
.
value
=
p
.
age_years
;
ageYears
.
value
=
p
.
age_years
;
ageMonths
.
value
=
p
.
age_months
;
ageMonths
.
value
=
p
.
age_months
;
genderSelect
.
value
=
p
.
gender
;
feedback
.
innerHTML
=
'<span style="color:#059669;">✓ صالح — '
+
(
p
.
gender
===
'male'
?
'ذكر'
:
'أنثى'
)
+
'</span>'
;
feedback
.
innerHTML
=
'<span style="color:#059669;">✓ الرقم القومي صالح</span>'
;
// Check gender matches required
if
(
p
.
gender
!==
requiredGender
)
{
var
reqAr
=
requiredGender
===
'male'
?
'ذكر'
:
'أنثى'
;
var
gotAr
=
p
.
gender
===
'male'
?
'ذكر'
:
'أنثى'
;
feedback
.
innerHTML
=
'<span style="color:#DC2626;">✖ الرقم القومي يشير إلى '
+
gotAr
+
' — يجب أن يكون '
+
reqAr
+
'</span>'
;
}
if
(
data
.
duplicate
)
{
if
(
data
.
duplicate
)
{
feedback
.
innerHTML
+=
'<br><span style="color:#DC2626;">✖
الرقم مسجل بالفع
ل: '
+
data
.
duplicate
.
full_name_ar
+
'</span>'
;
feedback
.
innerHTML
+=
'<br><span style="color:#DC2626;">✖
مسج
ل: '
+
data
.
duplicate
.
full_name_ar
+
'</span>'
;
}
}
}
else
{
}
else
{
feedback
.
innerHTML
=
'<span style="color:#DC2626;">✖ '
+
(
p
.
errors
?
p
.
errors
.
join
(
' | '
)
:
'
رقم
غير صالح'
)
+
'</span>'
;
feedback
.
innerHTML
=
'<span style="color:#DC2626;">✖ '
+
(
p
.
errors
?
p
.
errors
.
join
(
' | '
)
:
'غير صالح'
)
+
'</span>'
;
}
}
})
})
.
catch
(
function
()
{
feedback
.
innerHTML
=
'<span style="color:#DC2626;">خطأ في الاتصال</span>'
;
});
.
catch
(
function
()
{
feedback
.
innerHTML
=
'<span style="color:#DC2626;">خطأ</span>'
;
});
}
else
{
}
else
{
feedback
.
innerHTML
=
''
;
}
feedback
.
innerHTML
=
''
;
});
dobInput
.
addEventListener
(
'change'
,
function
()
{
if
(
this
.
value
&&
!
nidInput
.
value
)
{
var
dob
=
new
Date
(
this
.
value
);
var
now
=
new
Date
();
var
years
=
now
.
getFullYear
()
-
dob
.
getFullYear
();
var
months
=
now
.
getMonth
()
-
dob
.
getMonth
();
if
(
months
<
0
||
(
months
===
0
&&
now
.
getDate
()
<
dob
.
getDate
()))
{
years
--
;
months
+=
12
;
}
if
(
now
.
getDate
()
<
dob
.
getDate
())
months
--
;
if
(
months
<
0
)
months
=
0
;
ageDisplay
.
value
=
years
+
' سنة و '
+
months
+
' شهر'
;
ageYears
.
value
=
years
;
ageMonths
.
value
=
months
;
}
}
});
});
});
});
...
...
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