Files
WMS/Modules/Company/Http/Controllers/CompanyMembershipController.php
T

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.');
}
}