diff --git a/app/Domains/Forms/Controllers/AdminApp/EntryFormController.php b/app/Domains/Forms/Controllers/AdminApp/EntryFormController.php new file mode 100644 index 0000000..518425e --- /dev/null +++ b/app/Domains/Forms/Controllers/AdminApp/EntryFormController.php @@ -0,0 +1,22 @@ +entryFormService->get( + $request->user('sanctum')->tenant()->firstOrFail() + ) + ); + } +} diff --git a/app/Domains/Forms/Resources/EntryFormResource.php b/app/Domains/Forms/Resources/EntryFormResource.php new file mode 100644 index 0000000..87f2bef --- /dev/null +++ b/app/Domains/Forms/Resources/EntryFormResource.php @@ -0,0 +1,26 @@ + */ + public function toArray(Request $request): array + { + return [ + 'event_dates' => $this->resource['event_dates']->map( + fn (EventDate $eventDate): array => [ + 'id' => $eventDate->id, + 'validity_time_id' => $eventDate->validity_time_id, + 'validity_time' => ValidityTimeResource::make($eventDate->validityTime), + 'date' => $eventDate->date->format('Y-m-d'), + ] + )->values(), + ]; + } +} diff --git a/app/Domains/Forms/Services/EntryFormService.php b/app/Domains/Forms/Services/EntryFormService.php new file mode 100644 index 0000000..33311dc --- /dev/null +++ b/app/Domains/Forms/Services/EntryFormService.php @@ -0,0 +1,22 @@ +} */ + public function get(Tenant $tenant): array + { + return [ + 'event_dates' => $tenant->eventDates() + ->whereNull('rescheduled_to_event_date_id') + ->whereNull('suspended_at') + ->with('validityTime') + ->get(), + ]; + } +} diff --git a/app/Domains/Forms/routes/adminapp.php b/app/Domains/Forms/routes/adminapp.php index 70f9ee3..93c41e5 100644 --- a/app/Domains/Forms/routes/adminapp.php +++ b/app/Domains/Forms/routes/adminapp.php @@ -1,5 +1,6 @@ seed(AuthorizationSeeder::class); + WebsiteType::query()->create(['codigo' => 'onticket', 'nombre' => 'OnTicket']); + } + + public function test_authentication_is_required(): void + { + $this->getJson('/api/v1/adminapp/forms/fiesta-futbol-infantil/entry') + ->assertUnauthorized(); + } + + public function test_it_returns_only_selectable_event_dates_for_the_tenant(): void + { + $tenant = $this->createTenant('fiesta'); + $otherTenant = $this->createTenant('other'); + $available = $this->createEventDate($tenant, '2026-10-09'); + $rescheduled = $this->createEventDate($tenant, '2026-10-10'); + $replacement = $this->createEventDate($tenant, '2026-10-11'); + $rescheduled->update(['rescheduled_to_event_date_id' => $replacement->id]); + $this->createEventDate($tenant, '2026-10-12', ['suspended_at' => now()]); + $this->createEventDate($otherTenant, '2026-10-13'); + + Sanctum::actingAs(User::factory()->create([ + 'rol_codigo' => RoleCode::AdminApp->value, + 'tenant_codigo' => $tenant->codigo, + ])); + + $this->getJson('/api/v1/adminapp/forms/fiesta-futbol-infantil/entry') + ->assertOk() + ->assertJsonCount(2, 'data.event_dates') + ->assertJsonFragment(['id' => $available->id, 'date' => '2026-10-09']) + ->assertJsonFragment(['id' => $replacement->id, 'date' => '2026-10-11']) + ->assertJsonMissing(['date' => '2026-10-10']) + ->assertJsonMissing(['date' => '2026-10-12']) + ->assertJsonMissing(['date' => '2026-10-13']); + } + + private function createTenant(string $code): Tenant + { + return Tenant::query()->create([ + 'codigo' => $code, + 'nombre' => ucfirst($code), + 'dominio' => "{$code}.test", + 'website_type_code' => 'onticket', + ]); + } + + /** @param array $overrides */ + private function createEventDate( + Tenant $tenant, + string $date, + array $overrides = [] + ): EventDate { + return $tenant->eventDates()->create([ + 'date' => $date, + 'time_start' => '00:00', + 'time_end' => '23:59', + ...$overrides, + ]); + } +}