From 060f41ada60ce1064ca522de32a03e9afe68830d Mon Sep 17 00:00:00 2001 From: armiejean Date: Fri, 16 May 2025 12:31:02 +0800 Subject: [PATCH] member management functionality works --- app/Http/Controllers/CardMemberController.php | 173 ++++++++++++++++-- .../card-member-component.blade.php | 14 +- .../views/pages/card-member-view.blade.php | 2 +- .../views/pages/locked-account-view.blade.php | 44 +++++ .../locked-accounts.blade.php | 65 ++++--- routes/web.php | 7 +- 6 files changed, 255 insertions(+), 50 deletions(-) create mode 100644 resources/views/pages/locked-account-view.blade.php diff --git a/app/Http/Controllers/CardMemberController.php b/app/Http/Controllers/CardMemberController.php index 55c0a9d..dfe0dc0 100644 --- a/app/Http/Controllers/CardMemberController.php +++ b/app/Http/Controllers/CardMemberController.php @@ -60,24 +60,20 @@ class CardMemberController extends Controller $total = $json['meta']['total'] ?? count($members); $lastPage = $json['meta']['last_page'] ?? ceil($total / $pageSize); - - return view('pages.member management.card-member', [ - 'members' => $members, - 'currentPage' => $page, - 'lastPage' => $lastPage, - 'total' => $total, - 'search' => $search, - ]); } else { Log::warning('No card member data found or invalid API response: ', $json); - return view('pages.member management.card-member', [ - 'members' => [], - 'currentPage' => 1, - 'lastPage' => 1, - 'total' => 0, - 'search' => $search, - ]); + $members = []; + $total = 0; + $lastPage = 1; } + + return view('pages.member management.card-member', [ + 'members' => $members, + 'currentPage' => $page, + 'lastPage' => $lastPage, + 'total' => $total, + 'search' => $search, + ]); } catch (\Exception $e) { Log::error('Error fetching card member data: ' . $e->getMessage()); return view('pages.member management.card-member', [ @@ -89,4 +85,151 @@ class CardMemberController extends Controller ]); } } + + public function lockedAccounts(Request $request) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + Log::info('No access token found, redirecting to login from locked-account'); + return redirect()->route('login')->with('error', 'Please log in to view locked accounts.'); + } + + $page = $request->input('page', 1); + $pageSize = 5; // Fixed at 5 per page as per sample + $search = $request->input('_search', null); + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cms/member", [ + 'page' => $page, + 'page_size' => $pageSize, + '_search' => $search, + '_locked' => 1, // Fetch only locked accounts + ]); + + if ($response->status() === 401 || $response->status() === 403) { + Log::warning('Unauthorized or Forbidden API response: ', $response->json()); + return redirect()->route('login')->with('error', 'Your session has expired. Please log in again.'); + } + + $json = $response->json(); + + Log::info("Locked Account API Response (Page {$page}): ", $json); + + if ($response->successful() && isset($json['data']) && is_array($json['data'])) { + $members = array_map(function ($member) { + Log::info('Processing locked account record: ', $member); + return [ + 'id' => $member['lcard_uuid'] ?? null, + 'cardNumber' => $member['card_number'] ?? '', + 'firstName' => $member['firstname'] ?? '', + 'lastName' => $member['lastname'] ?? '', + 'birthday' => $member['birthdate'] ?? '', + 'cardType' => $member['card_type'] ?? '', + 'status' => $member['is_validated'] ? 'Active' : 'Inactive', + ]; + }, $json['data']); + + $total = $json['meta']['total'] ?? count($members); + $lastPage = $json['meta']['last_page'] ?? ceil($total / $pageSize); + } else { + Log::warning('No locked account data found or invalid API response: ', $json); + $members = []; + $total = 0; + $lastPage = 1; + } + + return view('pages.member management.locked-account', [ + 'members' => $members, + 'currentPage' => $page, + 'lastPage' => $lastPage, + 'total' => $total, + 'search' => $search, + ]); + } catch (\Exception $e) { + Log::error('Error fetching locked account data: ' . $e->getMessage()); + return view('pages.member management.locked-account', [ + 'members' => [], + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, + 'search' => $search, + ]); + } + } + + public function show($uuid) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to view a card member.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cms/member/{$uuid}"); + + $json = $response->json(); + + if ($response->successful() && isset($json['data'])) { + $member = [ + 'id' => $json['data']['lcard_uuid'] ?? null, + 'cardNumber' => $json['data']['card_number'] ?? '', + 'firstName' => $json['data']['firstname'] ?? '', + 'lastName' => $json['data']['lastname'] ?? '', + 'birthday' => $json['data']['birthdate'] ?? '', + 'cardType' => $json['data']['card_type'] ?? '', + 'status' => $json['data']['is_validated'] ? 'Active' : 'Inactive', + ]; + + // Determine the view based on the referring route + $previousUrl = url()->previous(); + if (str_contains($previousUrl, 'locked-account')) { + return view('pages.locked-account-view', ['member' => $member]); + } + return view('pages.card-member-view', ['member' => $member]); + } else { + Log::warning('No card member found or invalid API response: ', $json); + return redirect()->back()->with('error', 'Card member not found.'); + } + } catch (\Exception $e) { + Log::error('Error fetching card member for view: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while loading the card member.'); + } + } + + public function activate($uuid) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + return redirect()->route('login')->with('error', 'Please log in to activate an account.'); + } + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->post("{$this->apiBaseUrl}/cms/memberActivate/{$uuid}"); + + if ($response->successful()) { + return redirect()->route('locked-account')->with('success', 'Account activated successfully.'); + } else { + Log::warning('Failed to activate account: ', $response->json()); + return redirect()->back()->with('error', $response->json()['message'] ?? 'Failed to activate account. Please try again.'); + } + } catch (\Exception $e) { + Log::error('Error activating account: ' . $e->getMessage()); + return redirect()->back()->with('error', 'An error occurred while activating the account.'); + } + } } \ No newline at end of file diff --git a/resources/views/components/card-member-component.blade.php b/resources/views/components/card-member-component.blade.php index 1803efe..7308826 100644 --- a/resources/views/components/card-member-component.blade.php +++ b/resources/views/components/card-member-component.blade.php @@ -257,8 +257,9 @@ rowHtml += ``; tableConfig.actions.forEach(action => { if (action === 'view') { + const route = tableConfig.pageTitle === 'Locked Account' ? 'locked-account.show' : 'card-member.show'; rowHtml += ` - + `; } @@ -279,13 +280,15 @@ if (!pagination) return; pagination.innerHTML = ''; + const routeName = tableConfig.pageTitle === 'Locked Account' ? 'locked-account.index' : 'card-member.index'; + const prevLi = document.createElement('li'); prevLi.className = `page-item ${currentPage === 1 ? 'disabled' : ''}`; prevLi.innerHTML = ``; prevLi.addEventListener('click', (e) => { e.preventDefault(); if (currentPage > 1) { - window.location.href = `{{ route('card-member.index') }}?page=${currentPage - 1}&_search=${tableConfig.search || ''}`; + window.location.href = `{{ route('') }}/${routeName}?page=${currentPage - 1}&_search=${tableConfig.search || ''}`; } }); pagination.appendChild(prevLi); @@ -296,7 +299,7 @@ li.innerHTML = `${i}`; li.addEventListener('click', (e) => { e.preventDefault(); - window.location.href = `{{ route('card-member.index') }}?page=${i}&_search=${tableConfig.search || ''}`; + window.location.href = `{{ route('') }}/${routeName}?page=${i}&_search=${tableConfig.search || ''}`; }); pagination.appendChild(li); } @@ -307,7 +310,7 @@ nextLi.addEventListener('click', (e) => { e.preventDefault(); if (currentPage < tableConfig.lastPage) { - window.location.href = `{{ route('card-member.index') }}?page=${currentPage + 1}&_search=${tableConfig.search || ''}`; + window.location.href = `{{ route('') }}/${routeName}?page=${currentPage + 1}&_search=${tableConfig.search || ''}`; } }); pagination.appendChild(nextLi); @@ -408,7 +411,8 @@ return; } const memberId = this.getAttribute('data-id'); - window.location.href = `{{ route('card-member.show', '') }}/${memberId}`; + const route = tableConfig.pageTitle === 'Locked Account' ? 'locked-account.show' : 'card-member.show'; + window.location.href = `{{ route('') }}/${route}/${memberId}`; }); }); } diff --git a/resources/views/pages/card-member-view.blade.php b/resources/views/pages/card-member-view.blade.php index a2b5b75..e471876 100644 --- a/resources/views/pages/card-member-view.blade.php +++ b/resources/views/pages/card-member-view.blade.php @@ -26,7 +26,7 @@
Status: {{ $member['status'] }}
- Back + Back @endsection \ No newline at end of file diff --git a/resources/views/pages/locked-account-view.blade.php b/resources/views/pages/locked-account-view.blade.php new file mode 100644 index 0000000..67e6b29 --- /dev/null +++ b/resources/views/pages/locked-account-view.blade.php @@ -0,0 +1,44 @@ +@extends('layouts.app') + +@section('page_title', 'View Locked Account') + +@section('content') +
+
+
View Locked Account
+
+
+ @if (session('error')) + + @endif +
+ Card Number: {{ $member['cardNumber'] }} +
+
+ First Name: {{ $member['firstName'] }} +
+
+ Last Name: {{ $member['lastName'] }} +
+
+ Birthday: {{ $member['birthday'] ? date('F d, Y', strtotime($member['birthday'])) : 'N/A' }} +
+
+ Card Type: {{ $member['cardType'] }} +
+
+ Status: {{ $member['status'] }} +
+
+ Back +
+ @csrf + +
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/member management/locked-accounts.blade.php b/resources/views/pages/member management/locked-accounts.blade.php index 2fce484..07e8a77 100644 --- a/resources/views/pages/member management/locked-accounts.blade.php +++ b/resources/views/pages/member management/locked-accounts.blade.php @@ -3,31 +3,42 @@ @section('page_title', 'Locked Account') @section('content') - @php - $members = [ - ['id' => 1, 'cardNumber' => '1234-5678-9012-3456', 'firstName' => 'John', 'lastName' => 'Doe', 'birthday' => '1990-05-15', 'cardType' => 'Gold', 'status' => 'Inactive'], - ['id' => 2, 'cardNumber' => '9876-5432-1098-7654', 'firstName' => 'Jane', 'lastName' => 'Smith', 'birthday' => '1985-11-22', 'cardType' => 'Silver', 'status' => 'Inactive'], - ['id' => 3, 'cardNumber' => '4567-8901-2345-6789', 'firstName' => 'Alice', 'lastName' => 'Johnson', 'birthday' => '1992-03-10', 'cardType' => 'Platinum', 'status' => 'Inactive'], - ['id' => 4, 'cardNumber' => '3210-9876-5432-1098', 'firstName' => 'Bob', 'lastName' => 'Brown', 'birthday' => '1988-07-30', 'cardType' => 'Gold', 'status' => 'Inactive'] - ]; - @endphp - - @include('components.table-component', [ - 'pageTitle' => 'Locked Account', - 'data' => $members, - 'columns' => [ - ['name' => 'Card Number', 'key' => 'cardNumber', 'sortable' => true], - ['name' => 'First Name', 'key' => 'firstName', 'sortable' => true], - ['name' => 'Last Name', 'key' => 'lastName', 'sortable' => true], - ['name' => 'Birthday', 'key' => 'birthday', 'sortable' => true], - ['name' => 'Card Type', 'key' => 'cardType', 'sortable' => true], - ['name' => 'Status', 'key' => 'status', 'sortable' => true] - ], - 'actions' => ['view'], - 'showAddButton' => false, - 'showCheckboxes' => false, - 'showBatchDelete' => false, - 'showEditModal' => false, - 'showViewModal' => true - ]) +
+ @if (session('success')) + + @endif + @if (session('error')) + + @endif + @include('components.table-component', [ + 'pageTitle' => 'Locked Account', + 'data' => $members ?? [], + 'columns' => [ + ['name' => 'Card Number', 'key' => 'cardNumber', 'sortable' => true], + ['name' => 'First Name', 'key' => 'firstName', 'sortable' => true], + ['name' => 'Last Name', 'key' => 'lastName', 'sortable' => true], + ['name' => 'Birthday', 'key' => 'birthday', 'sortable' => true], + ['name' => 'Card Type', 'key' => 'cardType', 'sortable' => true], + ['name' => 'Status', 'key' => 'status', 'sortable' => true] + ], + 'actions' => ['view'], + 'showAddButton' => false, + 'showCheckboxes' => false, + 'showBatchDelete' => false, + 'showEditModal' => false, + 'showViewModal' => true, + 'currentPage' => $currentPage ?? 1, + 'lastPage' => $lastPage ?? 1, + 'total' => $total ?? 0, + ]) +
+

No locked accounts found.

+
+
@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 2bbaf6f..7af9ada 100644 --- a/routes/web.php +++ b/routes/web.php @@ -183,6 +183,9 @@ Route::get('/notification', [NotificationController::class, 'index'])->name('not Route::get('/notification/create', [NotificationController::class, 'create'])->name('notification.create'); Route::post('/notification', [NotificationController::class, 'store'])->name('notification.store'); -//Card Member +//Member Management Route::get('/card-member', [CardMemberController::class, 'index'])->name('card-member'); -Route::get('/card-member/{uuid}', [CardMemberController::class, 'show'])->name('card-member.show'); \ No newline at end of file +Route::get('/locked-account', [CardMemberController::class, 'lockedAccounts'])->name('locked-account'); +Route::get('/card-member/{uuid}', [CardMemberController::class, 'show'])->name('card-member.show'); +Route::get('/locked-account/{uuid}', [CardMemberController::class, 'show'])->name('locked-account.show'); +Route::post('/locked-account/activate/{uuid}', [CardMemberController::class, 'activate'])->name('locked-account.activate'); \ No newline at end of file