<?php
namespace App\Voter\__Accounting;
use App\Entity\Partner\Partner;
use App\Voter\VoterTrait;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class AccountingPartnerVoter extends Voter
{
use VoterTrait;
const LIST_PARTNER = "ACCOUNTING_PARTNER_LIST_PARTNER";
const LIST_PERIOD = "ACCOUNTING_PARTNER_LIST_PERIOD";
const DETAILS_PERIOD = "ACCOUNTING_PARTNER_DETAILS_PERIOD";
const EXPORT_PERIOD = "ACCOUNTING_PARTNER_EXPORT_PERIOD";
const ARCHIVE_PERIOD = "ACCOUNTING_PARTNER_ARCHIVE_PERIOD";
const UNARCHIVE_PERIOD = "ACCOUNTING_PARTNER_UNARCHIVE_PERIOD";
protected function supports($attribute, $subject): bool
{
return (in_array($attribute, [self::LIST_PARTNER, self::LIST_PERIOD]) && $subject === null) ||
(in_array($attribute, [self::DETAILS_PERIOD, self::EXPORT_PERIOD, self::ARCHIVE_PERIOD, self::UNARCHIVE_PERIOD]) && $subject instanceof Partner);
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
$loggedUser = $token->getUser();
if (!$loggedUser instanceof UserInterface) {
return false;
}
switch ($attribute) {
case self::LIST_PARTNER:
return $this->voteOnListPartner($loggedUser);
case self::LIST_PERIOD:
return $this->voteOnListPeriod($loggedUser);
case self::DETAILS_PERIOD:
return $this->voteOnDetailsPeriod($subject, $loggedUser);
case self::EXPORT_PERIOD:
return $this->voteOnExportPeriod($subject, $loggedUser);
case self::ARCHIVE_PERIOD:
return $this->voteOnArchivePeriod($subject, $loggedUser);
case self::UNARCHIVE_PERIOD:
return $this->voteOnUnarchivePeriod($subject, $loggedUser);
}
return false;
}
private function voteOnListPartner(UserInterface $loggedUser): bool
{
return in_array(self::LIST_PARTNER, $loggedUser->getRoles());
}
private function voteOnListPeriod(UserInterface $loggedUser): bool
{
return in_array(self::LIST_PERIOD, $loggedUser->getRoles());
}
private function voteOnDetailsPeriod(?Partner $partner, UserInterface $loggedUser): bool
{
if (null === $partner) {
return false;
}
return in_array(self::DETAILS_PERIOD, $loggedUser->getRoles());
}
private function voteOnExportPeriod(?Partner $partner, UserInterface $loggedUser): bool
{
if (null === $partner) {
return false;
}
return in_array(self::EXPORT_PERIOD, $loggedUser->getRoles());
}
private function voteOnArchivePeriod(?Partner $partner, UserInterface $loggedUser): bool
{
if (null === $partner) {
return false;
}
return in_array(self::ARCHIVE_PERIOD, $loggedUser->getRoles());
}
private function voteOnUnarchivePeriod(?Partner $partner, UserInterface $loggedUser): bool
{
if (null === $partner) {
return false;
}
return in_array(self::UNARCHIVE_PERIOD, $loggedUser->getRoles());
}
}