feat(tickets): enhance AdminAppTicketResource and service with purchase details and update tests

This commit is contained in:
2026-08-28 16:05:56 -03:00
parent 1ec7ab3e35
commit 0f6f39cce7
3 changed files with 57 additions and 1 deletions

View File

@@ -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<string, mixed> */
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 list<array{
* code: string,

View File

@@ -20,7 +20,9 @@ class AdminAppTicketService
...TicketValidityResolver::RELATIONS,
...TicketPresentationResolver::RELATIONS,
'user',
'scannerUser',
'sourceCatalogItem.category',
'sourcePurchase.items',
])
->orderByDesc('id')
->paginateFromRequest()

View File

@@ -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')