feat: implementation du role Gestionnaire RH et refonte de la gestion des offres

This commit is contained in:
jeremy bayse
2026-05-09 11:21:40 +02:00
parent 97a8b9443d
commit 9edf79e8ba
23 changed files with 1223 additions and 232 deletions

View File

@@ -93,11 +93,20 @@ class CandidateController extends Controller
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'birth_name' => 'nullable|string|max:255',
'usage_name' => 'nullable|string|max:255',
'first_name' => 'nullable|string|max:255',
'address' => 'nullable|string|max:255',
'zip_code' => 'nullable|string|max:10',
'email' => 'required|string|email|max:255|unique:users',
'phone' => 'nullable|string|max:20',
'linkedin_url' => 'nullable|url|max:255',
'city' => 'nullable|string|max:255',
'birth_date' => 'nullable|date',
'birth_place' => 'nullable|string|max:255',
'nationality' => 'nullable|string|max:255',
'current_situation' => 'nullable|string|max:255',
'education_level' => 'nullable|string|max:255',
'has_driving_license' => 'nullable|boolean',
'cv' => 'nullable|mimes:pdf|max:5120',
'cover_letter' => 'nullable|mimes:pdf|max:5120',
'tenant_id' => 'nullable|exists:tenants,id',
@@ -106,20 +115,34 @@ class CandidateController extends Controller
$password = Str::random(10);
$name = $request->first_name
? ($request->first_name . ' ' . ($request->usage_name ?? ''))
: $request->name;
$user = User::create([
'name' => $request->name,
'name' => $name,
'email' => $request->email,
'password' => Hash::make(Str::random(12)),
'password' => Hash::make($password),
'role' => 'candidate',
'tenant_id' => auth()->user()->isSuperAdmin() ? $request->tenant_id : auth()->user()->tenant_id,
'tenant_id' => (auth()->user()->isSuperAdmin() || auth()->user()->isGestionnaireRH()) ? $request->tenant_id : auth()->user()->tenant_id,
]);
$candidate = $user->candidate()->create([
'birth_name' => $request->birth_name,
'usage_name' => $request->usage_name,
'first_name' => $request->first_name,
'address' => $request->address,
'zip_code' => $request->zip_code,
'phone' => $request->phone,
'linkedin_url' => $request->linkedin_url,
'city' => $request->city,
'birth_date' => $request->birth_date,
'birth_place' => $request->birth_place,
'nationality' => $request->nationality,
'current_situation' => $request->current_situation,
'education_level' => $request->education_level,
'has_driving_license' => $request->has_driving_license ?? false,
'status' => 'en_attente',
'tenant_id' => auth()->user()->isSuperAdmin() ? $request->tenant_id : auth()->user()->tenant_id,
'tenant_id' => (auth()->user()->isSuperAdmin() || auth()->user()->isGestionnaireRH()) ? $request->tenant_id : auth()->user()->tenant_id,
'job_position_id' => $request->job_position_id,
]);
@@ -165,7 +188,7 @@ class CandidateController extends Controller
]
];
if (auth()->user()->isSuperAdmin()) {
if (auth()->user()->isSuperAdmin() || auth()->user()->isGestionnaireRH()) {
$data['tenants'] = \App\Models\Tenant::orderBy('name')->get();
}
@@ -190,22 +213,42 @@ class CandidateController extends Controller
public function update(Request $request, Candidate $candidate)
{
$request->validate([
'birth_name' => 'nullable|string|max:255',
'usage_name' => 'nullable|string|max:255',
'first_name' => 'nullable|string|max:255',
'address' => 'nullable|string|max:255',
'zip_code' => 'nullable|string|max:10',
'phone' => 'nullable|string|max:255',
'city' => 'nullable|string|max:255',
'birth_date' => 'nullable|date',
'birth_place' => 'nullable|string|max:255',
'nationality' => 'nullable|string|max:255',
'current_situation' => 'nullable|string|max:255',
'education_level' => 'nullable|string|max:255',
'has_driving_license' => 'nullable|boolean',
'email' => 'nullable|string|email|max:255|unique:users,email,' . $candidate->user_id,
'linkedin_url' => 'nullable|url|max:255',
'cv' => 'nullable|file|mimes:pdf|max:5120',
'cover_letter' => 'nullable|file|mimes:pdf|max:5120',
'name' => 'nullable|string|max:255',
'email' => 'nullable|string|email|max:255|unique:users,email,' . $candidate->user_id,
'phone' => 'nullable|string|max:255',
'linkedin_url' => 'nullable|url|max:255',
'city' => 'nullable|string|max:255',
]);
// Update User info if name or email present
if ($request->has('name') || $request->has('email')) {
$candidate->user->update($request->only(['name', 'email']));
if ($request->has('email')) {
$candidate->user->update(['email' => $request->email]);
}
if ($request->has('first_name') || $request->has('usage_name')) {
$firstName = $request->first_name ?? $candidate->first_name;
$usageName = $request->usage_name ?? $candidate->usage_name;
$candidate->user->update(['name' => $firstName . ' ' . $usageName]);
}
// Update Candidate info
$candidate->update($request->only(['phone', 'linkedin_url', 'city']));
$candidate->update($request->only([
'birth_name', 'usage_name', 'first_name', 'address', 'zip_code',
'phone', 'linkedin_url', 'city', 'birth_date', 'birth_place',
'nationality', 'current_situation', 'education_level', 'has_driving_license'
]));
if ($request->hasFile('cv')) {
$this->replaceDocument($candidate, $request->file('cv'), 'cv');
@@ -263,7 +306,7 @@ class CandidateController extends Controller
public function updateTenant(Request $request, Candidate $candidate)
{
if (!auth()->user()->isSuperAdmin()) {
if (!auth()->user()->isSuperAdmin() && !auth()->user()->isGestionnaireRH()) {
abort(403);
}