From 2d920f245a171d6ff37458d3845dbe3945b6ff15 Mon Sep 17 00:00:00 2001 From: armiejean Date: Wed, 21 May 2025 00:03:38 +0800 Subject: [PATCH] locked-account data fetched --- .../Controllers/LockedAccountController.php | 182 ++++++++ .../card-member-component.blade.php | 2 +- .../locked-accounts-component.blade.php | 422 ++++++++++++++++++ .../locked-accounts.blade.php | 2 +- routes/web.php | 10 +- 5 files changed, 613 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controllers/LockedAccountController.php create mode 100644 resources/views/components/locked-accounts-component.blade.php diff --git a/app/Http/Controllers/LockedAccountController.php b/app/Http/Controllers/LockedAccountController.php new file mode 100644 index 0000000..2e26617 --- /dev/null +++ b/app/Http/Controllers/LockedAccountController.php @@ -0,0 +1,182 @@ + $request->all()]); + + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + Log::warning('No access token found, redirecting to login from locked-accounts'); + return redirect()->route('login')->with('error', 'Please log in to view locked accounts.'); + } + + Log::debug('Access token found', ['access_token' => $accessToken]); + + // Prepare query parameters + $params = [ + 'page' => $request->input('page', 1), + 'page_size' => $request->input('page_size', 5), // Match CardMemberController's default + '_search' => $request->input('_search', null), + 'status' => $request->input('status', null), + '_locked' => 1, + ]; + + Log::debug('Making API call to fetch locked accounts', [ + 'url' => "{$this->apiBaseUrl}/cms/member", + 'params' => $params, + ]); + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->get("{$this->apiBaseUrl}/cms/member", $params); + + Log::debug('API response received', [ + 'status' => $response->status(), + 'body' => $response->body(), + ]); + + if ($response->status() === 401 || $response->status() === 403) { + Log::warning('Unauthorized or Forbidden API response', ['response' => $response->json()]); + return redirect()->route('login')->with('error', 'Your session has expired. Please log in again.'); + } + + $json = $response->json(); + Log::info('Locked Accounts API Raw Response', ['response' => $json]); + + if ($response->successful() && isset($json['data']) && is_array($json['data'])) { + $accounts = array_map(function ($account) { + Log::info('Processing locked account record', ['account' => $account]); + return [ + 'id' => $account['lcard_uuid'] ?? null, + 'cardNumber' => $account['card_number'] ?? '', + 'firstName' => $account['firstname'] ?? '', + 'lastName' => $account['lastname'] ?? '', + 'birthday' => $account['birthdate'] ?? '', + 'cardType' => $account['card_type'] ?? '', + 'status' => $account['status'] ? 'Active' : 'Inactive', + 'is_locked' => $account['is_locked'] ?? 1, // Ensure locked status + ]; + }, $json['data']); + + $total = $json['meta']['total'] ?? count($accounts); + $lastPage = $json['meta']['last_page'] ?? ceil($total / $params['page_size']); + } else { + Log::warning('No locked account data found or invalid API response', ['response' => $json]); + $accounts = []; + $total = 0; + $lastPage = 1; + } + + Log::debug('Rendering view with data', [ + 'accounts' => $accounts, + 'currentPage' => $params['page'], + 'lastPage' => $lastPage, + 'total' => $total, + 'params' => $params, + ]); + + return view('pages.member management.locked-accounts', [ + 'members' => $accounts, // Match naming convention with CardMemberController + 'currentPage' => $params['page'], + 'lastPage' => $lastPage, + 'total' => $total, + 'search' => $params['_search'], + 'params' => $params, // Include params for view compatibility + ]); + } catch (\Exception $e) { + Log::error('Error in LockedAccountController index method', [ + 'message' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + ]); + return view('pages.member management.locked-accounts', [ + 'members' => [], + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, + 'search' => $params['_search'] ?? null, + 'params' => $params ?? [ + 'page' => 1, + 'page_size' => 5, + '_search' => null, + 'status' => null, + '_locked' => 1, + ], + ]); + } + } + + /** + * Activate a locked account. + * + * @param string $uuid + * @return \Illuminate\Http\RedirectResponse + */ + public function activate($uuid) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; + + if (!$accessToken) { + Log::warning('No access token found, redirecting to login from activate account'); + return redirect()->route('login')->with('error', 'Please log in to activate an account.'); + } + + Log::debug('Making API call to activate account', [ + 'url' => "{$this->apiBaseUrl}/cms/memberActivate/{$uuid}", + 'uuid' => $uuid, + ]); + + $response = Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->post("{$this->apiBaseUrl}/cms/memberActivate/{$uuid}"); + + Log::debug('Activate API response received', [ + 'status' => $response->status(), + 'body' => $response->body(), + ]); + + if ($response->successful()) { + return redirect()->route('locked-accounts')->with('success', 'Account activated successfully.'); + } else { + Log::warning('Failed to activate account', ['uuid' => $uuid, 'response' => $response->json()]); + return redirect()->route('locked-accounts')->with('error', $response->json()['message'] ?? 'Failed to activate account. Please try again.'); + } + } catch (\Exception $e) { + Log::error('Error activating account', [ + 'uuid' => $uuid, + 'message' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + ]); + return redirect()->route('locked-accounts')->with('error', 'An error occurred while activating the account.'); + } + } + + public function show() + { + return view('pages.locked-account-view'); + } +} \ 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 7a0dc67..956b139 100644 --- a/resources/views/components/card-member-component.blade.php +++ b/resources/views/components/card-member-component.blade.php @@ -282,7 +282,7 @@ if (!pagination) return; pagination.innerHTML = ''; - const routeName = tableConfig.pageTitle === 'Locked Account' ? '{{ route("locked-account") }}' : '{{ route("card-member") }}'; + const routeName = tableConfig.pageTitle === 'Locked Account' ? '{{ route("locked-accounts") }}' : '{{ route("card-member") }}'; const prevLi = document.createElement('li'); prevLi.className = `page-item ${currentPage === 1 ? 'disabled' : ''}`; diff --git a/resources/views/components/locked-accounts-component.blade.php b/resources/views/components/locked-accounts-component.blade.php new file mode 100644 index 0000000..956b139 --- /dev/null +++ b/resources/views/components/locked-accounts-component.blade.php @@ -0,0 +1,422 @@ +@props([ + 'pageTitle' => '', + 'data' => [], + 'columns' => [], + 'actions' => [], + 'showAddButton' => false, + 'addButtonUrl' => '#', + 'showCheckboxes' => false, + 'showBatchDelete' => false, + 'showEditModal' => false, + 'showViewModal' => false, + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, + 'viewRoute' => '', // New prop for the view route +]) + +
+
+
{{ $pageTitle }}
+ @if ($showAddButton) + + Add {{ $pageTitle }} + + @endif +
+
+
+ +
+
+
+ + + + +
+
+
+ +
+
+ + +
+ + + + @if ($showCheckboxes) + + @endif + @foreach ($columns as $index => $column) + + @endforeach + @if (!empty($actions)) + + @endif + + + +
+ + + {{ $column['name'] }} + @if ($column['sortable']) + + @endif + Action
+
+ + +
+ @if ($showBatchDelete) +
+ +
+ @endif + +
+
+ + + + + \ 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 db62902..592ad1f 100644 --- a/resources/views/pages/member management/locked-accounts.blade.php +++ b/resources/views/pages/member management/locked-accounts.blade.php @@ -16,7 +16,7 @@ @endif - @include('components.card-member-component', [ + @include('components.locked-accounts-component', [ 'pageTitle' => 'Locked Account', 'data' => $members ?? [], 'columns' => [ diff --git a/routes/web.php b/routes/web.php index b26874c..e4548d9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,6 +13,9 @@ use App\Http\Controllers\TermsAndPrivacyController; use App\Http\Controllers\CardTypeController; use App\Http\Controllers\ReportsController; use App\Http\Controllers\StationController; +use App\Http\Controllers\LockedAccountController; + + Route::get('/', function () { return redirect()->route('login'); @@ -163,9 +166,10 @@ Route::post('/notification', [NotificationController::class, 'store'])->name('no //Member Management Route::get('/card-member', [CardMemberController::class, 'index'])->name('card-member'); Route::get('/card-member/{uuid}', [CardMemberController::class, 'show'])->name('card-member.show'); -Route::get('/locked-account', [CardMemberController::class, 'lockedAccounts'])->name('locked-account'); -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'); +Route::get('/locked-accounts', [LockedAccountController::class, 'index'])->name('locked-accounts'); +Route::post('/locked-accounts/activate/{uuid}', [LockedAccountController::class, 'activate'])->name('locked-accounts.activate'); +Route::get('/locked-accounts/{uuid}', [LockedAccountController::class, 'show'])->name('locked-account.show'); + //Promotion Route::get('/promotions', [PromotionController::class, 'index'])->name('promotions'); Route::get('/promotions/create', [PromotionController::class, 'create'])->name('promotions.create');