ping(); } catch (\Throwable) { foreach ($users as $user) { $records[] = [ 'user_name' => $user->user_name, 'name' => $user->name, 'attendances' => [], ]; } return $records; } foreach ($users as $user) { $rec = [ 'user_name' => $user->user_name, 'name' => $user->name, 'attendances' => [], ]; foreach (Redis::keys("att-tempreq:{$user->user_name}:*") as $key) { if (str_contains($key, ':creates:')) { continue; } $raw = Redis::get($key); if (!$raw) { continue; } $get = json_decode($raw); if ($get && ($get->function ?? null) !== 'rejected') { $rec['attendances'][] = $get; } } $createRequests = Redis::lrange("att-tempreq:creates:{$user->user_name}", 0, -1); foreach ($createRequests as $reqJson) { $get = json_decode($reqJson); if ($get && ($get->function ?? null) !== 'rejected') { $rec['attendances'][] = $get; } } $records[] = $rec; } return $records; } private function enrichUsersForDashboard($users): void { $userNames = $users->pluck('user_name'); $now = Carbon::now(); $monthStart = $now->copy()->startOfMonth(); $monthEnd = $now->copy()->endOfMonth(); $today = $now->format('Y-m-d'); $monthAttendances = Attendance::query() ->whereIn('user_identity', $userNames) ->whereBetween('entered_at', [$monthStart, $monthEnd]) ->whereNotNull('duration') ->select(['user_identity', 'duration']) ->get() ->groupBy('user_identity'); $openAttendances = Attendance::query() ->whereIn('user_identity', $userNames) ->whereNull('exited_at') ->select(['id', 'user_identity', 'entered_at']) ->get() ->groupBy('user_identity'); $activeBreakAttendanceIds = AttendanceBreak::query() ->whereIn('attendance_id', $openAttendances->flatten()->pluck('id')) ->whereNull('break_end') ->pluck('attendance_id') ->flip(); foreach ($users as $user) { $totalSeconds = 0; foreach ($monthAttendances->get($user->user_name, []) as $attendance) { if (!$attendance->duration) { continue; } $parts = explode(':', $attendance->duration); if (count($parts) !== 3) { continue; } [$h, $m, $s] = array_map('intval', $parts); $totalSeconds += ($h * 3600) + ($m * 60) + $s; } $hours = intdiv($totalSeconds, 3600); $minutes = intdiv($totalSeconds % 3600, 60); $user->totaltime = sprintf('%02d:%02d', $hours, $minutes); $user->working = 0; $openForUser = $openAttendances->get($user->user_name, collect()); if ($openForUser->isEmpty()) { continue; } $latestOpen = $openForUser->sortByDesc('entered_at')->first(); if ($latestOpen && Carbon::parse($latestOpen->entered_at)->format('Y-m-d') === $today) { $user->working = 1; } foreach ($openForUser as $openAttendance) { if ($activeBreakAttendanceIds->has($openAttendance->id)) { $user->working = 2; break; } } } } public function dashboard() { if (isset($_COOKIE['token-0'])) { $uname = $_COOKIE['token-0']; setcookie("user_identity", $_COOKIE['token-0'], time() + (60 * 60 * 24 * 365), '/'); Cookie::queue(Cookie::forget('token-0')); } else { $uname = $_COOKIE['user_identity'] ?? null; } if (!$uname) { return redirect('/')->with('message', [ 'color' => '#ff8800ff', 'text' => 'ابتدا باید وارد شوید!' ]); } $u = User::select('name', 'is_admin') ->where('user_name', $uname) ->first(); if (!$u) { return redirect('/')->with('message', [ 'color' => '#ff8800ff', 'text' => 'کاربر یافت نشد!' ]); } if ($u->is_admin == 1) { $provider = 'admin'; } elseif ($u->is_admin == 2) { $provider = 'supervisor'; } if ($u->is_admin == '1' || $u->is_admin == '2') { setcookie('ad', '1', time() + (60 * 60 * 24 * 365 * 5), "/"); $users = User::whereNotNull('user_name') ->select(['id', 'name', 'user_name', 'req_counts', 'active_task']) ->get(); $this->enrichUsersForDashboard($users); $users = $users->sortByDesc('working'); $records = $this->loadPendingRequests($users); return view("admin..admin")->with(['message', [ 'color' => '#ff8800ff', "text" => 'شما به پنل ادمین وارد شدید✔️' ], "users" => $users, 'reqs' => $records, "userType" => $provider ]); } return redirect()->back()->with('message', [ 'color' => '#ff8800ff', "text" => 'شما دسترسی به این صفحه را ندارید!' ]); } public function newUser() { // dd('hello world'); return view('admin.new'); } public function addUser(Request $request) { // dd($request); try { $user = new User(); $user->name = $request->name; $user->email = $request->email; $user->user_name = $request->username; $user->chatid = $request->chatid; $user->number = $request->number; $user->save(); return redirect(route('admin.dashboard'))->with('message', [ 'color' => '#009900ff', 'text' => 'کاربر با موفقیت ایجاد شد✔️' ]); } catch (\Exception $exception) { return redirect(route('admin.dashboard'))->with('message', [ 'color' => '#ff9900ff', 'text' => 'مقادیر وارد شده تکراری یا اشتباه است✖️' ]); } } public function edit(Request $request) { // dd($request); $allData = array_merge($request->all(), $request->query()); $converted = $this->fa2en_numbers($allData); $request->merge($converted); $id = $request->id; $nstartt = $request->starttime; $nendt = $request->endtime; // dd($request); $user = User::where('user_name', $_COOKIE['user_identity'])->first(); if ($user->is_admin == 2) { $attController = new AttendanceController(); return $attController->edit($request); } if ($id == 'new') { $user_name = $request->uname; if ($request->display_date == null) { $date = Carbon::now()->format('Y-m-d'); } else { // dump($date); $date = \Morilog\Jalali\CalendarUtils::convertNumbers($request->display_date, true); $date = str_replace('/', '-', $date); // dump($date); $date = Jalalian::fromFormat('Y-m-d', $date)->toCarbon()->format('Y-m-d'); // $date = \Morilog\Jalali\CalendarUtils::createCarbonFromFormat('Y-m-d', $date)->format('Y-m-d'); } if (($nendt > $nstartt) || ($nendt === null && $nstartt !== null)) { $attendance = new Attendance(); $attendance->ip_address = 'admin-manual'; $attendance->user_identity = $user_name; $attendance->entered_at = $nstartt ? $date . ' ' . $nstartt : null; $attendance->exited_at = $nendt ? $date . ' ' . $nendt : null; $attendance->duration = $nendt !== null ? $attendance->duration($nstartt, $nendt) : null; $attendance->save(); return redirect()->back()->with('message', [ 'color' => '#6aff00ff', "text" => 'تغییرات با موفقیت ذخیره شد.✔️' ]); } else { return redirect()->back()->with('message', [ 'color' => '#ff4400ff', "text" => 'مقادیر اشتباه وارد شده است✖️' ]); } } else { $attendance = Attendance::find($id); $date = Carbon::parse($attendance->entered_at ?? $attendance->exited_at)->format('Y-m-d'); $ostartt = Carbon::parse($attendance->entered_at)->format('H:i'); $oendt = Carbon::parse($attendance->exited_at)->format('H:i'); if (($ostartt != $nstartt || $oendt != $nendt) && ($nendt != null ? $nendt > $nstartt : true)) { $attendance->entered_at = $date . ' ' . $nstartt; $attendance->exited_at = $nendt ? $date . ' ' . $nendt : null; $attendance->duration = $nendt ? $attendance->duration($nstartt, $nendt) : null; $attendance->save(); return redirect()->back()->with('message', [ 'color' => '#6aff00ff', "text" => 'تغییرات با موفقیت ذخیره شد.✔️' ]); } else { return redirect()->back()->with('message', [ 'color' => '#ff4400ff', "text" => 'مقادیر اشتباه وارد شده است✖️' ]); } } } public function delete(Request $request) { // dd($request); $id = $request->id; $attendance = Attendance::find($id); if ($attendance) { $attendance->delete(); return redirect()->back()->with('message', [ 'color' => '#6aff00ff', "text" => 'حذف با موفقیت انجام شد.✔️' ]); } else { return redirect()->back()->with('message', [ 'color' => '#ff4400ff', "text" => 'خطا در حذف رکورد✖️' ]); } } public function update(Request $request) { // dd($request); $data = json_decode($request->data); if ($request->update == 'approve') { if ($data->function == 'delete') { $st = Attendance::find($data->id); if ($st) { $st->delete(); if ($st) { tel_notif($st->user_identity, "تایید"); // $create_requests_key = "att-tempreq:creates:{$data->userid}"; // Redis::connection()->lrem($create_requests_key, 1, json_encode($data)); Redis::connection()->del("att-tempreq:{$data->userid}:{$data->id}"); return redirect()->back()->with('message', [ 'color' => '#6aff00ff', 'text' => 'رکورد با موفقیت حذف شد✔️' ]); } else { return redirect()->back()->with('message', [ 'color' => '#ff8800ff', 'text' => 'حذف رکورد با شکست مواجه شد✖️️' ]); } } else { return redirect()->back()->with('message', [ 'color' => '#ff8800ff', 'text' => 'رکورد پیدا نشد✖️' ]); } } elseif ($data->function == 'edit') { // dd($data); $record = Attendance::find($data->id); $attendance = new Attendance(); $date = Carbon::parse($record->entered_at)->format('Y-m-d'); $record->ip_address = 'admin-edited'; $record->user_identity = $data->userid; $record->entered_at = $data->newenter ? $date . ' ' . $data->newenter : null; if ($data->newexit != null) { //جریمه // if($data->newexit > '16:00:00'){ // $data->newexit = date('H:i:s', strtotime($data->newexit . ' -1 hour')); // } $record->exited_at = $date . ' ' . $data->newexit; $duration = $attendance->duration($data->newenter, $data->newexit); } else { $record->exited_at = null; $record->duration = null; } $break = AttendanceBreak::where('attendance_id', $data->id)->sum('duration'); if ($break) { $breakSec = strtotime("1970-01-01 " . $break) - strtotime("1970-01-01 00:00:00"); $durationSec = strtotime("1970-01-01 " . $duration) - strtotime("1970-01-01 00:00:00"); $durationSec -= $breakSec; $duration = gmdate("H:i:s", $durationSec); } $record->duration = $duration ?? $record->duration; //dd($record->duration, $duration, $break); $record->requested = ''; $record->save(); // $create_requests_key = "att-tempreq:creates:{$data->userid}"; // $create_requests_key = "att-tempreq:{$data->userid}:{$data->id}"; // $t = Redis::connection()->lrem($create_requests_key, -1, json_encode($data)); Redis::connection()->del("att-tempreq:{$data->userid}:{$data->id}"); tel_notif($record->user_identity, "تایید"); return redirect()->back()->with('message', [ 'color' => '#6aff00ff', "text" => 'رکورد با موفقیت ذخیره شد.✔️' ]); } elseif ($data->function == 'new') { // dd($data); $starttime = $data->oldenter ? Carbon::parse($data->oldenter)->format('H:i:s') : null; $endtime = $data->oldexit ? Carbon::parse($data->oldexit)->format('H:i:s') : null; if (is_null($endtime) || $endtime > $starttime) { $attendance = new Attendance(); $attendance->ip_address = 'admin-new'; $attendance->user_identity = $data->userid; $attendance->entered_at = $data->oldenter ?: null; $attendance->exited_at = $data->oldexit ?: null; $attendance->duration = $data->oldexit ? $attendance->duration($data->oldenter, $data->oldexit) : null; $attendance->save(); $create_requests_key = "att-tempreq:creates:{$data->userid}"; Redis::connection()->lrem($create_requests_key, 1, json_encode($data)); // Redis::connection()->del("att-tempreq:{$data->userid}:{$data->id}"); tel_notif($data->userid, "تایید"); return redirect()->back()->with('message', [ 'color' => '#6aff00ff', "text" => 'درخواست با موفقیت تایید شد.✔️' ]); } } } if ($request->update == 'reject') { if ($data->function == 'delete' || $data->function == 'edit') { Redis::connection()->del("att-tempreq:{$data->userid}:{$data->id}"); } elseif ($data->function == 'new') { $create_requests_key = "att-tempreq:creates:{$data->userid}"; Redis::connection()->lrem($create_requests_key, 1, json_encode($data)); } // dd($data->id); if ($data->id !== "new") { $att = Attendance::find($data->id); // dd($att); $att->requested = null; $att->save(); } tel_notif($data->userid, "رد"); return redirect()->back()->with('message', [ 'color' => '#6aff00ff', "text" => 'درخواست با موفقیت رد شد.✔️' ]); } } // private function fa2en_numbers($input) // { // if (is_string($input)) { // $fa_numbers = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']; // $en_numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; // return str_replace($fa_numbers, $en_numbers, $input); // } elseif (is_array($input)) { // return array_map([$this, __FUNCTION__], $input); // } else { // return $input; // } // } } function tel_notif($username, $status) { $message = "درخواست شما {$status} شد."; $user = User::where('user_name', $username)->whereNotNull('chatid')->select('chatid', 'user_name')->first(); if ($user) { try { Http::withoutVerifying()->post('https://tapi.bale.ai/1482838710:sYbLzby0tuLRzHvP4d3LsbcNwg2sjSDLTAU/sendMessage', [ "chat_id" => $user->bale, 'text' => $message, ]); } catch (\Exception $e) {} } }