'integer', 'stock' => 'integer', ]; } protected function formattedPrice(): Attribute { return Attribute::make( get: fn () => 'Rp '.number_format($this->price, 0, ',', '.'), ); } protected function formattedStock(): Attribute { return Attribute::make( get: fn () => number_format($this->stock, 0, ',', '.'), ); } public function cuttingMaterials(): HasMany { return $this->hasMany(CuttingMaterial::class); } public function purchaseItems(): HasMany { return $this->hasMany(PurchaseItem::class); } public function rawMaterial(): BelongsTo { return $this->belongsTo(RawMaterial::class)->withTrashed(); } public function getPhotoUrlAttribute(): ?string { $media = $this->getFirstMedia('images'); return $media ? app(S3PresignedService::class)->getTemporaryUrl($media->getPath()) : null; } public function registerMediaCollections(): void { $this->addMediaCollection('images'); } public function registerMediaConversions(?Media $media = null): void { $this->addMediaConversion('thumb') ->fit(Fit::Contain, 150, 150); } }