From e17d1fa15e47fbcdb8eafce39bd7d4e688efac43 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Wed, 5 Aug 2026 09:17:09 -0300 Subject: [PATCH] feat: Add scanner user association to tickets; update Ticket model, resource, migration, and tests --- app/Domains/Ticket/Models/Ticket.php | 8 ++++++ .../Ticket/Resources/TicketResource.php | 1 + ...0_add_scanner_user_id_to_tickets_table.php | 27 +++++++++++++++++++ tests/Unit/Ticket/TicketTest.php | 3 +++ 4 files changed, 39 insertions(+) create mode 100644 database/migrations/2026_08_04_000400_add_scanner_user_id_to_tickets_table.php diff --git a/app/Domains/Ticket/Models/Ticket.php b/app/Domains/Ticket/Models/Ticket.php index 7d5e242..7d937bc 100644 --- a/app/Domains/Ticket/Models/Ticket.php +++ b/app/Domains/Ticket/Models/Ticket.php @@ -24,6 +24,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; 'starts_at', 'expires_at', 'used_at', + 'scanner_user_id', 'user_id', ])] class Ticket extends Model @@ -47,6 +48,7 @@ class Ticket extends Model 'starts_at' => 'datetime', 'expires_at' => 'datetime', 'used_at' => 'datetime', + 'scanner_user_id' => 'integer', 'user_id' => 'integer', ]; } @@ -63,6 +65,12 @@ class Ticket extends Model return $this->belongsTo(User::class); } + /** @return BelongsTo */ + public function scannerUser(): BelongsTo + { + return $this->belongsTo(User::class, 'scanner_user_id'); + } + /** @return BelongsTo */ public function sourcePurchase(): BelongsTo { diff --git a/app/Domains/Ticket/Resources/TicketResource.php b/app/Domains/Ticket/Resources/TicketResource.php index d19aa4b..a8d7714 100644 --- a/app/Domains/Ticket/Resources/TicketResource.php +++ b/app/Domains/Ticket/Resources/TicketResource.php @@ -23,6 +23,7 @@ class TicketResource extends JsonResource 'starts_at' => $this->getEffectiveStartsAt(), 'expires_at' => $this->getEffectiveExpiresAt(), 'used_at' => $this->used_at, + 'scanner_user_id' => $this->scanner_user_id, 'is_valid' => $this->is_valid, 'is_expired' => $this->is_expired, 'is_used' => $this->is_used, diff --git a/database/migrations/2026_08_04_000400_add_scanner_user_id_to_tickets_table.php b/database/migrations/2026_08_04_000400_add_scanner_user_id_to_tickets_table.php new file mode 100644 index 0000000..73e01ab --- /dev/null +++ b/database/migrations/2026_08_04_000400_add_scanner_user_id_to_tickets_table.php @@ -0,0 +1,27 @@ +foreignId('scanner_user_id') + ->nullable() + ->after('used_at') + ->constrained('users') + ->cascadeOnUpdate() + ->nullOnDelete(); + }); + } + + public function down(): void + { + Schema::table('tickets', function (Blueprint $table): void { + $table->dropConstrainedForeignId('scanner_user_id'); + }); + } +}; diff --git a/tests/Unit/Ticket/TicketTest.php b/tests/Unit/Ticket/TicketTest.php index 763e360..d4a3958 100644 --- a/tests/Unit/Ticket/TicketTest.php +++ b/tests/Unit/Ticket/TicketTest.php @@ -29,6 +29,7 @@ class TicketTest extends TestCase 'starts_at' => '2026-07-21 10:00:00', 'expires_at' => '2026-07-22 10:00:00', 'used_at' => null, + 'scanner_user_id' => '15', 'user_id' => '10', ]); @@ -39,9 +40,11 @@ class TicketTest extends TestCase $this->assertInstanceOf(Carbon::class, $ticket->starts_at); $this->assertInstanceOf(Carbon::class, $ticket->expires_at); $this->assertNull($ticket->used_at); + $this->assertSame(15, $ticket->scanner_user_id); $this->assertSame(10, $ticket->user_id); $this->assertInstanceOf(Tenant::class, $ticket->tenant()->getRelated()); $this->assertInstanceOf(User::class, $ticket->user()->getRelated()); + $this->assertInstanceOf(User::class, $ticket->scannerUser()->getRelated()); $this->assertInstanceOf(CatalogItem::class, $ticket->sourceCatalogItem()->getRelated()); $this->assertInstanceOf(Variant::class, $ticket->sourceVariant()->getRelated()); }