262 lines
8.9 KiB
PHP
262 lines
8.9 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
|
|
$employers->getCollection()->transform(function($emp) {
|
|
$emp->status = $emp->sponsor ? $emp->sponsor->status : 'active';
|
|
return $emp;
|
|
});
|
|
|
|
return Inertia::render('Admin/Employers/Index', [
|
|
'employers' => $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->company_name ?? 'N/A',
|
|
$emp->employerProfile->phone ?? 'N/A',
|
|
$emp->employerProfile->country ?? '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.");
|
|
}
|
|
}
|