84 lines
3.3 KiB
PHP
84 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace Modules\Company\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
use Modules\Company\Models\Company;
|
|
use Modules\Company\Models\CompanyDivision;
|
|
use Modules\Company\Models\CompanyDirectorAssignment;
|
|
|
|
class CompanyMembershipController extends Controller
|
|
{
|
|
public function assignDivision(Request $request, Company $company)
|
|
{
|
|
$data = $request->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.');
|
|
}
|
|
}
|