src/EventSubscriber/CommandeChantierSubscriber.php line 129

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\CommandeChantier;
  4. use App\Entity\LivraisonChantier;
  5. use App\Entity\ProductCommande;
  6. use App\Event\Chantier\CommandeChantierCreatedEvent;
  7. use App\Event\Chantier\CommandeChantierDeletedEvent;
  8. use App\Event\Chantier\CommandeChantierUpdatedEvent;
  9. use App\Event\Chantier\LigneCommandeProductChantierCreatedEvent;
  10. use App\Event\Produit\ProductCommandeEvent;
  11. use App\Repository\LivraisonChantierRepository;
  12. use App\Service\ProductHelper;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Psr\EventDispatcher\EventDispatcherInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpFoundation\Request;
  17. class CommandeChantierSubscriber implements EventSubscriberInterface
  18. {
  19.     private LivraisonChantierRepository $livraisonChantierRepository;
  20.     private EventDispatcherInterface $eventDispatcher;
  21.     private ProductHelper $productHelper;
  22.     private EntityManagerInterface $entityManager;
  23.     public function __construct(LivraisonChantierRepository $livraisonChantierRepository,
  24.                                 EventDispatcherInterface $eventDispatcher,
  25.                                 ProductHelper $productHelper,
  26.                                 EntityManagerInterface $entityManager)
  27.     {
  28.         $this->livraisonChantierRepository $livraisonChantierRepository;
  29.         $this->eventDispatcher $eventDispatcher;
  30.         $this->productHelper $productHelper;
  31.         $this->entityManager $entityManager;
  32.     }
  33.     public static function getSubscribedEvents(): array
  34.     {
  35.         return [
  36.             CommandeChantierCreatedEvent::class => ['onCommandeCreated'100],
  37.             CommandeChantierUpdatedEvent::class => ['onCommandeUpdated'100],
  38.             CommandeChantierDeletedEvent::class => ['onCommandeDeleted'100],
  39.             LigneCommandeProductChantierCreatedEvent::class => ['onLigneCreated'100]
  40.         ];
  41.     }
  42.     public function onCommandeCreated(CommandeChantierCreatedEvent $event)
  43.     {
  44.         // Ajout de l'année en DB
  45.         $commande $event->getCommande();
  46.         $this->setAnnee($commande);
  47.         $this->addToBl($commande);
  48.     }
  49.     public function onCommandeUpdated(CommandeChantierUpdatedEvent $event)
  50.     {
  51.         // Ajout de l'année en DB
  52.         $commande $event->getCommande();
  53.         $this->setAnnee($commande);
  54.     }
  55.     public function onCommandeDeleted(CommandeChantierUpdatedEvent $event)
  56.     {
  57.         // On recalcule le ttc du BL
  58.         $commande $event->getCommande();
  59.         $bl $commande->getBonLivraison();
  60.         $bl->setTotalTtc($bl->getTotalTtc() - $commande->getMontantCommandeTtc());
  61.     }
  62.     private function setAnnee (CommandeChantier $commande) {
  63.         $semaineEncours Date('W');
  64.         $annee Date('Y');
  65.         if ($commande->getDateEnlevement() <= $semaineEncours) {
  66.             $annee++;
  67.         }
  68.         $commande->setAnneeEnlevement($annee);
  69.     }
  70.     /**
  71.      * Ajoute une commande à son BL
  72.      * Créé le BL si besoin
  73.      *
  74.      * @param CommandeChantier $commande
  75.      * @throws \Doctrine\ORM\NonUniqueResultException
  76.      */
  77.     private function addToBl (CommandeChantier $commande) {
  78.         if (!$commande->getBonLivraison()) {
  79.             // On l'ajoute au BL
  80.             /** @var LivraisonChantier $bl */
  81.             $bl $this->livraisonChantierRepository->findBl($commande->getStructure(), $commande->getDateEnlevement(), $commande->getAnneeEnlevement());
  82.             if ($bl) {
  83.                 $bl->setTotalTtc($bl->getTotalTtc() + $commande->getMontantCommandeTtc());
  84.             } else {
  85.                 // On créé le BL
  86.                 // On prend le premier jour de la semaine
  87.                 $date_enlevement date_isodate_set(date_create(), $commande->getAnneeEnlevement(), $commande->getDateEnlevement());
  88.                 $bl = new LivraisonChantier();
  89.                 $bl->setStructure($commande->getStructure())
  90.                     ->setAnnee($commande->getAnneeEnlevement())
  91.                     ->setSemaine($commande->getDateEnlevement())
  92.                     ->setTotalTtc($commande->getMontantCommandeTtc())
  93.                     ->setDateEnlevement($date_enlevement);
  94.             }
  95.             $commande->setBonLivraison($bl);
  96.         }
  97.     }
  98.     public function onLigneCreated (LigneCommandeProductChantierCreatedEvent $event) {
  99.         $ligne $event->getLigne();
  100.         $livraison $event->getLivraison();
  101.         $tarif $this->productHelper->getBestTarif($ligne->getProduct());
  102.         if (!$tarif) {
  103.             throw new \Exception("Ce produit ne possède pas de tarif");
  104.         }
  105.         $ligne->setTotalHt($tarif->getHt() * $ligne->getQuantite())
  106.             ->setTotalTtc($tarif->getTtc() * $ligne->getQuantite())
  107.             ->setTtc($tarif->getTtc())
  108.             ->setHt($tarif->getHt())
  109.             ->setTaxe($tarif->getTva())
  110.             ->setReference($tarif->getReference());
  111.         if ($livraison->getProductCommandes()->isEmpty()) {
  112.             // On créé la commande
  113.             $commande = new ProductCommande();
  114.             $commande->setLivraisonChantier($livraison)
  115.                 ->setStructure($livraison->getStructure())
  116.                 ->setFournisseur($tarif->getFournisseur())
  117.                 ->setDateLivraison($livraison->getDateEnlevement());
  118.             $commande->addLigne($ligne);
  119.             $this->entityManager->persist($commande);
  120.             $ligne->setCommande($commande);
  121.             $livraison->addProductCommande($commande);
  122.         } else {
  123.             $commande $livraison->getProductCommandes()->first();
  124.             $ligne->setCommande($commande);
  125.             $commande->addLigne($ligne);
  126.         }
  127.         // On met à jour le montant du camion
  128.         $livraison->setTotalTtc($livraison->getTotalTtc() + $tarif->getTtc() * $ligne->getQuantite());
  129.         $this->entityManager->flush();
  130.         $this->eventDispatcher->dispatch(new ProductCommandeEvent($commande, new Request()));
  131.     }
  132. }