From 6844ab7af994da267a1d03b2e5d6b79ec6e81d89 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Mon, 10 Aug 2026 13:59:45 -0300 Subject: [PATCH] feat(cart): update CartItemResource to use visibleVariants method with included variant ID; enhance variant filtering logic --- app/Domains/Cart/Resources/CartItemResource.php | 2 +- app/Domains/Catalog/Models/CatalogItem.php | 5 +++-- tests/Feature/Cart/CartControllerTest.php | 13 +++++++++++-- tests/Unit/Catalog/CatalogModelsTest.php | 6 ++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/Domains/Cart/Resources/CartItemResource.php b/app/Domains/Cart/Resources/CartItemResource.php index cc2a56e..dbe1709 100644 --- a/app/Domains/Cart/Resources/CartItemResource.php +++ b/app/Domains/Cart/Resources/CartItemResource.php @@ -38,7 +38,7 @@ class CartItemResource extends JsonResource 'product' => $selectedItem === null ? null : [ 'nombre' => $selectedItem->getName(), 'imagen' => $imageUrl, - 'variants' => $this->catalogItem->variants + 'variants' => $this->catalogItem->visibleVariants($this->variant_id) ->map(fn (Variant $variant): array => [ 'id' => $variant->id, 'precio' => $this->formatMoney($variant->getPrice()), diff --git a/app/Domains/Catalog/Models/CatalogItem.php b/app/Domains/Catalog/Models/CatalogItem.php index 253a0ef..fb96548 100644 --- a/app/Domains/Catalog/Models/CatalogItem.php +++ b/app/Domains/Catalog/Models/CatalogItem.php @@ -172,10 +172,11 @@ class CatalogItem extends Model } /** @return Collection */ - public function visibleVariants(): Collection + public function visibleVariants(?int $includedVariantId = null): Collection { return $this->variants - ->filter(fn (Variant $variant): bool => $this->inventory_policy === InventoryPolicy::Unlimited + ->filter(fn (Variant $variant): bool => ($includedVariantId !== null && $variant->id === $includedVariantId) + || $this->inventory_policy === InventoryPolicy::Unlimited || ($variant->inventory?->availableStock() ?? 0) > 0) ->values(); } diff --git a/tests/Feature/Cart/CartControllerTest.php b/tests/Feature/Cart/CartControllerTest.php index e1e26b4..460b164 100644 --- a/tests/Feature/Cart/CartControllerTest.php +++ b/tests/Feature/Cart/CartControllerTest.php @@ -260,11 +260,16 @@ class CartControllerTest extends TestCase { $tenant = $this->createTenant('acme'); [$item, $firstVariant] = $this->createVariantItem($tenant, 10, '15.00'); - $secondInventory = Inventory::query()->create(['real_stock' => 8]); + $secondInventory = Inventory::query()->create(['real_stock' => 2]); $secondVariant = $item->variants()->create([ 'inventory_id' => $secondInventory->id, 'precio' => '20.00', ]); + $unavailableInventory = Inventory::query()->create(['real_stock' => 0]); + $unavailableVariant = $item->variants()->create([ + 'inventory_id' => $unavailableInventory->id, + 'precio' => '25.00', + ]); $createResponse = $this->postJson('/api/tenants/acme/cart/items', [ 'catalog_item_id' => $item->id, 'variant_id' => $firstVariant->id, @@ -285,7 +290,11 @@ class CartControllerTest extends TestCase ->assertOk() ->assertJsonPath('data.items.0.variant_id', $secondVariant->id) ->assertJsonPath('data.items.0.precio_unitario', '20.00') - ->assertJsonCount(2, 'data.items.0.product.variants'); + ->assertJsonCount(2, 'data.items.0.product.variants') + ->assertJsonPath('data.items.0.product.variants.0.id', $firstVariant->id) + ->assertJsonPath('data.items.0.product.variants.1.id', $secondVariant->id) + ->assertJsonPath('data.items.0.product.variants.1.stock_tecnico', 0) + ->assertJsonMissing(['id' => $unavailableVariant->id, 'stock_tecnico' => 0]); $this->assertDatabaseHas('inventories', [ 'id' => $firstVariant->inventory_id, diff --git a/tests/Unit/Catalog/CatalogModelsTest.php b/tests/Unit/Catalog/CatalogModelsTest.php index 642c51c..e364d2b 100644 --- a/tests/Unit/Catalog/CatalogModelsTest.php +++ b/tests/Unit/Catalog/CatalogModelsTest.php @@ -290,11 +290,17 @@ class CatalogModelsTest extends TestCase { $unavailable = (new Variant)->setRelation('inventory', $this->trackedInventory(3, 3)); $available = (new Variant)->setRelation('inventory', $this->trackedInventory(5, 2)); + $unavailable->id = 10; + $available->id = 20; $item = new CatalogItem; $item->inventory_policy = InventoryPolicy::Tracked; $item->setRelation('variants', new EloquentCollection([$unavailable, $available])); $this->assertSame([$available], $item->visibleVariants()->all()); + $this->assertSame( + [$unavailable, $available], + $item->visibleVariants($unavailable->id)->all(), + ); $item->inventory_policy = InventoryPolicy::Unlimited;