src/EventListener/OrderEditEventListener.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\Activity;
  4. use App\Entity\Order;
  5. use App\Entity\OrderSpecification;
  6. use App\Entity\User;
  7. use App\Enum\NotificationTopic;
  8. use App\Event\OrderEditEvent;
  9. use App\Notification\FindUserNotification;
  10. use App\Notification\MercureNotification;
  11. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  12. use Symfony\Component\Serializer\Encoder\XmlEncoder;
  13. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  14. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  15. use Symfony\Component\Serializer\Serializer;
  16. class OrderEditEventListener
  17. {
  18.     private $activities = [];
  19.     /**
  20.      * @var MercureNotification
  21.      */
  22.     private $mercureNotification;
  23.     /**
  24.      * @var FindUserNotification
  25.      */
  26.     private $findUserNotification;
  27.     public function __construct(MercureNotification $mercureNotificationFindUserNotification $findUserNotification)
  28.     {
  29.         $this->mercureNotification $mercureNotification;
  30.         $this->findUserNotification $findUserNotification;
  31.     }
  32.     public function __invoke(OrderEditEvent $orderEditEvent)
  33.     {
  34.         $activities $this->getActivities($orderEditEvent);
  35.         $encoders = [new XmlEncoder(), new JsonEncoder()];
  36.         $dateCallback = function ($innerObject$outerObjectstring $attributeNamestring $format null, array $context = []) {
  37.             return $innerObject instanceof \DateTimeInterface $innerObject->format('h:i:s a \<\/\b\r\> d-m-Y ') : '';
  38.         };
  39.         $defaultContext = [
  40.             AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object$format$context) {
  41.                 return $object->getFullName();
  42.             },
  43.             AbstractNormalizer::CALLBACKS => [
  44.                 'createdAt' => $dateCallback,
  45.             ],
  46.         ];
  47.         $normalizer = new ObjectNormalizer(nullnullnullnullnullnull$defaultContext);
  48.         $serializer = new Serializer([$normalizer], $encoders);
  49.         $data = [
  50.             'activities' => [],
  51.             'users' => $this->findUserNotification->findByOrder($orderEditEvent->getNewOrder(), $orderEditEvent->getUser()),
  52.         ];
  53.         foreach ($activities as $activity) {
  54.             $data['activities'][] = $serializer->serialize($activity'json');
  55.         }
  56.         $this->mercureNotification->notification(NotificationTopic::ORDER$data);
  57.     }
  58.     /**
  59.      * @throws \Exception
  60.      */
  61.     public function getActivities(OrderEditEvent $orderEditEvent): array
  62.     {
  63.         $now = new \DateTimeImmutable();
  64.         if (\count($this->diffOrder($orderEditEvent)) < 1) {
  65.             return [];
  66.         }
  67.         foreach ($this->diffOrder($orderEditEvent) as $item) {
  68.             $activity = new Activity();
  69.             $activity->setClassId($orderEditEvent->getOldOrder()->getId());
  70.             $activity->setClassName(Order::class);
  71.             $activity->setField($item['label']);
  72.             $activity->setNewValue($item['newValue']);
  73.             $activity->setOldValue($item['oldValue']);
  74.             $activity->setCreatedAt($now);
  75.             $activity->setCode('order_1_'.$now->format('d-m-Y-h-i-s'));
  76.             /** @var User $userCurrent */
  77.             $userCurrent $orderEditEvent->getUser();
  78.             $user = new User();
  79.             $user->setFirstName($userCurrent->getFirstName());
  80.             $user->setLastName($userCurrent->getLastName());
  81.             $activity->setUser($user);
  82.             $activity->setType($item['type']);
  83.             $activity->setView(0);
  84.             $this->activities[] = $activity;
  85.         }
  86.         return $this->activities;
  87.     }
  88.     private function diffOrder(OrderEditEvent $orderEditEvent): array
  89.     {
  90.         $items = [];
  91.         $oldOrder $orderEditEvent->getOldOrder();
  92.         $newOrder $orderEditEvent->getNewOrder();
  93.         if ($oldOrder->getName() !== $newOrder->getName()) {
  94.             $items[] = [
  95.                 'label' => 'name',
  96.                 'oldValue' => $oldOrder->getName(),
  97.                 'newValue' => $newOrder->getName(),
  98.                 'type' => 'attribute',
  99.             ];
  100.         }
  101.         if ($oldOrder->getDeliveredAt() !== $newOrder->getDeliveredAt()) {
  102.             $items[] = [
  103.                 'label' => 'deliveredAt',
  104.                 'oldValue' => $oldOrder->getDeliveredAt(),
  105.                 'newValue' => $newOrder->getDeliveredAt(),
  106.                 'type' => 'attribute',
  107.             ];
  108.         }
  109.         if ($oldOrder->getShortNote() !== $newOrder->getShortNote()) {
  110.             $items[] = [
  111.                 'label' => 'shortNote',
  112.                 'oldValue' => $oldOrder->getShortNote(),
  113.                 'newValue' => $newOrder->getShortNote(),
  114.                 'type' => 'attribute',
  115.             ];
  116.         }
  117.         if ($oldOrder->getNameNumber() !== $newOrder->getNameNumber()) {
  118.             $items[] = [
  119.                 'label' => 'nameNumber',
  120.                 'oldValue' => $oldOrder->getNameNumber(),
  121.                 'newValue' => $newOrder->getNameNumber(),
  122.                 'type' => 'attribute',
  123.             ];
  124.         }
  125.         foreach ($oldOrder->getOrderSpecifications() as $orderSpecification) {
  126.             $indexOf $newOrder->getOrderSpecifications()->indexOf($orderSpecification);
  127.             if ($indexOf) {
  128.                 /** @var OrderSpecification $orderSpecificationNew */
  129.                 $orderSpecificationNew $newOrder->getOrderSpecifications()->get($indexOf);
  130.                 if ($orderSpecificationNew->getQuantity() === $orderSpecificationNew->getQuantity()) {
  131.                     continue;
  132.                 }
  133.                 $items[] = [
  134.                     'label' => $orderSpecificationNew->getSpecification()->getName(),
  135.                     'oldValue' => $orderSpecification->getQuantity(),
  136.                     'newValue' => $orderSpecificationNew->getQuantity(),
  137.                     'type' => 'specification',
  138.                 ];
  139.             } else {
  140.                 //remove
  141.                 $items[] = [
  142.                     'label' => $orderSpecification->getSpecification()->getName(),
  143.                     'oldValue' => $orderSpecification->getQuantity(),
  144.                     'newValue' => '',
  145.                     'type' => 'specification',
  146.                 ];
  147.             }
  148.         }
  149.         //addOrderSpecifications
  150.         $list $newOrder->getOrderSpecifications()->filter(function (OrderSpecification $orderSpecification) use ($oldOrder) {
  151.             return !is_numeric($oldOrder->getOrderSpecifications()->indexOf($orderSpecification));
  152.         });
  153.         /** @var OrderSpecification $orderSpecification */
  154.         foreach ($list as $orderSpecification) {
  155.             $items[] = [
  156.                 'label' => $orderSpecification->getSpecification()->getName(),
  157.                 'oldValue' => $orderSpecification->getQuantity(),
  158.                 'newValue' => '',
  159.                 'type' => 'specification',
  160.             ];
  161.         }
  162.         return $items;
  163.     }
  164. }