<?php
namespace AppBundle\Security;
use AppBundle\Entity\LawFirmTaxRate;
use AppBundle\Entity\User;
use AppBundle\Enum\LawFirmTaxRateEnum;
use AppBundle\Repository\ActivityEntryRepository;
use AppBundle\Repository\AssetEntryRepository;
use AppBundle\Repository\Category\ExpenseCategoryPresetRepository;
use AppBundle\Repository\Category\FlatFeeCategoryPresetRepository;
use AppBundle\Repository\Category\OutlayCategoryPresetRepository;
use AppBundle\Repository\Category\TimeCategoryPresetRepository;
use AppBundle\Repository\FeeMatterFeeRepository;
use BillingBundle\Repository\FeeRepository;
use BillingBundle\Repository\SplitBillRepository;
use BillingBundle\Repository\TrustRepository;
use CommonBundle\Util\FloatComparator;
use CRMBundle\Repository\ContactRepository;
use LogicException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
/**
* Class LawFirmTaxRateVoter
*/
class LawFirmTaxRateVoter extends Voter
{
const EDIT_PERCENTAGE = 'edit_percentage';
const DELETE = 'delete';
/**
* @var TrustRepository $trustRepository
*/
private $trustRepository;
/**
* @var ExpenseCategoryPresetRepository
*/
private $expenseCategoryPresetRepository;
/**
* @var FlatFeeCategoryPresetRepository
*/
private $flatFeeCategoryPresetRepository;
/**
* @var OutlayCategoryPresetRepository
*/
private $outlayCategoryPresetRepository;
/**
* @var TimeCategoryPresetRepository
*/
private $timeCategoryPresetRepository;
/**
* @var ContactRepository
*/
private $contactRepository;
/**
* @var ActivityEntryRepository
*/
private $activityEntryRepository;
/**
* @var FeeRepository
*/
private $feeRepository;
/**
* @var FeeMatterFeeRepository
*/
private $feeMatterFeeRepository;
/**
* @var SplitBillRepository
*/
private $splitBillRepository;
/**
* @var AssetEntryRepository
*/
private $assetEntryRepository;
/**
* LawFirmTaxRateVoter constructor.
* @param TrustRepository $trustRepository
* @param ExpenseCategoryPresetRepository $expenseCategoryPresetRepository
* @param FlatFeeCategoryPresetRepository $flatFeeCategoryPresetRepository
* @param OutlayCategoryPresetRepository $outlayCategoryPresetRepository
* @param TimeCategoryPresetRepository $timeCategoryPresetRepository
* @param ContactRepository $contactRepository
* @param ActivityEntryRepository $activityEntryRepository
* @param FeeRepository $feeRepository
* @param FeeMatterFeeRepository $feeMatterFeeRepository
* @param SplitBillRepository $splitBillRepository
* @param AssetEntryRepository $assetEntryRepository
*/
public function __construct(
TrustRepository $trustRepository,
ExpenseCategoryPresetRepository $expenseCategoryPresetRepository,
FlatFeeCategoryPresetRepository $flatFeeCategoryPresetRepository,
OutlayCategoryPresetRepository $outlayCategoryPresetRepository,
TimeCategoryPresetRepository $timeCategoryPresetRepository,
ContactRepository $contactRepository,
ActivityEntryRepository $activityEntryRepository,
FeeRepository $feeRepository,
FeeMatterFeeRepository $feeMatterFeeRepository,
SplitBillRepository $splitBillRepository,
AssetEntryRepository $assetEntryRepository
) {
$this->trustRepository = $trustRepository;
$this->expenseCategoryPresetRepository = $expenseCategoryPresetRepository;
$this->flatFeeCategoryPresetRepository = $flatFeeCategoryPresetRepository;
$this->outlayCategoryPresetRepository = $outlayCategoryPresetRepository;
$this->timeCategoryPresetRepository = $timeCategoryPresetRepository;
$this->contactRepository = $contactRepository;
$this->activityEntryRepository = $activityEntryRepository;
$this->feeRepository = $feeRepository;
$this->feeMatterFeeRepository = $feeMatterFeeRepository;
$this->splitBillRepository = $splitBillRepository;
$this->assetEntryRepository = $assetEntryRepository;
}
/**
* {@inheritdoc}
*/
protected function supports($attribute, $subject)
{
if (!in_array($attribute, [self::EDIT_PERCENTAGE, self::DELETE])) {
return false;
}
if (!$subject instanceof LawFirmTaxRate) {
return false;
}
return true;
}
/**
* {@inheritdoc}
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
$lawFirmTaxRate = $subject;
switch ($attribute) {
case self::EDIT_PERCENTAGE:
return $this->canEditPercentage($lawFirmTaxRate, $user);
case self::DELETE:
return $this->canDelete($lawFirmTaxRate, $user);
}
throw new LogicException('Error');
}
/**
* @param LawFirmTaxRate $lawFirmTaxRate
* @param User $user
* @return bool
*/
private function canEditPercentage(LawFirmTaxRate $lawFirmTaxRate, User $user): bool
{
if (FloatComparator::isEqualTo(LawFirmTaxRateEnum::NOT_SUBJECT, floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
$activtyEntryVats = $this->activityEntryRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($activtyEntryVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$feeVats = $this->feeRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($feeVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['feeEntriesVat']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$feeMatterFeeVats = $this->feeMatterFeeRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($feeMatterFeeVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$trustVats = $this->trustRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($trustVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$splitBillVats = $this->splitBillRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($splitBillVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$contactVats = $this->contactRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($contactVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$assetEntryVats = $this->assetEntryRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($assetEntryVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$expenseCategoryPresetVats = $this->expenseCategoryPresetRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($expenseCategoryPresetVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['taxRate']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$flatFeeCategoryPresetVats = $this->flatFeeCategoryPresetRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($flatFeeCategoryPresetVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['taxRate']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$outlayCategoryPresetVats = $this->outlayCategoryPresetRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($outlayCategoryPresetVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['taxRate']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
$timeCategoryPresetVats = $this->timeCategoryPresetRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
foreach ($timeCategoryPresetVats as $data) {
if (FloatComparator::isEqualTo(floatval($data['taxRate']), floatval($lawFirmTaxRate->getPercentage()))) {
return false;
}
}
return true;
}
/**
* @param LawFirmTaxRate $lawFirmTaxRate
* @param User $user
* @return bool
*/
private function canDelete(LawFirmTaxRate $lawFirmTaxRate, User $user): bool
{
if (true === $lawFirmTaxRate->getIsDefault()) {
return false;
}
return $this->canEditPercentage($lawFirmTaxRate, $user);
}
}