ProductStockQuality::class, 'quantity' => 'integer', 'unit_price' => 'integer', 'subtotal' => 'integer', ]; } protected function stockQualityLabel(): Attribute { return Attribute::make( get: fn () => $this->stock_quality->label(), ); } protected function formattedSubtotal(): Attribute { return Attribute::make( get: fn () => 'Rp '.number_format($this->subtotal, 0, ',', '.'), ); } protected function formattedUnitPrice(): Attribute { return Attribute::make( get: fn () => 'Rp '.number_format($this->unit_price, 0, ',', '.'), ); } #[Scope] protected function good(Builder $query): void { $query->where('stock_quality', ProductStockQuality::GOOD); } #[Scope] protected function reject(Builder $query): void { $query->where('stock_quality', ProductStockQuality::REJECT); } public function order(): BelongsTo { return $this->belongsTo(Order::class); } public function productVariant(): BelongsTo { return $this->belongsTo(ProductVariant::class)->withTrashed(); } public function user(): BelongsTo { return $this->belongsTo(User::class); } }