From 6890cf085dce0390cb58726a5fce0ee33720233f Mon Sep 17 00:00:00 2001 From: Gbanyan Date: Fri, 28 Nov 2025 00:25:04 +0800 Subject: [PATCH] Fix 'My Membership' 404 by adding missing profile flow - Added a 'Create Member Profile' page for existing users who don't have a member record. - Updated MemberDashboardController to redirect to profile creation instead of aborting 404. - Added 'member.profile.create' and 'member.profile.store' routes. --- .../Controllers/MemberDashboardController.php | 60 ++++++++- .../views/member/create-profile.blade.php | 121 ++++++++++++++++++ routes/web.php | 4 + 3 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 resources/views/member/create-profile.blade.php diff --git a/app/Http/Controllers/MemberDashboardController.php b/app/Http/Controllers/MemberDashboardController.php index ffeed33..f63cee2 100644 --- a/app/Http/Controllers/MemberDashboardController.php +++ b/app/Http/Controllers/MemberDashboardController.php @@ -2,7 +2,10 @@ namespace App\Http\Controllers; +use App\Models\Member; +use App\Support\AuditLogger; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class MemberDashboardController extends Controller { @@ -12,7 +15,7 @@ class MemberDashboardController extends Controller $member = $user->member; if (! $member) { - abort(404); + return redirect()->route('member.profile.create'); } $member->load([ @@ -31,5 +34,58 @@ class MemberDashboardController extends Controller 'pendingPayment' => $pendingPayment, ]); } -} + public function createProfile() + { + $user = Auth::user(); + if ($user->member) { + return redirect()->route('member.dashboard'); + } + return view('member.create-profile'); + } + + public function storeProfile(Request $request) + { + $user = Auth::user(); + if ($user->member) { + return redirect()->route('member.dashboard'); + } + + $validated = $request->validate([ + 'full_name' => ['required', 'string', 'max:255'], + 'phone' => ['nullable', 'string', 'max:20'], + 'national_id' => ['nullable', 'string', 'max:20'], + 'address_line_1' => ['nullable', 'string', 'max:255'], + 'address_line_2' => ['nullable', 'string', 'max:255'], + 'city' => ['nullable', 'string', 'max:100'], + 'postal_code' => ['nullable', 'string', 'max:10'], + 'emergency_contact_name' => ['nullable', 'string', 'max:255'], + 'emergency_contact_phone' => ['nullable', 'string', 'max:20'], + 'terms_accepted' => ['required', 'accepted'], + ]); + + $member = Member::create([ + 'user_id' => $user->id, + 'full_name' => $validated['full_name'], + 'email' => $user->email, + 'phone' => $validated['phone'] ?? null, + 'national_id' => $validated['national_id'] ?? null, + 'address_line_1' => $validated['address_line_1'] ?? null, + 'address_line_2' => $validated['address_line_2'] ?? null, + 'city' => $validated['city'] ?? null, + 'postal_code' => $validated['postal_code'] ?? null, + 'emergency_contact_name' => $validated['emergency_contact_name'] ?? null, + 'emergency_contact_phone' => $validated['emergency_contact_phone'] ?? null, + 'membership_status' => Member::STATUS_PENDING, + 'membership_type' => Member::TYPE_REGULAR, + ]); + + AuditLogger::log('member.created_profile', $member, [ + 'user_id' => $user->id, + 'name' => $member->full_name, + ]); + + return redirect()->route('member.dashboard') + ->with('status', __('Profile completed! Please submit your membership payment.')); + } +} \ No newline at end of file diff --git a/resources/views/member/create-profile.blade.php b/resources/views/member/create-profile.blade.php new file mode 100644 index 0000000..c690544 --- /dev/null +++ b/resources/views/member/create-profile.blade.php @@ -0,0 +1,121 @@ + + +

+ {{ __('Complete Your Membership Profile') }} +

+
+ +
+
+
+
+
+ {{ __('To access the member area, please provide your membership details. This information is required for our records.') }} +
+ +
+ @csrf + + {{-- Basic Information --}} +
+

{{ __('Basic Information') }}

+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + +

{{ __('Your national ID will be encrypted for security.') }}

+ +
+
+ + {{-- Address Information --}} +
+

{{ __('Address') }}

+ + +
+ + + +
+ + +
+ + + +
+ +
+ +
+ + + +
+ + +
+ + + +
+
+
+ + {{-- Emergency Contact --}} +
+

{{ __('Emergency Contact') }}

+ + +
+ + + +
+ + +
+ + + +
+
+ + {{-- Terms and Conditions --}} +
+ + +
+ +
+ + {{ __('Complete Profile') }} + +
+
+
+
+
+
+
diff --git a/routes/web.php b/routes/web.php index c32d774..0c67f7c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -82,6 +82,10 @@ Route::middleware('auth')->group(function () { // Member Payment Submission Routes Route::get('/member/submit-payment', [MemberPaymentController::class, 'create'])->name('member.payments.create'); Route::post('/member/payments', [MemberPaymentController::class, 'store'])->name('member.payments.store'); + + Route::get('/create-member-profile', [MemberDashboardController::class, 'createProfile'])->name('member.profile.create'); + Route::post('/create-member-profile', [MemberDashboardController::class, 'storeProfile'])->name('member.profile.store'); + Route::get('/my-membership', [MemberDashboardController::class, 'show']) ->name('member.dashboard');