member management functionality works

This commit is contained in:
armiejean 2025-05-16 12:31:02 +08:00
parent 2ed97e9578
commit 060f41ada6
6 changed files with 255 additions and 50 deletions

View File

@ -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.');
}
}
}

View File

@ -257,8 +257,9 @@
rowHtml += `<td class="text-center">`;
tableConfig.actions.forEach(action => {
if (action === 'view') {
const route = tableConfig.pageTitle === 'Locked Account' ? 'locked-account.show' : 'card-member.show';
rowHtml += `
<a href="{{ route('card-member.show', '') }}/${row.id}" class="btn btn-sm view-btn me-1" title="View">
<a href="{{ route('') }}/${route}/${row.id}" class="btn btn-sm view-btn me-1" title="View">
<i class="fa-solid fa-eye"></i>
</a>`;
}
@ -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 = `<a class="page-link" href="#" aria-label="Previous"><span aria-hidden="true">«</span></a>`;
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 = `<a class="page-link" href="#">${i}</a>`;
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}`;
});
});
}

View File

@ -26,7 +26,7 @@
<div class="mb-3">
<strong>Status:</strong> {{ $member['status'] }}
</div>
<a href="{{ route('card-member.index') }}" class="btn btn-secondary">Back</a>
<a href="{{ route('card-member') }}" class="btn btn-secondary">Back</a>
</div>
</div>
@endsection

View File

@ -0,0 +1,44 @@
@extends('layouts.app')
@section('page_title', 'View Locked Account')
@section('content')
<div class="card">
<div class="card-header">
<h5 class="mb-0 fw-bold text-dark">View Locked Account</h5>
</div>
<div class="card-body">
@if (session('error'))
<div class="alert alert-danger alert-dismissible fade show" role="alert">
{{ session('error') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
<div class="mb-3">
<strong>Card Number:</strong> {{ $member['cardNumber'] }}
</div>
<div class="mb-3">
<strong>First Name:</strong> {{ $member['firstName'] }}
</div>
<div class="mb-3">
<strong>Last Name:</strong> {{ $member['lastName'] }}
</div>
<div class="mb-3">
<strong>Birthday:</strong> {{ $member['birthday'] ? date('F d, Y', strtotime($member['birthday'])) : 'N/A' }}
</div>
<div class="mb-3">
<strong>Card Type:</strong> {{ $member['cardType'] }}
</div>
<div class="mb-3">
<strong>Status:</strong> {{ $member['status'] }}
</div>
<div class="d-flex gap-2">
<a href="{{ route('locked-account') }}" class="btn btn-secondary">Back</a>
<form action="{{ route('locked-account.activate', $member['id']) }}" method="POST">
@csrf
<button type="submit" class="btn btn-success" onclick="return confirm('Are you sure you want to activate this account?')">Activate Account</button>
</form>
</div>
</div>
</div>
@endsection

View File

@ -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
])
<div id="locked-account-table">
@if (session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
{{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
@if (session('error'))
<div class="alert alert-danger alert-dismissible fade show" role="alert">
{{ session('error') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@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,
])
<div id="no-data-message" style="display: {{ empty($members ?? []) ? 'block' : 'none' }}; text-align: center; margin-top: 20px;">
<p>No locked accounts found.</p>
</div>
</div>
@endsection

View File

@ -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('/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');