'boolean', 'stock' => 'integer', ]; } #[Scope] protected function active(Builder $query): void { $query->where('is_active', true); } #[Scope] protected function inactive(Builder $query): void { $query->where('is_active', false); } public function getSlugOptions(): SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); } public function registerMediaCollections(): void { $this->addMediaCollection('thumbnail') ->singleFile(); $this->addMediaCollection('images'); } protected function thumbnailUrl(): Attribute { return Attribute::make( get: fn () => $this->getFirstMediaUrl('thumbnail') ?: null, ); } protected function imagesData(): Attribute { return Attribute::make( get: fn () => $this->getMedia('images')->map(fn ($media) => [ 'id' => $media->id, 'url' => $media->getUrl(), ])->toArray(), ); } public function categories(): BelongsToMany { return $this->belongsToMany(Category::class); } public function prices(): HasMany { return $this->hasMany(ProductPrice::class); } public function orderItems(): HasMany { return $this->hasMany(OrderItem::class); } public function purchaseItems(): HasMany { return $this->hasMany(PurchaseItem::class); } public function getActivitylogOptions(): LogOptions { return LogOptions::defaults() ->logOnly(['name', 'description', 'stock', 'is_active']) ->logOnlyDirty() ->useLogName('Produk'); } public function tapActivity(Activity $activity, string $eventName) { $activity->description = match ($eventName) { 'created' => 'TAMBAH', 'updated' => 'UBAH', 'deleted' => 'HAPUS', default => $activity->description, }; if (isset($activity->properties['attributes'])) { $attributeMap = [ 'name' => 'Nama', 'description' => 'Deskripsi', 'stock' => 'Stok', 'is_active' => 'Status', ]; $properties = $activity->properties->toArray(); $localizeValues = function ($attrs) use ($attributeMap) { $newAttrs = []; foreach ($attrs as $key => $value) { $label = $attributeMap[$key] ?? $key; $displayValue = $value; if ($key === 'is_active') { $displayValue = $value ? 'Aktif' : 'Tidak Aktif'; } $newAttrs[$label] = $displayValue; } return $newAttrs; }; $properties['attributes'] = $localizeValues($properties['attributes']); if (isset($properties['old'])) { $properties['old'] = $localizeValues($properties['old']); } $activity->properties = collect($properties); } } }