feat(scanner): implement category validation for AdminApp role and update tests
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
namespace App\Domains\Ticket\Services;
|
namespace App\Domains\Ticket\Services;
|
||||||
|
|
||||||
use App\Domains\Auth\Models\User;
|
use App\Domains\Auth\Models\User;
|
||||||
|
use App\Domains\Authorization\Enums\RoleCode;
|
||||||
use App\Domains\Ticket\Models\Ticket;
|
use App\Domains\Ticket\Models\Ticket;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
@@ -73,7 +74,7 @@ class ScannerTicketService
|
|||||||
->where('tenant_code', $scanner->tenant_codigo)
|
->where('tenant_code', $scanner->tenant_codigo)
|
||||||
->where('ticket', $ticketUuid);
|
->where('ticket', $ticketUuid);
|
||||||
|
|
||||||
if ($scanner->tenant()->firstOrFail()->requiresScannerCategoryValidation()) {
|
if ($this->requiresCategoryValidation($scanner)) {
|
||||||
$categoryIds = $this->scannerCategoryIds($scanner);
|
$categoryIds = $this->scannerCategoryIds($scanner);
|
||||||
|
|
||||||
$query->where(function (Builder $query) use ($scanner, $categoryIds): void {
|
$query->where(function (Builder $query) use ($scanner, $categoryIds): void {
|
||||||
@@ -158,7 +159,7 @@ class ScannerTicketService
|
|||||||
|
|
||||||
private function scannerCanScan(User $scanner, Ticket $ticket): bool
|
private function scannerCanScan(User $scanner, Ticket $ticket): bool
|
||||||
{
|
{
|
||||||
if (! $scanner->tenant()->firstOrFail()->requiresScannerCategoryValidation()) {
|
if (! $this->requiresCategoryValidation($scanner)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,4 +170,10 @@ class ScannerTicketService
|
|||||||
->where('categorias.id', $categoryId)
|
->where('categorias.id', $categoryId)
|
||||||
->exists();
|
->exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function requiresCategoryValidation(User $scanner): bool
|
||||||
|
{
|
||||||
|
return $scanner->rol_codigo !== RoleCode::AdminApp->value
|
||||||
|
&& $scanner->tenant()->firstOrFail()->requiresScannerCategoryValidation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class ScannerTicketControllerTest extends TestCase
|
|||||||
$this->getJson('/api/v1/scanner/tickets')->assertUnauthorized();
|
$this->getJson('/api/v1/scanner/tickets')->assertUnauthorized();
|
||||||
|
|
||||||
Sanctum::actingAs(User::factory()->create([
|
Sanctum::actingAs(User::factory()->create([
|
||||||
'rol_codigo' => RoleCode::AdminApp->value,
|
'rol_codigo' => RoleCode::User->value,
|
||||||
'tenant_codigo' => $this->tenant->codigo,
|
'tenant_codigo' => $this->tenant->codigo,
|
||||||
]));
|
]));
|
||||||
|
|
||||||
@@ -300,6 +300,45 @@ class ScannerTicketControllerTest extends TestCase
|
|||||||
->assertNotFound();
|
->assertNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_adminapp_can_read_and_scan_all_tenant_categories_without_assignments(): void
|
||||||
|
{
|
||||||
|
$this->tenant->update(['scanner_category_validation_enabled' => true]);
|
||||||
|
$admin = User::factory()->create([
|
||||||
|
'rol_codigo' => RoleCode::AdminApp->value,
|
||||||
|
'tenant_codigo' => $this->tenant->codigo,
|
||||||
|
]);
|
||||||
|
$this->assertCount(0, $admin->scanCategories);
|
||||||
|
$otherCategory = Category::query()->create([
|
||||||
|
'tenant_code' => $this->tenant->codigo, 'nombre' => 'Comidas',
|
||||||
|
]);
|
||||||
|
Sanctum::actingAs($admin);
|
||||||
|
foreach ([$this->category, $otherCategory] as $category) {
|
||||||
|
$ticket = $this->createTicket((string) Str::uuid(), [], $category);
|
||||||
|
$this->getJson("/api/v1/scanner/tickets/{$ticket->ticket}")->assertOk();
|
||||||
|
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")
|
||||||
|
->assertOk()->assertJsonPath('data.scanner_user_id', $admin->id);
|
||||||
|
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")
|
||||||
|
->assertUnprocessable()->assertJsonValidationErrors('ticket');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_adminapp_cannot_read_or_scan_another_tenants_ticket(): void
|
||||||
|
{
|
||||||
|
$admin = User::factory()->create([
|
||||||
|
'rol_codigo' => RoleCode::AdminApp->value,
|
||||||
|
'tenant_codigo' => $this->tenant->codigo,
|
||||||
|
]);
|
||||||
|
$foreignTenant = $this->createTenant('foreign');
|
||||||
|
$foreignCategory = Category::query()->create([
|
||||||
|
'tenant_code' => $foreignTenant->codigo, 'nombre' => 'Externas',
|
||||||
|
]);
|
||||||
|
$ticket = $this->createTicket((string) Str::uuid(), [], $foreignCategory, $foreignTenant);
|
||||||
|
Sanctum::actingAs($admin);
|
||||||
|
$this->getJson("/api/v1/scanner/tickets/{$ticket->ticket}")->assertNotFound();
|
||||||
|
$this->postJson("/api/v1/scanner/tickets/{$ticket->ticket}/scan")->assertNotFound();
|
||||||
|
$this->assertNull($ticket->fresh()->used_at);
|
||||||
|
}
|
||||||
|
|
||||||
/** @param array<string, mixed> $attributes */
|
/** @param array<string, mixed> $attributes */
|
||||||
private function createTicket(
|
private function createTicket(
|
||||||
string $uuid,
|
string $uuid,
|
||||||
|
|||||||
Reference in New Issue
Block a user