user()->employee; } public function index(Request $request) { $employee = $this->checkEmployee($request); if (!$employee) { return redirect()->route('employee.index')->with('error', 'Profil karyawan tidak ditemukan.'); } $employeeId = $employee->id; $attendances = Attendance::where('employee_id', $employeeId)->orderBy('date', 'desc')->get(); $today = Carbon::today()->toDateString(); $todayAttendance = Attendance::where('employee_id', $employeeId)->where('date', $today)->first(); return Inertia::render('employee/attendances/index', [ 'attendances' => $attendances, 'todayAttendance' => $todayAttendance, ]); } public function clockIn(Request $request) { $employee = $this->checkEmployee($request); if (!$employee) { return redirect()->route('employee.index')->with('error', 'Profil karyawan tidak ditemukan.'); } $request->validate([ 'latitude_in' => 'required|numeric', 'longitude_in' => 'required|numeric', ], [ 'latitude_in.required' => 'Lokasi latitude wajib diisi.', 'latitude_in.numeric' => 'Lokasi latitude harus berupa angka.', 'longitude_in.required' => 'Lokasi longitude wajib diisi.', 'longitude_in.numeric' => 'Lokasi longitude harus berupa angka.', ]); $employeeId = $employee->id; $today = Carbon::today()->toDateString(); $existingAttendance = Attendance::where('employee_id', $employeeId) ->where('date', $today) ->first(); if ($existingAttendance) { return back()->with('error', 'Anda sudah melakukan absen masuk hari ini.'); } Attendance::create([ 'employee_id' => $employeeId, 'date' => $today, 'check_in' => Carbon::now()->toTimeString(), 'latitude_in' => $request->latitude_in, 'longitude_in' => $request->longitude_in, 'status' => 'present', ]); return back()->with('success', 'Berhasil Absen Masuk.'); } public function clockOut(Request $request) { $employee = $this->checkEmployee($request); if (!$employee) { return redirect()->route('employee.index')->with('error', 'Profil karyawan tidak ditemukan.'); } $request->validate([ 'latitude_out' => 'required|numeric', 'longitude_out' => 'required|numeric', ], [ 'latitude_out.required' => 'Lokasi latitude wajib diisi.', 'latitude_out.numeric' => 'Lokasi latitude harus berupa angka.', 'longitude_out.required' => 'Lokasi longitude wajib diisi.', 'longitude_out.numeric' => 'Lokasi longitude harus berupa angka.', ]); $employeeId = $employee->id; $today = Carbon::today()->toDateString(); $attendance = Attendance::where('employee_id', $employeeId) ->where('date', $today) ->first(); if (!$attendance || $attendance->check_out) { return back()->with('error', 'Anda belum absen masuk atau sudah absen pulang hari ini.'); } $attendance->update([ 'check_out' => Carbon::now()->toTimeString(), 'latitude_out' => $request->latitude_out, 'longitude_out' => $request->longitude_out, ]); return back()->with('success', 'Berhasil Absen Pulang.'); } public function submitLeave(Request $request) { $employee = $this->checkEmployee($request); if (!$employee) { return redirect()->route('employee.index')->with('error', 'Profil karyawan tidak ditemukan.'); } $request->validate([ 'date' => 'required|date', 'notes' => 'required|string|min:5', ], [ 'date.required' => 'Tanggal izin wajib diisi.', 'date.date' => 'Format tanggal tidak valid.', 'notes.required' => 'Keterangan izin wajib diisi.', 'notes.string' => 'Keterangan izin harus berupa teks.', 'notes.min' => 'Keterangan izin minimal 5 karakter.', ]); Attendance::create([ 'employee_id' => $employee->id, 'date' => $request->date, 'status' => 'leave', 'notes' => $request->notes, ]); return back()->with('success', 'Izin berhasil diajukan.'); } public function submitDispensation(Request $request) { $employee = $this->checkEmployee($request); if (!$employee) { return redirect()->route('employee.index')->with('error', 'Profil karyawan tidak ditemukan.'); } $request->validate([ 'latitude_in' => 'required|numeric', 'longitude_in' => 'required|numeric', 'notes' => 'required|string|min:5', ], [ 'latitude_in.required' => 'Lokasi latitude wajib diisi.', 'latitude_in.numeric' => 'Lokasi latitude harus berupa angka.', 'longitude_in.required' => 'Lokasi longitude wajib diisi.', 'longitude_in.numeric' => 'Lokasi longitude harus berupa angka.', 'notes.required' => 'Keterangan dispensasi wajib diisi.', 'notes.string' => 'Keterangan dispensasi harus berupa teks.', 'notes.min' => 'Keterangan dispensasi minimal 5 karakter.', ]); $now = Carbon::now(); Attendance::create([ 'employee_id' => $employee->id, 'date' => $now->toDateString(), 'check_in' => $now->toTimeString(), 'latitude_in' => $request->latitude_in, 'longitude_in' => $request->longitude_in, 'status' => 'dispensation', 'notes' => $request->notes, ]); return back()->with('success', 'Dispensasi berhasil diajukan.'); } }