From 937857a842dd22d78966b527ef6d3d8dbaa69902 Mon Sep 17 00:00:00 2001 From: jeremy bayse Date: Sun, 22 Mar 2026 23:24:20 +0100 Subject: [PATCH] AI Analysis: add custom AI prompt to job positions --- .../Controllers/JobPositionController.php | 4 +++ app/Models/JobPosition.php | 2 +- app/Services/AIAnalysisService.php | 3 ++ ...6_add_ai_prompt_to_job_positions_table.php | 28 +++++++++++++++++++ .../js/Pages/Admin/JobPositions/Index.vue | 16 ++++++++++- 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2026_03_22_222246_add_ai_prompt_to_job_positions_table.php diff --git a/app/Http/Controllers/JobPositionController.php b/app/Http/Controllers/JobPositionController.php index a5896e9..706c8ba 100644 --- a/app/Http/Controllers/JobPositionController.php +++ b/app/Http/Controllers/JobPositionController.php @@ -25,12 +25,14 @@ class JobPositionController extends Controller 'title' => 'required|string|max:255', 'description' => 'required|string', 'requirements' => 'nullable|array', + 'ai_prompt' => 'nullable|string', ]); JobPosition::create([ 'title' => $request->title, 'description' => $request->description, 'requirements' => $request->requirements, + 'ai_prompt' => $request->ai_prompt, ]); return back()->with('success', 'Fiche de poste créée avec succès.'); @@ -44,12 +46,14 @@ class JobPositionController extends Controller 'title' => 'required|string|max:255', 'description' => 'required|string', 'requirements' => 'nullable|array', + 'ai_prompt' => 'nullable|string', ]); $jobPosition->update([ 'title' => $request->title, 'description' => $request->description, 'requirements' => $request->requirements, + 'ai_prompt' => $request->ai_prompt, ]); return back()->with('success', 'Fiche de poste mise à jour.'); diff --git a/app/Models/JobPosition.php b/app/Models/JobPosition.php index af40e07..73e86c1 100644 --- a/app/Models/JobPosition.php +++ b/app/Models/JobPosition.php @@ -7,7 +7,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Factories\HasFactory; -#[Fillable(['title', 'description', 'requirements'])] +#[Fillable(['title', 'description', 'requirements', 'ai_prompt'])] class JobPosition extends Model { use HasFactory; diff --git a/app/Services/AIAnalysisService.php b/app/Services/AIAnalysisService.php index b1645a4..4663cb1 100644 --- a/app/Services/AIAnalysisService.php +++ b/app/Services/AIAnalysisService.php @@ -95,6 +95,9 @@ class AIAnalysisService CONTENU DE LA LETTRE DE MOTIVATION: " . ($letterText ?? "Non fournie") . " + CONTEXTE ADDITIONNEL & INSTRUCTIONS PARTICULIÈRES: + " . ($candidate->jobPosition->ai_prompt ?? "Aucune instruction spécifique.") . " + Fournis une analyse structurée en JSON avec les clés suivantes: - match_score: note de 0 à 100 - summary: résumé de 3-4 phrases sur le profil diff --git a/database/migrations/2026_03_22_222246_add_ai_prompt_to_job_positions_table.php b/database/migrations/2026_03_22_222246_add_ai_prompt_to_job_positions_table.php new file mode 100644 index 0000000..a45fdea --- /dev/null +++ b/database/migrations/2026_03_22_222246_add_ai_prompt_to_job_positions_table.php @@ -0,0 +1,28 @@ +text('ai_prompt')->nullable()->after('description'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('job_positions', function (Blueprint $table) { + $table->dropColumn('ai_prompt'); + }); + } +}; diff --git a/resources/js/Pages/Admin/JobPositions/Index.vue b/resources/js/Pages/Admin/JobPositions/Index.vue index e21587c..6217fd1 100644 --- a/resources/js/Pages/Admin/JobPositions/Index.vue +++ b/resources/js/Pages/Admin/JobPositions/Index.vue @@ -18,7 +18,8 @@ const editingPosition = ref(null); const form = useForm({ title: '', description: '', - requirements: [] + requirements: [], + ai_prompt: '' }); const openModal = (position = null) => { @@ -27,6 +28,7 @@ const openModal = (position = null) => { form.title = position.title; form.description = position.description; form.requirements = position.requirements || []; + form.ai_prompt = position.ai_prompt || ''; } else { form.reset(); } @@ -165,6 +167,18 @@ const removeRequirement = (index) => { +
+ +

Utilisez cette zone pour donner des instructions spécifiques à l'IA (priorités, contexte entreprise, ton de l'analyse...)

+ + +
+