src/EventSubscriber/EasyAdminSubscriber.php line 144

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Erp\BaseInvoice;
  4. use App\Entity\Erp\FolderCEE;
  5. use App\Entity\Erp\FolderStatus;
  6. use App\Entity\Erp\Invoice;
  7. use App\Entity\Erp\InvoiceCreditNote;
  8. use App\Entity\Erp\Status;
  9. use App\Entity\User;
  10. use App\Service\InvoiceNumberGenerator;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Doctrine\ORM\ORMException;
  13. use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
  14. use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityUpdatedEvent;
  15. use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
  16. use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Symfony\Component\Security\Core\Security;
  19. class EasyAdminSubscriber implements EventSubscriberInterface
  20. {
  21.     /**
  22.      * @var InvoiceNumberGenerator
  23.      */
  24.     private $numberGenerator;
  25.     /**
  26.      * @var Security
  27.      */
  28.     private $security;
  29.     /**
  30.      * @var EntityManagerInterface
  31.      */
  32.     private $em;
  33.     /**
  34.      * EasyAdminSubscriber constructor.
  35.      * @param InvoiceNumberGenerator $numberGenerator
  36.      * @param Security $security
  37.      */
  38.     public function __construct(InvoiceNumberGenerator $numberGeneratorSecurity $securityEntityManagerInterface $em)
  39.     {
  40.         $this->numberGenerator $numberGenerator;
  41.         $this->security $security;
  42.         $this->em $em;
  43.     }
  44.     public static function getSubscribedEvents()
  45.     {
  46.         return [
  47.             BeforeEntityPersistedEvent::class => 'beforeEntityPersistedEvent',
  48.             BeforeEntityUpdatedEvent::class => 'beforeEntityUpdatedEvent',
  49.             AfterEntityPersistedEvent::class => 'afterEntityPersistedEvent',
  50.             AfterEntityUpdatedEvent::class => 'afterEntityUpdatedEvent'
  51.         ];
  52.     }
  53.     public function beforeEntityPersistedEvent(BeforeEntityPersistedEvent $event)
  54.     {
  55.         $entity $event->getEntityInstance();
  56.         /**
  57.          * Invoice
  58.          */
  59.         if ($entity instanceof Invoice) {
  60.             $number $this->numberGenerator->generate();
  61.             $createdBy $this->security->getUser()->getFullName();
  62.             /** @var Invoice $entity */
  63.             $entity->setInvoiceNumber($number);
  64.             $entity->setCreatedBy($createdBy);
  65.             if (isset($_POST['Invoice']['sameAddress']) && $_POST['Invoice']['sameAddress'] === "1") {
  66.                 $customer $entity->getCustomer();
  67.                 $siteAddress = clone $customer->getBillingAddress();
  68.                 $customer->setSiteAddress($siteAddress);
  69.             }
  70.             foreach ($entity->getRows() as $row) {
  71.                 $row->setTotalAmountExcludingTaxes($row->getUnitAmount() * $row->getQuantity());
  72.             }
  73.         } else if($entity instanceof FolderCEE) {
  74.             $folderCEE $this->em->getRepository(FolderCEE::class)
  75.                 ->findOneBy(['invoice' => $entity->getInvoice()->getId(), 'isDeleted' => false ]);
  76.             if($folderCEE != null) {
  77.                 throw new \Exception("Un dossier existe déjà pour cette facture");
  78.             }
  79.         }
  80.     }
  81.     /**
  82.      * @param BeforeEntityUpdatedEvent $event
  83.      */
  84.     public function beforeEntityUpdatedEvent(BeforeEntityUpdatedEvent $event)
  85.     {
  86.         /** @var BaseInvoice $entity */
  87.         $entity $event->getEntityInstance();
  88.         if ($entity instanceof Invoice) {
  89.             if (isset($_POST['Invoice']['sameAddress']) && $_POST['Invoice']['sameAddress'] === "1") {
  90.                 $customer $entity->getCustomer();
  91.                 $siteAddress = clone $customer->getBillingAddress();
  92.                 $customer->setSiteAddress($siteAddress);
  93.             }
  94.         } elseif ($entity instanceof InvoiceCreditNote) {
  95.             foreach ($entity->getRows() as $row) {
  96.                 $row->setTotalAmountExcludingTaxes($row->getUnitAmount() * $row->getQuantity());
  97.             }
  98.         }
  99.     }
  100.     public function afterEntityPersistedEvent(AfterEntityPersistedEvent $event)
  101.     {
  102.         $entity $event->getEntityInstance();
  103.         /**
  104.          * Dossier CEE
  105.          */
  106.         if($entity instanceof FolderCEE) {
  107.             /**
  108.              * @var Status $status
  109.              */
  110.             $status $this->em->getRepository(Status::class)
  111.                 ->findOneBy(['status' => 'waiting_documents']);
  112.             $folderStatus = new FolderStatus();
  113.             $folderStatus->setFolderCEE($entity);
  114.             $folderStatus->setUser($this->getUser());
  115.             $folderStatus->setCommentaire($_POST['commentaire']);
  116.             $folderStatus->setStatus($status);
  117.             $folderStatus->setDate(new \DateTime());
  118.             $this->em->persist($folderStatus);
  119.             $this->em->flush();
  120.         }
  121.     }
  122.     public function afterEntityUpdatedEvent(AfterEntityUpdatedEvent $event)
  123.     {
  124.         $entity $event->getEntityInstance();
  125.         
  126.         if(isset($_POST['statut']) && !empty($_POST['statut'])) {
  127.             if($entity instanceof FolderCEE) {
  128.                 $status $this->em->getRepository(Status::class)
  129.                     ->findOneBy(['id' => $_POST['statut']]);
  130.                 $folderStatus = new FolderStatus();
  131.                 $folderStatus->setFolderCEE($entity);
  132.                 $folderStatus->setUser($this->getUser());
  133.                 $folderStatus->setCommentaire($_POST['commentaire']);
  134.                 $folderStatus->setStatus($status);
  135.                 $folderStatus->setDate(new \DateTime());
  136.                 $this->em->persist($folderStatus);
  137.                 $this->em->flush();
  138.             }
  139.         }
  140.     }
  141.     private function getUser(): User {
  142.         return $this->em->getRepository(User::class)
  143.             ->findOneBy(['username' => $this->security->getUser()->getUsername()]);
  144.     }
  145. }