fix: don't enforce required checks on users with administrative roles

This commit is contained in:
Björn Fromme
2026-03-15 12:42:28 +01:00
parent 3d71dcfc14
commit 90dda38c0f
6 changed files with 62 additions and 17 deletions
@@ -55,7 +55,8 @@ class IndexController extends AbstractController
// Validate teamer data to show missing data right away // Validate teamer data to show missing data right away
$errors = $this->validator->validate($teamer, null, ['profile_preflight']); $errors = $this->validator->validate($teamer, null, ['profile_preflight']);
$verificationMode = false === $this->personalDataVerificationRequiredCheck->isSatisfied($user); $verificationMode = true === $this->personalDataVerificationRequiredCheck->appliesTo($user)
&& false === $this->personalDataVerificationRequiredCheck->isSatisfied($user);
$form = $this->createForm(TeamerProfileType::class, $teamer, [ $form = $this->createForm(TeamerProfileType::class, $teamer, [
'upload_session' => $uploadSession, 'upload_session' => $uploadSession,
@@ -0,0 +1,23 @@
<?php
namespace App\RequiredTeamerCheck;
use App\Entity\User;
abstract class AbstractRequiredTeamerCheck implements RequiredTeamerCheckInterface
{
private const EXCLUDED_ROLES = [
'ROLE_ADMIN',
'ROLE_MANAGER',
'ROLE_HOUSE_MANAGER',
];
public function appliesTo(User $user): bool
{
if (0 < count(array_intersect($user->getRoles(), self::EXCLUDED_ROLES))) {
return false;
}
return true === $user->hasRole('ROLE_TEAMER');
}
}
@@ -5,20 +5,14 @@ namespace App\RequiredTeamerCheck;
use App\Entity\Teamer; use App\Entity\Teamer;
use App\Entity\Upload; use App\Entity\Upload;
use App\Entity\User; use App\Entity\User;
use App\RequiredTeamerCheck\RequiredTeamerCheckInterface;
class DriverLicenseRequiredCheck implements RequiredTeamerCheckInterface class DriverLicenseRequiredCheck extends AbstractRequiredTeamerCheck
{ {
public function getCode(): string public function getCode(): string
{ {
return 'driver_license'; return 'driver_license';
} }
public function appliesTo(User $user): bool
{
return true === $user->hasRole('ROLE_TEAMER');
}
public function isSatisfied(User $user): bool public function isSatisfied(User $user): bool
{ {
$teamer = $user->getTeamer(); $teamer = $user->getTeamer();
@@ -6,7 +6,7 @@ use App\Entity\Teamer;
use App\Entity\User; use App\Entity\User;
use Carbon\CarbonImmutable; use Carbon\CarbonImmutable;
class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterface class PersonalDataVerificationRequiredCheck extends AbstractRequiredTeamerCheck
{ {
public function __construct( public function __construct(
private readonly array $dataVerificationDeadlines = ['04-01', '10-01'], private readonly array $dataVerificationDeadlines = ['04-01', '10-01'],
@@ -18,11 +18,6 @@ class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterf
return 'personal_data_verification'; return 'personal_data_verification';
} }
public function appliesTo(User $user): bool
{
return true === $user->hasRole('ROLE_TEAMER');
}
public function isSatisfied(User $user): bool public function isSatisfied(User $user): bool
{ {
$teamer = $user->getTeamer(); $teamer = $user->getTeamer();
@@ -20,12 +20,24 @@ class DriverLicenseRequiredCheckTest extends TestCase
} }
public function testAppliesToMixedRoleUsersWithTeamerRole(): void /**
* @dataProvider mixedRoleProvider
*/
public function testDoesNotApplyToExcludedMixedRoleUsersWithTeamerRole(string $excludedRole): void
{ {
$user = $this->createTeamerUser(); $user = $this->createTeamerUser();
$user->setRoles(['ROLE_ADMIN', 'ROLE_TEAMER']); $user->setRoles([$excludedRole, 'ROLE_TEAMER']);
$this->assertTrue($this->check->appliesTo($user)); $this->assertFalse($this->check->appliesTo($user));
}
public function mixedRoleProvider(): array
{
return [
['ROLE_ADMIN'],
['ROLE_MANAGER'],
['ROLE_HOUSE_MANAGER'],
];
} }
public function testIsNotSatisfiedWhenDeclarationIsMissing(): void public function testIsNotSatisfiedWhenDeclarationIsMissing(): void
@@ -30,6 +30,26 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase
$this->assertTrue($check->appliesTo($user)); $this->assertTrue($check->appliesTo($user));
} }
/**
* @dataProvider mixedRoleProvider
*/
public function testDoesNotApplyToExcludedMixedRoleUsersWithTeamerRole(string $excludedRole): void
{
$check = new PersonalDataVerificationRequiredCheck();
$user = (new User())->setRoles([$excludedRole, 'ROLE_TEAMER']);
$this->assertFalse($check->appliesTo($user));
}
public function mixedRoleProvider(): array
{
return [
['ROLE_ADMIN'],
['ROLE_MANAGER'],
['ROLE_HOUSE_MANAGER'],
];
}
public function testIsNotSatisfiedWhenTeamerIsMissing(): void public function testIsNotSatisfiedWhenTeamerIsMissing(): void
{ {
$check = new PersonalDataVerificationRequiredCheck(); $check = new PersonalDataVerificationRequiredCheck();