installation du module RH

This commit is contained in:
jeremy bayse
2026-05-09 08:24:12 +02:00
parent 7c01803f46
commit 97a8b9443d
9 changed files with 234 additions and 5 deletions

View File

@@ -25,8 +25,11 @@ const form = useForm({
ai_bypass_base_prompt: false,
tenant_id: '',
quiz_ids: [],
fpt_metadata: null,
});
const isGeneratingFpt = ref(false);
const openModal = (position = null) => {
editingPosition.value = position;
if (position) {
@@ -37,12 +40,36 @@ const openModal = (position = null) => {
form.ai_bypass_base_prompt = !!position.ai_bypass_base_prompt;
form.tenant_id = position.tenant_id || '';
form.quiz_ids = position.quizzes ? position.quizzes.map(q => q.id) : [];
form.fpt_metadata = position.fpt_metadata || null;
} else {
form.reset();
}
showingModal.value = true;
};
const generateFpt = async () => {
if (!form.title || !form.description) {
alert("Veuillez remplir le titre et la description avant de générer.");
return;
}
isGeneratingFpt.value = true;
try {
const response = await axios.post(route('admin.job-positions.ai-fpt'), {
title: form.title,
description: form.description
});
form.fpt_metadata = response.data;
if (response.data.fiche_synthese) {
form.description = response.data.fiche_synthese;
}
} catch (error) {
console.error(error);
alert("Une erreur est survenue lors de la génération IA.");
} finally {
isGeneratingFpt.value = false;
}
};
const closeModal = () => {
showingModal.value = false;
form.reset();
@@ -215,6 +242,59 @@ const copyLink = (position) => {
<InputError :message="form.errors.description" />
</div>
<div class="flex justify-between items-center bg-indigo-50 dark:bg-indigo-900/10 p-4 rounded-2xl border border-indigo-100 dark:border-indigo-800/50">
<div>
<h4 class="text-xs font-black text-indigo-700 dark:text-indigo-400 uppercase tracking-widest mb-1">Assistant RH FPT (IA)</h4>
<p class="text-[10px] text-indigo-500 font-bold">Génère automatiquement les mentions réglementaires et catégorise le poste (CGFP).</p>
</div>
<PrimaryButton type="button" @click="generateFpt" :disabled="isGeneratingFpt || !form.title || !form.description" class="whitespace-nowrap text-xs py-2 px-4 bg-indigo-600 hover:bg-indigo-700">
<svg v-if="isGeneratingFpt" class="animate-spin -ml-1 mr-2 h-4 w-4 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
<svg v-else xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
{{ isGeneratingFpt ? 'Génération...' : 'Structurer l\'offre' }}
</PrimaryButton>
</div>
<div v-if="form.fpt_metadata" class="bg-slate-50 dark:bg-slate-800/50 rounded-2xl p-4 border border-slate-200 dark:border-slate-700 space-y-4">
<div>
<h5 class="text-[10px] font-black uppercase tracking-widest text-slate-400 mb-2">Informations Statutaires</h5>
<div class="grid grid-cols-2 gap-2 text-xs font-bold">
<div class="bg-white dark:bg-slate-900 p-2 rounded-xl">
<span class="text-slate-400 block text-[9px] uppercase">Catégorie</span>
{{ form.fpt_metadata.infos_poste?.categorie }}
</div>
<div class="bg-white dark:bg-slate-900 p-2 rounded-xl">
<span class="text-slate-400 block text-[9px] uppercase">Cadre d'emplois</span>
{{ form.fpt_metadata.infos_poste?.cadre_emplois }}
</div>
<div class="bg-white dark:bg-slate-900 p-2 rounded-xl">
<span class="text-slate-400 block text-[9px] uppercase">Grade Mini</span>
{{ form.fpt_metadata.infos_poste?.grade_mini }}
</div>
<div class="bg-white dark:bg-slate-900 p-2 rounded-xl">
<span class="text-slate-400 block text-[9px] uppercase">Grade Maxi</span>
{{ form.fpt_metadata.infos_poste?.grade_maxi }}
</div>
</div>
</div>
<div>
<h5 class="text-[10px] font-black uppercase tracking-widest text-slate-400 mb-2">Conformité CGFP</h5>
<div class="bg-white dark:bg-slate-900 p-3 rounded-xl text-xs font-bold text-slate-600 dark:text-slate-300">
<p class="mb-2"><span class="text-indigo-500">Fondement :</span> {{ form.fpt_metadata.conformite?.fondement_juridique_recrutement }}</p>
<ul class="list-disc list-inside space-y-1">
<li v-for="(mention, i) in form.fpt_metadata.conformite?.mentions_legales_obligatoires" :key="i">
{{ mention }}
</li>
</ul>
</div>
</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>