204 lines
7.5 KiB
PHP
204 lines
7.5 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|integer',
|
|
'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'));
|
|
}
|
|
}
|