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(), ]); } }