From 11776f0734526584e4f73488199b5eb10b4ba058 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Fri, 7 Aug 2026 14:34:59 -0300 Subject: [PATCH] refactor: integrate category handling for entries and food items in services and tests --- .../Services/EntryService.php | 13 +++++++-- .../Services/FoodService.php | 7 +++++ .../FiestaFutbolInfantilProductSeeder.php | 14 ++++++++++ .../EntryControllerTest.php | 9 +++++- .../FoodControllerTest.php | 6 ++++ .../FiestaFutbolInfantilProductSeederTest.php | 28 +++++++++++++++++-- 6 files changed, 70 insertions(+), 7 deletions(-) diff --git a/app/Domains/FiestaFutbolInfantil/Services/EntryService.php b/app/Domains/FiestaFutbolInfantil/Services/EntryService.php index 7f239bf..3c16a34 100644 --- a/app/Domains/FiestaFutbolInfantil/Services/EntryService.php +++ b/app/Domains/FiestaFutbolInfantil/Services/EntryService.php @@ -5,6 +5,7 @@ namespace App\Domains\FiestaFutbolInfantil\Services; use App\Domains\Catalog\Enums\EventProductType; use App\Domains\Catalog\Enums\InventoryPolicy; use App\Domains\Catalog\Models\CatalogItem; +use App\Domains\Catalog\Models\Category; use App\Domains\Catalog\Models\Inventory; use App\Domains\Catalog\Models\Variant; use App\Domains\Catalog\Services\CatalogService; @@ -26,10 +27,14 @@ class EntryService { return DB::transaction(function () use ($tenant, $entries): Collection { $reservedSlugs = []; + $category = Category::query()->firstOrCreate([ + 'tenant_code' => $tenant->codigo, + 'nombre' => 'Entradas', + ]); - return collect($entries)->map(function (array $entry, int $index) use ($tenant, &$reservedSlugs): CatalogItem { + return collect($entries)->map(function (array $entry, int $index) use ($tenant, $category, &$reservedSlugs): CatalogItem { if (isset($entry['id'])) { - return $this->update($tenant, $entry, $index); + return $this->update($tenant, $category, $entry, $index); } $slug = $this->uniqueSlug($tenant, $entry['title'], $reservedSlugs); @@ -40,6 +45,7 @@ class EntryService 'slug' => $slug, 'nombre' => $entry['title'], 'descripcion' => $entry['description'] ?? null, + 'category_id' => $category->id, 'precio' => $entry['price'], 'event_product_type' => EventProductType::Entry->value, 'has_tickets' => true, @@ -56,7 +62,7 @@ class EntryService } /** @param array $entry */ - private function update(Tenant $tenant, array $entry, int $index): CatalogItem + private function update(Tenant $tenant, Category $category, array $entry, int $index): CatalogItem { $catalogItem = CatalogItem::query() ->whereKey($entry['id']) @@ -100,6 +106,7 @@ class EntryService $catalogItem->update([ 'nombre' => $entry['title'], 'descripcion' => $entry['description'] ?? null, + 'category_id' => $category->id, 'precio' => $entry['price'], 'has_tickets' => true, 'inventory_policy' => InventoryPolicy::Tracked->value, diff --git a/app/Domains/FiestaFutbolInfantil/Services/FoodService.php b/app/Domains/FiestaFutbolInfantil/Services/FoodService.php index 1515fee..1dc1177 100644 --- a/app/Domains/FiestaFutbolInfantil/Services/FoodService.php +++ b/app/Domains/FiestaFutbolInfantil/Services/FoodService.php @@ -7,6 +7,7 @@ use App\Domains\Catalog\Enums\InventoryPolicy; use App\Domains\Catalog\Models\Attribute; use App\Domains\Catalog\Models\AttributeOption; use App\Domains\Catalog\Models\CatalogItem; +use App\Domains\Catalog\Models\Category; use App\Domains\Catalog\Models\Inventory; use App\Domains\Catalog\Models\ItemAttribute; use App\Domains\Catalog\Models\Variant; @@ -96,6 +97,10 @@ class FoodService /** @param array> $variants */ private function food(Tenant $tenant, array $variants): CatalogItem { + $category = Category::query()->firstOrCreate([ + 'tenant_code' => $tenant->codigo, + 'nombre' => 'Comidas', + ]); $food = CatalogItem::query() ->where('tenant_code', $tenant->codigo) ->where('slug', 'comida') @@ -104,6 +109,7 @@ class FoodService if ($food !== null) { $food->update([ + 'category_id' => $category->id, 'event_product_type' => EventProductType::Product->value, 'inventory_policy' => InventoryPolicy::Tracked->value, 'has_tickets' => false, @@ -117,6 +123,7 @@ class FoodService 'slug' => 'comida', 'nombre' => 'Comida', 'descripcion' => 'Comida', + 'category_id' => $category->id, 'precio' => collect($variants)->min('price') ?? 0, 'event_product_type' => EventProductType::Product->value, 'inventory_policy' => InventoryPolicy::Tracked->value, diff --git a/database/seeders/FiestaFutbolInfantilProductSeeder.php b/database/seeders/FiestaFutbolInfantilProductSeeder.php index dfdc6b8..fe7ae3e 100644 --- a/database/seeders/FiestaFutbolInfantilProductSeeder.php +++ b/database/seeders/FiestaFutbolInfantilProductSeeder.php @@ -32,6 +32,16 @@ class FiestaFutbolInfantilProductSeeder extends Seeder Category::query()->where('tenant_code', $tenant->codigo)->update(['categoria_id' => null]); Category::query()->where('tenant_code', $tenant->codigo)->delete(); + $categories = collect([ + 'entradas' => 'Entradas', + 'alojamientos' => 'Alojamientos', + 'comidas' => 'Comidas', + 'merchandising' => 'Merchandising', + ])->map(fn (string $name): Category => Category::query()->create([ + 'nombre' => $name, + 'tenant_code' => $tenant->codigo, + ])); + $tenant->update([ 'event_title' => 'Fiesta Nacional del FĂștbol Infantil', 'event_location' => 'Sunchales, Santa Fe', @@ -49,6 +59,7 @@ class FiestaFutbolInfantilProductSeeder extends Seeder $this->createProduct($tenant, [ 'slug' => 'camiseta', 'nombre' => 'Camiseta', + 'category_id' => $categories['merchandising']->id, 'precio' => 18000, 'attribute_codes' => ['color', 'talle'], 'variants' => collect(['Verde', 'Blanco']) @@ -62,6 +73,7 @@ class FiestaFutbolInfantilProductSeeder extends Seeder $this->createProduct($tenant, [ 'slug' => 'alojamiento', 'nombre' => 'Alojamiento', + 'category_id' => $categories['alojamientos']->id, 'precio' => 35000, 'attribute_codes' => ['tipo_alojamiento'], 'variants' => collect(['Carpa', 'Motorhome'])->map(fn (string $type): array => [ @@ -73,6 +85,7 @@ class FiestaFutbolInfantilProductSeeder extends Seeder $this->createProduct($tenant, [ 'slug' => 'comida', 'nombre' => 'Comida', + 'category_id' => $categories['comidas']->id, 'precio' => 4000, 'attribute_codes' => ['event_date', 'horario', 'servicio'], 'variants' => $eventDates @@ -94,6 +107,7 @@ class FiestaFutbolInfantilProductSeeder extends Seeder $this->createProduct($tenant, [ 'slug' => 'abono', 'nombre' => 'Abono', + 'category_id' => $categories['entradas']->id, 'precio' => 40000, 'event_product_type' => EventProductType::Entry->value, 'has_tickets' => true, diff --git a/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php b/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php index 9c9102f..7f8c7b6 100644 --- a/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php @@ -6,6 +6,7 @@ use App\Domains\Auth\Models\User; use App\Domains\Authorization\Enums\RoleCode; use App\Domains\Catalog\Models\Attribute; use App\Domains\Catalog\Models\CatalogItem; +use App\Domains\Catalog\Models\Category; use App\Domains\Shared\Enums\FieldType; use App\Domains\Tenant\Models\Tenant; use App\Domains\Tenant\Models\WebsiteType; @@ -83,8 +84,14 @@ class EntryControllerTest extends TestCase $this->assertDatabaseCount('inventories', 2); $this->assertDatabaseCount('variant_event_dates', 3); - CatalogItem::query()->each(function (CatalogItem $entry) use ($tenant): void { + $entryCategory = Category::query() + ->where('tenant_code', $tenant->codigo) + ->where('nombre', 'Entradas') + ->sole(); + + CatalogItem::query()->each(function (CatalogItem $entry) use ($tenant, $entryCategory): void { $this->assertSame($tenant->codigo, $entry->tenant_code); + $this->assertSame($entryCategory->id, $entry->category_id); $this->assertSame('entrada', $entry->event_product_type->value); $this->assertSame('tracked', $entry->inventory_policy->value); $this->assertTrue($entry->has_tickets); diff --git a/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php b/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php index fed13eb..623c313 100644 --- a/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature\FiestaFutbolInfantil; use App\Domains\Auth\Models\User; use App\Domains\Authorization\Enums\RoleCode; use App\Domains\Catalog\Models\Attribute; +use App\Domains\Catalog\Models\Category; use App\Domains\Shared\Enums\FieldType; use App\Domains\Tenant\Models\Tenant; use App\Domains\Tenant\Models\WebsiteType; @@ -63,6 +64,11 @@ class FoodControllerTest extends TestCase 'tenant_code' => $tenant->codigo, 'slug' => 'comida', 'nombre' => 'Comida', + 'category_id' => Category::query() + ->where('tenant_code', $tenant->codigo) + ->where('nombre', 'Comidas') + ->sole() + ->id, 'precio' => 8000, ]); } diff --git a/tests/Feature/Seeders/FiestaFutbolInfantilProductSeederTest.php b/tests/Feature/Seeders/FiestaFutbolInfantilProductSeederTest.php index 678add2..a0af0e5 100644 --- a/tests/Feature/Seeders/FiestaFutbolInfantilProductSeederTest.php +++ b/tests/Feature/Seeders/FiestaFutbolInfantilProductSeederTest.php @@ -19,7 +19,7 @@ class FiestaFutbolInfantilProductSeederTest extends TestCase { use RefreshDatabase; - public function test_it_seeds_the_category_free_configurable_catalog(): void + public function test_it_seeds_the_configurable_catalog_with_its_categories(): void { $headerLogo = $this->attachment('header'); $footerLogo = $this->attachment('footer'); @@ -44,7 +44,14 @@ class FiestaFutbolInfantilProductSeederTest extends TestCase ['color', 'event_date', 'horario', 'servicio', 'talle', 'tipo_alojamiento'], Attribute::query()->where('tenant_codigo', $tenant->codigo)->orderBy('codigo')->pluck('codigo')->all(), ); - $this->assertSame(0, Category::query()->where('tenant_code', $tenant->codigo)->count()); + $this->assertSame( + ['Alojamientos', 'Comidas', 'Entradas', 'Merchandising'], + Category::query() + ->where('tenant_code', $tenant->codigo) + ->orderBy('nombre') + ->pluck('nombre') + ->all(), + ); $this->assertSame( ['abono', 'alojamiento', 'camiseta', 'comida'], CatalogItem::query()->where('tenant_code', $tenant->codigo)->orderBy('slug')->pluck('slug')->all(), @@ -59,9 +66,24 @@ class FiestaFutbolInfantilProductSeederTest extends TestCase foreach ($expectedVariantCounts as $slug => $count) { $item = CatalogItem::query()->where('tenant_code', $tenant->codigo)->where('slug', $slug)->sole(); $this->assertCount($count, $item->variants); - $this->assertNull($item->category_id); } + $this->assertSame( + [ + 'abono' => 'Entradas', + 'alojamiento' => 'Alojamientos', + 'camiseta' => 'Merchandising', + 'comida' => 'Comidas', + ], + CatalogItem::query() + ->where('tenant_code', $tenant->codigo) + ->with('category') + ->orderBy('slug') + ->get() + ->mapWithKeys(fn (CatalogItem $item): array => [$item->slug => $item->category?->nombre]) + ->all(), + ); + $abono = CatalogItem::query() ->where('tenant_code', $tenant->codigo) ->where('slug', 'abono')