MIF_E31230910_MP-HRIS-WEB/database/seeders/PresensiSeeder.php

89 lines
3.2 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Presensi;
use App\Models\JadwalKerja;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class PresensiSeeder extends Seeder
{
public function run(): void
{
$today = Carbon::today()->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!');
}
}