input('month', Carbon::now()->format('Y-m')); $startOfMonth = Carbon::parse($selectedMonth)->startOfMonth(); $endOfMonth = Carbon::parse($selectedMonth)->endOfMonth(); // 1. Calculate top stats from all active users $allActiveUsers = User::where('status', User::STATUS_ACTIVE)->get()->map(function($user) use ($startOfMonth, $endOfMonth) { $user->total_received = Administration::where('receiver', $user->msnv) ->whereBetween('date', [$startOfMonth, $endOfMonth]) ->sum('received'); $user->total_sent = Administration::where('sender', $user->msnv) ->whereBetween('date', [$startOfMonth, $endOfMonth]) ->sum('sent'); return $user; }); $topReceivedUser = $allActiveUsers->sortByDesc('total_received')->first(); $topSentUser = $allActiveUsers->sortByDesc('total_sent')->first(); // 2. Paginate users for the list table (10 per page) $users = User::where('status', User::STATUS_ACTIVE)->paginate(10)->withQueryString(); // 3. Compute stats only for the paginated users (to display in the table) $users->getCollection()->transform(function($user) use ($startOfMonth, $endOfMonth) { $user->total_received = Administration::where('receiver', $user->msnv) ->whereBetween('date', [$startOfMonth, $endOfMonth]) ->sum('received'); $user->total_sent = Administration::where('sender', $user->msnv) ->whereBetween('date', [$startOfMonth, $endOfMonth]) ->sum('sent'); return $user; }); return view('admin.users.index', compact('users', 'selectedMonth', 'topReceivedUser', 'topSentUser')); } public function create() { return view('admin.users.create'); } public function store(Request $request) { $request->validate([ 'msnv' => 'required|unique:user,msnv', 'mail' => 'required|email|unique:user,mail', 'password' => 'required|min:6', 'role' => 'required|in:' . User::ROLE_MEMBER . ',' . User::ROLE_ADMIN ]); User::create([ 'msnv' => $request->msnv, 'mail' => $request->mail, 'pass' => Hash::make($request->password), 'role' => $request->role, 'status' => User::STATUS_ACTIVE, 'card' => 0, 'flag_send' => User::FLAG_SEND_DISABLED, 'first_login' => User::FIRST_LOGIN_TRUE ]); return redirect()->route('admin.users.index')->with('success', 'Tạo user thành công!'); } public function edit(Request $request, $msnv) { $user = User::where('msnv', $msnv)->firstOrFail(); $selectedMonth = $request->input('month', Carbon::now()->format('Y-m')); $startOfMonth = Carbon::parse($selectedMonth)->startOfMonth(); $endOfMonth = Carbon::parse($selectedMonth)->endOfMonth(); $administrations = Administration::where(function($q) use ($msnv) { $q->where('sender', $msnv)->orWhere('receiver', $msnv); }) ->whereBetween('date', [$startOfMonth, $endOfMonth]) ->orderBy('date', 'desc') ->get(); return view('admin.users.edit', compact('user', 'administrations', 'selectedMonth')); } public function update(Request $request, $msnv) { $user = User::where('msnv', $msnv)->firstOrFail(); $request->validate([ 'num_card' => 'nullable|integer|min:1', 'flag_send' => 'nullable|boolean' ]); DB::transaction(function () use ($request, $user) { if ($request->filled('num_card')) { AddCard::create([ 'buyer' => $user->msnv, 'num_card' => $request->num_card, 'seller' => auth()->user()->msnv, 'date' => Carbon::today() ]); $user->card += $request->num_card; } $user->flag_send = $request->has('flag_send') ? User::FLAG_SEND_ENABLED : User::FLAG_SEND_DISABLED; $user->save(); }); return redirect()->back()->with('success', 'Cập nhật thành công!'); } public function destroy($msnv) { $user = User::where('msnv', $msnv)->firstOrFail(); $user->status = User::STATUS_INACTIVE; $user->save(); return redirect()->route('admin.users.index')->with('success', 'Đã đánh dấu nhân viên nghỉ việc thành công!'); } public function resetCards() { User::where('status', User::STATUS_ACTIVE)->update(['card' => 0]); return redirect()->back()->with('success', 'Reset thẻ toàn hệ thống thành công!'); } }