From 4810ca9d9ca47fc159744d83deb909fa01e22544 Mon Sep 17 00:00:00 2001 From: jeremy bayse Date: Mon, 30 Mar 2026 17:03:20 +0200 Subject: [PATCH] feat: allow super admin to update candidate tenant on profile page --- app/Http/Controllers/CandidateController.php | 37 ++++++++++++++++++-- resources/js/Pages/Admin/Candidates/Show.vue | 27 ++++++++++++++ routes/web.php | 1 + 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/CandidateController.php b/app/Http/Controllers/CandidateController.php index 54de8b8..e3ca269 100644 --- a/app/Http/Controllers/CandidateController.php +++ b/app/Http/Controllers/CandidateController.php @@ -84,10 +84,11 @@ class CandidateController extends Controller 'attempts.quiz', 'attempts.answers.question', 'attempts.answers.option', - 'jobPosition' + 'jobPosition', + 'tenant' ]); - return \Inertia\Inertia::render('Admin/Candidates/Show', [ + $data = [ 'candidate' => $candidate, 'jobPositions' => \App\Models\JobPosition::all(), 'ai_config' => [ @@ -99,7 +100,13 @@ class CandidateController extends Controller 'gemini' => !empty(env('GEMINI_API_KEY')), ], function($v) { return $v; }) ] - ]); + ]; + + if (auth()->user()->isSuperAdmin()) { + $data['tenants'] = \App\Models\Tenant::orderBy('name')->get(); + } + + return \Inertia\Inertia::render('Admin/Candidates/Show', $data); } public function destroy(Candidate $candidate) @@ -174,6 +181,30 @@ class CandidateController extends Controller return back()->with('success', 'Fiche de poste associée au candidat.'); } + public function updateTenant(Request $request, Candidate $candidate) + { + if (!auth()->user()->isSuperAdmin()) { + abort(403); + } + + $request->validate([ + 'tenant_id' => 'nullable|exists:tenants,id', + ]); + + $candidate->update([ + 'tenant_id' => $request->tenant_id, + ]); + + // Also update the associated user's tenant_id if it exists + if ($candidate->user) { + $candidate->user->update([ + 'tenant_id' => $request->tenant_id, + ]); + } + + return back()->with('success', 'Structure de rattachement mise à jour avec succès.'); + } + public function resetPassword(Candidate $candidate) { $password = Str::random(10); diff --git a/resources/js/Pages/Admin/Candidates/Show.vue b/resources/js/Pages/Admin/Candidates/Show.vue index 476ac46..79f69e1 100644 --- a/resources/js/Pages/Admin/Candidates/Show.vue +++ b/resources/js/Pages/Admin/Candidates/Show.vue @@ -13,6 +13,7 @@ import InputError from '@/Components/InputError.vue'; const props = defineProps({ candidate: Object, jobPositions: Array, + tenants: Array, ai_config: Object }); @@ -29,6 +30,16 @@ const updatePosition = () => { }); }; +const tenantForm = useForm({ + tenant_id: props.candidate.tenant_id || '' +}); + +const updateTenant = () => { + tenantForm.patch(route('admin.candidates.update-tenant', props.candidate.id), { + preserveScroll: true, + }); +}; + const selectedDocument = ref(null); const docForm = useForm({ @@ -207,6 +218,22 @@ const runAI = async () => { + + +
+ + +

Note: modifie aussi le rattachement de l'utilisateur.

+
diff --git a/routes/web.php b/routes/web.php index a1c5372..b5a8d2c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -76,6 +76,7 @@ Route::middleware('auth')->group(function () { Route::patch('/candidates/{candidate}/notes', [\App\Http\Controllers\CandidateController::class, 'updateNotes'])->name('candidates.update-notes'); Route::patch('/candidates/{candidate}/scores', [\App\Http\Controllers\CandidateController::class, 'updateScores'])->name('candidates.update-scores'); Route::patch('/candidates/{candidate}/position', [\App\Http\Controllers\CandidateController::class, 'updatePosition'])->name('candidates.update-position'); + Route::patch('/candidates/{candidate}/tenant', [\App\Http\Controllers\CandidateController::class, 'updateTenant'])->name('candidates.update-tenant'); Route::post('/candidates/{candidate}/analyze', [\App\Http\Controllers\AIAnalysisController::class, 'analyze'])->name('candidates.analyze'); Route::post('/candidates/{candidate}/reset-password', [\App\Http\Controllers\CandidateController::class, 'resetPassword'])->name('candidates.reset-password'); Route::get('/documents/{document}', [\App\Http\Controllers\DocumentController::class, 'show'])->name('documents.show');