validate([ 'user_id' => ['required', Rule::exists('users', 'id')->where('company_id', $company->id)], 'company_division_id' => ['required', Rule::exists('company_divisions', 'id')->where('company_id', $company->id)], 'role' => ['nullable', 'string', 'max:80'], 'is_director' => ['nullable', 'boolean'], ]); $division = CompanyDivision::where('company_id', $company->id)->findOrFail($data['company_division_id']); $division->users()->syncWithoutDetaching([ $data['user_id'] => [ 'company_id' => $company->id, 'role' => $data['role'] ?? 'member', 'is_director' => (bool) ($data['is_director'] ?? false), ], ]); if ((bool) ($data['is_director'] ?? false)) { CompanyDirectorAssignment::updateOrCreate([ 'company_id' => $company->id, 'company_division_id' => $division->id, 'user_id' => $data['user_id'], ], ['coverage_type' => 'division']); } return redirect()->route('platform.companies.show', $company)->with('status', 'Division membership updated.'); } public function assignDirector(Request $request, Company $company) { $data = $request->validate([ 'user_id' => ['required', Rule::exists('users', 'id')->where('company_id', $company->id)], 'coverage_type' => ['required', Rule::in(['company', 'division'])], 'company_division_id' => ['nullable', Rule::exists('company_divisions', 'id')->where('company_id', $company->id)], 'starts_at' => ['nullable', 'date'], 'ends_at' => ['nullable', 'date', 'after_or_equal:starts_at'], 'notes' => ['nullable', 'string', 'max:2000'], ]); if ($data['coverage_type'] === 'company') { $data['company_division_id'] = null; } else { abort_if(empty($data['company_division_id']), 422, 'Division coverage requires a division.'); } CompanyDirectorAssignment::updateOrCreate([ 'company_id' => $company->id, 'company_division_id' => $data['company_division_id'], 'user_id' => $data['user_id'], ], [ 'coverage_type' => $data['coverage_type'], 'starts_at' => $data['starts_at'] ?? null, 'ends_at' => $data['ends_at'] ?? null, 'notes' => $data['notes'] ?? null, ]); return redirect()->route('platform.companies.show', $company)->with('status', 'Director coverage updated.'); } public function removeDirector(Company $company, CompanyDirectorAssignment $assignment) { abort_unless($assignment->company_id === $company->id, 404); $assignment->delete(); return redirect()->route('platform.companies.show', $company)->with('status', 'Director coverage removed.'); } }