From 708037677a3d50688f72fc8df7b628930664689d Mon Sep 17 00:00:00 2001 From: ncoronel Date: Wed, 16 Sep 2026 10:08:39 -0300 Subject: [PATCH] feat(entry): add validation for single non-replaced variant in EntryResource and update tests --- .../Resources/EntryResource.php | 22 +++++++++++++++---- .../Services/EntryService.php | 1 + .../EntryResourceTest.php | 4 ++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/Domains/FiestaFutbolInfantil/Resources/EntryResource.php b/app/Domains/FiestaFutbolInfantil/Resources/EntryResource.php index 8df1b7b..9e32742 100644 --- a/app/Domains/FiestaFutbolInfantil/Resources/EntryResource.php +++ b/app/Domains/FiestaFutbolInfantil/Resources/EntryResource.php @@ -5,6 +5,7 @@ namespace App\Domains\FiestaFutbolInfantil\Resources; use App\Domains\Catalog\Models\CatalogItem; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Validation\ValidationException; /** @mixin CatalogItem */ class EntryResource extends JsonResource @@ -12,14 +13,27 @@ class EntryResource extends JsonResource /** @return array */ public function toArray(Request $request): array { + $variants = $this->variants->whereNull('replaced_by_variant_id'); + + if ($variants->count() !== 1) { + throw ValidationException::withMessages([ + 'entries' => [sprintf( + 'La entrada %s tiene %d variantes sin reemplazar (IDs: %s). Se esperaba una.', + $this->id, + $variants->count(), + $variants->pluck('id')->implode(', '), + )], + ]); + } + + $variant = $variants->first(); + return [ 'id' => $this->id, 'title' => $this->nombre, 'description' => $this->descripcion, - 'variants' => $this->variants - ->whereNull('replaced_by_variant_id') - ->values() - ->toArray(), + 'event_date_ids' => $variant->selectedEventDates()->pluck('id')->values(), + 'stock' => $variant->inventory->real_stock, 'price' => $this->precio, ]; } diff --git a/app/Domains/FiestaFutbolInfantil/Services/EntryService.php b/app/Domains/FiestaFutbolInfantil/Services/EntryService.php index eed5231..c8811c8 100644 --- a/app/Domains/FiestaFutbolInfantil/Services/EntryService.php +++ b/app/Domains/FiestaFutbolInfantil/Services/EntryService.php @@ -25,6 +25,7 @@ class EntryService ->where('tenant_code', $tenant->codigo) ->whereHas('category', fn ($query) => $query->where('nombre', 'Entradas')) ->with([ + 'variants' => fn ($query) => $query->whereNull('replaced_by_variant_id'), 'variants.inventory', 'variants.eventDate', 'variants.eventDates', diff --git a/tests/Unit/FiestaFutbolInfantil/EntryResourceTest.php b/tests/Unit/FiestaFutbolInfantil/EntryResourceTest.php index 6f71b8a..3bbf8d1 100644 --- a/tests/Unit/FiestaFutbolInfantil/EntryResourceTest.php +++ b/tests/Unit/FiestaFutbolInfantil/EntryResourceTest.php @@ -8,7 +8,7 @@ use App\Domains\Catalog\Models\Variant; use App\Domains\Event\Models\EventDate; use App\Domains\FiestaFutbolInfantil\Resources\EntryResource; use Illuminate\Http\Request; -use Illuminate\Support\MultipleItemsFoundException; +use Illuminate\Validation\ValidationException; use Tests\TestCase; class EntryResourceTest extends TestCase @@ -38,7 +38,7 @@ class EntryResourceTest extends TestCase $entry = new CatalogItem; $entry->setRelation('variants', collect([new Variant, new Variant])); - $this->expectException(MultipleItemsFoundException::class); + $this->expectException(ValidationException::class); (new EntryResource($entry))->resolve(Request::create('/')); }