value => 'stock', ProductStockQuality::REJECT->value => 'reject_stock', ProductStockQuality::RETAIL->value => 'retail_stock', ]; private function adjustStock(Model $model, string $field, int $quantity, int $sign): void { if ($sign > 0) { $model->increment($field, $quantity); } else { if ($model->{$field} < $quantity) { $label = match ($field) { 'stock' => 'stok bagus', 'reject_stock' => 'stok reject', 'retail_stock' => 'stok ecer', default => $field, }; throw ValidationException::withMessages([ 'stock' => "Stok {$label} tidak mencukupi. Tersedia: {$model->{$field}}, dibutuhkan: {$quantity}.", ]); } $model->decrement($field, $quantity); } } private function adjustVariantStock(int $variantId, int $quantity, int $sign, string $stockType): void { $field = self::QUALITY_STOCK_MAP[$stockType] ?? 'stock'; $this->adjustStock( model: app(ProductVariant::class)->newQuery()->findOrFail($variantId), field: $field, quantity: $quantity, sign: $sign, ); } private function applyStock(array $items, string $stockType, int $sign): void { DB::transaction(function () use ($items, $stockType, $sign) { foreach ($items as $item) { $this->adjustVariantStock($item['product_variant_id'], $item['quantity'], $sign, $stockType); } }); } }