TIFNJK_E41222887/app/Http/Controllers/Employee/EmployeeAttendanceControlle...

178 lines
6.3 KiB
PHP

<?php
namespace App\Http\Controllers\Employee;
use App\Http\Controllers\Controller;
use App\Models\Attendance;
use Illuminate\Http\Request;
use Carbon\Carbon;
use Inertia\Inertia;
class EmployeeAttendanceController extends Controller
{
private function checkEmployee(Request $request)
{
return $request->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.');
}
}