new companies Module now with full spoort migrated

This commit is contained in:
Mark Gregory
2026-07-02 11:06:52 +01:00
parent b87036e1a2
commit 7f5572989e
34 changed files with 107 additions and 215 deletions
@@ -2,78 +2,40 @@
namespace Modules\Company\Http\Controllers;
use Illuminate\Contracts\Support\Renderable;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Str;
use Modules\Company\Models\Company;
class CompanyController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
* Display companies.
*/
public function index()
{
return view('company::index');
return view('company::index', [
'companies' => Company::withCount(['users', 'warehouses', 'licenseKeys'])->latest('id')->paginate(20),
]);
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('company::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
* Create a company tenant.
*/
public function store(Request $request)
{
//
}
$data = $request->validate([
'name' => ['required', 'string', 'max:255'],
'billing_email' => ['nullable', 'email', 'max:255'],
'status' => ['required', 'in:active,suspended'],
]);
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('company::show');
}
Company::create([
...$data,
'slug' => Str::slug($data['name']),
'timezone' => 'Europe/London',
]);
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('company::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
return back()->with('status', 'Company created.');
}
}
+75
View File
@@ -0,0 +1,75 @@
<?php
namespace Modules\Company\Models;
use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Str;
use Modules\Platform\app\Models\LicenseKey;
use Modules\Platform\app\Models\Payment;
use Modules\Warehouse\app\Models\Warehouse;
class Company extends Model
{
use SoftDeletes;
protected $fillable = [
'uuid', 'name', 'slug', 'status', 'timezone', 'settings',
'is_system_company', 'stripe_customer_id', 'billing_email',
];
protected $casts = [
'settings' => 'array',
'is_system_company' => 'boolean',
];
protected static function booted(): void
{
static::creating(function (Company $company): void {
$company->uuid ??= (string) Str::uuid();
$company->slug ??= Str::slug($company->name);
$company->status ??= 'active';
$company->timezone ??= 'Europe/London';
});
}
public function users(): HasMany
{
return $this->hasMany(User::class);
}
public function licenseKeys(): HasMany
{
return $this->hasMany(LicenseKey::class);
}
public function payments(): HasMany
{
return $this->hasMany(Payment::class);
}
public function warehouses(): HasMany
{
return $this->hasMany(Warehouse::class);
}
public function hasActiveLicense(): bool
{
if ($this->is_system_company) {
return true;
}
return $this->licenseKeys()
->where('is_active', true)
->where(function ($query): void {
$query->whereNull('starts_at')->orWhere('starts_at', '<=', now());
})
->where(function ($query): void {
$query->whereNull('expires_at')->orWhere('expires_at', '>=', now());
})
->whereNull('revoked_at')
->exists();
}
}
@@ -1,9 +1,49 @@
@extends('company::layouts.master')
@section('content')
<h1>Hello World</h1>
<p>
This view is loaded from module: {!! config('company.name') !!}
</p>
@endsection
<x-layouts::app :title="__('Companies')">
<div class="space-y-6">
<x-wms.page-hero eyebrow="Platform Administration" title="Companies"
description="Manage tenant companies and keep every company’s users, warehouses and records isolated."
icon="fa-solid fa-building" />
<div class="rounded-3xl bg-white p-6 shadow-sm ring-1 ring-zinc-200 dark:bg-zinc-900 dark:ring-zinc-800">
<h2 class="text-lg font-bold text-zinc-900 dark:text-white">Create company</h2>
<form method="POST" action="{{ route('platform.companies.store') }}" class="mt-5 grid gap-4 md:grid-cols-4">
@csrf
<input name="name" placeholder="Company name"
class="rounded-xl border-zinc-300 dark:border-zinc-700 dark:bg-zinc-950" required>
<input name="billing_email" placeholder="billing@example.com"
class="rounded-xl border-zinc-300 dark:border-zinc-700 dark:bg-zinc-950">
<select name="status" class="rounded-xl border-zinc-300 dark:border-zinc-700 dark:bg-zinc-950">
<option value="active">Active</option>
<option value="suspended">Suspended</option>
</select>
<button
class="rounded-xl bg-zinc-900 px-4 py-2 font-semibold text-white dark:bg-white dark:text-zinc-900">Create</button>
</form>
</div>
<div
class="overflow-x-auto rounded-2xl bg-white shadow-sm ring-1 ring-zinc-200 dark:bg-zinc-900 dark:ring-zinc-800">
<table class="min-w-full text-sm">
<thead>
<tr class="border-b">
<th class="p-4 text-left">Name</th>
<th class="p-4 text-left">Users</th>
<th class="p-4 text-left">Warehouses</th>
<th class="p-4 text-left">Licences</th>
<th class="p-4 text-left">Status</th>
</tr>
</thead>
<tbody>
@foreach ($companies as $company)
<tr class="border-b border-zinc-100 dark:border-zinc-800">
<td class="p-4 font-semibold">{{ $company->name }}</td>
<td class="p-4">{{ $company->users_count }}</td>
<td class="p-4">{{ $company->warehouses_count }}</td>
<td class="p-4">{{ $company->license_keys_count }}</td>
<td class="p-4">{{ $company->is_system_company ? 'System' : $company->status }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
{{ $companies->links() }}
</div>
</x-layouts::app>
@@ -1,19 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Module Company</title>
{{-- Laravel Mix - CSS File --}}
{{-- <link rel="stylesheet" href="{{ mix('css/company.css') }}"> --}}
</head>
<body>
@yield('content')
{{-- Laravel Mix - JS File --}}
{{-- <script src="{{ mix('js/company.js') }}"></script> --}}
</body>
</html>
+9 -3
View File
@@ -11,6 +11,12 @@
|
*/
Route::prefix('company')->group(function() {
Route::get('/', 'CompanyController@index');
});
use Modules\Company\Http\Controllers\CompanyController;
Route::middleware(['auth', 'verified', 'tenant.assigned', 'platform.admin'])
->prefix('admin')
->name('platform.')
->group(function (): void {
Route::get('/companies', [CompanyController::class, 'index'])->name('companies.index');
Route::post('/companies', [CompanyController::class, 'store'])->name('companies.store');
});