src/Security/Voter/InvoiceVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Company\User;
  4. use App\Entity\Invoice\ImportedInvoice;
  5. use App\Entity\Invoice\Invoice;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\User\UserInterface;
  9. class InvoiceVoter extends Voter
  10. {
  11.     public const EDIT 'EDIT';
  12.     public const VIEW 'VIEW';
  13.     public const DELETE 'DELETE';
  14.     public const CONTINUE = 'CONTINUE';
  15.     public const SEND_MAIL 'SEND_MAIL';
  16.     public const PAYMENT 'PAYMENT';
  17.     protected function supports(string $attributemixed $subject): bool
  18.     {
  19.         return $subject instanceof Invoice;
  20.     }
  21.     protected function voteOnAttribute(string $attributemixed $subjectTokenInterface $token): bool
  22.     {
  23.         $user $token->getUser();
  24.         if (!$user instanceof UserInterface) {
  25.             return false;
  26.         }
  27.         return match ($attribute) {
  28.             self::EDIT => $this->canPerformSimpleAction($subject$user),
  29.             self::VIEW => $this->canPerformSimpleAction($subject$user),
  30.             self::DELETE => $this->canPerformSimpleAction($subject$user),
  31.             self::CONTINUE => $this->canContinue($subject$user),
  32.             self::SEND_MAIL => $this->canSendMail($subject$user),
  33.             self::PAYMENT => $this->canPayInvoice($subject$user)
  34.         };
  35.     }
  36.     /**
  37.      *
  38.      * @param Invoice $invoice
  39.      * @param User $user
  40.      * @return boolean
  41.      */
  42.     private function canPerformSimpleAction(Invoice $invoiceUser $user): bool
  43.     {
  44.         return $invoice->getCompany()->getId() == $user->getCompany()->getId();
  45.     }
  46.     /**
  47.      *
  48.      * @param Invoice $invoice
  49.      * @param User $user
  50.      * @return boolean
  51.      */
  52.     private function canContinue(Invoice $invoiceUser $user): bool
  53.     {
  54.         return $this->canPerformSimpleAction($invoice$user) && $invoice->getStatus() == 0;
  55.     }
  56.     /**
  57.      *
  58.      * @param Invoice $invoice
  59.      * @param User $user
  60.      * @return boolean
  61.      */
  62.     private function canSendMail(Invoice $invoiceUser $user): bool
  63.     {
  64.         return $this->canPerformSimpleAction($invoice$user) && $invoice->getStatus() == 1;
  65.     }
  66.     private function canPayInvoice(Invoice|ImportedInvoice $invoiceUser $user): bool
  67.     {
  68.         if ($invoice instanceof Invoice) {
  69.             return $user->getCustomerCompany()->getStripeCustomer() != null &&
  70.                 $invoice->getQuote()?->getPurchaseOrder()?->getConstructionSiteOffer()?->getConstructionSite()?->getCustomerCompany()?->getId() == $user->getCustomerCompany()->getId() &&
  71.                 in_array($invoice->getStatus(), [12]);
  72.         } else {
  73.             return $user->getCustomerCompany()->getStripeCustomer() != null &&
  74.                 $invoice->getPurchaseOrder()?->getConstructionSiteOffer()?->getConstructionSite()?->getCustomerCompany()?->getId() == $user->getCustomerCompany()->getId() &&
  75.                 in_array($invoice->getStatus(), [12]);
  76.         }
  77.     }
  78. }