Company::query() ->with(['address.country']) ->withCount(['users', 'warehouses', 'licenseKeys', 'divisions']) ->latest('id') ->paginate(20), 'countries' => $this->countriesForSelect(), ]); } /** * Show the create company screen. */ public function create() { return view('company::create', [ 'company' => new Company([ 'status' => 'active', 'timezone' => 'Europe/London', ]), 'countries' => $this->countriesForSelect(), ]); } /** * Store a company tenant. */ public function store(Request $request) { $validated = $this->validated($request); $company = Company::create($validated['company']); $this->syncAddressCountry($company, $validated['country_id']); return redirect() ->route('platform.companies.index') ->with('status', 'Company created.'); } /** * Display a company workbench. */ public function show(Company $company) { $company->load([ 'address.country', 'divisions.address.country', 'divisions.warehouses', 'divisions.users', 'warehouses.address.country', 'warehouses.division', 'directorAssignments.user', 'directorAssignments.division', ])->loadCount(['users', 'warehouses', 'licenseKeys', 'payments', 'divisions']); return view('company::show', [ 'company' => $company, 'recentUsers' => $company->users()->latest('id')->limit(5)->get(), 'recentWarehouses' => $company->warehouses()->latest('id')->limit(5)->get(), 'recentLicenseKeys' => $company->licenseKeys()->latest('id')->limit(5)->get(), 'countries' => $this->countriesForSelect(), 'companyUsers' => $company->users()->orderBy('name')->get(['id', 'name', 'email', 'company_id']), 'unassignedWarehouses' => $company->warehouses()->whereNull('division_id')->orderBy('name')->get(), ]); } /** * Show the edit company screen. */ public function edit(Company $company) { return view('company::edit', [ 'company' => $company->loadMissing('address.country'), 'countries' => $this->countriesForSelect(), ]); } /** * Update a company tenant. */ public function update(Request $request, Company $company) { $validated = $this->validated($request, $company); $company->update($validated['company']); $this->syncAddressCountry($company, $validated['country_id']); return redirect() ->route('platform.companies.show', $company) ->with('status', 'Company updated.'); } /** * Delete a company tenant. */ public function destroy(Company $company) { abort_if($company->is_system_company, 403, 'The system company cannot be deleted.'); $company->delete(); return redirect() ->route('platform.companies.index') ->with('status', 'Company deleted.'); } private function validated(Request $request, ?Company $company = null): array { $data = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'billing_email' => ['nullable', 'email', 'max:255'], 'status' => ['required', Rule::in(['active', 'suspended', 'inactive'])], 'country_id' => ['nullable', 'integer', Rule::exists('countries', 'id')], ]); return [ 'company' => [ 'name' => $data['name'], 'billing_email' => $data['billing_email'] ?? null, 'status' => $data['status'], 'slug' => Str::slug($data['name']), 'timezone' => $company?->timezone ?: 'Europe/London', ], 'country_id' => $data['country_id'] ?? null, ]; } private function countriesForSelect() { return Country::query() ->active() ->orderByRaw("LOWER(COALESCE(NULLIF(display_name, ''), NULLIF(common_name, ''), name)) ASC") ->get(['id', 'alpha2', 'name', 'display_name', 'common_name']); } private function syncAddressCountry(Company $company, ?int $countryId): void { if ($countryId === null) { $company->address()?->delete(); return; } $company->address()->updateOrCreate( [], [ 'country_id' => $countryId, 'label' => 'Registered address', 'is_primary' => true, ] ); } }