TIFNJK_E41222887/app/Http/Controllers/Admin/AttendanceController.php

89 lines
2.9 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Attendance;
use App\Models\Department;
use App\Models\Employee;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Inertia\Inertia;
class AttendanceController extends Controller
{
public function index(Request $request)
{
$query = Attendance::with(['employee.department']);
if ($request->filled('date')) {
$query->whereDate('date', $request->date);
}
if ($request->filled('status')) {
$query->where('status', $request->status);
}
if ($request->filled('department_id')) {
$query->whereHas('employee', function ($q) use ($request) {
$q->where('department_id', $request->department_id);
});
}
if ($request->filled('search')) {
$query->whereHas('employee', function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%')
->orWhere('nip', 'like', '%' . $request->search . '%');
});
}
return Inertia::render('admin/attendance/index', [
'attendances' => $query->latest('date')->paginate(15)->withQueryString(),
'departments' => Department::select('id', 'name')->orderBy('name')->get(),
'filters' => $request->only(['search', 'date', 'status', 'department_id']),
]);
}
public function create()
{
$employees = Employee::with('department')
->orderBy('name')
->get()
->map(fn($employee) => [
'id' => $employee->id,
'name' => $employee->name,
'nip' => $employee->nip,
'department' => $employee->department?->name,
]);
return Inertia::render('admin/attendance/create', [
'employees' => $employees,
]);
}
public function store(Request $request)
{
$validated = $request->validate([
'employee_id' => [
'required',
'exists:employees,id',
Rule::unique('attendances')->where(fn($query) => $query->where('date', $request->date)),
],
'date' => 'required|date',
'shift' => 'required|in:Pagi,Siang,Malam',
'status' => 'required|in:hadir,izin,sakit,alpha',
'check_in' => 'nullable|date',
'check_out' => 'nullable|date|after_or_equal:check_in',
'notes' => 'nullable|string|max:255',
], [
'employee_id.unique' => 'Absensi karyawan pada tanggal ini sudah tercatat.',
'check_out.after_or_equal' => 'Jam pulang harus setelah jam masuk.',
]);
Attendance::create($validated);
return redirect()->route('admin.attendance.index')
->with('success', 'Absensi berhasil disimpan.');
}
}