<?php
namespace App\Infrastructure\Security;
use App\Domain\Common\Entity\EnregistrementDiagnostic;
use App\Domain\Common\Entity\User;
use App\Domain\Common\Enum\EnregistrementDiagnosticStateEnum;
use App\Domain\Common\Enum\EntrepriseValidationTypeEnum;
use App\Domain\Common\Enum\UserTypeEnum;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class DiagnosticValidationVoter extends Voter
{
public const SHOW_VALIDATION_PAGE = 'SHOW_VALIDATION_PAGE';
public const VALIDATE_DIAGNOSTIC = 'VALIDATE_DIAGNOSTIC';
protected function supports(string $attribute, $subject): bool
{
if (!$subject instanceof EnregistrementDiagnostic) {
return false;
}
return \in_array($attribute, [self::SHOW_VALIDATION_PAGE, self::VALIDATE_DIAGNOSTIC]);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
/** @var EnregistrementDiagnostic $enregistrementDiagnostic */
$enregistrementDiagnostic = $subject;
return match ($attribute) {
self::SHOW_VALIDATION_PAGE => $this->canShowValidationPage($enregistrementDiagnostic, $user),
self::VALIDATE_DIAGNOSTIC => $this->canValidate($enregistrementDiagnostic, $user),
default => false,
};
}
private function canShowValidationPage(EnregistrementDiagnostic $enregistrementDiagnostic, User $user): bool
{
$grantedUserTypes = [
UserTypeEnum::TYPE_ADMIN,
UserTypeEnum::TYPE_OPAC_VALIDATEUR_N1,
UserTypeEnum::TYPE_OPAC_VALIDATEUR_N2,
UserTypeEnum::TYPE_DIAGNOSTIQUEUR,
];
return \in_array($user->getType(), $grantedUserTypes);
}
private function canValidate(EnregistrementDiagnostic $enregistrementDiagnostic, User $user): bool
{
$grantedUserTypes = [
UserTypeEnum::TYPE_ADMIN,
UserTypeEnum::TYPE_OPAC_VALIDATEUR_N1,
UserTypeEnum::TYPE_OPAC_VALIDATEUR_N2,
];
if (EnregistrementDiagnosticStateEnum::STATE_WAITING_VALIDATION_N1 !== $enregistrementDiagnostic->getState()
&& EnregistrementDiagnosticStateEnum::STATE_WAITING_VALIDATION_N2 !== $enregistrementDiagnostic->getState()) {
return false;
}
if (UserTypeEnum::TYPE_OPAC_VALIDATEUR_N1 === $user->getType()
&& EnregistrementDiagnosticStateEnum::STATE_WAITING_VALIDATION_N2 === $enregistrementDiagnostic->getState()) {
return false;
}
if (UserTypeEnum::TYPE_OPAC_VALIDATEUR_N2 === $user->getType()
&& EnregistrementDiagnosticStateEnum::STATE_WAITING_VALIDATION_N1 === $enregistrementDiagnostic->getState()
&& EntrepriseValidationTypeEnum::VALIDATION_TYPE_1_STEP !== $enregistrementDiagnostic->getEntreprise()->getValidationType()) {
return false;
}
return \in_array($user->getType(), $grantedUserTypes);
}
}