fix(mobile): resolve user avatars, chat alignment, timestamp formatting, and payslips API
This commit is contained in:
139
app/Http/Controllers/AttendanceLocationController.php
Normal file
139
app/Http/Controllers/AttendanceLocationController.php
Normal file
@@ -0,0 +1,139 @@
|
||||
<?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.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user