Improve tasks UI, dark theme, performance fixes, and admin pages polish
This commit is contained in:
@@ -22,6 +22,128 @@ use App\Models\Pivot_Tasks;
|
||||
|
||||
class AdminController extends Controller
|
||||
{
|
||||
private function loadPendingRequests($users): array
|
||||
{
|
||||
$records = [];
|
||||
|
||||
try {
|
||||
Redis::connection()->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()
|
||||
{
|
||||
|
||||
@@ -29,60 +151,44 @@ class AdminController extends Controller
|
||||
$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'];
|
||||
} 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')
|
||||
->with('attendances')
|
||||
$users = User::whereNotNull('user_name')
|
||||
->select(['id', 'name', 'user_name', 'req_counts', 'active_task'])
|
||||
->get();
|
||||
|
||||
$records = [];
|
||||
foreach ($users as $user) {
|
||||
$rec = [
|
||||
"user_name" => $user->user_name,
|
||||
"name" => $user->name,
|
||||
"attendances" => []
|
||||
];
|
||||
foreach ($user->attendances as $attendance) {
|
||||
$key = "att-tempreq:{$user->user_name}:{$attendance->id}";
|
||||
$get = json_decode(Redis::get("{$key}"));
|
||||
$date = $attendance->entered_at ? Carbon::parse($attendance->entered_at)->format('Y-m-d') : null;
|
||||
if ($get)
|
||||
if ($get->function != 'rejected')
|
||||
$rec['attendances'][] = $get;
|
||||
}
|
||||
// $key = "att-tempreq:{$user->user_name}:new";
|
||||
$create_requests_key = "att-tempreq:creates:{$user->user_name}";
|
||||
$create_requests = Redis::connection()->lrange($create_requests_key, 0, -1); // خواندن تمام آیتم های لیست
|
||||
$this->enrichUsersForDashboard($users);
|
||||
$users = $users->sortByDesc('working');
|
||||
$records = $this->loadPendingRequests($users);
|
||||
|
||||
foreach ($create_requests as $req_json) {
|
||||
$get = json_decode($req_json);
|
||||
if ($get && $get->function != 'rejected') {
|
||||
$rec['attendances'][] = $get;
|
||||
}
|
||||
}
|
||||
// $get = json_decode(Redis::get("{$key}"));
|
||||
// if ($get) {
|
||||
//// dd($get);
|
||||
//
|
||||
// if ($get->function != 'rejected')
|
||||
//
|
||||
// $rec['attendances'][] = $get;
|
||||
// }
|
||||
$records[] = $rec;
|
||||
}
|
||||
|
||||
// dd($users);
|
||||
// dd(json_decode($json,true));
|
||||
return view("admin..admin")->with(['message', [
|
||||
'color' => '#ff8800ff',
|
||||
"text" => 'شما به پنل ادمین وارد شدید✔️'
|
||||
|
||||
Reference in New Issue
Block a user