diff --git a/app/Domains/Auth/Resources/UserResource.php b/app/Domains/Auth/Resources/UserResource.php index 89cee51..661aa09 100644 --- a/app/Domains/Auth/Resources/UserResource.php +++ b/app/Domains/Auth/Resources/UserResource.php @@ -24,6 +24,11 @@ class UserResource extends JsonResource 'telefono' => $this->telefono, 'rol_codigo' => $this->rol_codigo, 'tenant_codigo' => $this->tenant_codigo, + 'categories' => $this->whenLoaded('scanCategories', fn () => $this->scanCategories + ->map(fn ($category) => [ + 'id' => $category->id, + 'nombre' => $category->nombre, + ])->values()), ]; } } diff --git a/app/Domains/Auth/Services/ScannerContextService.php b/app/Domains/Auth/Services/ScannerContextService.php index b4acbb3..313d0a5 100644 --- a/app/Domains/Auth/Services/ScannerContextService.php +++ b/app/Domains/Auth/Services/ScannerContextService.php @@ -19,6 +19,16 @@ class ScannerContextService $user->setRelation('tenant', $tenant); + if ($tenant->requiresScannerCategoryValidation()) { + $categories = $user->scanCategories() + ->orderBy('nombre') + ->get(); + + if ($categories->isNotEmpty()) { + $user->setRelation('scanCategories', $categories); + } + } + return $user; } } diff --git a/tests/Feature/Auth/ScannerMeControllerTest.php b/tests/Feature/Auth/ScannerMeControllerTest.php index c5ddec5..f5ec62b 100644 --- a/tests/Feature/Auth/ScannerMeControllerTest.php +++ b/tests/Feature/Auth/ScannerMeControllerTest.php @@ -8,6 +8,7 @@ use App\Domains\Authorization\Enums\PermissionCode; use App\Domains\Authorization\Enums\RoleCode; use App\Domains\Authorization\Models\Permission; use App\Domains\Authorization\Models\Role; +use App\Domains\Catalog\Models\Category; use App\Domains\Menu\Models\Menu; use App\Domains\Tenant\Models\Tenant; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -85,6 +86,65 @@ class ScannerMeControllerTest extends TestCase $this->getJson('/api/v1/scanner/me')->assertForbidden(); } + public function test_it_returns_assigned_scan_categories_when_validation_is_enabled(): void + { + $this->createScannerRole(); + $tenant = $this->createTenant(); + $scanner = User::factory()->create([ + 'rol_codigo' => RoleCode::Scanner->value, + 'tenant_codigo' => $tenant->codigo, + ]); + $meals = Category::query()->create(['tenant_code' => $tenant->codigo, 'nombre' => 'Comidas']); + $entries = Category::query()->create(['tenant_code' => $tenant->codigo, 'nombre' => 'Entradas']); + $scanner->scanCategories()->attach([$meals->id, $entries->id]); + Sanctum::actingAs($scanner); + + $this->getJson('/api/v1/scanner/me') + ->assertOk() + ->assertJsonPath('data.user.categories.0.id', $meals->id) + ->assertJsonPath('data.user.categories.0.nombre', 'Comidas') + ->assertJsonPath('data.user.categories.1.id', $entries->id) + ->assertJsonPath('data.user.categories.1.nombre', 'Entradas'); + } + + public function test_it_omits_scan_categories_when_validation_is_disabled_or_none_are_assigned(): void + { + $this->createScannerRole(); + $tenant = $this->createTenant(); + $scanner = User::factory()->create([ + 'rol_codigo' => RoleCode::Scanner->value, + 'tenant_codigo' => $tenant->codigo, + ]); + Sanctum::actingAs($scanner); + + $this->getJson('/api/v1/scanner/me') + ->assertOk() + ->assertJsonMissingPath('data.user.categories'); + + $category = Category::query()->create(['tenant_code' => $tenant->codigo, 'nombre' => 'Entradas']); + $scanner->scanCategories()->attach($category); + $tenant->update(['scanner_category_validation_enabled' => false]); + + $this->getJson('/api/v1/scanner/me') + ->assertOk() + ->assertJsonMissingPath('data.user.categories'); + } + + private function createScannerRole(): Role + { + $role = Role::query()->create([ + 'codigo' => RoleCode::Scanner->value, + 'nombre' => 'Scanner', + ]); + $permission = Permission::query()->create([ + 'codigo' => PermissionCode::ScanTickets->value, + 'nombre' => 'Escanear tickets', + ]); + $role->permissions()->attach($permission->codigo); + + return $role; + } + private function createTenant(): Tenant { $logo = Attachment::query()->create([