src/AppBundle/Security/LawFirmTaxRateVoter.php line 27

Open in your IDE?
  1. <?php
  2. namespace AppBundle\Security;
  3. use AppBundle\Entity\LawFirmTaxRate;
  4. use AppBundle\Entity\User;
  5. use AppBundle\Enum\LawFirmTaxRateEnum;
  6. use AppBundle\Repository\ActivityEntryRepository;
  7. use AppBundle\Repository\AssetEntryRepository;
  8. use AppBundle\Repository\Category\ExpenseCategoryPresetRepository;
  9. use AppBundle\Repository\Category\FlatFeeCategoryPresetRepository;
  10. use AppBundle\Repository\Category\OutlayCategoryPresetRepository;
  11. use AppBundle\Repository\Category\TimeCategoryPresetRepository;
  12. use AppBundle\Repository\FeeMatterFeeRepository;
  13. use BillingBundle\Repository\FeeRepository;
  14. use BillingBundle\Repository\SplitBillRepository;
  15. use BillingBundle\Repository\TrustRepository;
  16. use CommonBundle\Util\FloatComparator;
  17. use CRMBundle\Repository\ContactRepository;
  18. use LogicException;
  19. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  20. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  21. /**
  22.  * Class LawFirmTaxRateVoter
  23.  */
  24. class LawFirmTaxRateVoter extends Voter
  25. {
  26.     const EDIT_PERCENTAGE 'edit_percentage';
  27.     const DELETE 'delete';
  28.     /**
  29.      * @var TrustRepository $trustRepository
  30.      */
  31.     private $trustRepository;
  32.     /**
  33.      * @var ExpenseCategoryPresetRepository
  34.      */
  35.     private $expenseCategoryPresetRepository;
  36.     /**
  37.      * @var FlatFeeCategoryPresetRepository
  38.      */
  39.     private $flatFeeCategoryPresetRepository;
  40.     /**
  41.      * @var OutlayCategoryPresetRepository
  42.      */
  43.     private $outlayCategoryPresetRepository;
  44.     /**
  45.      * @var TimeCategoryPresetRepository
  46.      */
  47.     private $timeCategoryPresetRepository;
  48.     /**
  49.      * @var ContactRepository
  50.      */
  51.     private $contactRepository;
  52.     /**
  53.      * @var ActivityEntryRepository
  54.      */
  55.     private $activityEntryRepository;
  56.     /**
  57.      * @var FeeRepository
  58.      */
  59.     private $feeRepository;
  60.     /**
  61.      * @var FeeMatterFeeRepository
  62.      */
  63.     private $feeMatterFeeRepository;
  64.     /**
  65.      * @var SplitBillRepository
  66.      */
  67.     private $splitBillRepository;
  68.     /**
  69.      * @var AssetEntryRepository
  70.      */
  71.     private $assetEntryRepository;
  72.     /**
  73.      * LawFirmTaxRateVoter constructor.
  74.      * @param TrustRepository $trustRepository
  75.      * @param ExpenseCategoryPresetRepository $expenseCategoryPresetRepository
  76.      * @param FlatFeeCategoryPresetRepository $flatFeeCategoryPresetRepository
  77.      * @param OutlayCategoryPresetRepository $outlayCategoryPresetRepository
  78.      * @param TimeCategoryPresetRepository $timeCategoryPresetRepository
  79.      * @param ContactRepository $contactRepository
  80.      * @param ActivityEntryRepository $activityEntryRepository
  81.      * @param FeeRepository $feeRepository
  82.      * @param FeeMatterFeeRepository $feeMatterFeeRepository
  83.      * @param SplitBillRepository $splitBillRepository
  84.      * @param AssetEntryRepository $assetEntryRepository
  85.      */
  86.     public function __construct(
  87.         TrustRepository $trustRepository,
  88.         ExpenseCategoryPresetRepository $expenseCategoryPresetRepository,
  89.         FlatFeeCategoryPresetRepository $flatFeeCategoryPresetRepository,
  90.         OutlayCategoryPresetRepository $outlayCategoryPresetRepository,
  91.         TimeCategoryPresetRepository $timeCategoryPresetRepository,
  92.         ContactRepository $contactRepository,
  93.         ActivityEntryRepository $activityEntryRepository,
  94.         FeeRepository $feeRepository,
  95.         FeeMatterFeeRepository $feeMatterFeeRepository,
  96.         SplitBillRepository $splitBillRepository,
  97.         AssetEntryRepository $assetEntryRepository
  98.     ) {
  99.         $this->trustRepository $trustRepository;
  100.         $this->expenseCategoryPresetRepository $expenseCategoryPresetRepository;
  101.         $this->flatFeeCategoryPresetRepository $flatFeeCategoryPresetRepository;
  102.         $this->outlayCategoryPresetRepository $outlayCategoryPresetRepository;
  103.         $this->timeCategoryPresetRepository $timeCategoryPresetRepository;
  104.         $this->contactRepository $contactRepository;
  105.         $this->activityEntryRepository $activityEntryRepository;
  106.         $this->feeRepository $feeRepository;
  107.         $this->feeMatterFeeRepository $feeMatterFeeRepository;
  108.         $this->splitBillRepository $splitBillRepository;
  109.         $this->assetEntryRepository $assetEntryRepository;
  110.     }
  111.     /**
  112.      * {@inheritdoc}
  113.      */
  114.     protected function supports($attribute$subject)
  115.     {
  116.         if (!in_array($attribute, [self::EDIT_PERCENTAGEself::DELETE])) {
  117.             return false;
  118.         }
  119.         if (!$subject instanceof LawFirmTaxRate) {
  120.             return false;
  121.         }
  122.         return true;
  123.     }
  124.     /**
  125.      * {@inheritdoc}
  126.      */
  127.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  128.     {
  129.         $user $token->getUser();
  130.         if (!$user instanceof User) {
  131.             return false;
  132.         }
  133.         $lawFirmTaxRate $subject;
  134.         switch ($attribute) {
  135.             case self::EDIT_PERCENTAGE:
  136.                 return $this->canEditPercentage($lawFirmTaxRate$user);
  137.             case self::DELETE:
  138.                 return $this->canDelete($lawFirmTaxRate$user);
  139.         }
  140.         throw new LogicException('Error');
  141.     }
  142.     /**
  143.      * @param LawFirmTaxRate $lawFirmTaxRate
  144.      * @param User $user
  145.      * @return bool
  146.      */
  147.     private function canEditPercentage(LawFirmTaxRate $lawFirmTaxRateUser $user): bool
  148.     {
  149.         if (FloatComparator::isEqualTo(LawFirmTaxRateEnum::NOT_SUBJECTfloatval($lawFirmTaxRate->getPercentage()))) {
  150.             return false;
  151.         }
  152.         $activtyEntryVats $this->activityEntryRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  153.         foreach ($activtyEntryVats as $data) {
  154.             if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
  155.                 return false;
  156.             }
  157.         }
  158.         $feeVats $this->feeRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  159.         foreach ($feeVats as $data) {
  160.             if (FloatComparator::isEqualTo(floatval($data['feeEntriesVat']), floatval($lawFirmTaxRate->getPercentage()))) {
  161.                 return false;
  162.             }
  163.         }
  164.         $feeMatterFeeVats $this->feeMatterFeeRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  165.         foreach ($feeMatterFeeVats as $data) {
  166.             if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
  167.                 return false;
  168.             }
  169.         }
  170.         $trustVats $this->trustRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  171.         foreach ($trustVats as $data) {
  172.             if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
  173.                 return false;
  174.             }
  175.         }
  176.         $splitBillVats $this->splitBillRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  177.         foreach ($splitBillVats as $data) {
  178.             if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
  179.                 return false;
  180.             }
  181.         }
  182.         $contactVats $this->contactRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  183.         foreach ($contactVats as $data) {
  184.             if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
  185.                 return false;
  186.             }
  187.         }
  188.         $assetEntryVats $this->assetEntryRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  189.         foreach ($assetEntryVats as $data) {
  190.             if (FloatComparator::isEqualTo(floatval($data['vat']), floatval($lawFirmTaxRate->getPercentage()))) {
  191.                 return false;
  192.             }
  193.         }
  194.         $expenseCategoryPresetVats $this->expenseCategoryPresetRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  195.         foreach ($expenseCategoryPresetVats as $data) {
  196.             if (FloatComparator::isEqualTo(floatval($data['taxRate']), floatval($lawFirmTaxRate->getPercentage()))) {
  197.                 return false;
  198.             }
  199.         }
  200.         $flatFeeCategoryPresetVats $this->flatFeeCategoryPresetRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  201.         foreach ($flatFeeCategoryPresetVats as $data) {
  202.             if (FloatComparator::isEqualTo(floatval($data['taxRate']), floatval($lawFirmTaxRate->getPercentage()))) {
  203.                 return false;
  204.             }
  205.         }
  206.         $outlayCategoryPresetVats $this->outlayCategoryPresetRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  207.         foreach ($outlayCategoryPresetVats as $data) {
  208.             if (FloatComparator::isEqualTo(floatval($data['taxRate']), floatval($lawFirmTaxRate->getPercentage()))) {
  209.                 return false;
  210.             }
  211.         }
  212.         $timeCategoryPresetVats $this->timeCategoryPresetRepository->getLawFirmDistinctVat($lawFirmTaxRate->getLawFirm());
  213.         foreach ($timeCategoryPresetVats as $data) {
  214.             if (FloatComparator::isEqualTo(floatval($data['taxRate']), floatval($lawFirmTaxRate->getPercentage()))) {
  215.                 return false;
  216.             }
  217.         }
  218.         return true;
  219.     }
  220.     /**
  221.      * @param LawFirmTaxRate $lawFirmTaxRate
  222.      * @param User $user
  223.      * @return bool
  224.      */
  225.     private function canDelete(LawFirmTaxRate $lawFirmTaxRateUser $user): bool
  226.     {
  227.         if (true === $lawFirmTaxRate->getIsDefault()) {
  228.             return false;
  229.         }
  230.         return $this->canEditPercentage($lawFirmTaxRate$user);
  231.     }
  232. }