AI Analysis: add custom AI prompt to job positions
This commit is contained in:
@@ -25,12 +25,14 @@ class JobPositionController extends Controller
|
|||||||
'title' => 'required|string|max:255',
|
'title' => 'required|string|max:255',
|
||||||
'description' => 'required|string',
|
'description' => 'required|string',
|
||||||
'requirements' => 'nullable|array',
|
'requirements' => 'nullable|array',
|
||||||
|
'ai_prompt' => 'nullable|string',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
JobPosition::create([
|
JobPosition::create([
|
||||||
'title' => $request->title,
|
'title' => $request->title,
|
||||||
'description' => $request->description,
|
'description' => $request->description,
|
||||||
'requirements' => $request->requirements,
|
'requirements' => $request->requirements,
|
||||||
|
'ai_prompt' => $request->ai_prompt,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return back()->with('success', 'Fiche de poste créée avec succès.');
|
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',
|
'title' => 'required|string|max:255',
|
||||||
'description' => 'required|string',
|
'description' => 'required|string',
|
||||||
'requirements' => 'nullable|array',
|
'requirements' => 'nullable|array',
|
||||||
|
'ai_prompt' => 'nullable|string',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$jobPosition->update([
|
$jobPosition->update([
|
||||||
'title' => $request->title,
|
'title' => $request->title,
|
||||||
'description' => $request->description,
|
'description' => $request->description,
|
||||||
'requirements' => $request->requirements,
|
'requirements' => $request->requirements,
|
||||||
|
'ai_prompt' => $request->ai_prompt,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return back()->with('success', 'Fiche de poste mise à jour.');
|
return back()->with('success', 'Fiche de poste mise à jour.');
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
|
|||||||
use Illuminate\Database\Eloquent\Attributes\Fillable;
|
use Illuminate\Database\Eloquent\Attributes\Fillable;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
|
||||||
#[Fillable(['title', 'description', 'requirements'])]
|
#[Fillable(['title', 'description', 'requirements', 'ai_prompt'])]
|
||||||
class JobPosition extends Model
|
class JobPosition extends Model
|
||||||
{
|
{
|
||||||
use HasFactory;
|
use HasFactory;
|
||||||
|
|||||||
@@ -95,6 +95,9 @@ class AIAnalysisService
|
|||||||
CONTENU DE LA LETTRE DE MOTIVATION:
|
CONTENU DE LA LETTRE DE MOTIVATION:
|
||||||
" . ($letterText ?? "Non fournie") . "
|
" . ($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:
|
Fournis une analyse structurée en JSON avec les clés suivantes:
|
||||||
- match_score: note de 0 à 100
|
- match_score: note de 0 à 100
|
||||||
- summary: résumé de 3-4 phrases sur le profil
|
- summary: résumé de 3-4 phrases sur le profil
|
||||||
|
|||||||
@@ -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');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -18,7 +18,8 @@ const editingPosition = ref(null);
|
|||||||
const form = useForm({
|
const form = useForm({
|
||||||
title: '',
|
title: '',
|
||||||
description: '',
|
description: '',
|
||||||
requirements: []
|
requirements: [],
|
||||||
|
ai_prompt: ''
|
||||||
});
|
});
|
||||||
|
|
||||||
const openModal = (position = null) => {
|
const openModal = (position = null) => {
|
||||||
@@ -27,6 +28,7 @@ const openModal = (position = null) => {
|
|||||||
form.title = position.title;
|
form.title = position.title;
|
||||||
form.description = position.description;
|
form.description = position.description;
|
||||||
form.requirements = position.requirements || [];
|
form.requirements = position.requirements || [];
|
||||||
|
form.ai_prompt = position.ai_prompt || '';
|
||||||
} else {
|
} else {
|
||||||
form.reset();
|
form.reset();
|
||||||
}
|
}
|
||||||
@@ -165,6 +167,18 @@ const removeRequirement = (index) => {
|
|||||||
<InputError :message="form.errors.description" />
|
<InputError :message="form.errors.description" />
|
||||||
</div>
|
</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>
|
||||||
<div class="flex justify-between items-center mb-4">
|
<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>
|
<label class="text-xs font-black uppercase tracking-widest text-slate-400">Compétences clés / Pré-requis</label>
|
||||||
|
|||||||
Reference in New Issue
Block a user