refactor(catalog): enhance variant options retrieval by restoring canonical values from reserved cart items
This commit is contained in:
@@ -125,6 +125,7 @@ class CatalogController extends Controller
|
||||
|
||||
$includedVariantId = null;
|
||||
$cartItemId = $request->validated('cart_item_id');
|
||||
$selectedValues = $request->validated('selected_values', []);
|
||||
|
||||
if ($cartItemId !== null) {
|
||||
$cartItem = $cartService->show($tenant, $request)
|
||||
@@ -132,12 +133,18 @@ class CatalogController extends Controller
|
||||
->firstWhere('id', (int) $cartItemId);
|
||||
abort_unless($cartItem?->catalog_item_id === $catalogItem->id, 404);
|
||||
$includedVariantId = $cartItem->variant_id;
|
||||
|
||||
if ($selectedValues === [] && $cartItem->variant !== null) {
|
||||
$selectedValues = $cartItem->variant
|
||||
->selectorOptions($catalogItem->itemAttributes)
|
||||
->all();
|
||||
}
|
||||
}
|
||||
|
||||
return CatalogVariantOptionsResource::make(
|
||||
$variantSelectionService->options(
|
||||
$catalogItem,
|
||||
$request->validated('selected_values', []),
|
||||
$selectedValues,
|
||||
$includedVariantId,
|
||||
)
|
||||
);
|
||||
|
||||
@@ -4,6 +4,8 @@ namespace Tests\Feature\Catalog;
|
||||
|
||||
use App\Domains\Attachable\Enums\AttachmentType;
|
||||
use App\Domains\Attachable\Models\Attachment;
|
||||
use App\Domains\Auth\Models\User;
|
||||
use App\Domains\Cart\Models\Cart;
|
||||
use App\Domains\Catalog\Enums\InventoryPolicy;
|
||||
use App\Domains\Catalog\Models\Attribute;
|
||||
use App\Domains\Catalog\Models\CatalogItem;
|
||||
@@ -358,6 +360,57 @@ class CatalogItemDetailControllerTest extends TestCase
|
||||
->assertJsonPath('data.resolved_variant.values.sector.value', 'A');
|
||||
}
|
||||
|
||||
public function test_variant_options_restore_canonical_values_from_the_reserved_cart_item(): void
|
||||
{
|
||||
$tenant = $this->createTenant('reserved-variant-options');
|
||||
$item = $this->createItem($tenant, 'Reserved numbered entry');
|
||||
$sector = Attribute::query()->create([
|
||||
'tenant_codigo' => $tenant->codigo,
|
||||
'codigo' => 'sector',
|
||||
'nombre' => 'Sector',
|
||||
'type' => FieldType::Select,
|
||||
]);
|
||||
$seat = Attribute::query()->create([
|
||||
'tenant_codigo' => $tenant->codigo,
|
||||
'codigo' => 'seat',
|
||||
'nombre' => 'Seat',
|
||||
'type' => FieldType::Select,
|
||||
]);
|
||||
$itemSector = $item->itemAttributes()->create([
|
||||
'attribute_id' => $sector->id,
|
||||
'sort_order' => 0,
|
||||
]);
|
||||
$itemSeat = $item->itemAttributes()->create([
|
||||
'attribute_id' => $seat->id,
|
||||
'sort_order' => 1,
|
||||
]);
|
||||
$variant = $this->createVariant($item, 1, 0);
|
||||
$variant->definitions()->createMany([
|
||||
['item_attribute_id' => $itemSector->id, 'value' => 'VIP'],
|
||||
['item_attribute_id' => $itemSeat->id, 'value' => 'A-12'],
|
||||
]);
|
||||
$user = User::factory()->create();
|
||||
$cart = Cart::query()->create([
|
||||
'tenant_codigo' => $tenant->codigo,
|
||||
'user_id' => $user->id,
|
||||
'status' => 'active',
|
||||
]);
|
||||
$cartItem = $cart->addItem($item->id, $variant->id, 1);
|
||||
|
||||
$this->actingAs($user, 'sanctum')
|
||||
->postJson(
|
||||
"/api/tenants/{$tenant->codigo}/catalog-items/{$item->id}/variant-options",
|
||||
[
|
||||
'selected_values' => [],
|
||||
'cart_item_id' => $cartItem->id,
|
||||
],
|
||||
)
|
||||
->assertOk()
|
||||
->assertJsonPath('data.selected_values.sector', 'VIP')
|
||||
->assertJsonPath('data.selected_values.seat', 'A-12')
|
||||
->assertJsonPath('data.resolved_variant.id', $variant->id);
|
||||
}
|
||||
|
||||
private function createItem(
|
||||
Tenant $tenant,
|
||||
string $name,
|
||||
|
||||
Reference in New Issue
Block a user