<?php
namespace 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()]);
}
}