140 lines
5.0 KiB
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.');
|
|
}
|
|
}
|