where('codigo', 'fiesta_futbol_infantil')->first(); if (! $tenant) { throw new RuntimeException("Tenant 'fiesta_futbol_infantil' no encontrado."); } $this->deleteExistingCatalog($tenant); FeaturedGroup::query()->where('tenant_code', $tenant->codigo)->delete(); Category::query() ->where('tenant_code', $tenant->codigo) ->update(['categoria_id' => null]); Category::query()->where('tenant_code', $tenant->codigo)->delete(); $event = Event::query()->updateOrCreate( [ 'tenant_code' => $tenant->codigo, 'name' => 'Fiesta Nacional del Fútbol Infantil', ], ['address' => 'Sunchales, Santa Fe'], ); $event->dates()->delete(); $eventDates = collect(['2026-10-09', '2026-10-10', '2026-10-11', '2026-10-12']) ->mapWithKeys(function (string $date) use ($event): array { $eventDate = $event->dates()->create([ 'date' => $date, 'time_start' => '00:00:00', 'time_end' => '23:59:59', ]); return [$date => $eventDate]; }); $tenant->active_event_id = $event->id; $tenant->save(); $ticketCategory = Category::query()->firstOrCreate([ 'nombre' => 'Entradas', 'tenant_code' => $tenant->codigo, ]); $accommodationCategory = Category::query()->firstOrCreate([ 'nombre' => 'Alojamientos', 'tenant_code' => $tenant->codigo, ]); $merchandisingCategory = Category::query()->firstOrCreate([ 'nombre' => 'Merchandising', 'tenant_code' => $tenant->codigo, ]); $foodCategory = Category::query()->firstOrCreate([ 'nombre' => 'Comida', 'tenant_code' => $tenant->codigo, ]); $dates = $eventDates->keys()->all(); $minimumUseDate = $dates[0].' 00:00:00'; $maximumUseDate = $dates[array_key_last($dates)].' 23:59:59'; $eventValidityTime = ValidityTime::query()->firstOrCreate([ 'type' => ValidityTimeType::FixedWindow, 'fixed_starts_at' => $minimumUseDate, 'fixed_expires_at' => $maximumUseDate, ]); $generalAdmission = $this->catalogService->create([ 'tenant_code' => $tenant->codigo, 'event_id' => $event->id, 'event_product_type' => EventProductType::Entry->value, 'category_id' => $ticketCategory->id, 'slug' => 'entrada-general', 'nombre' => 'Entrada General', 'descripcion' => 'Acceso total al predio. No incluye acceso a estacionamiento. Niños menores de 5 años ingresan gratis.', 'precio' => 10000, 'inventory_policy' => InventoryPolicy::Unlimited->value, 'has_tickets' => true, 'validity_time_id' => $eventValidityTime->id, 'variants' => array_map( fn (string $date): array => [ 'real_stock' => 0, 'event_date_id' => $eventDates->get($date)->id, ], $dates, ), ]); $items = [ ['slug' => 'alojamiento-por-noche', 'nombre' => 'Alojamiento por noche', 'precio' => 35000, 'category_id' => $accommodationCategory->id], ['slug' => 'alojamiento-fin-de-semana', 'nombre' => 'Alojamiento fin de semana', 'precio' => 90000, 'category_id' => $accommodationCategory->id], ['slug' => 'remera-oficial', 'nombre' => 'Remera oficial', 'precio' => 18000, 'category_id' => $merchandisingCategory->id], ['slug' => 'gorra-oficial', 'nombre' => 'Gorra oficial', 'precio' => 12000, 'category_id' => $merchandisingCategory->id], ['slug' => 'hamburguesa-papa-frita', 'nombre' => 'Hamburguesa con papa frita', 'precio' => 8000, 'category_id' => $foodCategory->id], ['slug' => 'pancho', 'nombre' => 'Pancho', 'precio' => 4000, 'category_id' => $foodCategory->id], ]; $createdItems = []; foreach ($items as $item) { $createdItems[$item['slug']] = $this->catalogService->create([ 'tenant_code' => $tenant->codigo, 'event_id' => $event->id, 'event_product_type' => EventProductType::Product->value, 'descripcion' => $item['descripcion'] ?? $item['nombre'], 'inventory_policy' => InventoryPolicy::Unlimited->value, 'real_stock' => 0, 'validity_time_id' => $eventValidityTime->id, ...$item, ]); } $this->catalogService->create([ 'tenant_code' => $tenant->codigo, 'event_id' => $event->id, 'event_product_type' => EventProductType::Entry->value, 'type' => CatalogItemType::Bundle->value, 'slug' => 'entrada-general-todos-los-dias', 'nombre' => 'Entrada General - Todos los días', 'descripcion' => 'Incluye una entrada para cada día de la Fiesta Nacional del Fútbol Infantil.', 'precio' => 40000, 'category_id' => $ticketCategory->id, 'components' => $generalAdmission->variants ->map(fn ($variant): array => [ 'catalog_item_id' => $generalAdmission->id, 'variant_id' => $variant->id, 'quantity' => 1, ]) ->all(), ]); $this->catalogService->create([ 'tenant_code' => $tenant->codigo, 'event_id' => $event->id, 'event_product_type' => EventProductType::Product->value, 'type' => CatalogItemType::Bundle->value, 'slug' => 'combo-2-panchos-2-hamburguesas', 'nombre' => 'Combo 2 Panchos + 2 Hamburguesas', 'descripcion' => 'Incluye 2 panchos y 2 hamburguesas con papa frita.', 'precio' => 24000, 'category_id' => $foodCategory->id, 'components' => [ [ 'catalog_item_id' => $createdItems['pancho']->id, 'quantity' => 2, ], [ 'catalog_item_id' => $createdItems['hamburguesa-papa-frita']->id, 'quantity' => 2, ], ], ]); $this->seedFeaturedGroups($tenant, [ 'Entradas' => $ticketCategory, 'Alojamientos' => $accommodationCategory, 'Merchandising' => $merchandisingCategory, 'Comida' => $foodCategory, ]); } private function deleteExistingCatalog(Tenant $tenant): void { CatalogItem::query() ->where('tenant_code', $tenant->codigo) ->where('type', CatalogItemType::Bundle->value) ->each(fn (CatalogItem $item) => $this->catalogService->delete($item)); CatalogItem::query() ->where('tenant_code', $tenant->codigo) ->where('type', CatalogItemType::Standard->value) ->each(fn (CatalogItem $item) => $this->catalogService->delete($item)); } /** @param array $categories */ private function seedFeaturedGroups(Tenant $tenant, array $categories): void { $groups = [ 'Entradas' => [ 'product_layout' => ProductLayout::Row, 'group_layout' => GroupLayout::SimpleVertical, ], 'Alojamientos' => [ 'product_layout' => ProductLayout::ColumnWithCart, 'group_layout' => GroupLayout::Simple, ], 'Merchandising' => [ 'product_layout' => ProductLayout::ColumnWithCart, 'group_layout' => GroupLayout::Simple, ], 'Comida' => [ 'product_layout' => ProductLayout::ColumnWithCart, 'group_layout' => GroupLayout::Simple, ], ]; $groupOrder = 0; foreach ($groups as $groupName => $config) { FeaturedGroup::query()->create([ 'tenant_code' => $tenant->codigo, 'source_type' => FeaturedGroupSource::Category, 'category_id' => $categories[$groupName]->id, 'product_layout' => $config['product_layout'], 'group_layout' => $config['group_layout'], 'group_name' => $groupName, 'group_order' => $groupOrder++, ]); } } }