From 8395c7f24d5eee1f1d8ca09f8b3f998b23d84ee1 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Mon, 21 Sep 2026 09:16:33 -0300 Subject: [PATCH] feat(menus): assign event routes to OnTicket --- ..._09_21_000000_assign_menus_to_onticket.php | 113 ++++++++++++++++++ database/seeders/MenuSeeder.php | 14 +++ tests/Feature/Seeders/MenuSeederTest.php | 32 ++++- 3 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2026_09_21_000000_assign_menus_to_onticket.php diff --git a/database/migrations/2026_09_21_000000_assign_menus_to_onticket.php b/database/migrations/2026_09_21_000000_assign_menus_to_onticket.php new file mode 100644 index 0000000..8110238 --- /dev/null +++ b/database/migrations/2026_09_21_000000_assign_menus_to_onticket.php @@ -0,0 +1,113 @@ + [ + 'label' => 'Eventos', + 'route' => '/', + ], + 'event.detail' => [ + 'label' => 'Detalle de evento', + 'route' => '/evento/:id', + ], + ]; + + private const EXCLUDED_MENU_CODES = [ + 'product.detail', + 'help', + 'help.faq', + 'help.contact', + 'help.payment-methods', + 'help.shipping', + 'help.terms-and-conditions', + 'adminapp.tickets', + 'adminapp.fiesta-futbol-infantil.entradas', + 'adminapp.fiesta-futbol-infantil.alojamientos', + 'adminapp.fiesta-futbol-infantil.merchandising', + 'adminapp.fiesta-futbol-infantil.comida', + 'adminapp.desfile.entradas', + ]; + + public function up(): void + { + $now = now(); + + DB::transaction(function () use ($now): void { + foreach (self::EVENT_MENUS as $code => $menu) { + DB::table('menues')->updateOrInsert( + ['code' => $code], + [ + 'label' => $menu['label'], + 'parent_menu_code' => null, + 'content_type' => 'dynamic', + 'static_content_schema' => null, + 'route' => $menu['route'], + 'created_at' => $now, + 'updated_at' => $now, + ], + ); + } + + DB::table('roles') + ->whereIn('codigo', ['admin', 'adminapp', 'user']) + ->pluck('codigo') + ->each(function (string $roleCode): void { + foreach (array_keys(self::EVENT_MENUS) as $menuCode) { + DB::table('roles_menues')->updateOrInsert([ + 'rol_codigo' => $roleCode, + 'menu_codigo' => $menuCode, + ]); + } + }); + + if (! DB::table('tenants')->where('codigo', self::TENANT_CODE)->exists()) { + return; + } + + DB::table('menues') + ->whereNotIn('code', self::EXCLUDED_MENU_CODES) + ->pluck('code') + ->each(function (string $menuCode) use ($now): void { + DB::table('tenants_menues')->updateOrInsert( + [ + 'tenant_code' => self::TENANT_CODE, + 'menu_code' => $menuCode, + ], + [ + 'static_content' => null, + 'created_at' => $now, + 'updated_at' => $now, + ], + ); + }); + }); + } + + public function down(): void + { + DB::transaction(function (): void { + $assignedMenuCodes = DB::table('menues') + ->whereNotIn('code', self::EXCLUDED_MENU_CODES) + ->pluck('code'); + + DB::table('tenants_menues') + ->where('tenant_code', self::TENANT_CODE) + ->whereIn('menu_code', $assignedMenuCodes) + ->delete(); + + DB::table('roles_menues') + ->whereIn('menu_codigo', array_keys(self::EVENT_MENUS)) + ->delete(); + + DB::table('menues') + ->whereIn('code', array_keys(self::EVENT_MENUS)) + ->delete(); + }); + } +}; diff --git a/database/seeders/MenuSeeder.php b/database/seeders/MenuSeeder.php index 24b562b..64db9e5 100644 --- a/database/seeders/MenuSeeder.php +++ b/database/seeders/MenuSeeder.php @@ -17,6 +17,12 @@ class MenuSeeder extends Seeder { $menus = [ ['code' => 'index', 'label' => 'Inicio', 'route' => '/'], + ['code' => 'event.index', 'label' => 'Eventos', 'route' => '/'], + [ + 'code' => 'event.detail', + 'label' => 'Detalle de evento', + 'route' => '/evento/:id', + ], [ 'code' => 'product.detail', 'label' => 'Detalle de producto', @@ -291,6 +297,10 @@ class MenuSeeder extends Seeder $desfileMenuCodes = [ 'adminapp.desfile.entradas', ]; + $onTicketMenuCodes = [ + 'event.index', + 'event.detail', + ]; $frequentlyAskedQuestions = [ [ 'pregunta' => '¿Hay algún límite de compra?', @@ -358,6 +368,10 @@ class MenuSeeder extends Seeder $menuCodes = array_diff($menuCodes, $desfileMenuCodes); } + if ($tenant->codigo !== 'onticket') { + $menuCodes = array_diff($menuCodes, $onTicketMenuCodes); + } + // Usar sync para asociar los menues al tenant $tenant->menues()->sync($menuCodes); diff --git a/tests/Feature/Seeders/MenuSeederTest.php b/tests/Feature/Seeders/MenuSeederTest.php index 0864ce3..7f0c994 100644 --- a/tests/Feature/Seeders/MenuSeederTest.php +++ b/tests/Feature/Seeders/MenuSeederTest.php @@ -2,12 +2,12 @@ namespace Tests\Feature\Seeders; -use App\Shared\Attachable\Enums\AttachmentType; -use App\Shared\Attachable\Models\Attachment; use App\Domains\Core\Authorization\Enums\RoleCode; use App\Domains\Core\Authorization\Models\Role; use App\Domains\Core\Menu\Models\Menu; use App\Domains\Core\Tenant\Models\Tenant; +use App\Shared\Attachable\Enums\AttachmentType; +use App\Shared\Attachable\Models\Attachment; use Database\Seeders\AuthorizationSeeder; use Database\Seeders\MenuSeeder; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -183,6 +183,34 @@ class MenuSeederTest extends TestCase ); } + public function test_it_assigns_event_menus_only_to_onticket(): void + { + $onTicket = $this->createTenant('onticket'); + $otherTenant = $this->createTenant('other'); + + $this->seed(AuthorizationSeeder::class); + $this->seed(MenuSeeder::class); + + foreach ([ + 'event.index' => '/', + 'event.detail' => '/evento/:id', + ] as $code => $route) { + $menu = Menu::query()->where('code', $code)->firstOrFail(); + + $this->assertSame($route, $menu->route); + $this->assertTrue($onTicket->menues()->where('menues.code', $code)->exists()); + $this->assertFalse($otherTenant->menues()->where('menues.code', $code)->exists()); + $this->assertTrue( + Role::query() + ->where('codigo', RoleCode::User->value) + ->firstOrFail() + ->menus() + ->where('menues.code', $code) + ->exists() + ); + } + } + public function test_it_seeds_the_account_menu_hierarchy(): void { $tenant = $this->createTenant('account_tenant');