added full module support

This commit is contained in:
Mark Gregory
2026-06-10 12:42:07 +01:00
parent 12d4eec076
commit c59b16d791
63 changed files with 1639 additions and 131 deletions
+73
View File
@@ -0,0 +1,73 @@
<?php
namespace Modules\Platform\app\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Str;
use Modules\Warehouse\app\Models\Warehouse;
class Company extends Model
{
use HasFactory, 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(\App\Models\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();
}
}
@@ -0,0 +1,47 @@
<?php
namespace Modules\Platform\app\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Str;
class LicenseKey extends Model
{
protected $fillable = [
'company_id', 'key_hash', 'key_prefix', 'label', 'plan', 'max_users',
'is_active', 'starts_at', 'expires_at', 'last_used_at', 'revoked_at',
];
protected $casts = [
'is_active' => 'boolean',
'starts_at' => 'datetime',
'expires_at' => 'datetime',
'last_used_at' => 'datetime',
'revoked_at' => 'datetime',
];
public function company(): BelongsTo
{
return $this->belongsTo(Company::class);
}
public static function issueFor(Company $company, string $label, string $plan = 'standard', int $maxUsers = 10): string
{
$plainKey = 'WMS-' . Str::upper(Str::random(32));
self::create([
'company_id' => $company->id,
'key_hash' => hash('sha256', $plainKey),
'key_prefix' => Str::substr($plainKey, 0, 12),
'label' => $label,
'plan' => $plan,
'max_users' => $maxUsers,
'is_active' => true,
'starts_at' => now(),
'expires_at' => now()->addYear(),
]);
return $plainKey;
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace Modules\Platform\app\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Payment extends Model
{
protected $fillable = [
'company_id', 'stripe_payment_intent_id', 'stripe_invoice_id', 'amount',
'currency', 'status', 'description', 'paid_at', 'metadata',
];
protected $casts = [
'amount' => 'integer',
'paid_at' => 'datetime',
'metadata' => 'array',
];
public function company(): BelongsTo
{
return $this->belongsTo(Company::class);
}
}