format('Y-m-d'); $jadwalHariIni = JadwalKerja::with('shift') ->where('tanggal', $today) ->get(); if ($jadwalHariIni->isEmpty()) { $this->command->warn('Tidak ada jadwal kerja untuk tanggal ' . $today . '. Harap jalankan generator jadwal terlebih dahulu atau isi manual.'); return; } $this->command->info('Ditemukan ' . $jadwalHariIni->count() . ' jadwal untuk hari ini via PresensiSeeder.'); foreach ($jadwalHariIni as $jadwal) { try { if (!$jadwal->shift) continue; $jamMasukShift = $jadwal->shift->jam_masuk ?? $jadwal->shift->jam_mulai; $jamPulangShift = $jadwal->shift->jam_pulang ?? $jadwal->shift->jam_selesai; $shiftStart = Carbon::parse($jadwal->tanggal . ' ' . $jamMasukShift); $shiftEnd = Carbon::parse($jadwal->tanggal . ' ' . $jamPulangShift); $randomMinutes = rand(-10, 30); $jamMasuk = $shiftStart->copy()->addMinutes($randomMinutes); $idTepat = DB::table('status_presensi')->where('nama_status', 'Tepat Waktu')->value('id_status') ?? 1; $idTelat = DB::table('status_presensi')->where('nama_status', 'Terlambat')->value('id_status') ?? 2; $status = $idTepat; $alasan = null; $toleransi = 10; if ($randomMinutes > $toleransi) { $status = $idTelat; $alasan = 'Terlambat ' . ($randomMinutes) . ' menit (Dummy Data)'; } $validasi = (rand(1, 10) > 2) ? 1 : 2; $lat = -8.172110 + (rand(-100, 100) / 100000); $lon = 113.700550 + (rand(-100, 100) / 100000); Presensi::firstOrCreate( [ 'id_user' => $jadwal->id_user, 'tanggal' => $today ], [ 'jam_masuk' => $jamMasuk->format('H:i:s'), 'jam_pulang' => $shiftEnd->format('H:i:s'), 'lat_masuk' => $lat, 'lon_masuk' => $lon, 'lat_pulang' => $lat, 'lon_pulang' => $lon, 'foto_wajah_masuk' => 'https://placehold.co/400x400/png?text=Masuk', 'foto_wajah_pulang' => 'https://placehold.co/400x400/png?text=Pulang', 'id_status' => $status, 'alasan_telat' => $alasan, 'id_validasi' => $validasi, 'verifikasi_wajah' => 0 ] ); } catch (\Exception $e) { $this->command->error('Gagal seed user ' . $jadwal->id_user . ': ' . $e->getMessage()); } } $this->command->info('Presensi dummy berhasil dibuat!'); } }