diff --git a/Modules/Company/Http/Controllers/CompanyController.php b/Modules/Company/Http/Controllers/CompanyController.php index 09ede975..729e98ec 100644 --- a/Modules/Company/Http/Controllers/CompanyController.php +++ b/Modules/Company/Http/Controllers/CompanyController.php @@ -4,6 +4,7 @@ namespace Modules\Company\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Schema; use Illuminate\Support\Str; use Illuminate\Validation\Rule; use Modules\Company\Models\Company; @@ -16,12 +17,24 @@ class CompanyController extends Controller */ public function index() { + $counts = ['users', 'warehouses', 'licenseKeys']; + + if (Schema::hasTable('company_divisions')) { + $counts[] = 'divisions'; + } + + $companies = Company::query() + ->with(['country']) + ->withCount($counts) + ->orderBy('name') + ->paginate(20); + + $companies->getCollection()->each(function (Company $company): void { + $company->setAttribute('divisions_count', $company->getAttribute('divisions_count') ?? 0); + }); + return view('company::index', [ - 'companies' => Company::query() - ->with(['address.country', 'country']) - ->withCount(['users', 'warehouses', 'licenseKeys', 'divisions']) - ->orderBy('name') - ->paginate(20), + 'companies' => $companies, 'countries' => $this->countries(), ]); } @@ -57,16 +70,20 @@ class CompanyController extends Controller */ 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']); + $loads = ['country']; + $counts = ['users', 'warehouses', 'licenseKeys', 'payments']; + + if (Schema::hasTable('company_divisions')) { + $loads[] = 'divisions'; + $counts[] = 'divisions'; + } + + if (Schema::hasTable('company_director_assignments')) { + $loads[] = 'directorAssignments.user'; + } + + $company->load($loads)->loadCount($counts); + $company->setAttribute('divisions_count', $company->getAttribute('divisions_count') ?? 0); return view('company::show', [ 'company' => $company, @@ -74,8 +91,6 @@ class CompanyController extends Controller 'recentWarehouses' => $company->warehouses()->latest('id')->limit(5)->get(), 'recentLicenseKeys' => $company->licenseKeys()->latest('id')->limit(5)->get(), 'countries' => $this->countries(), - 'companyUsers' => $company->users()->orderBy('name')->get(['id', 'name', 'email', 'company_id']), - 'unassignedWarehouses' => $company->warehouses()->whereNull('division_id')->orderBy('name')->get(), ]); } @@ -85,7 +100,7 @@ class CompanyController extends Controller public function edit(Company $company) { return view('company::edit', [ - 'company' => $company->loadMissing(['address.country', 'country']), + 'company' => $company->loadMissing('country'), 'countries' => $this->countries(), ]); } @@ -125,10 +140,14 @@ class CompanyController extends Controller 'country_id' => ['nullable', Rule::exists('countries', 'id')->where('is_active', true)], ]); - $data['slug'] = Str::slug($data['name']); - $data['timezone'] = $company?->timezone ?: 'Europe/London'; - - return $data; + return [ + 'name' => $data['name'], + 'billing_email' => $data['billing_email'] ?? null, + 'status' => $data['status'], + 'country_id' => $data['country_id'] ?? null, + 'slug' => Str::slug($data['name']), + 'timezone' => $company?->timezone ?: 'Europe/London', + ]; } private function countries() diff --git a/Modules/Company/Models/CompanyAddress.php b/Modules/Company/Models/CompanyAddress.php new file mode 100644 index 00000000..27f84f71 --- /dev/null +++ b/Modules/Company/Models/CompanyAddress.php @@ -0,0 +1,27 @@ + 'boolean', + ]; + + public function addressable(): MorphTo + { + return $this->morphTo(); + } + + public function country(): BelongsTo + { + return $this->belongsTo(Country::class); + } +} diff --git a/Modules/Company/Models/CompanyDirectorAssignment.php b/Modules/Company/Models/CompanyDirectorAssignment.php new file mode 100644 index 00000000..d5ae3435 --- /dev/null +++ b/Modules/Company/Models/CompanyDirectorAssignment.php @@ -0,0 +1,27 @@ +belongsTo(Company::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function division(): BelongsTo + { + return $this->belongsTo(CompanyDivision::class, 'company_division_id'); + } +} diff --git a/Modules/Company/Models/CompanyDivision.php b/Modules/Company/Models/CompanyDivision.php new file mode 100644 index 00000000..af5e12dd --- /dev/null +++ b/Modules/Company/Models/CompanyDivision.php @@ -0,0 +1,35 @@ +belongsTo(Company::class); + } + + public function address(): MorphOne + { + return $this->morphOne(CompanyAddress::class, 'addressable'); + } + + public function warehouses(): HasMany + { + return $this->hasMany(Warehouse::class, 'division_id'); + } + + public function users(): HasMany + { + return $this->hasMany(User::class, 'division_id'); + } +} diff --git a/Modules/Company/Resources/views/_form.blade.php b/Modules/Company/Resources/views/_form.blade.php index e044d2d7..a5bf21dc 100644 --- a/Modules/Company/Resources/views/_form.blade.php +++ b/Modules/Company/Resources/views/_form.blade.php @@ -7,7 +7,7 @@ id="name" name="name" value="{{ old('name', $company->name) }}" - class="mt-2 w-full rounded-xl border-zinc-300 dark:border-zinc-700 dark:bg-zinc-950 dark:text-white" + class="mt-2 h-12 w-full rounded-xl border-zinc-300 bg-white px-4 text-sm text-zinc-900 shadow-sm outline-none transition focus:border-blue-500 focus:ring-2 focus:ring-blue-500/30 dark:border-zinc-700 dark:bg-zinc-950 dark:text-white" required > @error('name') @@ -23,7 +23,7 @@ name="billing_email" value="{{ old('billing_email', $company->billing_email) }}" placeholder="billing@example.com" - class="mt-2 w-full rounded-xl border-zinc-300 dark:border-zinc-700 dark:bg-zinc-950 dark:text-white" + class="mt-2 h-12 w-full rounded-xl border-zinc-300 bg-white px-4 text-sm text-zinc-900 shadow-sm outline-none transition focus:border-blue-500 focus:ring-2 focus:ring-blue-500/30 dark:border-zinc-700 dark:bg-zinc-950 dark:text-white" > @error('billing_email')
{{ $message }}
@@ -35,7 +35,7 @@ @@ -70,7 +70,7 @@