Files
RecruIT/app/Http/Controllers/PublicJobApplicationController.php

134 lines
4.6 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\JobPosition;
use App\Models\Candidate;
use App\Models\User;
use App\Models\Document;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use Inertia\Inertia;
use Illuminate\Support\Facades\Auth;
class PublicJobApplicationController extends Controller
{
public function index()
{
$jobs = JobPosition::with('tenant')
->where(function($q) {
$q->whereNull('expires_at')
->orWhere('expires_at', '>=', now());
})
->orderBy('created_at', 'desc')
->get()
->map(function($job) {
$job->description = strip_tags(\Illuminate\Support\Str::markdown($job->description));
return $job;
});
return Inertia::render('Public/Jobs/Index', [
'jobs' => $jobs
]);
}
public function show(JobPosition $jobPosition)
{
if ($jobPosition->expires_at && $jobPosition->expires_at->isPast()) {
abort(404);
}
$data = $jobPosition->toArray();
$data['description_html'] = \Illuminate\Support\Str::markdown($jobPosition->description);
return Inertia::render('Public/Jobs/Show', [
'jobPosition' => $data
]);
}
public function store(Request $request, JobPosition $jobPosition)
{
if ($jobPosition->expires_at && $jobPosition->expires_at->isPast()) {
return back()->withErrors(['error' => 'Cette offre a expiré.']);
}
$request->validate([
'birth_name' => 'required|string|max:255',
'usage_name' => 'required|string|max:255',
'first_name' => 'required|string|max:255',
'address' => 'required|string|max:255',
'zip_code' => 'required|string|max:10',
'city' => 'required|string|max:255',
'phone' => 'required|string|max:20',
'email' => 'required|string|email|max:255|unique:users|confirmed',
'birth_date' => 'required|date',
'birth_place' => 'required|string|max:255',
'nationality' => 'required|string|max:255',
'current_situation' => 'required|string|max:255',
'education_level' => 'required|string|max:255',
'has_driving_license' => 'required|boolean',
'privacy_policy' => 'accepted',
'cv' => 'nullable|mimes:pdf|max:5120',
'cover_letter' => 'nullable|mimes:pdf|max:5120',
]);
$password = Str::random(10);
$user = User::create([
'name' => $request->first_name . ' ' . $request->usage_name,
'email' => $request->email,
'password' => Hash::make($password),
'role' => 'candidate',
'tenant_id' => $jobPosition->tenant_id,
]);
$candidate = $user->candidate()->create([
'birth_name' => $request->birth_name,
'usage_name' => $request->usage_name,
'first_name' => $request->first_name,
'address' => $request->address,
'zip_code' => $request->zip_code,
'city' => $request->city,
'phone' => $request->phone,
'birth_date' => $request->birth_date,
'birth_place' => $request->birth_place,
'nationality' => $request->nationality,
'current_situation' => $request->current_situation,
'education_level' => $request->education_level,
'has_driving_license' => $request->has_driving_license,
'status' => 'en_attente',
'tenant_id' => $jobPosition->tenant_id,
'job_position_id' => $jobPosition->id,
]);
if ($request->hasFile('cv')) {
$this->storeDocument($candidate, $request->file('cv'), 'cv');
}
if ($request->hasFile('cover_letter')) {
$this->storeDocument($candidate, $request->file('cover_letter'), 'cover_letter');
}
// Auto-login
Auth::login($user);
return redirect()->route('dashboard')->with('success', 'Votre candidature a bien été enregistrée. Voici votre mot de passe temporaire pour vous reconnecter : ' . $password);
}
private function storeDocument(Candidate $candidate, $file, string $type)
{
if (!$file) {
return;
}
$path = $file->store('private/documents/' . $candidate->id, 'local');
Document::create([
'candidate_id' => $candidate->id,
'type' => $type,
'file_path' => $path,
'original_name' => $file->getClientOriginalName(),
]);
}
}