<?phpnamespace App\EventSubscriber;use App\Entity\Erp\BaseInvoice;use App\Entity\Erp\FolderCEE;use App\Entity\Erp\FolderStatus;use App\Entity\Erp\Invoice;use App\Entity\Erp\InvoiceCreditNote;use App\Entity\Erp\Status;use App\Entity\User;use App\Service\InvoiceNumberGenerator;use Doctrine\ORM\EntityManagerInterface;use Doctrine\ORM\ORMException;use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityUpdatedEvent;use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\Security\Core\Security;class EasyAdminSubscriber implements EventSubscriberInterface{ /** * @var InvoiceNumberGenerator */ private $numberGenerator; /** * @var Security */ private $security; /** * @var EntityManagerInterface */ private $em; /** * EasyAdminSubscriber constructor. * @param InvoiceNumberGenerator $numberGenerator * @param Security $security */ public function __construct(InvoiceNumberGenerator $numberGenerator, Security $security, EntityManagerInterface $em) { $this->numberGenerator = $numberGenerator; $this->security = $security; $this->em = $em; } public static function getSubscribedEvents() { return [ BeforeEntityPersistedEvent::class => 'beforeEntityPersistedEvent', BeforeEntityUpdatedEvent::class => 'beforeEntityUpdatedEvent', AfterEntityPersistedEvent::class => 'afterEntityPersistedEvent', AfterEntityUpdatedEvent::class => 'afterEntityUpdatedEvent' ]; } public function beforeEntityPersistedEvent(BeforeEntityPersistedEvent $event) { $entity = $event->getEntityInstance(); /** * Invoice */ if ($entity instanceof Invoice) { $number = $this->numberGenerator->generate(); $createdBy = $this->security->getUser()->getFullName(); /** @var Invoice $entity */ $entity->setInvoiceNumber($number); $entity->setCreatedBy($createdBy); if (isset($_POST['Invoice']['sameAddress']) && $_POST['Invoice']['sameAddress'] === "1") { $customer = $entity->getCustomer(); $siteAddress = clone $customer->getBillingAddress(); $customer->setSiteAddress($siteAddress); } foreach ($entity->getRows() as $row) { $row->setTotalAmountExcludingTaxes($row->getUnitAmount() * $row->getQuantity()); } } else if($entity instanceof FolderCEE) { $folderCEE = $this->em->getRepository(FolderCEE::class) ->findOneBy(['invoice' => $entity->getInvoice()->getId(), 'isDeleted' => false ]); if($folderCEE != null) { throw new \Exception("Un dossier existe déjà pour cette facture"); } } } /** * @param BeforeEntityUpdatedEvent $event */ public function beforeEntityUpdatedEvent(BeforeEntityUpdatedEvent $event) { /** @var BaseInvoice $entity */ $entity = $event->getEntityInstance(); if ($entity instanceof Invoice) { if (isset($_POST['Invoice']['sameAddress']) && $_POST['Invoice']['sameAddress'] === "1") { $customer = $entity->getCustomer(); $siteAddress = clone $customer->getBillingAddress(); $customer->setSiteAddress($siteAddress); } } elseif ($entity instanceof InvoiceCreditNote) { foreach ($entity->getRows() as $row) { $row->setTotalAmountExcludingTaxes($row->getUnitAmount() * $row->getQuantity()); } } } public function afterEntityPersistedEvent(AfterEntityPersistedEvent $event) { $entity = $event->getEntityInstance(); /** * Dossier CEE */ if($entity instanceof FolderCEE) { /** * @var Status $status */ $status = $this->em->getRepository(Status::class) ->findOneBy(['status' => 'waiting_documents']); $folderStatus = new FolderStatus(); $folderStatus->setFolderCEE($entity); $folderStatus->setUser($this->getUser()); $folderStatus->setCommentaire($_POST['commentaire']); $folderStatus->setStatus($status); $folderStatus->setDate(new \DateTime()); $this->em->persist($folderStatus); $this->em->flush(); } } public function afterEntityUpdatedEvent(AfterEntityUpdatedEvent $event) { $entity = $event->getEntityInstance(); if(isset($_POST['statut']) && !empty($_POST['statut'])) { if($entity instanceof FolderCEE) { $status = $this->em->getRepository(Status::class) ->findOneBy(['id' => $_POST['statut']]); $folderStatus = new FolderStatus(); $folderStatus->setFolderCEE($entity); $folderStatus->setUser($this->getUser()); $folderStatus->setCommentaire($_POST['commentaire']); $folderStatus->setStatus($status); $folderStatus->setDate(new \DateTime()); $this->em->persist($folderStatus); $this->em->flush(); } } } private function getUser(): User { return $this->em->getRepository(User::class) ->findOneBy(['username' => $this->security->getUser()->getUsername()]); }}