From 452bd77f8448145768abd9eeca21eb5e80477a27 Mon Sep 17 00:00:00 2001 From: "m.razaghi" Date: Sun, 16 Aug 2026 16:52:42 +0330 Subject: [PATCH] Updated user management --- .../Controllers/Admin/UsersController.php | 58 ++++++++++++- resources/views/admin/users/index.blade.php | 6 +- resources/views/admin/users/update.blade.php | 83 +++++++++++++------ routes/web.php | 3 + 4 files changed, 124 insertions(+), 26 deletions(-) diff --git a/app/Http/Controllers/Admin/UsersController.php b/app/Http/Controllers/Admin/UsersController.php index affc6a3..a4cbcf8 100644 --- a/app/Http/Controllers/Admin/UsersController.php +++ b/app/Http/Controllers/Admin/UsersController.php @@ -41,6 +41,58 @@ class UsersController extends Controller return view('admin.users.create'); } + /** + * Manually assign a paid subscription to a user from the Admin Panel. + */ + public function addManualSubscription(Request $request) + { + // 1. Validate the input + $request->validate([ + 'user_id' => 'required|exists:users,id', + 'subscribe_plan_id' => 'required|exists:subscribe_plans,id', + ]); + + $user = \App\Models\User::findOrFail($request->user_id); + $plan = \App\Models\SubscribePlan::findOrFail($request->subscribe_plan_id); + + // Prevent admins from accidentally adding free plans through this paid-only route + if ($plan->is_free) { + return back()->with('error', 'برای این عملیات باید یک اشتراک پولی انتخاب کنید.'); + } + + // 2. Find the latest active PAID subscription to correctly stack the days + $latestPaidSub = $user->userSubscribers() + ->where('expired_at', '>', now()) + ->whereHas('subscribe', function ($query) { + $query->where('is_free', false); + }) + ->latest('expired_at') + ->first(); + + // If they have an active paid plan, start from its expiration. Otherwise, start from right now. + $startDate = $latestPaidSub ? $latestPaidSub->expired_at : now(); + $expiredAt = $startDate->copy()->addDays($plan->expired_day); + + // 3. CLEANUP: Instantly expire any active FREE plans so they don't pollute the database + $user->userSubscribers() + ->where('expired_at', '>', now()) + ->whereHas('subscribe', function ($query) { + $query->where('is_free', true); + }) + ->update(['expired_at' => now()]); + + // 4. Create the manual paid subscription + $user->userSubscribers()->create([ + 'subscribe_plan_id' => $plan->id, + 'expired_at' => $expiredAt, + 'market_provider' => 'admin', // This will cleanly display as "(Admin)" in your dashboard charts! + 'is_free' => false, + ]); + + // Redirect back with a success message for your blade view + return back()->with('success', 'اشتراک پولی با موفقیت برای کاربر ثبت شد.'); + } + public function store(CreateUserRequest $request) { $validated = $request->validated(); @@ -53,7 +105,11 @@ class UsersController extends Controller public function edit(User $user) { - return view('admin.users.update', compact('user')); + $paidPlans = \App\Models\SubscribePlan::where('is_free', false) + ->where('is_active', true) + ->get(); + + return view('admin.users.update', compact('user', 'paidPlans')); } public function update(UpdateUserRequest $request, User $user) diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index b55bf81..b74a14f 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -27,7 +27,11 @@ {{ $user->mobile }} {{ $user->is_admin ? 'ادمین' : 'مشتری' }} - {{ $user->userSubscribers->sum(function ($subscriber) { return $subscriber->expired_at ? $subscriber->expired_at->diffInDays(now()) : 0; }) }} + @php + $activeSub = $user->userSubscribers->sortByDesc('expired_at')->first(); + $days = $activeSub && $activeSub->expired_at ? $activeSub->expired_at->diffInDays(now()) : 0; + @endphp + {{ $days }} روز
diff --git a/resources/views/admin/users/update.blade.php b/resources/views/admin/users/update.blade.php index 4f8419b..4241d16 100644 --- a/resources/views/admin/users/update.blade.php +++ b/resources/views/admin/users/update.blade.php @@ -1,34 +1,69 @@ @extends('admin.layouts.app') @section('content') -
-@include('admin.layouts.errors') +
+ @include('admin.layouts.errors') -
-
-
-

ویرایش کاربر

-
- + +
+
+
+

ویرایش کاربر

+
+ + @csrf + @method('put') +
+ +
+
+ +
+
+ +
+
+ is_admin ? 'checked="true"' :'' }}> + +
+ + +
+
+
+
+ + +
+
+
+

افزودن اشتراک دستی (پولی)

+ + @if(session('success')) +
{{ session('success') }}
+ @endif + @if(session('error')) +
{{ session('error') }}
+ @endif + +
@csrf - @method('put') -
- + + +
+ +
-
- -
-
- -
-
- is_admin ? 'checked="true"' :'' }}"> - -
- + +
+
-
-@endsection \ No newline at end of file +@endsection diff --git a/routes/web.php b/routes/web.php index f18bdf4..1296dbd 100644 --- a/routes/web.php +++ b/routes/web.php @@ -82,4 +82,7 @@ Route::middleware(['auth', config('jetstream.auth_session')])->group(function () Route::resource('quiz-subjects', QuizSubjectController::class)->except(['create', 'show', 'edit', 'update']); Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); + + Route::post('/users/manual-subscription', [\App\Http\Controllers\Admin\UsersController::class, 'addManualSubscription']) + ->name('admin.subscriptions.manual'); });