feat(ticket): add action capability helpers and expose them in admin resource

This commit is contained in:
2026-09-11 09:25:19 -03:00
parent 5d00dc439e
commit 2ddb046c26
4 changed files with 77 additions and 4 deletions

View File

@@ -150,6 +150,51 @@ class Ticket extends Model
return $this->allow_refund();
}
public function is_active(): bool
{
return $this->status === self::STATUS_ACTIVE;
}
public function isActive(): bool
{
return $this->is_active();
}
public function getIsActiveAttribute(): bool
{
return $this->is_active();
}
public function can_cancel(): bool
{
return $this->is_active();
}
public function canCancel(): bool
{
return $this->can_cancel();
}
public function getCanCancelAttribute(): bool
{
return $this->can_cancel();
}
public function can_refund(): bool
{
return $this->is_active() && $this->allow_refund();
}
public function canRefund(): bool
{
return $this->can_refund();
}
public function getCanRefundAttribute(): bool
{
return $this->can_refund();
}
/** @return BelongsTo<User, $this> */
public function user(): BelongsTo
{

View File

@@ -20,6 +20,9 @@ class AdminAppTicketResource extends TicketResource
...parent::toArray($request),
...$details,
'allow_refund' => $this->resource->allow_refund(),
'is_active' => $this->resource->is_active(),
'can_cancel' => $this->resource->can_cancel(),
'can_refund' => $this->resource->can_refund(),
'values' => $rowService->values($this->resource, $details),
];
}

View File

@@ -74,6 +74,9 @@ class AdminAppTicketControllerTest extends TestCase
->assertJsonPath('data.0.values.status', Ticket::STATUS_ACTIVE)
->assertJsonPath('data.0.status_label', 'Activo')
->assertJsonPath('data.0.allow_refund', false)
->assertJsonPath('data.0.is_active', true)
->assertJsonPath('data.0.can_cancel', true)
->assertJsonPath('data.0.can_refund', false)
->assertJsonMissingPath('data.0.values.ticket')
->assertJsonPath('data.0.values.date', '-')
->assertJsonPath('data.0.values.size', '-')
@@ -93,13 +96,15 @@ class AdminAppTicketControllerTest extends TestCase
// Default: neither total nor partial refund allowed
$this->getJson('/api/v1/adminapp/tenant/tickets')
->assertOk()
->assertJsonPath('data.0.allow_refund', false);
->assertJsonPath('data.0.allow_refund', false)
->assertJsonPath('data.0.can_refund', false);
// Total refund allowed
$tenant->update(['allow_ticket_total_refund' => true]);
$this->getJson('/api/v1/adminapp/tenant/tickets')
->assertOk()
->assertJsonPath('data.0.allow_refund', true);
->assertJsonPath('data.0.allow_refund', true)
->assertJsonPath('data.0.can_refund', true);
// Partial refund allowed with percentage set
$tenant->update([
@@ -109,7 +114,8 @@ class AdminAppTicketControllerTest extends TestCase
]);
$this->getJson('/api/v1/adminapp/tenant/tickets')
->assertOk()
->assertJsonPath('data.0.allow_refund', true);
->assertJsonPath('data.0.allow_refund', true)
->assertJsonPath('data.0.can_refund', true);
// Partial refund enabled but percentage is 0
$tenant->update([
@@ -117,7 +123,8 @@ class AdminAppTicketControllerTest extends TestCase
]);
$this->getJson('/api/v1/adminapp/tenant/tickets')
->assertOk()
->assertJsonPath('data.0.allow_refund', false);
->assertJsonPath('data.0.allow_refund', false)
->assertJsonPath('data.0.can_refund', false);
}
public function test_it_cancels_a_ticket_from_the_authenticated_tenant(): void

View File

@@ -64,6 +64,24 @@ class TicketTest extends TestCase
$this->assertSame(Ticket::STATUS_ACTIVE, $ticket->status);
}
public function test_it_exposes_admin_action_capabilities(): void
{
$tenant = new Tenant([
'allow_ticket_total_refund' => true,
]);
$active = (new Ticket)->setRelation('tenant', $tenant);
$this->assertTrue($active->is_active());
$this->assertTrue($active->can_cancel());
$this->assertTrue($active->can_refund());
$active->used_at = now();
$this->assertFalse($active->is_active());
$this->assertFalse($active->can_cancel());
$this->assertFalse($active->can_refund());
}
public function test_fixed_window_controls_ticket_validity(): void
{
Carbon::setTestNow('2026-07-21 10:00:00');