*/ use HasFactory, LogsActivity; /** * Full CRUD audit trail — catalog admin writes are staff-only and * infrequent, so logging every attribute change is affordable * (domain.md §6; T6.2). */ public function getActivitylogOptions(): LogOptions { return LogOptions::defaults() ->logFillable() ->logOnlyDirty() ->dontLogEmptyChanges() ->useLogName('catalog'); } /** * @var list */ protected $fillable = [ 'name', 'mm_name', 'slug', 'description', 'mm_description', 'contact', 'address', 'logo', 'is_active', ]; protected static function booted(): void { static::creating(function (self $evCompany): void { if (filled($evCompany->slug)) { return; } $slug = Str::slug($evCompany->name); $uniqueSlug = $slug; $suffix = 1; while (static::where('slug', $uniqueSlug)->exists()) { $uniqueSlug = "{$slug}-{$suffix}"; $suffix++; } $evCompany->slug = $uniqueSlug; }); } /** * @return array */ protected function casts(): array { return [ 'is_active' => 'boolean', ]; } /** * `logo` is stored as the disk-relative path Filament's FileUpload * writes (e.g. "logos/xxx.png"), not a URL — API consumers need a full * absolute URL to render it directly. Guards against the disk itself * already returning an absolute URL (e.g. an s3 disk), so this stays * correct if the storage disk ever changes from local. */ public function logoUrl(): Attribute { return Attribute::make( get: function (): ?string { if (blank($this->logo)) { return null; } $url = Storage::disk(config('filesystems.default'))->url($this->logo); return str($url)->startsWith(['http://', 'https://']) ? $url : url($url); }, ); } }