From 5e78f2bb1eb1d5c1266b07dd563670832b5cb945 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Wed, 23 Sep 2026 16:28:35 -0300 Subject: [PATCH] feat(forms): add desfile entry reservation form --- .../DesfileEntryReservationFormController.php | 19 +++++ .../DesfileEntryReservationFormResource.php | 17 ++++ .../DesfileEntryReservationFormService.php | 16 ++++ app/Shared/Forms/routes/adminapp.php | 6 ++ database/seeders/MenuSeeder.php | 7 ++ ...fileEntryReservationFormControllerTest.php | 85 +++++++++++++++++++ 6 files changed, 150 insertions(+) create mode 100644 app/Shared/Forms/Controllers/AdminApp/DesfileEntryReservationFormController.php create mode 100644 app/Shared/Forms/Resources/DesfileEntryReservationFormResource.php create mode 100644 app/Shared/Forms/Services/DesfileEntryReservationFormService.php create mode 100644 tests/Feature/Forms/AdminAppDesfileEntryReservationFormControllerTest.php diff --git a/app/Shared/Forms/Controllers/AdminApp/DesfileEntryReservationFormController.php b/app/Shared/Forms/Controllers/AdminApp/DesfileEntryReservationFormController.php new file mode 100644 index 0000000..4a2a242 --- /dev/null +++ b/app/Shared/Forms/Controllers/AdminApp/DesfileEntryReservationFormController.php @@ -0,0 +1,19 @@ +formService->get()); + } +} diff --git a/app/Shared/Forms/Resources/DesfileEntryReservationFormResource.php b/app/Shared/Forms/Resources/DesfileEntryReservationFormResource.php new file mode 100644 index 0000000..8750f6d --- /dev/null +++ b/app/Shared/Forms/Resources/DesfileEntryReservationFormResource.php @@ -0,0 +1,17 @@ + */ + public function toArray(Request $request): array + { + return [ + 'payment_types' => $this->resource['payment_types'], + ]; + } +} diff --git a/app/Shared/Forms/Services/DesfileEntryReservationFormService.php b/app/Shared/Forms/Services/DesfileEntryReservationFormService.php new file mode 100644 index 0000000..8741164 --- /dev/null +++ b/app/Shared/Forms/Services/DesfileEntryReservationFormService.php @@ -0,0 +1,16 @@ +} */ + public function get(): array + { + return [ + 'payment_types' => EntryReservationPaymentType::options(), + ]; + } +} diff --git a/app/Shared/Forms/routes/adminapp.php b/app/Shared/Forms/routes/adminapp.php index 5afd625..6517d63 100644 --- a/app/Shared/Forms/routes/adminapp.php +++ b/app/Shared/Forms/routes/adminapp.php @@ -1,5 +1,6 @@ middleware(['auth:sanctum', 'adminapp.tenant']) ->group(function (): void { Route::get('event', EventFormController::class); + Route::get( + 'desfile/entry-reservation', + DesfileEntryReservationFormController::class + )->middleware('tenant.menu:adminapp.desfile.reservas') + ->name('adminapp.forms.desfile.entry-reservation'); Route::get('sale', SaleFormController::class); Route::get('staff', StaffFormController::class); Route::get('tickets-filter', TicketFilterFormController::class) diff --git a/database/seeders/MenuSeeder.php b/database/seeders/MenuSeeder.php index f698f67..183ec63 100644 --- a/database/seeders/MenuSeeder.php +++ b/database/seeders/MenuSeeder.php @@ -130,6 +130,12 @@ class MenuSeeder extends Seeder 'parent_menu_code' => 'main.adminapp', 'route' => '/admin/desfile/entradas', ], + [ + 'code' => 'adminapp.desfile.reservas', + 'label' => 'Reserva de Tickets', + 'parent_menu_code' => 'main.adminapp', + 'route' => '/admin/desfile/reservas', + ], [ 'code' => 'account', 'label' => 'Mi cuenta', @@ -306,6 +312,7 @@ class MenuSeeder extends Seeder ]; $desfileMenuCodes = [ 'adminapp.desfile.entradas', + 'adminapp.desfile.reservas', ]; $onTicketMenuCodes = [ 'event.index', diff --git a/tests/Feature/Forms/AdminAppDesfileEntryReservationFormControllerTest.php b/tests/Feature/Forms/AdminAppDesfileEntryReservationFormControllerTest.php new file mode 100644 index 0000000..ec818cc --- /dev/null +++ b/tests/Feature/Forms/AdminAppDesfileEntryReservationFormControllerTest.php @@ -0,0 +1,85 @@ +seed(AuthorizationSeeder::class); + } + + public function test_authentication_is_required(): void + { + $this->getJson('/api/v1/adminapp/forms/desfile/entry-reservation') + ->assertUnauthorized(); + } + + public function test_the_tenant_must_have_the_reservations_menu(): void + { + $tenant = $this->createTenant('without_reservations'); + Sanctum::actingAs($this->createAdminAppUser($tenant)); + + $this->getJson('/api/v1/adminapp/forms/desfile/entry-reservation') + ->assertNotFound(); + } + + public function test_it_only_returns_the_available_payment_types(): void + { + $tenant = $this->createTenant('desfile_pura_tendencia'); + $this->grantReservationsMenu($tenant); + Sanctum::actingAs($this->createAdminAppUser($tenant)); + + $this->getJson('/api/v1/adminapp/forms/desfile/entry-reservation') + ->assertOk() + ->assertExactJson([ + 'data' => [ + 'payment_types' => [ + ['value' => 'sin_cargo', 'label' => 'Sin cargo'], + ['value' => 'otro_metodo', 'label' => 'Otro método'], + ], + ], + ]); + } + + private function createTenant(string $code): Tenant + { + return Tenant::query()->create([ + 'codigo' => $code, + 'nombre' => str($code)->headline(), + 'dominio' => "{$code}.test", + ]); + } + + private function createAdminAppUser(Tenant $tenant): User + { + return User::factory()->create([ + 'rol_codigo' => RoleCode::AdminApp->value, + 'tenant_codigo' => $tenant->codigo, + ]); + } + + private function grantReservationsMenu(Tenant $tenant): void + { + $menu = Menu::query()->create([ + 'code' => 'adminapp.desfile.reservas', + 'label' => 'Reserva de Tickets', + 'route' => '/admin/desfile/reservas', + ]); + + $tenant->menues()->attach($menu->code); + } +}