migrant-web/app/Http/Controllers/Admin/WorkerController.php

218 lines
8.2 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Inertia\Inertia;
class WorkerController extends Controller
{
/**
* Display a listing of all workers.
*/
public function index()
{
$workers = \App\Models\Worker::with(['skills', 'documents'])
->latest()
->get()
->map(function ($worker) {
// Map languages from database comma-separated string
$langs = $worker->language ? array_map('trim', explode(',', $worker->language)) : ['English'];
// Map skills dynamically from database
$mappedSkills = $worker->skills->pluck('name')->toArray();
if (empty($mappedSkills)) {
$mappedSkills = ['cooking', 'cleaning'];
}
// Preferred job types: full-time / part-time / live-in / live-out
$jobTypes = ['full-time', 'part-time', 'live-in', 'live-out'];
$preferredJobType = $worker->preferred_job_type ?? $jobTypes[$worker->id % 4];
return [
'id' => $worker->id,
'name' => $worker->name,
'email' => $worker->email,
'phone' => $worker->phone,
'gender' => $worker->gender ?? 'Female',
'age' => $worker->age,
'religion' => $worker->religion,
'visa_status' => $worker->visa_status,
'in_country' => (bool)$worker->in_country,
'language' => $worker->language ?? 'English',
'languages' => $langs,
'nationality' => $worker->nationality,
'country' => $worker->country,
'city' => $worker->city,
'area' => $worker->area,
'preferred_location' => $worker->preferred_location,
'live_in_out' => $worker->live_in_out ?? 'Live-in',
'experience' => $worker->experience,
'salary' => (int)$worker->salary,
'skills' => $mappedSkills,
'preferred_job_type' => $preferredJobType,
'status' => $worker->status,
'availability' => $worker->availability,
'verified' => (bool)$worker->verified,
'bio' => $worker->bio,
'documents' => $worker->documents,
'joined_at' => $worker->created_at ? $worker->created_at->format('Y-m-d') : 'N/A',
];
});
return Inertia::render('Admin/Workers/Index', [
'workers' => $workers,
]);
}
/**
* Toggle worker active/inactive status.
*/
public function toggleStatus(Request $request, $id)
{
$validated = $request->validate([
'status' => 'required|in:active,inactive,suspended,banned',
]);
$worker = \App\Models\Worker::findOrFail($id);
$worker->status = $validated['status'];
$worker->save();
return back()->with('success', "Worker status has been updated to {$validated['status']}.");
}
/**
* Override worker availability.
*/
public function availabilityOverride(Request $request, $id)
{
$validated = $request->validate([
'availability' => 'required|string',
]);
$worker = \App\Models\Worker::findOrFail($id);
$worker->availability = $validated['availability'];
$worker->save();
return back()->with('success', "Worker availability has been overridden to '{$validated['availability']}' successfully.");
}
/**
* Flag worker as fraudulent or suspicious.
*/
public function flagFraud(Request $request, $id)
{
$validated = $request->validate([
'is_fraud' => 'required|boolean',
'reason' => 'nullable|string'
]);
$worker = \App\Models\Worker::findOrFail($id);
$worker->status = $validated['is_fraud'] ? 'suspended' : 'active';
$worker->save();
$statusStr = $validated['is_fraud'] ? 'FLAGGED FOR FRAUD' : 'UNFLAGGED';
return back()->with('success', "Worker #{$id} has been {$statusStr}. Notes: {$validated['reason']}");
}
/**
* Moderation profile updates.
*/
public function updateProfile(Request $request, $id)
{
$validated = $request->validate([
'name' => 'required|string',
'phone' => 'required|string',
'gender' => 'nullable|string',
'language' => 'nullable|string',
'preferred_location' => 'nullable|string',
'live_in_out' => 'nullable|string',
'experience' => 'required|string',
'salary' => 'nullable|numeric',
'nationality' => 'nullable|string',
'visa_status' => 'nullable|string',
'age' => [
'nullable',
function ($attribute, $value, $fail) {
if (is_numeric($value)) {
$intValue = (int)$value;
if ($intValue < 18 || $intValue > 100) {
$fail('The age must be between 18 and 100.');
}
} else {
if (!in_array($value, ['18-25', '26-35', '36-45', '46-55', '56-60'])) {
$fail('The age must be a valid number or one of the ranges: 18-25, 26-35, 36-45, 46-55, 56-60.');
}
}
}
],
'in_country' => 'nullable',
'preferred_job_type' => 'nullable|string',
'skills' => 'nullable|string',
]);
$worker = \App\Models\Worker::findOrFail($id);
$worker->name = $validated['name'];
$worker->phone = $validated['phone'];
$worker->gender = $validated['gender'] ?? $worker->gender;
$worker->language = $validated['language'] ?? $worker->language;
$worker->preferred_location = $validated['preferred_location'] ?? $worker->preferred_location;
$worker->live_in_out = $validated['live_in_out'] ?? $worker->live_in_out;
$worker->experience = $validated['experience'];
$worker->salary = $validated['salary'] ?? $worker->salary;
$worker->nationality = $validated['nationality'] ?? $worker->nationality;
$worker->visa_status = $validated['visa_status'] ?? $worker->visa_status;
$worker->age = $validated['age'] ?? $worker->age;
if (isset($validated['in_country'])) {
$worker->in_country = filter_var($validated['in_country'], FILTER_VALIDATE_BOOLEAN);
}
$worker->preferred_job_type = $validated['preferred_job_type'] ?? $worker->preferred_job_type;
$worker->save();
if ($request->has('skills')) {
$skillsArray = array_filter(array_map('trim', explode(',', $validated['skills'] ?? '')));
$skillIds = [];
foreach ($skillsArray as $name) {
$skill = \App\Models\Skill::firstOrCreate(['name' => $name]);
$skillIds[] = $skill->id;
}
$worker->skills()->sync($skillIds);
}
return back()->with('success', "Worker #{$id} profile details moderated and updated successfully.");
}
/**
* Verify an employer's company details.
*/
public function verifyEmployer(Request $request, $id)
{
$sponsor = \App\Models\Sponsor::findOrFail($id);
$sponsor->is_verified = true;
$sponsor->save();
return back()->with('success', "Employer #{$id} verification status set to APPROVED.");
}
/**
* Suspend employer.
*/
public function suspendEmployer(Request $request, $id)
{
$validated = $request->validate([
'reason' => 'nullable|string'
]);
$sponsor = \App\Models\Sponsor::findOrFail($id);
$sponsor->status = 'suspended';
$sponsor->save();
return back()->with('success', "Employer #{$id} has been suspended. Reason: " . ($validated['reason'] ?? 'Unspecified violation'));
}
}