feat(catalog): implement maximum addable quantity logic and user quota sharing across variants

This commit is contained in:
2026-08-19 16:43:51 -03:00
parent d97cc12af6
commit 8537d2ed0a
10 changed files with 260 additions and 26 deletions

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\FeaturedGroupSource;
use App\Domains\Catalog\Enums\GroupLayout;
use App\Domains\Catalog\Enums\ProductLayout;
@@ -73,13 +75,53 @@ class CatalogControllerTest extends TestCase
->assertJsonPath('0.items.0.stock_tecnico', 7)
->assertJsonCount(2, '0.items.0.variants')
->assertJsonPath('0.items.0.variants.0.stock_tecnico', 4)
->assertJsonPath('0.items.0.variants.0.maximum_addable_quantity', 4)
->assertJsonPath('0.items.0.variants.1.stock_tecnico', 3)
->assertJsonPath('0.items.0.variants.1.maximum_addable_quantity', 3)
->assertJsonMissing(['id' => $unavailableVariant->id, 'stock_tecnico' => 0])
->assertJsonPath('1.title', 'Row')
->assertJsonPath('1.items.data.0.stock_tecnico', 8)
->assertJsonPath('1.items.data.0.maximum_addable_quantity', 8)
->assertJsonCount(0, '1.items.data.0.variants');
}
public function test_maximum_addable_quantity_shares_the_authenticated_user_quota_between_variants(): void
{
$tenant = $this->createTenant('catalog-allowance');
$group = $this->createGroup(
$tenant,
ProductLayout::ColumnWithCart,
'Allowances',
groupLayout: GroupLayout::Simple,
);
$user = User::factory()->create();
$item = $this->createItem($tenant, 'Limited variants');
$item->update(['max_units_per_user' => 5]);
$firstVariant = $item->variants()->create([
'inventory_id' => Inventory::query()->create(['real_stock' => 10])->id,
]);
$secondVariant = $item->variants()->create([
'inventory_id' => Inventory::query()->create(['real_stock' => 10])->id,
]);
$group->featuredItems()->create(['catalog_item_id' => $item->id]);
$cart = Cart::query()->create([
'tenant_codigo' => $tenant->codigo,
'user_id' => $user->id,
'status' => 'active',
]);
$cart->addItem($item->id, $firstVariant->id, 2);
$cart->addItem($item->id, $secondVariant->id, 1);
$this->actingAs($user, 'sanctum')
->getJson("/api/tenants/{$tenant->codigo}/catalog")
->assertOk()
->assertJsonPath('0.items.0.variants.0.stock_tecnico', 8)
->assertJsonPath('0.items.0.variants.0.maximum_addable_quantity', 2)
->assertJsonPath('0.items.0.variants.1.stock_tecnico', 9)
->assertJsonPath('0.items.0.variants.1.maximum_addable_quantity', 2);
}
public function test_it_excludes_items_when_all_of_their_variants_are_out_of_stock(): void
{
$tenant = $this->createTenant('catalog-available-variants');