Files
HRM-System/app/Http/Controllers/AttendanceLocationController.php

140 lines
5.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\AttendanceLocation;
use App\Models\Branch;
use App\Models\Employee;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Exception;
class AttendanceLocationController extends Controller
{
public function index(Request $request)
{
$user = $request->user();
$creatorId = $user->type === 'company' ? $user->id : $user->created_by;
$query = AttendanceLocation::with('branch')
->where('created_by', $creatorId);
if ($request->filled('search')) {
$search = $request->input('search');
$query->where(function ($q) use ($search) {
$q->where('name', 'like', "%{$search}%")
->orWhere('address', 'like', "%{$search}%");
});
}
if ($request->filled('branch_id') && $request->branch_id !== 'all') {
$query->where('branch_id', $request->branch_id);
}
if ($request->filled('status') && $request->status !== 'all') {
$query->where('is_active', $request->status === 'active');
}
$perPage = $request->input('per_page', 10);
$locations = $query->orderBy('id', 'desc')->paginate($perPage)->withQueryString();
$branches = Branch::where('created_by', $creatorId)
->where('status', 'active')
->select('id', 'name')
->get();
$allEmployees = Employee::with('user')
->where('created_by', $creatorId)
->get()
->map(function ($emp) {
return [
'id' => $emp->id,
'name' => $emp->user ? $emp->user->name : "Employee #{$emp->id}",
];
});
$stats = [
'total' => AttendanceLocation::where('created_by', $creatorId)->count(),
'active' => AttendanceLocation::where('created_by', $creatorId)->where('is_active', true)->count(),
'inactive' => AttendanceLocation::where('created_by', $creatorId)->where('is_active', false)->count(),
];
return Inertia::render('hr/attendance-locations/index', [
'locations' => $locations,
'branches' => $branches,
'employees' => $allEmployees,
'stats' => $stats,
'filters' => $request->only(['search', 'branch_id', 'status', 'per_page']),
]);
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'branch_id' => 'nullable|exists:branches,id',
'address' => 'nullable|string',
'latitude' => 'required|numeric',
'longitude' => 'required|numeric',
'radius_meters' => 'required|integer|min:10|max:10000',
'is_active' => 'boolean',
]);
$user = $request->user();
$creatorId = $user->type === 'company' ? $user->id : $user->created_by;
$location = AttendanceLocation::create([
'created_by' => $creatorId,
'branch_id' => $validated['branch_id'] ?? null,
'name' => $validated['name'],
'address' => $validated['address'] ?? null,
'latitude' => $validated['latitude'],
'longitude' => $validated['longitude'],
'radius_meters' => $validated['radius_meters'],
'is_active' => $validated['is_active'] ?? true,
]);
return redirect()->back()->with('success', 'Attendance location created successfully.');
}
public function update(Request $request, AttendanceLocation $attendanceLocation)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'branch_id' => 'nullable|exists:branches,id',
'address' => 'nullable|string',
'latitude' => 'required|numeric',
'longitude' => 'required|numeric',
'radius_meters' => 'required|integer|min:10|max:10000',
'is_active' => 'boolean',
]);
$attendanceLocation->update([
'branch_id' => $validated['branch_id'] ?? null,
'name' => $validated['name'],
'address' => $validated['address'] ?? null,
'latitude' => $validated['latitude'],
'longitude' => $validated['longitude'],
'radius_meters' => $validated['radius_meters'],
'is_active' => $validated['is_active'] ?? true,
]);
return redirect()->back()->with('success', 'Attendance location updated successfully.');
}
public function destroy(AttendanceLocation $attendanceLocation)
{
$attendanceLocation->delete();
return redirect()->back()->with('success', 'Attendance location deleted successfully.');
}
public function toggleStatus(AttendanceLocation $attendanceLocation)
{
$attendanceLocation->update([
'is_active' => !$attendanceLocation->is_active,
]);
return redirect()->back()->with('success', 'Location status updated.');
}
}