src/EventSubscriber/OrderEventSubscriber.php line 50

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 $entityManager;
  21.         private $logger;
  22.         private $mailer;
  23.         public function __construct(LockFactory $lockerLoggerInterface $lifecycleLoggerEntityManagerInterface $entityManagerMailerInterface $mailer\App\Cacher\PreSetCacher $cacherUserEventSubscriber $UserEventSubscriber)
  24.         {
  25.             $this->locker $locker;
  26.             $this->dispatcher = new  \Symfony\Component\EventDispatcher\EventDispatcher();
  27.             $this->dispatcher->addSubscriber($UserEventSubscriber);
  28.             $this->logger $lifecycleLogger;
  29.             $this->entityManager $entityManager;
  30.             $this->mailer $mailer;
  31.             $cacher->setItemName('commande');
  32.             $this->order_cacher = clone $cacher;
  33.             $cacher->setItemName('eleve');
  34.             $this->eleve_cacher = clone $cacher;
  35.             $cacher->setItemName('lifecycle');
  36.             $this->lifecycle_cacher = clone $cacher;
  37.         }
  38.         public static function getSubscribedEvents() : array
  39.         {
  40.             return [
  41.                 OrderEvent::CONFIRMED => 'onOrderConfirmed',
  42.             ];
  43.         }
  44.         public function onOrderConfirmed(OrderEvent $event)
  45.         {
  46.             #à bug aléatoire, solution aléatoire
  47.             sleep(rand(0,3));
  48.             $shopOrder $event->getShopOrder();
  49.             // Log the event
  50.             $this->logger->info(OrderEvent::CONFIRMED, [
  51.                 'shopOrder'=>$shopOrder,
  52.             ]);
  53.             $lock $this->locker->createLock('order:'.$shopOrder->getReference());
  54.             $locked $lock->acquire(true);
  55.             // $e = new \Exception;
  56.             $trace '';
  57.             // $trace = print_r($e->getTraceAsString(),true);
  58.             $trace .= '#locked '.print_r($locked,true);
  59.             $trace .= '#_GET '.print_r($_GET,true);
  60.             $trace .= '#_POST '.print_r($_POST,true);
  61.             $trace .= '#_SERVER '.print_r($_SERVER,true);
  62.             // $trace .= '#Request '.print_r(Request::createFromGlobals()->getContent(),true);
  63.             // $trace .= '#lock '.print_r($lock,true);
  64.             $this->mailer->send((new TemplatedEmail())
  65.                 ->to('gabriel@pyreweb.com')
  66.                 ->subject('Locker')
  67.                 ->textTemplate('maildebug.txt.twig')
  68.                 ->context([
  69.                     'texte'=>$shopOrder->getReference().' has a locker?'.PHP_EOL.$trace,
  70.                 ])
  71.             );
  72.             if($shopOrder->getStatus()->getCode() == 'success') {
  73.                 // $this->mailAdminAboutError($shopOrder, 'La commande n°'.$shopOrder->getReference().' a déjà été payée.');
  74.                 throw new \Error('La commande n°'.$shopOrder->getReference().' a déjà été payée.');
  75.             }
  76.             $user $event->getUser();
  77.             // Delete the cache entries
  78.             $this->lifecycle_cacher->empty();
  79.             $this->eleve_cacher->delete($user);
  80.             $this->order_cacher->delete($shopOrder);
  81.             $this->order_cacher->delete('count');
  82.     
  83.             $entityManager $this->entityManager;
  84.             $ShopOrderStatus $entityManager->getRepository(\App\Entity\ShopOrderStatus::class)->findOneBy(['code'=>'success']);
  85.             $shopOrder->setStatus($ShopOrderStatus);
  86.             //liste des crédits utilisateurs non flushés
  87.             $UserEleveCredits = new \Doctrine\Common\Collections\ArrayCollection();
  88.     
  89.             // Traitement des éléments de la commande
  90.             foreach($shopOrder->getshopOrderProducts() as $shopOrderProduct) {
  91.     
  92.                 //Mise à jour des crédits utilisateur
  93.                 // La catégorie des crédits utilisateur concernée existe-elle ?
  94.                 $cat =  $entityManager->getRepository(UserEleveCredit::class);
  95.                 $UserEleveCredit $cat->findOneWithShopOrderProduct($shopOrderProduct);
  96.                 if($UserEleveCredit == null) {
  97.                     // On vérifie s'il y a une catégorie pas encore flushée pour le user
  98.                     $UserEleveCredit $UserEleveCredits->filter(function($UserEleveCredit) use ($shopOrderProduct) {
  99.                         return $UserEleveCredit->getCategorie() == $shopOrderProduct->getCategorie();
  100.                     })->first();
  101.                     if(!$UserEleveCredit) {
  102.                         $UserEleveCredit null;
  103.                     }
  104.                 }
  105.                 // Elle n'existe pas pour ce User, on la crée
  106.                 if($UserEleveCredit == null) {
  107.                     $UserEleveCredit = new UserEleveCredit();
  108.                     $UserEleveCredit->setUser($user);
  109.                     $UserEleveCredit->setCategorie($shopOrderProduct->getCategorie());
  110.                 }
  111.                 // On ajoute les points
  112.                 $UserEleveCredit->addPoints($shopOrderProduct->getTotalPoints());
  113.                 $entityManager->persist($UserEleveCredit);
  114.                 $UserEleveCredits->add($UserEleveCredit);
  115.                 $event = new CreditEvent($UserEleveCredit);
  116.                 $event->setMovedPoints($shopOrderProduct->getTotalPoints());
  117.                 $this->dispatcher->dispatch($eventCreditEvent::ADDED);
  118.             }
  119.             $entityManager->persist($shopOrder);
  120.     
  121.             $entityManager->flush();
  122.             $lock->release();
  123.             $this->mailAdminAboutConfirmation($shopOrder);
  124.             $this->mailUserAboutConfirmation($shopOrder);
  125.         }
  126.         protected function mailAdminAboutError(ShopOrder $shopOrderstring $erreur){
  127.             $this->mailer->send((new TemplatedEmail())
  128.                     ->subject('Erreur sur une Commande')
  129.                     ->htmlTemplate('admin/mail/order_error.html.twig')
  130.                     ->context([
  131.                         'commande'=>$shopOrder,
  132.                         'erreur'=>$erreur
  133.                     ])
  134.             );
  135.         }
  136.         protected function mailAdminAboutConfirmation(ShopOrder $shopOrder){
  137.             $this->mailer->send((new TemplatedEmail())
  138.                     ->subject('Commande confirmée')
  139.                     ->htmlTemplate('admin/mail/order_confirmed.html.twig')
  140.                     ->context([
  141.                         'commande'=>$shopOrder,
  142.                     ])
  143.             );
  144.         }
  145.         protected function mailUserAboutConfirmation(ShopOrder $shopOrder){
  146.             $this->mailer->send((new TemplatedEmail())
  147.                     ->to($shopOrder->getUser()->getEmail())
  148.                     ->subject('Commande confirmée')
  149.                     ->htmlTemplate('eleve/mail/order_confirmed.html.twig')
  150.                     ->context([
  151.                         'commande'=>$shopOrder,
  152.                     ])
  153.             );
  154.         }
  155.     }