diff --git a/app/Http/Controllers/CardMemberController.php b/app/Http/Controllers/CardMemberController.php new file mode 100644 index 0000000..55c0a9d --- /dev/null +++ b/app/Http/Controllers/CardMemberController.php @@ -0,0 +1,92 @@ +route('login')->with('error', 'Please log in to view card members.'); + } + + $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, + ]); + + 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("Card Member API Response (Page {$page}): ", $json); + + if ($response->successful() && isset($json['data']) && is_array($json['data'])) { + $members = array_map(function ($member) { + Log::info('Processing card member 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); + + 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, + ]); + } + } catch (\Exception $e) { + Log::error('Error fetching card member data: ' . $e->getMessage()); + return view('pages.member management.card-member', [ + 'members' => [], + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, + 'search' => $search, + ]); + } + } +} \ 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 new file mode 100644 index 0000000..1803efe --- /dev/null +++ b/resources/views/components/card-member-component.blade.php @@ -0,0 +1,419 @@ +@props([ + 'pageTitle' => '', + 'data' => [], + 'columns' => [], + 'actions' => [], + 'showAddButton' => false, + 'addButtonUrl' => '#', + 'showCheckboxes' => false, + 'showBatchDelete' => false, + 'showEditModal' => false, + 'showViewModal' => false, + 'currentPage' => 1, + 'lastPage' => 1, + 'total' => 0, +]) + +
+
+
{{ $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/card-member-view.blade.php b/resources/views/pages/card-member-view.blade.php new file mode 100644 index 0000000..a2b5b75 --- /dev/null +++ b/resources/views/pages/card-member-view.blade.php @@ -0,0 +1,32 @@ +@extends('layouts.app') + +@section('page_title', 'View Card Member') + +@section('content') +
+
+
View Card Member
+
+
+
+ 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 +
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/member management/card-member.blade.php b/resources/views/pages/member management/card-member.blade.php index 3801146..442bded 100644 --- a/resources/views/pages/member management/card-member.blade.php +++ b/resources/views/pages/member management/card-member.blade.php @@ -3,31 +3,42 @@ @section('page_title', 'Card Member') @section('content') - @php - $members = [ - ['id' => 1, 'cardNumber' => '1234-5678-9012-3456', 'firstName' => 'John', 'lastName' => 'Doe', 'birthday' => '1990-05-15', 'cardType' => 'Gold', 'status' => 'Active'], - ['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' => 'Active'], - ['id' => 4, 'cardNumber' => '3210-9876-5432-1098', 'firstName' => 'Bob', 'lastName' => 'Brown', 'birthday' => '1988-07-30', 'cardType' => 'Gold', 'status' => 'Active'] - ]; - @endphp - - @include('components.table-component', [ - 'pageTitle' => 'Card Member', - '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' => 'Card Member', + '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 card members found.

+
+
@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 92338b9..2bbaf6f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,8 +7,7 @@ use App\Http\Controllers\UserManagementController; use App\Http\Controllers\PhotoSliderController; use App\Http\Controllers\TopUpController; use App\Http\Controllers\NotificationController; - - +use App\Http\Controllers\CardMemberController; Route::get('/', function () { return redirect()->route('login'); @@ -182,4 +181,8 @@ Route::delete('/photo-slider/batch', [PhotoSliderController::class, 'batchDelete //Notification Route::get('/notification', [NotificationController::class, 'index'])->name('notification'); Route::get('/notification/create', [NotificationController::class, 'create'])->name('notification.create'); -Route::post('/notification', [NotificationController::class, 'store'])->name('notification.store'); \ No newline at end of file +Route::post('/notification', [NotificationController::class, 'store'])->name('notification.store'); + +//Card Member +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