with(['order', 'productVariant.productPrices']) ->get(); $fixed = 0; $skipped = 0; $notFound = 0; $details = []; foreach ($items as $item) { $order = $item->order; if (! $order) { $skipped++; continue; } $priceType = $this->resolvePriceType($order->price_type->value, $item->stock_quality->value); $productPrices = $item->productVariant?->productPrices; if (! $productPrices) { $notFound++; $details[] = [ 'Order' => $order->order_number, 'Variant' => $item->product_variant_id, 'Qty' => $item->quantity, 'Old Price' => 0, 'New Price' => 'N/A', 'Status' => 'No prices found', ]; continue; } $correctPrice = $productPrices->firstWhere('type', $priceType); if (! $correctPrice || $correctPrice->price <= 0) { $notFound++; $details[] = [ 'Order' => $order->order_number, 'Variant' => $item->product_variant_id, 'Qty' => $item->quantity, 'Old Price' => 0, 'New Price' => 'N/A', 'Status' => "No {$priceType} price", ]; continue; } $newSubtotal = $correctPrice->price * $item->quantity; $item->update([ 'unit_price' => $correctPrice->price, 'subtotal' => $newSubtotal, ]); $details[] = [ 'Order' => $order->order_number, 'Variant' => $item->product_variant_id, 'Qty' => $item->quantity, 'Old Price' => 0, 'New Price' => number_format($correctPrice->price), 'Status' => 'Fixed', ]; $fixed++; } if (! empty($details)) { $this->command->newLine(); $this->command->table( ['Order', 'Variant', 'Qty', 'Old Price', 'New Price', 'Status'], $details ); } return [ 'fixed' => $fixed, 'skipped' => $skipped, 'not_found' => $notFound, 'total' => $items->count(), ]; } private function resolvePriceType(string $orderPriceType, string $stockQuality): string { if ($stockQuality === ProductStockQuality::REJECT->value) { return PriceType::REJECT_SELLING->value; } $map = [ PriceType::DISTRIBUTOR->value => PriceType::DISTRIBUTOR->value, PriceType::AGEN->value => PriceType::AGEN->value, PriceType::SUB_AGEN->value => PriceType::SUB_AGEN->value, PriceType::WHOLESALE->value => PriceType::WHOLESALE->value, PriceType::RETAIL->value => PriceType::RETAIL->value, PriceType::TIKTOK->value => PriceType::TIKTOK->value, PriceType::SHOPEE->value => PriceType::SHOPEE->value, ]; return $map[$orderPriceType] ?? PriceType::RETAIL->value; } }