<?php
namespace App\Voter\__Accounting;
use App\Entity\Booking\Booking;
use App\Entity\User\User;
use App\Repository\User\UserRepository;
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 AccountingBookingVoter extends Voter
{
use VoterTrait;
const DETAILS_BILLING_AND_CREDITS = "ACCOUNTING_BOOKING_DETAILS_BILLING_AND_CREDITS";
const DETAILS_PAYMENTS = "ACCOUNTING_BOOKING_DETAILS_PAYMENTS";
const DETAILS_ACCOUNTING_MANAGEMENT = "ACCOUNTING_BOOKING_DETAILS_ACCOUNTING_MANAGEMENT";
const DETAILS_CALCULATION_TURNOVER = "ACCOUNTING_BOOKING_DETAILS_CALCULATION_TURNOVER";
const DETAILS_CALCULATION_SELLER_BONUS = "ACCOUNTING_BOOKING_DETAILS_CALCULATION_SELLER_BONUS";
const GET_PAYMENT_STATEMENT_PDF = "ACCOUNTING_BOOKING_GET_PAYMENT_STATEMENT_PDF";
const DETAILS_INSURANCES = "ACCOUNTING_BOOKING_DETAILS_INSURANCES";
protected function supports($attribute, $subject): bool
{
return in_array($attribute, [
self::DETAILS_BILLING_AND_CREDITS,
self::DETAILS_PAYMENTS,
self::DETAILS_ACCOUNTING_MANAGEMENT,
self::DETAILS_CALCULATION_TURNOVER,
self::DETAILS_CALCULATION_SELLER_BONUS,
self::GET_PAYMENT_STATEMENT_PDF,
self::DETAILS_INSURANCES,
]) && ($subject === null || $subject instanceof Booking);
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
$loggedUser = $token->getUser();
if (!$loggedUser instanceof UserInterface) {
return false;
}
if (null === $subject) {
return false;
}
switch ($attribute) {
case self::DETAILS_BILLING_AND_CREDITS:
return $this->voteOnDetailsBillingAndCredits($subject, $loggedUser);
case self::DETAILS_PAYMENTS:
return $this->voteOnDetailsPayments($subject, $loggedUser);
case self::DETAILS_ACCOUNTING_MANAGEMENT:
return $this->voteOnDetailsAccountingManagement($subject, $loggedUser);
case self::DETAILS_CALCULATION_TURNOVER:
return $this->voteOnDetailsCalculationTurnover($subject, $loggedUser);
case self::DETAILS_CALCULATION_SELLER_BONUS:
return $this->voteOnDetailsCalculationSellerBonus($subject, $loggedUser);
case self::GET_PAYMENT_STATEMENT_PDF:
return $this->voteOnGetPaymentStatementPdf($subject, $loggedUser);
case self::DETAILS_INSURANCES:
return $this->voteOnDetailsInsurances($subject, $loggedUser);
}
return false;
}
private function voteOnDetailsBillingAndCredits(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_BILLING_AND_CREDITS, $loggedUser->getRoles());
}
private function voteOnDetailsPayments(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_PAYMENTS, $loggedUser->getRoles());
}
private function voteOnDetailsAccountingManagement(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_ACCOUNTING_MANAGEMENT, $loggedUser->getRoles());
}
private function voteOnDetailsCalculationTurnover(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_CALCULATION_TURNOVER, $loggedUser->getRoles());
}
private function voteOnDetailsCalculationSellerBonus(?Booking $booking, UserInterface $loggedUser): bool
{
/** @var User $loggedUser */
if ($this->isUserBelongToGroup($loggedUser, UserRepository::SELLER_USER_GROUP_CODE)
&& $booking->getSeller()->getId() !== $loggedUser->getId()) {
return false;
}
return in_array(self::DETAILS_CALCULATION_SELLER_BONUS, $loggedUser->getRoles());
}
private function voteOnGetPaymentStatementPdf(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::GET_PAYMENT_STATEMENT_PDF, $loggedUser->getRoles());
}
private function voteOnDetailsInsurances(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_INSURANCES, $loggedUser->getRoles());
}
}