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
a2cdc876
Commit
a2cdc876
authored
Apr 07, 2026
by
Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update 3 files via Son of Anton
parent
35e407e0
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
237 additions
and
73 deletions
+237
-73
MemberController.php
app/Modules/Members/Controllers/MemberController.php
+150
-24
Routes.php
app/Modules/Members/Routes.php
+16
-13
show.php
app/Modules/Members/Views/show.php
+71
-36
No files found.
app/Modules/Members/Controllers/MemberController.php
View file @
a2cdc876
...
@@ -92,9 +92,9 @@ class MemberController extends Controller
...
@@ -92,9 +92,9 @@ class MemberController extends Controller
$needsStartNumber
=
(
$nextFormNumber
===
null
);
$needsStartNumber
=
(
$nextFormNumber
===
null
);
return
$this
->
view
(
'Members.Views.create'
,
[
return
$this
->
view
(
'Members.Views.create'
,
[
'branches'
=>
$branches
,
'branches'
=>
$branches
,
'nextFormNumber'
=>
$nextFormNumber
,
'nextFormNumber'
=>
$nextFormNumber
,
'formFee'
=>
$formFee
,
'formFee'
=>
$formFee
,
'needsStartNumber'
=>
$needsStartNumber
,
'needsStartNumber'
=>
$needsStartNumber
,
]);
]);
}
}
...
@@ -153,7 +153,6 @@ class MemberController extends Controller
...
@@ -153,7 +153,6 @@ class MemberController extends Controller
$gender
=
$parsed
[
'gender'
];
$gender
=
$parsed
[
'gender'
];
$govCode
=
$parsed
[
'governorate_code'
];
$govCode
=
$parsed
[
'governorate_code'
];
// Check duplicate
$dup
=
$db
->
selectOne
(
$dup
=
$db
->
selectOne
(
"SELECT id, full_name_ar, membership_number FROM members WHERE national_id = ? AND is_archived = 0"
,
"SELECT id, full_name_ar, membership_number FROM members WHERE national_id = ? AND is_archived = 0"
,
[
$nationalId
]
[
$nationalId
]
...
@@ -164,7 +163,6 @@ class MemberController extends Controller
...
@@ -164,7 +163,6 @@ class MemberController extends Controller
}
}
}
}
}
else
{
}
else
{
// Without NID, we need DOB and gender manually
$dob
=
$request
->
post
(
'date_of_birth'
,
''
);
$dob
=
$request
->
post
(
'date_of_birth'
,
''
);
$gender
=
$request
->
post
(
'gender'
,
''
);
$gender
=
$request
->
post
(
'gender'
,
''
);
if
(
$dob
===
''
)
$errors
[]
=
'تاريخ الميلاد مطلوب'
;
if
(
$dob
===
''
)
$errors
[]
=
'تاريخ الميلاد مطلوب'
;
...
@@ -184,13 +182,11 @@ class MemberController extends Controller
...
@@ -184,13 +182,11 @@ class MemberController extends Controller
return
$this
->
redirect
(
'/members/create'
);
return
$this
->
redirect
(
'/members/create'
);
}
}
// Generate form number
$formNumber
=
FormNumberGenerator
::
next
();
$formNumber
=
FormNumberGenerator
::
next
();
if
(
$formNumber
===
null
)
{
if
(
$formNumber
===
null
)
{
return
$this
->
redirect
(
'/members/create'
)
->
withError
(
'يجب تحديد رقم بداية الاستمارات أولاً'
);
return
$this
->
redirect
(
'/members/create'
)
->
withError
(
'يجب تحديد رقم بداية الاستمارات أولاً'
);
}
}
// Create member with basic info
$member
=
Member
::
create
([
$member
=
Member
::
create
([
'full_name_ar'
=>
$fullNameAr
,
'full_name_ar'
=>
$fullNameAr
,
'national_id'
=>
$nationalId
?:
null
,
'national_id'
=>
$nationalId
?:
null
,
...
@@ -219,7 +215,7 @@ class MemberController extends Controller
...
@@ -219,7 +215,7 @@ class MemberController extends Controller
$formFee
=
FormNumberGenerator
::
getFormFee
();
$formFee
=
FormNumberGenerator
::
getFormFee
();
return
$this
->
redirect
(
'/members/'
.
$member
->
id
)
return
$this
->
redirect
(
'/members/'
.
$member
->
id
)
->
withSuccess
(
'تم تسجيل العضو — استمارة رقم: '
.
$formNumber
.
' —
رسوم الاستمارة: '
.
money
(
$formFee
)
);
->
withSuccess
(
'تم تسجيل العضو — استمارة رقم: '
.
$formNumber
.
' —
يجب دفع رسوم الاستمارة '
.
money
(
$formFee
)
.
' لملء البيانات'
);
}
}
public
function
show
(
Request
$request
,
string
$id
)
:
Response
public
function
show
(
Request
$request
,
string
$id
)
:
Response
...
@@ -235,6 +231,21 @@ class MemberController extends Controller
...
@@ -235,6 +231,21 @@ class MemberController extends Controller
?
$db
->
selectOne
(
"SELECT name_ar FROM qualifications WHERE id = ?"
,
[(
int
)
$member
->
qualification_id
])
?
$db
->
selectOne
(
"SELECT name_ar FROM qualifications WHERE id = ?"
,
[(
int
)
$member
->
qualification_id
])
:
null
;
:
null
;
// Check if form fee is paid
$formFeePaid
=
false
;
$formFeePayment
=
null
;
try
{
$formFeePayment
=
$db
->
selectOne
(
"SELECT p.*, r.receipt_number
FROM payments p
LEFT JOIN receipts r ON r.id = p.receipt_id
WHERE p.member_id = ? AND p.payment_type = 'form_fee' AND p.is_voided = 0
LIMIT 1"
,
[(
int
)
$id
]
);
$formFeePaid
=
(
$formFeePayment
!==
null
);
}
catch
(
\Throwable
$e
)
{}
// Load family data
// Load family data
$spouses
=
[];
$spouses
=
[];
$children
=
[];
$children
=
[];
...
@@ -268,28 +279,126 @@ class MemberController extends Controller
...
@@ -268,28 +279,126 @@ class MemberController extends Controller
$totalPaid
=
$totalPaidRow
[
'total'
]
??
'0.00'
;
$totalPaid
=
$totalPaidRow
[
'total'
]
??
'0.00'
;
}
catch
(
\Throwable
$e
)
{}
}
catch
(
\Throwable
$e
)
{}
// Load notes
$notes
=
$member
->
getNotes
();
$notes
=
$member
->
getNotes
();
$formFee
=
FormNumberGenerator
::
getFormFee
();
$formFee
=
FormNumberGenerator
::
getFormFee
();
// Check if form is filled (has qualification = minimum indicator of filled form)
$formFilled
=
(
$member
->
qualification_id
!==
null
&&
$member
->
qualification_id
>
0
);
$formFilled
=
(
$member
->
qualification_id
!==
null
&&
$member
->
qualification_id
>
0
);
return
$this
->
view
(
'Members.Views.show'
,
[
return
$this
->
view
(
'Members.Views.show'
,
[
'member'
=>
$member
,
'member'
=>
$member
,
'branchName'
=>
$branch
[
'name_ar'
]
??
'—'
,
'branchName'
=>
$branch
[
'name_ar'
]
??
'—'
,
'qualificationName'
=>
$qualification
[
'name_ar'
]
??
'—'
,
'qualificationName'
=>
$qualification
[
'name_ar'
]
??
'—'
,
'spouses'
=>
$spouses
,
'spouses'
=>
$spouses
,
'children'
=>
$children
,
'children'
=>
$children
,
'payments'
=>
$payments
,
'payments'
=>
$payments
,
'totalPaid'
=>
$totalPaid
,
'totalPaid'
=>
$totalPaid
,
'notes'
=>
$notes
,
'notes'
=>
$notes
,
'formFee'
=>
$formFee
,
'formFee'
=>
$formFee
,
'formFilled'
=>
$formFilled
,
'formFilled'
=>
$formFilled
,
'formFeePaid'
=>
$formFeePaid
,
'formFeePayment'
=>
$formFeePayment
,
]);
]);
}
}
/**
* Pay form fee — quick inline payment
*/
public
function
payFormFee
(
Request
$request
,
string
$id
)
:
Response
{
$db
=
App
::
getInstance
()
->
db
();
$member
=
Member
::
find
((
int
)
$id
);
if
(
!
$member
||
$member
->
is_archived
)
{
return
$this
->
redirect
(
'/members'
)
->
withError
(
'العضو غير موجود'
);
}
// Check if already paid
$existing
=
$db
->
selectOne
(
"SELECT id FROM payments WHERE member_id = ? AND payment_type = 'form_fee' AND is_voided = 0"
,
[(
int
)
$id
]
);
if
(
$existing
)
{
return
$this
->
redirect
(
'/members/'
.
$id
)
->
withError
(
'رسوم الاستمارة مدفوعة بالفعل'
);
}
$formFee
=
FormNumberGenerator
::
getFormFee
();
$employee
=
App
::
getInstance
()
->
currentEmployee
();
$paymentMethod
=
trim
((
string
)
$request
->
post
(
'payment_method'
,
'cash'
));
$db
->
beginTransaction
();
try
{
// Create receipt number
$year
=
date
(
'Y'
);
$prefix
=
'REC-'
.
$year
.
'-'
;
$lastReceipt
=
$db
->
selectOne
(
"SELECT receipt_number FROM receipts WHERE receipt_number LIKE ? ORDER BY id DESC LIMIT 1"
,
[
$prefix
.
'%'
]
);
if
(
$lastReceipt
)
{
$parts
=
explode
(
'-'
,
$lastReceipt
[
'receipt_number'
]);
$seq
=
(
int
)
end
(
$parts
)
+
1
;
}
else
{
$seq
=
1
;
}
$receiptNumber
=
$prefix
.
str_pad
((
string
)
$seq
,
6
,
'0'
,
STR_PAD_LEFT
);
// Create payment
$paymentId
=
$db
->
insert
(
'payments'
,
[
'member_id'
=>
(
int
)
$id
,
'payment_type'
=>
'form_fee'
,
'amount'
=>
$formFee
,
'currency'
=>
'EGP'
,
'payment_method'
=>
$paymentMethod
,
'payment_date'
=>
date
(
'Y-m-d'
),
'received_by_employee_id'
=>
$employee
?
(
int
)
$employee
->
id
:
null
,
'related_entity_type'
=>
'members'
,
'related_entity_id'
=>
(
int
)
$id
,
'notes'
=>
'رسوم استمارة عضوية رقم '
.
(
$member
->
form_number
??
''
),
'is_voided'
=>
0
,
'created_at'
=>
date
(
'Y-m-d H:i:s'
),
'updated_at'
=>
date
(
'Y-m-d H:i:s'
),
'created_by'
=>
$employee
?
(
int
)
$employee
->
id
:
null
,
]);
// Create receipt
$receiptId
=
$db
->
insert
(
'receipts'
,
[
'receipt_number'
=>
$receiptNumber
,
'member_id'
=>
(
int
)
$id
,
'payment_id'
=>
$paymentId
,
'receipt_type'
=>
'payment'
,
'amount'
=>
$formFee
,
'amount_in_words_ar'
=>
number_to_arabic_words
((
float
)
$formFee
),
'description_ar'
=>
'رسوم استمارة عضوية رقم '
.
(
$member
->
form_number
??
''
),
'issued_by_employee_id'
=>
$employee
?
(
int
)
$employee
->
id
:
null
,
'issued_at'
=>
date
(
'Y-m-d H:i:s'
),
'is_voided'
=>
0
,
'print_count'
=>
0
,
'created_at'
=>
date
(
'Y-m-d H:i:s'
),
]);
// Link receipt to payment
$db
->
update
(
'payments'
,
[
'receipt_id'
=>
$receiptId
],
'`id` = ?'
,
[
$paymentId
]);
$db
->
commit
();
EventBus
::
dispatch
(
'payment.completed'
,
[
'payment_id'
=>
$paymentId
,
'receipt_id'
=>
$receiptId
,
'member_id'
=>
(
int
)
$id
,
'type'
=>
'form_fee'
,
'amount'
=>
$formFee
,
]);
return
$this
->
redirect
(
'/members/'
.
$id
)
->
withSuccess
(
'تم دفع رسوم الاستمارة '
.
money
(
$formFee
)
.
' — إيصال رقم: '
.
$receiptNumber
.
' — يمكنك الآن ملء الاستمارة'
);
}
catch
(
\Throwable
$e
)
{
$db
->
rollBack
();
return
$this
->
redirect
(
'/members/'
.
$id
)
->
withError
(
'فشل تسجيل الدفع: '
.
$e
->
getMessage
());
}
}
/**
* Fill form — BLOCKED if form fee not paid
*/
public
function
fillForm
(
Request
$request
,
string
$id
)
:
Response
public
function
fillForm
(
Request
$request
,
string
$id
)
:
Response
{
{
$db
=
App
::
getInstance
()
->
db
();
$db
=
App
::
getInstance
()
->
db
();
...
@@ -298,6 +407,16 @@ class MemberController extends Controller
...
@@ -298,6 +407,16 @@ class MemberController extends Controller
return
$this
->
redirect
(
'/members'
)
->
withError
(
'العضو غير موجود'
);
return
$this
->
redirect
(
'/members'
)
->
withError
(
'العضو غير موجود'
);
}
}
// CHECK: Form fee must be paid
$formFeePaid
=
$db
->
selectOne
(
"SELECT id FROM payments WHERE member_id = ? AND payment_type = 'form_fee' AND is_voided = 0 LIMIT 1"
,
[(
int
)
$id
]
);
if
(
!
$formFeePaid
)
{
return
$this
->
redirect
(
'/members/'
.
$id
)
->
withError
(
'⚠ يجب دفع رسوم الاستمارة ('
.
money
(
FormNumberGenerator
::
getFormFee
())
.
') قبل ملء البيانات'
);
}
$branches
=
$db
->
select
(
"SELECT id, name_ar FROM branches WHERE is_active = 1 ORDER BY name_ar"
);
$branches
=
$db
->
select
(
"SELECT id, name_ar FROM branches WHERE is_active = 1 ORDER BY name_ar"
);
$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"
);
$governorates
=
$db
->
select
(
"SELECT code, name_ar FROM governorates WHERE is_active = 1 ORDER BY name_ar"
);
$governorates
=
$db
->
select
(
"SELECT code, name_ar FROM governorates WHERE is_active = 1 ORDER BY name_ar"
);
...
@@ -320,10 +439,19 @@ class MemberController extends Controller
...
@@ -320,10 +439,19 @@ class MemberController extends Controller
return
$this
->
redirect
(
'/members'
)
->
withError
(
'العضو غير موجود'
);
return
$this
->
redirect
(
'/members'
)
->
withError
(
'العضو غير موجود'
);
}
}
// CHECK: Form fee must be paid
$formFeePaid
=
$db
->
selectOne
(
"SELECT id FROM payments WHERE member_id = ? AND payment_type = 'form_fee' AND is_voided = 0 LIMIT 1"
,
[(
int
)
$id
]
);
if
(
!
$formFeePaid
)
{
return
$this
->
redirect
(
'/members/'
.
$id
)
->
withError
(
'⚠ يجب دفع رسوم الاستمارة قبل ملء البيانات'
);
}
$data
=
$request
->
all
();
$data
=
$request
->
all
();
unset
(
$data
[
'_csrf_token'
]);
unset
(
$data
[
'_csrf_token'
]);
// Build update array — only update non-empty fields
$updateFields
=
[
$updateFields
=
[
'full_name_en'
,
'place_of_birth'
,
'nationality'
,
'religion'
,
'full_name_en'
,
'place_of_birth'
,
'nationality'
,
'religion'
,
'qualification_id'
,
'marital_status'
,
'id_issue_date'
,
'id_expiry_date'
,
'qualification_id'
,
'marital_status'
,
'id_issue_date'
,
'id_expiry_date'
,
...
@@ -344,7 +472,6 @@ class MemberController extends Controller
...
@@ -344,7 +472,6 @@ class MemberController extends Controller
}
}
}
}
// Handle qualification_id as integer
if
(
isset
(
$update
[
'qualification_id'
]))
{
if
(
isset
(
$update
[
'qualification_id'
]))
{
$update
[
'qualification_id'
]
=
$update
[
'qualification_id'
]
?
(
int
)
$update
[
'qualification_id'
]
:
null
;
$update
[
'qualification_id'
]
=
$update
[
'qualification_id'
]
?
(
int
)
$update
[
'qualification_id'
]
:
null
;
}
}
...
@@ -366,7 +493,6 @@ class MemberController extends Controller
...
@@ -366,7 +493,6 @@ class MemberController extends Controller
}
catch
(
\Throwable
$e
)
{}
}
catch
(
\Throwable
$e
)
{}
}
}
// Update status to under_review if still potential
if
(
$member
->
status
===
'potential'
)
{
if
(
$member
->
status
===
'potential'
)
{
$update
[
'status'
]
=
'under_review'
;
$update
[
'status'
]
=
'under_review'
;
}
}
...
...
app/Modules/Members/Routes.php
View file @
a2cdc876
...
@@ -3,20 +3,23 @@ declare(strict_types=1);
...
@@ -3,20 +3,23 @@ declare(strict_types=1);
return
[
return
[
// Member CRUD
// Member CRUD
[
'GET'
,
'/members'
,
'Members\Controllers\MemberController@index'
,
[
'auth'
],
'member.view'
],
[
'GET'
,
'/members'
,
'Members\Controllers\MemberController@index'
,
[
'auth'
],
'member.view'
],
[
'GET'
,
'/members/create'
,
'Members\Controllers\MemberController@create'
,
[
'auth'
],
'member.create'
],
[
'GET'
,
'/members/create'
,
'Members\Controllers\MemberController@create'
,
[
'auth'
],
'member.create'
],
[
'POST'
,
'/members'
,
'Members\Controllers\MemberController@store'
,
[
'auth'
],
'member.create'
],
[
'POST'
,
'/members'
,
'Members\Controllers\MemberController@store'
,
[
'auth'
],
'member.create'
],
[
'GET'
,
'/members/search'
,
'Members\Controllers\MemberController@search'
,
[
'auth'
],
'member.view'
],
[
'GET'
,
'/members/search'
,
'Members\Controllers\MemberController@search'
,
[
'auth'
],
'member.view'
],
[
'GET'
,
'/members/{id}'
,
'Members\Controllers\MemberController@show'
,
[
'auth'
],
'member.view'
],
[
'GET'
,
'/members/{id}'
,
'Members\Controllers\MemberController@show'
,
[
'auth'
],
'member.view'
],
[
'GET'
,
'/members/{id}/edit'
,
'Members\Controllers\MemberController@edit'
,
[
'auth'
],
'member.edit'
],
[
'GET'
,
'/members/{id}/edit'
,
'Members\Controllers\MemberController@edit'
,
[
'auth'
],
'member.edit'
],
[
'POST'
,
'/members/{id}'
,
'Members\Controllers\MemberController@update'
,
[
'auth'
],
'member.edit'
],
[
'POST'
,
'/members/{id}'
,
'Members\Controllers\MemberController@update'
,
[
'auth'
],
'member.edit'
],
[
'POST'
,
'/members/{id}/status'
,
'Members\Controllers\MemberController@changeStatus'
,[
'auth'
],
'member.change_status'
],
[
'POST'
,
'/members/{id}/status'
,
'Members\Controllers\MemberController@changeStatus'
,
[
'auth'
],
'member.change_status'
],
// Fill Form (استمارة)
// Form fee payment
[
'GET'
,
'/members/{id}/fill-form'
,
'Members\Controllers\MemberController@fillForm'
,
[
'auth'
],
'member.edit'
],
[
'POST'
,
'/members/{id}/pay-form-fee'
,
'Members\Controllers\MemberController@payFormFee'
,
[
'auth'
],
'member.edit'
],
[
'POST'
,
'/members/{id}/fill-form'
,
'Members\Controllers\MemberController@saveFillForm'
,[
'auth'
],
'member.edit'
],
// Fill Form (استمارة) — blocked until form fee paid
[
'GET'
,
'/members/{id}/fill-form'
,
'Members\Controllers\MemberController@fillForm'
,
[
'auth'
],
'member.edit'
],
[
'POST'
,
'/members/{id}/fill-form'
,
'Members\Controllers\MemberController@saveFillForm'
,
[
'auth'
],
'member.edit'
],
// API endpoints
// API endpoints
[
'POST'
,
'/api/members/parse-nid'
,
'Members\Controllers\MemberApiController@parseNid'
,
[
'auth'
],
'member.create'
],
[
'POST'
,
'/api/members/parse-nid'
,
'Members\Controllers\MemberApiController@parseNid'
,
[
'auth'
],
'member.create'
],
[
'POST'
,
'/api/members/search'
,
'Members\Controllers\MemberApiController@search'
,
[
'auth'
],
'member.view'
],
[
'POST'
,
'/api/members/search'
,
'Members\Controllers\MemberApiController@search'
,
[
'auth'
],
'member.view'
],
];
];
\ No newline at end of file
app/Modules/Members/Views/show.php
View file @
a2cdc876
...
@@ -13,27 +13,73 @@ $statusLabel = $member->getStatusLabel();
...
@@ -13,27 +13,73 @@ $statusLabel = $member->getStatusLabel();
$statusColor
=
$member
->
getStatusColor
();
$statusColor
=
$member
->
getStatusColor
();
?>
?>
<!-- Form Not Filled Banner -->
<!-- ══════════════════════════════════════════════════════ -->
<?php
if
(
!
$formFilled
&&
in_array
(
$member
->
status
,
[
'potential'
]))
:
?>
<!-- STEP 1: Form Fee Not Paid — BIG RED BLOCKER -->
<div
class=
"card"
style=
"margin-bottom:20px;padding:25px;background:linear-gradient(135deg, #FFF7ED, #FEF3C7);border:2px solid #F59E0B;"
>
<!-- ══════════════════════════════════════════════════════ -->
<?php
if
(
!
$formFeePaid
&&
$member
->
status
===
'potential'
)
:
?>
<div
class=
"card"
style=
"margin-bottom:20px;padding:30px;background:linear-gradient(135deg, #FEF2F2, #FEE2E2);border:2px solid #DC2626;"
>
<div
style=
"text-align:center;margin-bottom:20px;"
>
<div
style=
"font-size:48px;"
>
🔒
</div>
<h2
style=
"color:#DC2626;margin:10px 0 5px;"
>
يجب دفع رسوم الاستمارة أولاً
</h2>
<p
style=
"color:#6B7280;font-size:14px;margin:0;"
>
لا يمكن ملء بيانات الاستمارة قبل دفع الرسوم
</p>
</div>
<div
style=
"max-width:500px;margin:0 auto;background:#fff;border-radius:12px;padding:25px;box-shadow:0 4px 12px rgba(0,0,0,0.1);"
>
<table
style=
"width:100%;font-size:15px;margin-bottom:20px;"
>
<tr>
<td
style=
"padding:8px 0;color:#6B7280;"
>
رقم الاستمارة
</td>
<td
style=
"padding:8px 0;text-align:left;font-weight:700;font-size:20px;color:#0D7377;"
>
<?=
e
(
$member
->
form_number
??
'—'
)
?>
</td>
</tr>
<tr>
<td
style=
"padding:8px 0;color:#6B7280;"
>
اسم العضو
</td>
<td
style=
"padding:8px 0;text-align:left;font-weight:600;"
>
<?=
e
(
$member
->
full_name_ar
)
?>
</td>
</tr>
<tr>
<td
style=
"padding:8px 0;color:#6B7280;"
>
رسوم الاستمارة
</td>
<td
style=
"padding:8px 0;text-align:left;font-weight:700;font-size:24px;color:#DC2626;"
>
<?=
money
(
$formFee
)
?>
</td>
</tr>
</table>
<form
method=
"POST"
action=
"/members/
<?=
(
int
)
$member
->
id
?>
/pay-form-fee"
>
<?=
csrf_field
()
?>
<div
class=
"form-group"
style=
"margin-bottom:15px;"
>
<label
class=
"form-label"
>
طريقة الدفع
</label>
<select
name=
"payment_method"
class=
"form-select"
style=
"font-size:16px;"
>
<option
value=
"cash"
>
نقدي 💵
</option>
<option
value=
"visa"
>
فيزا / بطاقة 💳
</option>
<option
value=
"bank_transfer"
>
تحويل بنكي 🏦
</option>
</select>
</div>
<button
type=
"submit"
class=
"btn btn-primary"
style=
"width:100%;padding:15px;font-size:18px;background:#059669;border-color:#059669;"
onclick=
"return confirm('تأكيد دفع رسوم الاستمارة
<?=
e
(
money
(
$formFee
))
?>
؟')"
>
💰 تسجيل دفع رسوم الاستمارة
</button>
</form>
</div>
</div>
<!-- ══════════════════════════════════════════════════════ -->
<!-- STEP 2: Fee Paid but Form Not Filled -->
<!-- ══════════════════════════════════════════════════════ -->
<?php
elseif
(
$formFeePaid
&&
!
$formFilled
&&
in_array
(
$member
->
status
,
[
'potential'
,
'under_review'
]))
:
?>
<div
class=
"card"
style=
"margin-bottom:20px;padding:25px;background:linear-gradient(135deg, #F0FDF4, #DCFCE7);border:2px solid #059669;"
>
<div
style=
"display:flex;justify-content:space-between;align-items:center;"
>
<div
style=
"display:flex;justify-content:space-between;align-items:center;"
>
<div>
<div>
<h3
style=
"color:#D97706;margin:0 0 8px;"
>
📋 الاستمارة لم تُملأ بعد
</h3>
<h3
style=
"color:#059669;margin:0 0 8px;"
>
✅ تم دفع رسوم الاستمارة — جاهز لملء البيانات
</h3>
<p
style=
"color:#92400E;margin:0;font-size:14px;"
>
<p
style=
"color:#6B7280;margin:0;font-size:14px;"
>
استمارة رقم
<strong
style=
"font-size:18px;"
>
<?=
e
(
$member
->
form_number
)
?>
</strong>
استمارة رقم
<strong
style=
"font-size:18px;color:#0D7377;"
>
<?=
e
(
$member
->
form_number
)
?>
</strong>
— رسوم الاستمارة:
<strong>
<?=
money
(
$formFee
)
?>
</strong>
— إيصال:
<strong>
<?=
e
(
$formFeePayment
[
'receipt_number'
]
??
'—'
)
?>
</strong>
— المبلغ:
<strong>
<?=
money
(
$formFee
)
?>
</strong>
</p>
</p>
<p
style=
"color:#6B7280;margin:8px 0 0;font-size:13px;"
>
يجب دفع رسوم الاستمارة ثم ملء باقي البيانات
</p>
</div>
</div>
<a
href=
"/members/
<?=
(
int
)
$member
->
id
?>
/fill-form"
class=
"btn btn-primary"
style=
"padding:15px 30px;font-size:1
6px;background:#D97706;border-color:#D97706
;"
>
<a
href=
"/members/
<?=
(
int
)
$member
->
id
?>
/fill-form"
class=
"btn btn-primary"
style=
"padding:15px 30px;font-size:1
8px
;"
>
📝 ملء الاستمارة
📝 ملء الاستمارة
الآن
</a>
</a>
</div>
</div>
</div>
</div>
<?php
endif
;
?>
<?php
endif
;
?>
<!-- Member Header Card -->
<!-- Member Header Card -->
<div
class=
"card"
style=
"margin-bottom:20px;
overflow:visible;
"
>
<div
class=
"card"
style=
"margin-bottom:20px;"
>
<div
style=
"padding:25px;"
>
<div
style=
"padding:25px;"
>
<div
style=
"display:flex;justify-content:space-between;align-items:start;"
>
<div
style=
"display:flex;justify-content:space-between;align-items:start;"
>
<div>
<div>
...
@@ -51,6 +97,11 @@ $statusColor = $member->getStatusColor();
...
@@ -51,6 +97,11 @@ $statusColor = $member->getStatusColor();
<?php
if
(
$member
->
age_years
)
:
?>
<?php
if
(
$member
->
age_years
)
:
?>
<span>
🎂
<?=
(
int
)
$member
->
age_years
?>
سنة
</span>
<span>
🎂
<?=
(
int
)
$member
->
age_years
?>
سنة
</span>
<?php
endif
;
?>
<?php
endif
;
?>
<?php
if
(
$formFeePaid
)
:
?>
<span
style=
"color:#059669;"
>
✅ الرسوم مدفوعة
</span>
<?php
else
:
?>
<span
style=
"color:#DC2626;"
>
❌ الرسوم غير مدفوعة
</span>
<?php
endif
;
?>
</div>
</div>
</div>
</div>
<div
style=
"text-align:left;"
>
<div
style=
"text-align:left;"
>
...
@@ -105,23 +156,24 @@ $statusColor = $member->getStatusColor();
...
@@ -105,23 +156,24 @@ $statusColor = $member->getStatusColor();
<div
style=
"color:#6B7280;font-size:12px;"
>
إجمالي المدفوع
</div>
<div
style=
"color:#6B7280;font-size:12px;"
>
إجمالي المدفوع
</div>
</div>
</div>
</div>
</div>
<a
href=
"/payments/member/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
style=
"width:100%;text-align:center;"
>
عرض كل المدفوعات
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Quick Actions -->
<!-- Quick Actions -->
<div
class=
"card"
style=
"margin-bottom:20px;padding:15px;"
>
<div
class=
"card"
style=
"margin-bottom:20px;padding:15px;"
>
<h4
style=
"margin:0 0 10px;color:#6B7280;font-size:13px;"
>
إجراءات سريعة
</h4>
<div
style=
"display:flex;gap:10px;flex-wrap:wrap;"
>
<div
style=
"display:flex;gap:10px;flex-wrap:wrap;"
>
<?php
if
(
!
$formFilled
&&
$member
->
status
===
'potential'
)
:
?>
<?php
if
(
$formFeePaid
&&
!
$formFilled
)
:
?>
<a
href=
"/members/
<?=
(
int
)
$member
->
id
?>
/fill-form"
class=
"btn btn-primary"
>
📝 ملء الاستمارة
</a>
<a
href=
"/members/
<?=
(
int
)
$member
->
id
?>
/fill-form"
class=
"btn btn-primary"
>
📝 ملء الاستمارة
</a>
<?php
endif
;
?>
<?php
endif
;
?>
<a
href=
"/members/
<?=
(
int
)
$member
->
id
?>
/spouses/create"
class=
"btn btn-outline"
>
💍 إضافة زوج/ة
</a>
<?php
if
(
$formFilled
)
:
?>
<a
href=
"/members/
<?=
(
int
)
$member
->
id
?>
/children/create"
class=
"btn btn-outline"
>
👶 إضافة ابن/ة
</a>
<a
href=
"/members/
<?=
(
int
)
$member
->
id
?>
/spouses/create"
class=
"btn btn-outline"
>
💍 إضافة زوج/ة
</a>
<a
href=
"/payments/process/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
💰 تسجيل دفعة
</a>
<a
href=
"/members/
<?=
(
int
)
$member
->
id
?>
/children/create"
class=
"btn btn-outline"
>
👶 إضافة ابن/ة
</a>
<a
href=
"/documents/upload/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
📁 رفع مستندات
</a>
<a
href=
"/documents/upload/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
📁 رفع مستندات
</a>
<a
href=
"/interviews/schedule/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
🗓️ تحديد مقابلة
</a>
<a
href=
"/interviews/schedule/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
🗓️ تحديد مقابلة
</a>
<a
href=
"/installments/create/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
📅 خطة تقسيط
</a>
<a
href=
"/installments/create/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
📅 خطة تقسيط
</a>
<?php
endif
;
?>
<?php
if
(
$member
->
status
===
'active'
)
:
?>
<?php
if
(
$member
->
status
===
'active'
)
:
?>
<a
href=
"/carnets/issue/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
🪪 إصدار كارنيه
</a>
<a
href=
"/carnets/issue/
<?=
(
int
)
$member
->
id
?>
"
class=
"btn btn-outline"
>
🪪 إصدار كارنيه
</a>
<?php
endif
;
?>
<?php
endif
;
?>
...
@@ -226,21 +278,4 @@ $statusColor = $member->getStatusColor();
...
@@ -226,21 +278,4 @@ $statusColor = $member->getStatusColor();
</div>
</div>
</div>
</div>
<!-- Notes -->
<?php
if
(
!
empty
(
$notes
))
:
?>
<div
class=
"card"
>
<div
style=
"padding:15px 20px;border-bottom:1px solid #E5E7EB;"
>
<h3
style=
"margin:0;color:#0D7377;font-size:15px;"
>
📝 الملاحظات
</h3>
</div>
<div
style=
"padding:15px 20px;"
>
<?php
foreach
(
$notes
as
$note
)
:
?>
<div
style=
"padding:10px 0;border-bottom:1px solid #F3F4F6;"
>
<div
style=
"font-size:13px;"
>
<?=
nl2br
(
e
(
$note
[
'note_text'
]))
?>
</div>
<div
style=
"font-size:11px;color:#9CA3AF;margin-top:5px;"
>
<?=
e
(
$note
[
'employee_name'
]
??
'النظام'
)
?>
—
<?=
e
(
$note
[
'created_at'
])
?>
</div>
</div>
<?php
endforeach
;
?>
</div>
</div>
<?php
endif
;
?>
<?php
$__template
->
endSection
();
?>
<?php
$__template
->
endSection
();
?>
\ No newline at end of file
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