178 lines
6.3 KiB
PHP
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.');
|
|
}
|
|
}
|