src/V4/Voters/QuoteVoter.php line 16

Open in your IDE?
  1. <?php
  2. namespace App\V4\Voters;
  3. use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
  4. use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
  5. use App\Model\ModuleConfiguration\ModuleConfiguration;
  6. use App\Security\SecurityConfig;
  7. use App\Security\User;
  8. use App\V4\Enum\Quote\QuoteLineConfigEnum;
  9. use App\V4\Model\Quote\Quote;
  10. use LogicException;
  11. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  12. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  13. class QuoteVoter extends Voter
  14. {
  15.     public const QUOTE_MANAGE_LIST 'quote_manage_list';
  16.     public const QUOTE_SHOW_LIST 'quote_show_list';
  17.     public const QUOTE_ADD_EDIT 'quote_add_edit';
  18.     public const QUOTE_DUPLICATE 'quote_duplicate';
  19.     public const QUOTE_REGENERATE_PRICES 'quote_regenerate_prices';
  20.     public const QUOTE_MANAGE_FIELDS 'quote_manage_fields';
  21.     public const QUOTE_STATE_ADD_EDIT 'quote_state_add_edit';
  22.     public const QUOTE_REASON_ADD_EDIT 'quote_reason_add_edit';
  23.     public const QUOTE_LINES_EXPORT_PDF 'quote_lines_export_pdf';
  24.     public const QUOTE_CAN_SPLIT 'quote_can_split';
  25.     /**
  26.      * @var CollectionDataProviderInterface
  27.      */
  28.     private $collectionDataProvider;
  29.     public function __construct(CollectionDataProviderInterface $collectionDataProvider)
  30.     {
  31.         $this->collectionDataProvider $collectionDataProvider;
  32.     }
  33.     /**
  34.      * @param $attribute
  35.      * @param $subject
  36.      *
  37.      * @return bool
  38.      */
  39.     protected function supports($attribute$subject): bool
  40.     {
  41.         return in_array($attribute, [
  42.             self::QUOTE_MANAGE_LIST,
  43.             self::QUOTE_SHOW_LIST,
  44.             self::QUOTE_ADD_EDIT,
  45.             self::QUOTE_DUPLICATE,
  46.             self::QUOTE_REGENERATE_PRICES,
  47.             self::QUOTE_MANAGE_FIELDS,
  48.             self::QUOTE_STATE_ADD_EDIT,
  49.             self::QUOTE_REASON_ADD_EDIT,
  50.             self::QUOTE_LINES_EXPORT_PDF,
  51.             self::QUOTE_CAN_SPLIT,
  52.         ], true);
  53.     }
  54.     /**
  55.      * @param $attribute
  56.      * @param $subject
  57.      * @param TokenInterface $token
  58.      *
  59.      * @return bool
  60.      *
  61.      * @throws LogicException
  62.      */
  63.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  64.     {
  65.         $user $token->getUser();
  66.         if (!$user instanceof User) {
  67.             return false;
  68.         }
  69.         switch ($attribute) {
  70.             case self::QUOTE_MANAGE_LIST:
  71.                 return $this->canQuoteManageList();
  72.             case self::QUOTE_SHOW_LIST:
  73.                 return $this->canQuoteShowList();
  74.             case self::QUOTE_ADD_EDIT:
  75.                 return $this->canQuoteAddEdit();
  76.             case self::QUOTE_DUPLICATE:
  77.                 return $this->canQuoteDuplicate();
  78.             case self::QUOTE_REGENERATE_PRICES:
  79.                 return $this->canQuoteRegeneratePrices($user);
  80.             case self::QUOTE_MANAGE_FIELDS:
  81.                 return $this->canQuoteManageFields();
  82.             case self::QUOTE_STATE_ADD_EDIT:
  83.                 return $this->canQuoteStateAddEdit();
  84.             case self::QUOTE_REASON_ADD_EDIT:
  85.                 return $this->canQuoteReasonAddEdit();
  86.             case self::QUOTE_LINES_EXPORT_PDF:
  87.                 return $this->canExportQuotesPdf();
  88.             case self::QUOTE_CAN_SPLIT:
  89.                 return $this->canSplit($user$subject);
  90.         }
  91.         throw new LogicException('This should never happen');
  92.     }
  93.     private function canQuoteManageList(): bool
  94.     {
  95.         return $this->canAccessQuote();
  96.     }
  97.     private function canQuoteShowList(): bool
  98.     {
  99.         return $this->canAccessQuote();
  100.     }
  101.     private function canQuoteAddEdit(): bool
  102.     {
  103.         return $this->canAccessQuote();
  104.     }
  105.     private function canQuoteDuplicate(): bool
  106.     {
  107.         return $this->canAccessQuote();
  108.     }
  109.     /**
  110.      * @param User $user
  111.      *
  112.      * @return bool
  113.      */
  114.     private function canQuoteRegeneratePrices(User $user): bool
  115.     {
  116.         return in_array(SecurityConfig::QUOTE_REGENERATE_PRICES$user->getRoles(), true);
  117.     }
  118.     private function canQuoteManageFields(): bool
  119.     {
  120.         return $this->canAccessQuote();
  121.     }
  122.     private function canQuoteStateAddEdit(): bool
  123.     {
  124.         return $this->canAccessQuote();
  125.     }
  126.     private function canQuoteReasonAddEdit(): bool
  127.     {
  128.         return $this->canAccessQuote();
  129.     }
  130.     /**
  131.      * @return bool
  132.      */
  133.     private function canExportQuotesPdf(): bool
  134.     {
  135.         return $this->canAccessQuote();
  136.     }
  137.     /**
  138.      * @TODO: Si le client n'a pas le droit "quote show", il peut tout de même voir les devis qu'il gère.
  139.      *
  140.      * @return bool
  141.      */
  142.     private function canAccessQuote(): bool
  143.     {
  144.         return true;
  145.     }
  146.     private function canUseQuoteLineModule(User $user): bool
  147.     {
  148.         return in_array(SecurityConfig::MODULE_QUOTE_LINE$user->getRoles(), true);
  149.     }
  150.     /**
  151.      * @throws ResourceClassNotSupportedException
  152.      */
  153.     private function canSplit(User $user$subject): bool
  154.     {
  155.         if (!$this->canUseQuoteLineModule($user)) {
  156.             return false;
  157.         }
  158.         if (!$subject instanceof Quote || $subject->isSplit() || $subject->getQuoteLines()->isEmpty()) {
  159.             return false;
  160.         }
  161.         foreach ($subject->getQuoteLines() as $quoteLine) {
  162.             if (empty($quoteLine->getSectionName())) {
  163.                 return false;
  164.             }
  165.         }
  166.         $moduleConfigs $this->collectionDataProvider->getCollection(ModuleConfiguration::class, null, [
  167.             'filters' => [
  168.                 'moduleId' => SecurityConfig::MODULE_QUOTE_LINE,
  169.             ],
  170.         ]);
  171.         foreach ($moduleConfigs as $moduleConfig) {
  172.             if ($moduleConfig instanceof ModuleConfiguration && QuoteLineConfigEnum::ENABLE_QUOTE_SPLIT === $moduleConfig->getKeyConf()) {
  173.                 return 'true' === $moduleConfig->getValue();
  174.             }
  175.         }
  176.         return false;
  177.     }
  178. }