AI Analysis: add custom AI prompt to job positions

This commit is contained in:
jeremy bayse
2026-03-22 23:24:20 +01:00
parent 949423b1ae
commit 937857a842
5 changed files with 51 additions and 2 deletions

View File

@@ -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.');

View File

@@ -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;

View File

@@ -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

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('job_positions', function (Blueprint $table) {
$table->text('ai_prompt')->nullable()->after('description');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('job_positions', function (Blueprint $table) {
$table->dropColumn('ai_prompt');
});
}
};

View File

@@ -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) => {
<InputError :message="form.errors.description" />
</div>
<div class="bg-indigo-50/50 dark:bg-indigo-900/10 p-6 rounded-3xl border border-indigo-100 dark:border-indigo-800/50">
<label class="block text-xs font-black uppercase tracking-widest text-indigo-600 dark:text-indigo-400 mb-2">IA Context & Prompt Personnalisé</label>
<p class="text-[10px] text-indigo-400 mb-4 font-bold uppercase tracking-tight">Utilisez cette zone pour donner des instructions spécifiques à l'IA (priorités, contexte entreprise, ton de l'analyse...)</p>
<textarea
v-model="form.ai_prompt"
rows="5"
class="w-full bg-white dark:bg-slate-900 border-none rounded-2xl p-4 focus:ring-2 focus:ring-indigo-500/20 transition-all text-sm leading-relaxed"
placeholder="Ex: Sois particulièrement attentif à l'expérience sur des projets SaaS à forte charge. Favorise les candidats ayant travaillé en environnement Agile."
></textarea>
<InputError :message="form.errors.ai_prompt" />
</div>
<div>
<div class="flex justify-between items-center mb-4">
<label class="text-xs font-black uppercase tracking-widest text-slate-400">Compétences clés / Pré-requis</label>