127 lines
3.7 KiB
PHP
127 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\DataFixes;
|
|
|
|
use App\Enums\PriceType;
|
|
use App\Enums\ProductStockQuality;
|
|
use App\Models\OrderItem;
|
|
|
|
class FixOrderItemsUnitPrice extends BaseDataFix
|
|
{
|
|
public function key(): string
|
|
{
|
|
return 'order-items-unit-price';
|
|
}
|
|
|
|
public function description(): string
|
|
{
|
|
return 'Fix order_items with unit_price = 0 (lookup correct price from product_prices)';
|
|
}
|
|
|
|
public function fix(): array
|
|
{
|
|
$items = OrderItem::where('unit_price', 0)
|
|
->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;
|
|
}
|
|
}
|