68 lines
2.2 KiB
PHP
68 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Manage;
|
|
|
|
use App\Enums\PriceType;
|
|
use App\Models\CuttingResultPrice;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class CuttingResultPriceResolver
|
|
{
|
|
public function resolve(int $productVariantId, PriceType $priceType): ?CuttingResultPrice
|
|
{
|
|
return CuttingResultPrice::query()
|
|
->where('product_variant_id', $productVariantId)
|
|
->where('price_type', $priceType)
|
|
->whereHas('cutting', fn ($query) => $query->verified())
|
|
->join('cuttings', 'cutting_result_prices.cutting_id', '=', 'cuttings.id')
|
|
->orderByDesc('cuttings.created_at')
|
|
->select('cutting_result_prices.*')
|
|
->first();
|
|
}
|
|
|
|
/**
|
|
* @return list<CuttingResultPrice>
|
|
*/
|
|
public function latestPricesForVariant(int $productVariantId): array
|
|
{
|
|
$prices = [];
|
|
|
|
foreach (PriceType::cases() as $priceType) {
|
|
$price = $this->resolve($productVariantId, $priceType);
|
|
|
|
if ($price !== null) {
|
|
$prices[] = $price;
|
|
}
|
|
}
|
|
|
|
return $prices;
|
|
}
|
|
|
|
/**
|
|
* Batch-fetch latest prices for multiple variant IDs in a single query.
|
|
* Returns a Collection keyed by product_variant_id, where each value is
|
|
* a Collection of CuttingResultPrice (one per price type, the latest).
|
|
*
|
|
* @param list<int> $variantIds
|
|
* @return Collection<int, Collection<int, CuttingResultPrice>>
|
|
*/
|
|
public function latestPricesForVariants(array $variantIds): Collection
|
|
{
|
|
if (empty($variantIds)) {
|
|
return collect();
|
|
}
|
|
|
|
return CuttingResultPrice::query()
|
|
->whereIn('product_variant_id', $variantIds)
|
|
->whereHas('cutting', fn ($query) => $query->verified())
|
|
->join('cuttings', 'cutting_result_prices.cutting_id', '=', 'cuttings.id')
|
|
->orderByDesc('cuttings.created_at')
|
|
->select('cutting_result_prices.*')
|
|
->get()
|
|
->groupBy(fn (CuttingResultPrice $price) => $price->product_variant_id.'-'.$price->price_type->value)
|
|
->map(fn (Collection $group) => $group->first())
|
|
->values()
|
|
->groupBy('product_variant_id');
|
|
}
|
|
}
|