Changes to holidays and the overlap between this year and the previous year

This commit is contained in:
2026-09-23 12:20:39 +03:30
parent 5e306564b2
commit 0fd5867701
15 changed files with 653 additions and 62 deletions
+63 -17
View File
@@ -207,6 +207,17 @@ class AdminController extends Controller
foreach ($pendingForUser->values() as $index => $attendance) {
$raw = $rawValues[$index] ?? null;
if (!$raw) {
// Redis موجود است ولی کلید نیست → درخواست قبلاً تایید/رد شده؛ پرچم کهنه را پاک کن
$attendance->requested = null;
$attendance->save();
continue;
}
$decoded = json_decode($raw);
if (($decoded->function ?? null) === 'rejected') {
Redis::del("att-tempreq:{$user->user_name}:{$attendance->id}");
$attendance->requested = null;
$attendance->save();
continue;
}
@@ -219,12 +230,15 @@ class AdminController extends Controller
}
}
foreach ($pendingForUser as $attendance) {
if (isset($loadedIds[(string) $attendance->id])) {
continue;
}
// فقط وقتی Redis در دسترس نیست از fallback استفاده کن
if (!$redisAvailable) {
foreach ($pendingForUser as $attendance) {
if (isset($loadedIds[(string) $attendance->id])) {
continue;
}
$rec['attendances'][] = $this->buildFallbackRequestFromAttendance($attendance);
$rec['attendances'][] = $this->buildFallbackRequestFromAttendance($attendance);
}
}
$pendingById = $pendingForUser->keyBy('id');
@@ -239,6 +253,46 @@ class AdminController extends Controller
return $records;
}
private function removeCreateRequest(string $userid, object $data): void
{
$key = "att-tempreq:creates:{$userid}";
try {
$items = Redis::lrange($key, 0, -1);
} catch (\Throwable) {
return;
}
foreach ($items as $item) {
$decoded = json_decode($item);
if (!$decoded) {
continue;
}
$sameUser = ($decoded->userid ?? null) === ($data->userid ?? null);
$sameEnter = (string) ($decoded->oldenter ?? '') === (string) ($data->oldenter ?? '');
$sameExit = (string) ($decoded->oldexit ?? '') === (string) ($data->oldexit ?? '');
if ($sameUser && $sameEnter && $sameExit) {
Redis::lrem($key, 1, $item);
}
}
Redis::del("att-tempreq:{$userid}:new");
}
private function clearAttendanceRequestFlag($attendanceId): void
{
if (!$attendanceId || $attendanceId === 'new') {
return;
}
$att = Attendance::find($attendanceId);
if ($att) {
$att->requested = null;
$att->save();
}
}
private function enrichUsersForDashboard($users): void
{
$userNames = $users->pluck('user_name');
@@ -579,7 +633,7 @@ class AdminController extends Controller
}
$record->duration = $duration ?? $record->duration;
$record->requested = '';
$record->requested = null;
$record->save();
app(LatePenaltyService::class)->syncAttendance($record);
@@ -617,8 +671,7 @@ class AdminController extends Controller
: null;
$attendance->save();
app(LatePenaltyService::class)->syncAttendance($attendance);
$create_requests_key = "att-tempreq:creates:{$data->userid}";
Redis::connection()->lrem($create_requests_key, 1, json_encode($data));
$this->removeCreateRequest($data->userid, $data);
$this->decrementUserRequestCount($data->userid);
tel_notif($data->userid, "تایید");
@@ -633,18 +686,11 @@ class AdminController extends Controller
if ($request->update == 'reject') {
if ($data->function == 'delete' || $data->function == 'edit') {
Redis::connection()->del("att-tempreq:{$data->userid}:{$data->id}");
$this->clearAttendanceRequestFlag($data->id ?? null);
} elseif ($data->function == 'new') {
$create_requests_key = "att-tempreq:creates:{$data->userid}";
Redis::connection()->lrem($create_requests_key, 1, json_encode($data));
$this->removeCreateRequest($data->userid, $data);
}
// dd($data->id);
if ($data->id !== "new") {
$att = Attendance::find($data->id);
// dd($att);
$att->requested = null;
$att->save();
}
tel_notif($data->userid, "رد");
$this->decrementUserRequestCount($data->userid);
return redirect()->back()->with('message', [