From 0f6f39cce716fe3c5de84696aa88c19d71dd31fb Mon Sep 17 00:00:00 2001 From: ncoronel Date: Fri, 28 Aug 2026 16:05:56 -0300 Subject: [PATCH] feat(tickets): enhance AdminAppTicketResource and service with purchase details and update tests --- .../AdminApp/AdminAppTicketResource.php | 25 +++++++++++++++ .../Ticket/Services/AdminAppTicketService.php | 2 ++ .../Ticket/AdminAppTicketControllerTest.php | 31 ++++++++++++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/app/Domains/Ticket/Resources/AdminApp/AdminAppTicketResource.php b/app/Domains/Ticket/Resources/AdminApp/AdminAppTicketResource.php index 8a7b9e2..14ffd08 100644 --- a/app/Domains/Ticket/Resources/AdminApp/AdminAppTicketResource.php +++ b/app/Domains/Ticket/Resources/AdminApp/AdminAppTicketResource.php @@ -3,6 +3,7 @@ namespace App\Domains\Ticket\Resources\AdminApp; use App\Domains\Catalog\Models\ItemAttribute; +use App\Domains\Purchase\Models\PurchaseItem; use App\Domains\Ticket\Models\Ticket; use App\Domains\Ticket\Resources\TicketResource; use Illuminate\Http\Request; @@ -13,12 +14,36 @@ class AdminAppTicketResource extends TicketResource /** @return array */ public function toArray(Request $request): array { + $purchaseItem = $this->sourcePurchaseItem(); + return [ ...parent::toArray($request), + 'source_purchase_id' => $this->source_purchase_id, + 'order_number' => $this->source_purchase_id, + 'product' => $purchaseItem?->item_nombre + ?? $this->sourceCatalogItem?->nombre + ?? $this->name, + 'amount' => $purchaseItem?->precio_unitario, + 'client' => $this->sourcePurchase?->nombre_apellido ?? $this->user?->nombre_apellido, + 'date' => $this->sourcePurchase?->created_at, + 'status' => $this->status, + 'scanned_by' => $this->scannerUser?->nombre_apellido, 'variant_properties' => $this->variantProperties(), ]; } + private function sourcePurchaseItem(): ?PurchaseItem + { + return $this->sourcePurchase?->items->first(function (PurchaseItem $item): bool { + if ($this->source_variant_id !== null) { + return $item->source_variant_id === $this->source_variant_id; + } + + return $item->source_catalog_item_id === $this->source_catalog_item_id + && $item->source_variant_id === null; + }); + } + /** * @return listorderByDesc('id') ->paginateFromRequest() diff --git a/tests/Feature/Ticket/AdminAppTicketControllerTest.php b/tests/Feature/Ticket/AdminAppTicketControllerTest.php index c8da04b..15f867f 100644 --- a/tests/Feature/Ticket/AdminAppTicketControllerTest.php +++ b/tests/Feature/Ticket/AdminAppTicketControllerTest.php @@ -11,6 +11,8 @@ use App\Domains\Catalog\Models\CatalogItem; use App\Domains\Catalog\Models\Inventory; use App\Domains\Catalog\Models\Variant; use App\Domains\Menu\Models\Menu; +use App\Domains\Purchase\Models\Purchase; +use App\Domains\Purchase\Models\PurchaseItem; use App\Domains\Shared\Enums\FieldType; use App\Domains\Tenant\Models\Tenant; use App\Domains\Tenant\Models\WebsiteType; @@ -145,14 +147,41 @@ class AdminAppTicketControllerTest extends TestCase 'item_attribute_id' => $itemAttribute->id, 'value' => 'xl', ]); - $ticket = $this->createTicket($tenant, $admin, [ + $purchase = Purchase::query()->create([ + 'tenant_codigo' => $tenant->codigo, + 'user_id' => $admin->id, + 'status' => Purchase::STATUS_PAID, + 'nombre_apellido' => 'Nombre Apellido', + 'total' => '8000.00', + ]); + PurchaseItem::query()->create([ + 'compra_id' => $purchase->id, 'source_catalog_item_id' => $item->id, 'source_variant_id' => $variant->id, + 'nombre' => 'Remera', + 'descripcion' => '', + 'slug' => 'remera', + 'item_nombre' => 'Remera', + 'cantidad' => 1, + 'precio_unitario' => '8000.00', + 'total' => '8000.00', + ]); + $ticket = $this->createTicket($tenant, $admin, [ + 'source_purchase_id' => $purchase->id, + 'source_catalog_item_id' => $item->id, + 'source_variant_id' => $variant->id, + 'scanner_user_id' => $admin->id, + 'used_at' => now(), ]); $this->getJson('/api/v1/adminapp/tenant/tickets') ->assertOk() ->assertJsonPath('data.0.id', $ticket->id) + ->assertJsonPath('data.0.order_number', $purchase->id) + ->assertJsonPath('data.0.product', 'Remera') + ->assertJsonPath('data.0.amount', '8000.00') + ->assertJsonPath('data.0.status', Ticket::STATUS_USED) + ->assertJsonPath('data.0.scanned_by', $admin->nombre_apellido) ->assertJsonPath('data.0.variant_properties.0.code', 'size') ->assertJsonPath('data.0.variant_properties.0.label', 'Talle') ->assertJsonPath('data.0.variant_properties.0.values.0.value', 'xl')