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;
|
$includedVariantId = null;
|
||||||
$cartItemId = $request->validated('cart_item_id');
|
$cartItemId = $request->validated('cart_item_id');
|
||||||
|
$selectedValues = $request->validated('selected_values', []);
|
||||||
|
|
||||||
if ($cartItemId !== null) {
|
if ($cartItemId !== null) {
|
||||||
$cartItem = $cartService->show($tenant, $request)
|
$cartItem = $cartService->show($tenant, $request)
|
||||||
@@ -132,12 +133,18 @@ class CatalogController extends Controller
|
|||||||
->firstWhere('id', (int) $cartItemId);
|
->firstWhere('id', (int) $cartItemId);
|
||||||
abort_unless($cartItem?->catalog_item_id === $catalogItem->id, 404);
|
abort_unless($cartItem?->catalog_item_id === $catalogItem->id, 404);
|
||||||
$includedVariantId = $cartItem->variant_id;
|
$includedVariantId = $cartItem->variant_id;
|
||||||
|
|
||||||
|
if ($selectedValues === [] && $cartItem->variant !== null) {
|
||||||
|
$selectedValues = $cartItem->variant
|
||||||
|
->selectorOptions($catalogItem->itemAttributes)
|
||||||
|
->all();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return CatalogVariantOptionsResource::make(
|
return CatalogVariantOptionsResource::make(
|
||||||
$variantSelectionService->options(
|
$variantSelectionService->options(
|
||||||
$catalogItem,
|
$catalogItem,
|
||||||
$request->validated('selected_values', []),
|
$selectedValues,
|
||||||
$includedVariantId,
|
$includedVariantId,
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ namespace Tests\Feature\Catalog;
|
|||||||
|
|
||||||
use App\Domains\Attachable\Enums\AttachmentType;
|
use App\Domains\Attachable\Enums\AttachmentType;
|
||||||
use App\Domains\Attachable\Models\Attachment;
|
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\Enums\InventoryPolicy;
|
||||||
use App\Domains\Catalog\Models\Attribute;
|
use App\Domains\Catalog\Models\Attribute;
|
||||||
use App\Domains\Catalog\Models\CatalogItem;
|
use App\Domains\Catalog\Models\CatalogItem;
|
||||||
@@ -358,6 +360,57 @@ class CatalogItemDetailControllerTest extends TestCase
|
|||||||
->assertJsonPath('data.resolved_variant.values.sector.value', 'A');
|
->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(
|
private function createItem(
|
||||||
Tenant $tenant,
|
Tenant $tenant,
|
||||||
string $name,
|
string $name,
|
||||||
|
|||||||
Reference in New Issue
Block a user