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

287 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\EmployerProfile;
use App\Models\Sponsor;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Illuminate\Support\Facades\DB;
class EmployerController extends Controller
{
/**
* List all employers (role = 'employer') with filters, search, and sorting.
*/
public function index(Request $request)
{
$query = User::where('role', 'employer')->with(['employerProfile', 'sponsor']);
// Search
if ($request->filled('search')) {
$search = $request->input('search');
$query->where(function($q) use ($search) {
$q->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%")
->orWhereHas('employerProfile', function($qp) use ($search) {
$qp->where('company_name', 'like', "%{$search}%")
->orWhere('phone', 'like', "%{$search}%");
});
});
}
// Status filter (on sponsor status)
if ($request->filled('status') && $request->input('status') !== 'All') {
$status = strtolower($request->input('status'));
$query->whereHas('sponsor', function($qs) use ($status) {
$qs->where('status', $status);
});
}
// Location filter
if ($request->filled('location') && $request->input('location') !== 'All') {
$location = $request->input('location');
$query->whereHas('employerProfile', function($qp) use ($location) {
$qp->where('country', $location);
});
}
// Sorting
$sortField = $request->input('sort_field', 'created_at');
$sortOrder = $request->input('sort_order', 'desc');
if (in_array($sortField, ['name', 'email', 'created_at'])) {
$query->orderBy($sortField, $sortOrder);
} else {
$query->orderBy('created_at', 'desc');
}
$employers = $query->paginate(10)->withQueryString();
// Transform results to format status correctly from sponsor and prevent nulls/missing fields
$employers->getCollection()->transform(function($emp) {
$emp->status = $emp->sponsor ? $emp->sponsor->status : 'active';
// Populate backward-compatible sponsor properties to prevent front-end crashes (e.g. charAt on full_name)
$emp->full_name = $emp->name ?? ($emp->sponsor ? $emp->sponsor->full_name : 'Employer');
if (empty($emp->full_name)) {
$emp->full_name = 'Employer';
}
$emp->mobile = $emp->sponsor ? $emp->sponsor->mobile : ($emp->employerProfile ? $emp->employerProfile->phone : '');
if (empty($emp->mobile)) {
$emp->mobile = '';
}
$emp->city = $emp->sponsor ? $emp->sponsor->city : ($emp->employerProfile ? $emp->employerProfile->country : 'Dubai');
if (empty($emp->city)) {
$emp->city = 'Dubai';
}
$emp->subscription_plan = $emp->sponsor ? $emp->sponsor->subscription_plan : ($emp->subscription_status ?? 'none');
if (empty($emp->subscription_plan)) {
$emp->subscription_plan = 'none';
}
$emp->subscription_status = $emp->sponsor ? $emp->sponsor->subscription_status : ($emp->subscription_status ?? 'none');
if (empty($emp->subscription_status)) {
$emp->subscription_status = 'none';
}
$emp->is_verified = $emp->sponsor ? (bool)$emp->sponsor->is_verified : ($emp->employerProfile ? ($emp->employerProfile->verification_status === 'approved') : false);
return $emp;
});
return Inertia::render('Admin/Employers/Index', [
'employers' => $employers,
'sponsors' => $employers,
'filters' => $request->only(['search', 'status', 'location', 'sort_field', 'sort_order'])
]);
}
/**
* Export employers as CSV.
*/
public function export(Request $request)
{
$query = User::where('role', 'employer')->with(['employerProfile', 'sponsor']);
// Search
if ($request->filled('search')) {
$search = $request->input('search');
$query->where(function($q) use ($search) {
$q->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%")
->orWhereHas('employerProfile', function($qp) use ($search) {
$qp->where('company_name', 'like', "%{$search}%")
->orWhere('phone', 'like', "%{$search}%");
});
});
}
// Status filter
if ($request->filled('status') && $request->input('status') !== 'All') {
$status = strtolower($request->input('status'));
$query->whereHas('sponsor', function($qs) use ($status) {
$qs->where('status', $status);
});
}
$employers = $query->get();
$headers = [
"Content-type" => "text/csv",
"Content-Disposition" => "attachment; filename=employers_export_" . date('Ymd_His') . ".csv",
"Pragma" => "no-cache",
"Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
"Expires" => "0"
];
$columns = ['ID', 'Name', 'Email', 'Company Name', 'Phone', 'Country', 'Status', 'Subscription Status', 'Created At'];
$callback = function() use ($employers, $columns) {
$file = fopen('php://output', 'w');
fputcsv($file, $columns);
foreach ($employers as $emp) {
fputcsv($file, [
$emp->id,
$emp->name,
$emp->email,
$emp->employerProfile ? ($emp->employerProfile->company_name ?? 'N/A') : 'N/A',
$emp->employerProfile ? ($emp->employerProfile->phone ?? 'N/A') : 'N/A',
$emp->employerProfile ? ($emp->employerProfile->country ?? 'N/A') : 'N/A',
$emp->sponsor ? $emp->sponsor->status : 'active',
$emp->subscription_status ?? 'none',
$emp->created_at ? $emp->created_at->toDateTimeString() : 'N/A',
]);
}
fclose($file);
};
return response()->stream($callback, 200, $headers);
}
/**
* Verify / approve employer profile.
*/
public function verify($id)
{
$user = User::where('role', 'employer')->findOrFail($id);
if ($user->employerProfile) {
$user->employerProfile->update([
'verification_status' => 'approved'
]);
}
$sponsor = Sponsor::where('email', $user->email)->first();
if ($sponsor) {
$sponsor->update([
'is_verified' => true,
'status' => 'active'
]);
}
return back()->with('success', "Employer '{$user->name}' profile verified and activated successfully.");
}
/**
* Suspend an employer.
*/
public function suspend($id)
{
$user = User::where('role', 'employer')->findOrFail($id);
$sponsor = Sponsor::where('email', $user->email)->first();
if ($sponsor) {
$sponsor->update(['status' => 'suspended']);
}
return back()->with('success', "Employer '{$user->name}' suspended successfully.");
}
/**
* Activate a suspended/inactive employer.
*/
public function activate($id)
{
$user = User::where('role', 'employer')->findOrFail($id);
$sponsor = Sponsor::where('email', $user->email)->first();
if ($sponsor) {
$sponsor->update(['status' => 'active']);
}
return back()->with('success', "Employer '{$user->name}' activated successfully.");
}
/**
* Delete an employer.
*/
public function delete($id)
{
$user = User::where('role', 'employer')->findOrFail($id);
$name = $user->name;
$sponsor = Sponsor::where('email', $user->email)->first();
if ($sponsor) {
$sponsor->delete();
}
if ($user->employerProfile) {
$user->employerProfile->delete();
}
$user->delete();
return back()->with('success', "Employer '{$name}' deleted successfully.");
}
/**
* Update an employer's fields.
*/
public function update(Request $request, $id)
{
$user = User::where('role', 'employer')->findOrFail($id);
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $user->id,
'company_name' => 'nullable|string|max:255',
'phone' => 'nullable|string',
'country' => 'nullable|string',
'subscription_status' => 'nullable|string',
]);
$user->update([
'name' => $validated['name'],
'email' => $validated['email'],
'subscription_status' => $validated['subscription_status'] ?? $user->subscription_status,
]);
if ($user->employerProfile) {
$user->employerProfile->update([
'company_name' => $validated['company_name'] ?? $user->employerProfile->company_name,
'phone' => $validated['phone'] ?? $user->employerProfile->phone,
'country' => $validated['country'] ?? $user->employerProfile->country,
]);
} else {
EmployerProfile::create([
'user_id' => $user->id,
'company_name' => $validated['company_name'],
'phone' => $validated['phone'],
'country' => $validated['country'],
]);
}
$sponsor = Sponsor::where('email', $user->email)->first();
if ($sponsor) {
$sponsor->update([
'full_name' => $validated['name'],
'email' => $validated['email'],
'mobile' => $validated['phone'] ?? $sponsor->mobile,
'organization_name' => $validated['company_name'] ?? $sponsor->organization_name,
'city' => $validated['country'] ?? $sponsor->city,
]);
}
return back()->with('success', "Employer details saved successfully.");
}
}