src/EventSubscriber/OrderEventSubscriber.php line 53

Open in your IDE?
  1. <?php
  2.     namespace App\EventSubscriber;
  3.     use App\Event\OrderEvent;
  4.     use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5.     use Symfony\Component\Mailer\MailerInterface;
  6.     use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  7.     use Symfony\Component\Mime\Address;
  8.     use Psr\Log\LoggerInterface;
  9.     use App\Entity\ShopOrder;
  10.     use App\Entity\ShopOrderProduct;
  11.     use App\Entity\User;
  12.     use App\Entity\UserEleveCredit;
  13.     use App\Event\CreditEvent;
  14.     use Symfony\Component\HttpFoundation\Request;
  15.     
  16.     use Doctrine\ORM\EntityManagerInterface;
  17.     use Symfony\Component\Lock\LockFactory;
  18.     class OrderEventSubscriber implements EventSubscriberInterface
  19.     {
  20.         private $logger;
  21.         private $dispatcher;
  22.         public function __construct(
  23.             private LockFactory $locker
  24.             LoggerInterface $lifecycleLogger
  25.             private EntityManagerInterface $entityManager
  26.             private MailerInterface $mailer
  27.             \App\Cacher\PreSetCacher $cacher
  28.             UserEventSubscriber $UserEventSubscriber
  29.         )
  30.         {
  31.             $this->dispatcher = new  \Symfony\Component\EventDispatcher\EventDispatcher();
  32.             $this->dispatcher->addSubscriber($UserEventSubscriber);
  33.             $this->logger $lifecycleLogger;
  34.             $cacher->setItemName('commande');
  35.             $this->order_cacher = clone $cacher;
  36.             $cacher->setItemName('eleve');
  37.             $this->eleve_cacher = clone $cacher;
  38.             $cacher->setItemName('lifecycle');
  39.             $this->lifecycle_cacher = clone $cacher;
  40.         }
  41.         public static function getSubscribedEvents() : array
  42.         {
  43.             return [
  44.                 OrderEvent::CONFIRMED => 'onOrderConfirmed',
  45.             ];
  46.         }
  47.         public function onOrderConfirmed(OrderEvent $event)
  48.         {
  49.             #à bug aléatoire, solution aléatoire
  50.             sleep(rand(0,3));
  51.             $shopOrder $event->getShopOrder();
  52.             // Log the event
  53.             $this->logger->info(OrderEvent::CONFIRMED.' '.$shopOrder->getReference(), [
  54.                 'shopOrder'=>['id'=>$shopOrder->getId(), 'reference'=>$shopOrder->getReference(), 'total'=>$shopOrder->getTotal()],
  55.             ]);
  56.             $this->logger->info(OrderEvent::CONFIRMED.' '.$shopOrder->getReference(), [
  57.                 'lock'=>'acquiring',
  58.             ]);
  59.             $lock $this->locker->createLock('order:'.$shopOrder->getReference());
  60.             $locked $lock->acquire(true);
  61.             $this->logger->info(OrderEvent::CONFIRMED.' '.$shopOrder->getReference(), [
  62.                 'lock'=>'acquired',
  63.                 'locked'=>$locked,
  64.             ]);
  65.             // $e = new \Exception;
  66.             $trace '';
  67.             // $trace = print_r($e->getTraceAsString(),true);
  68.             $trace .= '#locked '.print_r($locked,true);
  69.             $trace .= '#_GET '.print_r($_GET,true);
  70.             $trace .= '#_POST '.print_r($_POST,true);
  71.             $trace .= '#_SERVER '.print_r($_SERVER,true);
  72.             // $trace .= '#Request '.print_r(Request::createFromGlobals()->getContent(),true);
  73.             // $trace .= '#lock '.print_r($lock,true);
  74.             $this->mailer->send((new TemplatedEmail())
  75.                 ->to('gabriel@pyreweb.com')
  76.                 ->subject('Locker')
  77.                 ->textTemplate('maildebug.txt.twig')
  78.                 ->context([
  79.                     'texte'=>$shopOrder->getReference().' has a locker?'.PHP_EOL.$trace,
  80.                 ])
  81.             );
  82.             if ($shopOrder->getStatus()->getCode() == 'success') {
  83.                 // $this->mailAdminAboutError($shopOrder, 'La commande n°'.$shopOrder->getReference().' a déjà été payée.');
  84.                 throw new \Error('La commande n°'.$shopOrder->getReference().' a déjà été payée.');
  85.             }
  86.             $user $event->getUser();
  87.             // Delete the cache entries
  88.             $this->lifecycle_cacher->empty();
  89.             $this->eleve_cacher->delete($user);
  90.             $this->order_cacher->delete($shopOrder);
  91.             $this->order_cacher->delete('count');
  92.     
  93.             $entityManager $this->entityManager;
  94.             $ShopOrderStatus $entityManager->getRepository(\App\Entity\ShopOrderStatus::class)->findOneBy(['code'=>'success']);
  95.             $shopOrder->setStatus($ShopOrderStatus);
  96.             //liste des crédits utilisateurs non flushés
  97.             $UserEleveCredits = new \Doctrine\Common\Collections\ArrayCollection();
  98.     
  99.             // Traitement des éléments de la commande
  100.             /** @var \App\Entity\ShopOrderProduct */
  101.             foreach($shopOrder->getshopOrderProducts() as $shopOrderProduct) {
  102.                 $this->logger->info(OrderEvent::CONFIRMED.' '.$shopOrder->getReference(), [
  103.                     'shopOrderProduct'=>[
  104.                         'id'=>$shopOrderProduct->getId(),
  105.                         'intitule'=>$shopOrderProduct->getIntitule(),
  106.                         'categorie'=>$shopOrderProduct->getCategorie()->getIntitule(),
  107.                         'points'=>$shopOrderProduct->getPoints(),
  108.                         'quantite'=>$shopOrderProduct->getQuantite(),
  109.                     ]
  110.                 ]);
  111.     
  112.                 //Mise à jour des crédits utilisateur
  113.                 // La catégorie des crédits utilisateur concernée existe-elle ?
  114.                 $cat =  $entityManager->getRepository(UserEleveCredit::class);
  115.                 $UserEleveCredit $cat->findOneWithShopOrderProduct($shopOrderProduct);
  116.                 if($UserEleveCredit == null) {
  117.                     // On vérifie s'il y a une catégorie pas encore flushée pour le user
  118.                     $UserEleveCredit $UserEleveCredits->filter(function($UserEleveCredit) use ($shopOrderProduct) {
  119.                         return $UserEleveCredit->getCategorie() == $shopOrderProduct->getCategorie();
  120.                     })->first();
  121.                     if(!$UserEleveCredit) {
  122.                         $UserEleveCredit null;
  123.                     }
  124.                 }
  125.                 // Elle n'existe pas pour ce User, on la crée
  126.                 if($UserEleveCredit == null) {
  127.                     $UserEleveCredit = new UserEleveCredit();
  128.                     $UserEleveCredit->setUser($user);
  129.                     $UserEleveCredit->setCategorie($shopOrderProduct->getCategorie());
  130.                 }
  131.                 // On ajoute les points
  132.                 $UserEleveCredit->addPoints($shopOrderProduct->getTotalPoints());
  133.                 $entityManager->persist($UserEleveCredit);
  134.                 $UserEleveCredits->add($UserEleveCredit);
  135.                 $event = new CreditEvent($UserEleveCredit);
  136.                 $event->setMovedPoints($shopOrderProduct->getTotalPoints());
  137.                 $this->dispatcher->dispatch($eventCreditEvent::ADDED);
  138.             }
  139.             $entityManager->persist($shopOrder);
  140.     
  141.             $this->logger->info(OrderEvent::CONFIRMED.' '.$shopOrder->getReference(), [
  142.                 'flushed'=>'pending',
  143.             ]);
  144.             $entityManager->flush();
  145.             $this->logger->info(OrderEvent::CONFIRMED.' '.$shopOrder->getReference(), [
  146.                 'flushed'=>'done',
  147.             ]);
  148.             $lock->release();
  149.             $this->logger->info(OrderEvent::CONFIRMED.' '.$shopOrder->getReference(), [
  150.                 'lock'=>'released',
  151.             ]);
  152.             $this->mailAdminAboutConfirmation($shopOrder);
  153.             $this->mailUserAboutConfirmation($shopOrder);
  154.         }
  155.         protected function mailAdminAboutError(ShopOrder $shopOrderstring $erreur){
  156.             $this->mailer->send((new TemplatedEmail())
  157.                 ->subject('Erreur sur une Commande')
  158.                 ->htmlTemplate('admin/mail/order_error.html.twig')
  159.                 ->context([
  160.                     'commande'=>$shopOrder,
  161.                     'erreur'=>$erreur
  162.                 ])
  163.             );
  164.         }
  165.         protected function mailAdminAboutConfirmation(ShopOrder $shopOrder){
  166.             $this->mailer->send((new TemplatedEmail())
  167.                 ->subject('Commande confirmée')
  168.                 ->htmlTemplate('admin/mail/order_confirmed.html.twig')
  169.                 ->context([
  170.                     'commande'=>$shopOrder,
  171.                 ])
  172.             );
  173.         }
  174.         protected function mailUserAboutConfirmation(ShopOrder $shopOrder){
  175.             $this->mailer->send((new TemplatedEmail())
  176.                 ->to($shopOrder->getUser()->getEmail())
  177.                 ->subject('Commande confirmée')
  178.                 ->htmlTemplate('eleve/mail/order_confirmed.html.twig')
  179.                 ->context([
  180.                     'commande'=>$shopOrder,
  181.                 ])
  182.             );
  183.         }
  184.     }