refactor(catalog): enhance variant options retrieval by restoring canonical values from reserved cart items

This commit is contained in:
2026-08-18 09:27:26 -03:00
parent 7c2880646f
commit 9e74e21fb5
2 changed files with 61 additions and 1 deletions

View File

@@ -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,
)
);

View File

@@ -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,