From ca605127d0b4e4a12580e5be6def64eb24bcb3b8 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Mon, 10 Aug 2026 10:04:57 -0300 Subject: [PATCH] feat: implement index methods for Accommodation, Entry, Food, and Merchandise controllers; add service methods for fetching current items --- .../Controllers/AccommodationController.php | 8 ++++++++ .../Controllers/EntryController.php | 9 +++++++++ .../Controllers/FoodController.php | 8 ++++++++ .../Controllers/MerchandiseController.php | 9 +++++++++ .../Services/AccommodationService.php | 14 ++++++++++++++ .../Services/EntryService.php | 15 +++++++++++++++ .../Services/FoodService.php | 15 +++++++++++++++ .../Services/MerchandiseService.php | 17 +++++++++++++++++ app/Domains/FiestaFutbolInfantil/routes/api.php | 12 ++++++++++++ .../AccommodationControllerTest.php | 7 +++++++ .../EntryControllerTest.php | 7 +++++++ .../FiestaFutbolInfantil/FoodControllerTest.php | 7 +++++++ .../MerchandiseControllerTest.php | 8 ++++++++ 13 files changed, 136 insertions(+) diff --git a/app/Domains/FiestaFutbolInfantil/Controllers/AccommodationController.php b/app/Domains/FiestaFutbolInfantil/Controllers/AccommodationController.php index b3aab5e..d99b14d 100644 --- a/app/Domains/FiestaFutbolInfantil/Controllers/AccommodationController.php +++ b/app/Domains/FiestaFutbolInfantil/Controllers/AccommodationController.php @@ -6,11 +6,19 @@ use App\Domains\FiestaFutbolInfantil\Requests\UpsertAccommodationVariantsRequest use App\Domains\FiestaFutbolInfantil\Resources\AccommodationResource; use App\Domains\FiestaFutbolInfantil\Services\AccommodationService; use App\Http\Controllers\Controller; +use Illuminate\Http\Request; class AccommodationController extends Controller { public function __construct(private readonly AccommodationService $accommodationService) {} + public function index(Request $request): AccommodationResource + { + return AccommodationResource::make( + $this->accommodationService->current($request->user()->tenant()->firstOrFail()) + ); + } + public function store(UpsertAccommodationVariantsRequest $request): AccommodationResource { $tenant = $request->user()->tenant()->firstOrFail(); diff --git a/app/Domains/FiestaFutbolInfantil/Controllers/EntryController.php b/app/Domains/FiestaFutbolInfantil/Controllers/EntryController.php index d7aec23..5fde9ac 100644 --- a/app/Domains/FiestaFutbolInfantil/Controllers/EntryController.php +++ b/app/Domains/FiestaFutbolInfantil/Controllers/EntryController.php @@ -7,11 +7,20 @@ use App\Domains\FiestaFutbolInfantil\Resources\EntryResource; use App\Domains\FiestaFutbolInfantil\Services\EntryService; use App\Http\Controllers\Controller; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Illuminate\Http\Resources\Json\AnonymousResourceCollection; class EntryController extends Controller { public function __construct(private readonly EntryService $entryService) {} + public function index(Request $request): AnonymousResourceCollection + { + return EntryResource::collection( + $this->entryService->all($request->user()->tenant()->firstOrFail()) + ); + } + public function store(UpsertEntriesRequest $request): JsonResponse { $tenant = $request->user()->tenant()->firstOrFail(); diff --git a/app/Domains/FiestaFutbolInfantil/Controllers/FoodController.php b/app/Domains/FiestaFutbolInfantil/Controllers/FoodController.php index c9b0513..396656a 100644 --- a/app/Domains/FiestaFutbolInfantil/Controllers/FoodController.php +++ b/app/Domains/FiestaFutbolInfantil/Controllers/FoodController.php @@ -6,11 +6,19 @@ use App\Domains\FiestaFutbolInfantil\Requests\UpsertFoodVariantsRequest; use App\Domains\FiestaFutbolInfantil\Resources\FoodResource; use App\Domains\FiestaFutbolInfantil\Services\FoodService; use App\Http\Controllers\Controller; +use Illuminate\Http\Request; class FoodController extends Controller { public function __construct(private readonly FoodService $foodService) {} + public function index(Request $request): FoodResource + { + return FoodResource::make( + $this->foodService->current($request->user()->tenant()->firstOrFail()) + ); + } + public function store(UpsertFoodVariantsRequest $request): FoodResource { $tenant = $request->user()->tenant()->firstOrFail(); diff --git a/app/Domains/FiestaFutbolInfantil/Controllers/MerchandiseController.php b/app/Domains/FiestaFutbolInfantil/Controllers/MerchandiseController.php index 0ad55d2..a55d454 100644 --- a/app/Domains/FiestaFutbolInfantil/Controllers/MerchandiseController.php +++ b/app/Domains/FiestaFutbolInfantil/Controllers/MerchandiseController.php @@ -7,11 +7,20 @@ use App\Domains\FiestaFutbolInfantil\Resources\MerchandiseResource; use App\Domains\FiestaFutbolInfantil\Services\MerchandiseService; use App\Http\Controllers\Controller; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Illuminate\Http\Resources\Json\AnonymousResourceCollection; class MerchandiseController extends Controller { public function __construct(private readonly MerchandiseService $merchandiseService) {} + public function index(Request $request): AnonymousResourceCollection + { + return MerchandiseResource::collection( + $this->merchandiseService->all($request->user()->tenant()->firstOrFail()) + ); + } + public function store(UpsertMerchandiseRequest $request): JsonResponse { $tenant = $request->user()->tenant()->firstOrFail(); diff --git a/app/Domains/FiestaFutbolInfantil/Services/AccommodationService.php b/app/Domains/FiestaFutbolInfantil/Services/AccommodationService.php index 979280c..394312f 100644 --- a/app/Domains/FiestaFutbolInfantil/Services/AccommodationService.php +++ b/app/Domains/FiestaFutbolInfantil/Services/AccommodationService.php @@ -20,6 +20,20 @@ class AccommodationService { private const ATTRIBUTE_CODE = 'tipo_alojamiento'; + public function current(Tenant $tenant): CatalogItem + { + return CatalogItem::query() + ->where('tenant_code', $tenant->codigo) + ->where('slug', 'alojamiento') + ->with([ + 'itemAttributes.attribute.options', + 'variants.catalogItem', + 'variants.inventory', + 'variants.definitions', + ]) + ->firstOrFail(); + } + /** * @param array> $variants */ diff --git a/app/Domains/FiestaFutbolInfantil/Services/EntryService.php b/app/Domains/FiestaFutbolInfantil/Services/EntryService.php index 3c16a34..f3dae96 100644 --- a/app/Domains/FiestaFutbolInfantil/Services/EntryService.php +++ b/app/Domains/FiestaFutbolInfantil/Services/EntryService.php @@ -19,6 +19,21 @@ class EntryService { public function __construct(private readonly CatalogService $catalogService) {} + /** @return Collection */ + public function all(Tenant $tenant): Collection + { + return CatalogItem::query() + ->where('tenant_code', $tenant->codigo) + ->where('event_product_type', EventProductType::Entry->value) + ->with([ + 'variants.inventory', + 'variants.eventDate', + 'variants.eventDates', + ]) + ->orderBy('id') + ->get(); + } + /** * @param array> $entries * @return Collection diff --git a/app/Domains/FiestaFutbolInfantil/Services/FoodService.php b/app/Domains/FiestaFutbolInfantil/Services/FoodService.php index 1dc1177..13aef1a 100644 --- a/app/Domains/FiestaFutbolInfantil/Services/FoodService.php +++ b/app/Domains/FiestaFutbolInfantil/Services/FoodService.php @@ -20,6 +20,21 @@ class FoodService { private const ATTRIBUTE_CODES = ['event_date', 'horario', 'servicio']; + public function current(Tenant $tenant): CatalogItem + { + return CatalogItem::query() + ->where('tenant_code', $tenant->codigo) + ->where('slug', 'comida') + ->with([ + 'variants.catalogItem', + 'variants.inventory', + 'variants.eventDate', + 'variants.eventDates', + 'variants.definitions.itemAttribute.attribute', + ]) + ->firstOrFail(); + } + /** * @param array> $variants */ diff --git a/app/Domains/FiestaFutbolInfantil/Services/MerchandiseService.php b/app/Domains/FiestaFutbolInfantil/Services/MerchandiseService.php index 2a76944..e2ff079 100644 --- a/app/Domains/FiestaFutbolInfantil/Services/MerchandiseService.php +++ b/app/Domains/FiestaFutbolInfantil/Services/MerchandiseService.php @@ -21,6 +21,23 @@ class MerchandiseService { private const ATTRIBUTE_CODES = ['color', 'talle']; + /** @return Collection */ + public function all(Tenant $tenant): Collection + { + return CatalogItem::query() + ->where('tenant_code', $tenant->codigo) + ->where('event_product_type', EventProductType::Product->value) + ->whereHas('category', fn ($query) => $query->where('nombre', 'Merchandising')) + ->with([ + 'itemAttributes.attribute.options', + 'variants.catalogItem', + 'variants.inventory', + 'variants.definitions', + ]) + ->orderBy('id') + ->get(); + } + /** * @param array> $items * @return Collection diff --git a/app/Domains/FiestaFutbolInfantil/routes/api.php b/app/Domains/FiestaFutbolInfantil/routes/api.php index 8a9c9d6..33138dd 100644 --- a/app/Domains/FiestaFutbolInfantil/routes/api.php +++ b/app/Domains/FiestaFutbolInfantil/routes/api.php @@ -9,15 +9,27 @@ use Illuminate\Support\Facades\Route; Route::prefix('v1/adminapp/tenant') ->middleware(['auth:sanctum', 'adminapp.tenant']) ->group(function (): void { + Route::get('entries', [EntryController::class, 'index']) + ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.entradas') + ->name('adminapp.fiesta-futbol-infantil.entries.index'); Route::post('entries', [EntryController::class, 'store']) ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.entradas') ->name('adminapp.fiesta-futbol-infantil.entries.store'); + Route::get('foods', [FoodController::class, 'index']) + ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.comida') + ->name('adminapp.fiesta-futbol-infantil.foods.index'); Route::post('foods', [FoodController::class, 'store']) ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.comida') ->name('adminapp.fiesta-futbol-infantil.foods.store'); + Route::get('accommodations', [AccommodationController::class, 'index']) + ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.alojamientos') + ->name('adminapp.fiesta-futbol-infantil.accommodations.index'); Route::post('accommodations', [AccommodationController::class, 'store']) ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.alojamientos') ->name('adminapp.fiesta-futbol-infantil.accommodations.store'); + Route::get('merchandise', [MerchandiseController::class, 'index']) + ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.merchandising') + ->name('adminapp.fiesta-futbol-infantil.merchandise.index'); Route::post('merchandise', [MerchandiseController::class, 'store']) ->middleware('tenant.menu:adminapp.fiesta-futbol-infantil.merchandising') ->name('adminapp.fiesta-futbol-infantil.merchandise.store'); diff --git a/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php b/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php index 32a98db..0b2ad98 100644 --- a/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php @@ -57,6 +57,13 @@ class AccommodationControllerTest extends TestCase ->assertJsonPath('data.variants.0.stock', 25) ->assertJsonPath('data.variants.0.price', '45000.00'); + $this->getJson('/api/v1/adminapp/tenant/accommodations') + ->assertOk() + ->assertJsonPath('data.name', 'Alojamiento') + ->assertJsonCount(2, 'data.variants') + ->assertJsonPath('data.variants.0.title', 'Casa Rodante Familiar') + ->assertJsonPath('data.variants.1.title', 'Carpa'); + $this->assertDatabaseHas('attribute_options', [ 'attribute_id' => $attribute->id, 'value' => 'casa_rodante_familiar', diff --git a/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php b/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php index a95f9a5..4fcb908 100644 --- a/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php @@ -80,6 +80,13 @@ class EntryControllerTest extends TestCase ->assertJsonPath('data.1.title', 'Entrada diaria') ->assertJsonPath('data.1.price', '5000.50'); + $this->getJson('/api/v1/adminapp/tenant/entries') + ->assertOk() + ->assertJsonCount(2, 'data') + ->assertJsonPath('data.0.title', 'Abono') + ->assertJsonPath('data.0.event_date_ids', [$firstDate->id, $secondDate->id]) + ->assertJsonPath('data.1.title', 'Entrada diaria'); + $this->assertDatabaseCount('catalog_items', 2); $this->assertDatabaseCount('variantes', 2); $this->assertDatabaseCount('inventories', 2); diff --git a/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php b/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php index 056ab55..63ae5ed 100644 --- a/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php @@ -56,6 +56,13 @@ class FoodControllerTest extends TestCase ->assertJsonPath('data.variants.0.price', '10000.00') ->assertJsonPath('data.variants.1.price', '8000.00'); + $this->getJson('/api/v1/adminapp/tenant/foods') + ->assertOk() + ->assertJsonPath('data.name', 'Comida') + ->assertJsonCount(2, 'data.variants') + ->assertJsonPath('data.variants.0.schedule', 'Almuerzo') + ->assertJsonPath('data.variants.1.service', 'Vianda'); + $this->assertDatabaseCount('catalog_items', 1); $this->assertDatabaseCount('variantes', 2); $this->assertDatabaseCount('inventories', 2); diff --git a/tests/Feature/FiestaFutbolInfantil/MerchandiseControllerTest.php b/tests/Feature/FiestaFutbolInfantil/MerchandiseControllerTest.php index e33a395..d8bd320 100644 --- a/tests/Feature/FiestaFutbolInfantil/MerchandiseControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/MerchandiseControllerTest.php @@ -67,6 +67,14 @@ class MerchandiseControllerTest extends TestCase ->assertJsonPath('data.0.variants.2.color', 'Azul Marino') ->assertJsonPath('data.0.variants.2.color_value', 'azul_marino'); + $this->getJson('/api/v1/adminapp/tenant/merchandise') + ->assertOk() + ->assertJsonCount(2, 'data') + ->assertJsonPath('data.0.title', 'Camiseta') + ->assertJsonCount(3, 'data.0.variants') + ->assertJsonPath('data.1.title', 'Buzo') + ->assertJsonPath('data.1.variants.0.size', 'XL'); + $this->assertDatabaseCount('catalog_items', 2); $this->assertDatabaseCount('variantes', 4); $this->assertDatabaseCount('inventories', 4);