diff --git a/app/Domains/Catalog/Controllers/CatalogController.php b/app/Domains/Catalog/Controllers/CatalogController.php index 94fcdac..9d75e12 100644 --- a/app/Domains/Catalog/Controllers/CatalogController.php +++ b/app/Domains/Catalog/Controllers/CatalogController.php @@ -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, ) ); diff --git a/tests/Feature/Catalog/CatalogItemDetailControllerTest.php b/tests/Feature/Catalog/CatalogItemDetailControllerTest.php index 1da6453..68190d4 100644 --- a/tests/Feature/Catalog/CatalogItemDetailControllerTest.php +++ b/tests/Feature/Catalog/CatalogItemDetailControllerTest.php @@ -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,