89 lines
2.9 KiB
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.');
|
|
}
|
|
}
|