<?php
namespace App\Security\Voter\Payment;
use App\Entity\Billing;
use App\Entity\Member;
use App\Entity\Webmaster;
use App\Security\ApiUser;
use App\Service\User\MemberOperatorService;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class BillingVoter extends Voter
{
public const READPDF = 'billing_pdf';
public const LISTPDF = 'billing_list_pdf';
protected function supports(string $attribute, $subject): bool
{
return in_array($attribute, [
self::READPDF,
self::LISTPDF,
], true);
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof ApiUser) {
return false;
}
if ($user->getIsAdmin()) {
return true;
}
if (self::LISTPDF === $attribute) {
if ($subject instanceof Member) {
return $subject->getIsAmateur() || $subject->getAccount()->hasWebmaster();
}
if ($subject instanceof Webmaster) {
return $subject->getIsActive();
}
return false;
}
if (!$subject instanceof Billing) {
return false;
}
if ($subject->getWebmaster() && $user->getIsWebmaster()) {
$owningWmOfBill = $subject->getWebmaster();
return $owningWmOfBill->getId() === $user->getWebmaster()->getId();
}
/*
* @var $subject Billing
*/
if ($user->getIsAmateur() && !$user->getIsOperator()) {
$amateur = $user->getMember();
$billingAmateur = $subject->getAmateur();
return $amateur->getId() === $billingAmateur->getId();
}
if ($user->getIsOperator()) {
if ($billingAmateur = $subject->getAmateur()) {
return MemberOperatorService::isMemberOperatedByUser($billingAmateur, $user);
}
if ($billingWm = $subject->getWebmaster()) {
$owningMember = $billingWm->getAccount()->getMember();
return MemberOperatorService::isMemberOperatedByUser($owningMember, $user);
}
}
return false;
}
}