Commit 3af8e795 authored by Fares's avatar Fares

feat(members): unified insurance record showing all procedures

The السجل التأميني page now shows a complete record of ALL procedures
that affected a membership — death cases, waiver transfers, and
transfer/separation requests. Works for both active and archived members.

Shows: procedure details, role (source/target), fees, approval info,
payments related to procedures, death audit timeline, archive snapshots.
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 08335cb4
...@@ -879,16 +879,82 @@ class MemberController extends Controller ...@@ -879,16 +879,82 @@ class MemberController extends Controller
$this->authorize('member.view'); $this->authorize('member.view');
$db = App::getInstance()->db(); $db = App::getInstance()->db();
$member = $db->selectOne("SELECT id, full_name_ar, membership_number, status, is_archived FROM members WHERE id = ?", [(int) $id]); $member = $db->selectOne("SELECT * FROM members WHERE id = ?", [(int) $id]);
if (!$member) return $this->redirect('/members')->withError('العضو غير موجود'); if (!$member) return $this->redirect('/members')->withError('العضو غير موجود');
$cases = \App\Modules\Death\Services\DeathAuditService::getCasesForMember((int) $id); $memberId = (int) $id;
$auditLogs = \App\Modules\Death\Services\DeathAuditService::getForMember((int) $id);
// Death cases (as source or target)
$deathCases = $db->select(
"SELECT dc.*, m.full_name_ar as member_name, m.membership_number as member_number,
tm.full_name_ar as target_member_name
FROM death_cases dc
JOIN members m ON m.id = dc.member_id
LEFT JOIN members tm ON tm.id = dc.transferred_to_member_id
WHERE dc.member_id = ? OR dc.transferred_to_member_id = ?
ORDER BY dc.created_at DESC",
[$memberId, $memberId]
);
// Waiver requests (as source or target)
$waiverRequests = $db->select(
"SELECT wr.*, sm.full_name_ar as source_member_name, sm.membership_number as source_number,
tm.full_name_ar as target_member_name, tm.membership_number as target_number,
e.full_name_ar as approved_by_name
FROM waiver_requests wr
JOIN members sm ON sm.id = wr.source_member_id
LEFT JOIN members tm ON tm.id = wr.target_member_id
LEFT JOIN employees e ON e.id = wr.approved_by
WHERE wr.source_member_id = ? OR wr.target_member_id = ?
ORDER BY wr.created_at DESC",
[$memberId, $memberId]
);
// Transfer requests (as source or target)
$transferRequests = $db->select(
"SELECT tr.*, sm.full_name_ar as source_member_name, sm.membership_number as source_number,
tm.full_name_ar as target_member_name, tm.membership_number as target_number,
e.full_name_ar as approved_by_name
FROM transfer_requests tr
JOIN members sm ON sm.id = tr.source_member_id
LEFT JOIN members tm ON tm.id = tr.target_member_id
LEFT JOIN employees e ON e.id = tr.approved_by
WHERE tr.source_member_id = ? OR tr.target_member_id = ?
ORDER BY tr.created_at DESC",
[$memberId, $memberId]
);
// Death audit logs (detailed steps)
$deathAuditLogs = \App\Modules\Death\Services\DeathAuditService::getForMember($memberId);
// Payments related to all procedures
$procedurePayments = $db->select(
"SELECT p.*, pr.payment_type as request_type, pr.description_ar as request_description
FROM payments p
LEFT JOIN payment_requests pr ON pr.id = p.payment_request_id
WHERE p.member_id = ? AND p.is_voided = 0
AND (p.payment_type IN ('death_fee','waiver_fee','transfer_fee','separation_fee')
OR pr.payment_type IN ('death_fee','waiver_fee','transfer_fee','separation_fee'))
ORDER BY p.payment_date DESC",
[$memberId]
);
// Archive snapshots for this member
$snapshots = $db->select(
"SELECT id, snapshot_reason, membership_number, snapshot_taken_at, created_by
FROM archive_snapshots WHERE entity_type = 'members' AND entity_id = ?
ORDER BY snapshot_taken_at DESC",
[$memberId]
);
return $this->view('Members.Views.insurance-record', [ return $this->view('Members.Views.insurance-record', [
'member' => (object) $member, 'member' => (object) $member,
'cases' => $cases, 'deathCases' => $deathCases,
'auditLogs' => $auditLogs, 'waiverRequests' => $waiverRequests,
'transferRequests' => $transferRequests,
'deathAuditLogs' => $deathAuditLogs,
'procedurePayments' => $procedurePayments,
'snapshots' => $snapshots,
]); ]);
} }
} }
\ No newline at end of file
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