Updated user management
This commit is contained in:
@@ -41,6 +41,58 @@ class UsersController extends Controller
|
|||||||
return view('admin.users.create');
|
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)
|
public function store(CreateUserRequest $request)
|
||||||
{
|
{
|
||||||
$validated = $request->validated();
|
$validated = $request->validated();
|
||||||
@@ -53,7 +105,11 @@ class UsersController extends Controller
|
|||||||
|
|
||||||
public function edit(User $user)
|
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)
|
public function update(UpdateUserRequest $request, User $user)
|
||||||
|
|||||||
@@ -27,7 +27,11 @@
|
|||||||
<td>{{ $user->mobile }}</td>
|
<td>{{ $user->mobile }}</td>
|
||||||
<td>{{ $user->is_admin ? 'ادمین' : 'مشتری' }}</td>
|
<td>{{ $user->is_admin ? 'ادمین' : 'مشتری' }}</td>
|
||||||
<td>
|
<td>
|
||||||
{{ $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 }} روز
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<form action="{{ route('users.destroy', $user->id) }}" id="user-{{$user->id}}-delete" method="POST" style="display: inline;">
|
<form action="{{ route('users.destroy', $user->id) }}" id="user-{{$user->id}}-delete" method="POST" style="display: inline;">
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
@extends('admin.layouts.app')
|
@extends('admin.layouts.app')
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@include('admin.layouts.errors')
|
@include('admin.layouts.errors')
|
||||||
|
|
||||||
|
<!-- Existing User Edit Box -->
|
||||||
<div class="col-lg-6">
|
<div class="col-lg-6">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@@ -21,7 +22,7 @@
|
|||||||
<input class="form-control" name="mobile" type="text" placeholder="موبایل" value="{{$user->mobile}}">
|
<input class="form-control" name="mobile" type="text" placeholder="موبایل" value="{{$user->mobile}}">
|
||||||
</div>
|
</div>
|
||||||
<div class="custom-control custom-switch mb-2" dir="ltr">
|
<div class="custom-control custom-switch mb-2" dir="ltr">
|
||||||
<input type="checkbox" class="custom-control-input" id="customSwitch1" name="is_admin" {{ $user->is_admin ? 'checked="true"' :'' }}">
|
<input type="checkbox" class="custom-control-input" id="customSwitch1" name="is_admin" {{ $user->is_admin ? 'checked="true"' :'' }}>
|
||||||
<label class="custom-control-label" for="customSwitch1">ادمین</label>
|
<label class="custom-control-label" for="customSwitch1">ادمین</label>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-primary" type="submit">ثبت</button>
|
<button class="btn btn-primary" type="submit">ثبت</button>
|
||||||
@@ -30,5 +31,39 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
<!-- NEW: Manual Subscription Box -->
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<h4 class="card-title mb-4">افزودن اشتراک دستی (پولی)</h4>
|
||||||
|
|
||||||
|
@if(session('success'))
|
||||||
|
<div class="alert alert-success">{{ session('success') }}</div>
|
||||||
|
@endif
|
||||||
|
@if(session('error'))
|
||||||
|
<div class="alert alert-danger">{{ session('error') }}</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<form action="{{ route('admin.subscriptions.manual') }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
<input type="hidden" name="user_id" value="{{ $user->id }}">
|
||||||
|
|
||||||
|
<div class="form-group mb-4">
|
||||||
|
<label for="subscribe_plan_id" class="form-label">انتخاب پلن اشتراک</label>
|
||||||
|
<select name="subscribe_plan_id" id="subscribe_plan_id" class="form-control" required>
|
||||||
|
<option value="">یک پلن انتخاب کنید...</option>
|
||||||
|
@foreach($paidPlans as $plan)
|
||||||
|
<option value="{{ $plan->id }}">{{ $plan->name }} ({{ number_format($plan->price) }} تومان)</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-success w-100">ثبت اشتراک دستی</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
@@ -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::resource('quiz-subjects', QuizSubjectController::class)->except(['create', 'show', 'edit', 'update']);
|
||||||
|
|
||||||
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
|
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
|
||||||
|
|
||||||
|
Route::post('/users/manual-subscription', [\App\Http\Controllers\Admin\UsersController::class, 'addManualSubscription'])
|
||||||
|
->name('admin.subscriptions.manual');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user