src/EventListener/DataObjectListener.php line 39

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by Elements.at New Media Solutions GmbH
  4.  *
  5.  */
  6. namespace App\EventListener;
  7. use App\Marketplace\MarketplaceClient;
  8. use App\Model\BookingApi\Order;
  9. use App\Service\Shop\ShopService;
  10. use App\Service\SiteConfigService;
  11. use Carbon\Carbon;
  12. use Elements\Bundle\TicketShopFrameworkBundle\Service\VoucherCodeService;
  13. use GuzzleHttp\Exception\RequestException;
  14. use Pimcore\Event\Model\DataObjectEvent;
  15. use Pimcore\Log\ApplicationLogger;
  16. use Pimcore\Model\DataObject\Objectbrick\Data\OrderCustomizedMarketplace;
  17. use Pimcore\Model\DataObject\OnlineShopOrder;
  18. use Pimcore\Model\DataObject\OnlineShopOrderItem;
  19. use Psr\Log\LoggerInterface;
  20. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  21. use Symfony\Component\Routing\RouterInterface;
  22. class DataObjectListener
  23. {
  24.     public function __construct(protected LoggerInterface $bookingapiLogger,
  25.         protected VoucherCodeService $voucherCodeService,
  26.         protected ShopService $shopService,
  27.         protected SiteConfigService $siteConfigService,
  28.         protected MarketplaceClient $marketplaceClient,
  29.         protected RouterInterface $router,
  30.         protected ApplicationLogger $applicationLogger,
  31.         private ParameterBagInterface $params)
  32.     {
  33.     }
  34.     public function onPostUpdate(DataObjectEvent $e): void
  35.     {
  36.         if ($e->getArguments() && isset($e->getArguments()['saveVersionOnly']) && $e->getArguments()['saveVersionOnly'] == true) {
  37.             //do nothing for drafts
  38.             return;
  39.         }
  40.         $object $e->getObject();
  41.         if ($object instanceof OnlineShopOrder && $object->getTenant() == 'marketplace') {
  42.             //transfer complete orders to marketplace endpoint
  43.             $bookingApiOrder = new Order();
  44.             /** @phpstan-ignore-next-line */
  45.             $bookingApiOrder->setDataFromOnlineShopOrder($object$this->voucherCodeService$this->shopService$this->siteConfigService$this->router);
  46.             $orderCustomizedBrick $object->getCustomized() && $object->getCustomized()->getOrderCustomizedMarketplace() ? $object->getCustomized()->getOrderCustomizedMarketplace() : new OrderCustomizedMarketplace($object);
  47.             if ($this->orderNeedsTransmission($object)) {
  48.                 $this->transmitOrder($orderCustomizedBrick$bookingApiOrder$object);
  49.             }
  50.         } elseif ($object instanceof OnlineShopOrderItem
  51.             && $object->getParent() instanceof OnlineShopOrder
  52.             && $object->getParent()->getTenant() == 'marketplace'
  53.             && $object->getProduct() instanceof \Pimcore\Model\DataObject\TicketProduct
  54.             && $object->getCustomized()->getOrderItemCustomizedSkidata()
  55.             && $object->getCustomized()->getOrderItemCustomizedSkidata()->getOrderItemUuid()) {
  56.             //in skidata ticket transmit, the order items seems to be save after the order. This is why we need this additional check on the order item
  57.             /**
  58.              * @var OnlineShopOrder $order
  59.              */
  60.             $order $object->getParent();
  61.             if($this->orderNeedsTransmission($order)) {
  62.                 $bookingApiOrder = new Order();
  63.                 /** @phpstan-ignore-next-line */
  64.                 $bookingApiOrder->setDataFromOnlineShopOrder($order$this->voucherCodeService$this->shopService$this->siteConfigService$this->router);
  65.                 $orderCustomizedBrick $order->getCustomized() && $order->getCustomized()->getOrderCustomizedMarketplace() ? $order->getCustomized()->getOrderCustomizedMarketplace() : new OrderCustomizedMarketplace($order);
  66.                 $this->transmitOrder($orderCustomizedBrick$bookingApiOrder$order);
  67.             }
  68.         }
  69.     }
  70.     protected function orderNeedsTransmission(OnlineShopOrder $order): bool
  71.     {
  72.         $bookingApiOrder = new Order();
  73.         /** @phpstan-ignore-next-line */
  74.         $bookingApiOrder->setDataFromOnlineShopOrder($order$this->voucherCodeService$this->shopService$this->siteConfigService$this->router);
  75.         $orderCustomizedBrick $order->getCustomized() && $order->getCustomized()->getOrderCustomizedMarketplace() ? $order->getCustomized()->getOrderCustomizedMarketplace() : new OrderCustomizedMarketplace($order);
  76.         $needsTransmission false;
  77.         if ($bookingApiOrder->getOrderFinished()) {
  78.             if ($order->getOrderState() == $order::ORDER_STATE_COMMITTED && !$orderCustomizedBrick->getTransmitted()) {
  79.                 //new committed order not yet transmitted
  80.                 $needsTransmission true;
  81.             } elseif ($order->getOrderState() == $order::ORDER_STATE_CANCELLED
  82.                 && !$orderCustomizedBrick->getCancellationTransmissionPending()
  83.                 && !$orderCustomizedBrick->getTransmittedCancellation()) {
  84.                 //transmit cancellation
  85.                 $needsTransmission true;
  86.             }
  87.         }
  88.         return $needsTransmission;
  89.     }
  90.     /**
  91.      * @param OrderCustomizedMarketplace|null $orderCustomizedBrick
  92.      * @param Order $bookingApiOrder
  93.      * @param OnlineShopOrder $object
  94.      *
  95.      * @return void
  96.      */
  97.     public function transmitOrder(?OrderCustomizedMarketplace $orderCustomizedBrickOrder $bookingApiOrderOnlineShopOrder $object): void
  98.     {
  99.         $orderCustomizedBrick->setLastTransmittedDate(Carbon::now());
  100.         $log $orderCustomizedBrick->getTransmissionLog();
  101.         $success false;
  102.         try {
  103.             $log .= "\r\n";
  104.             $log .= $this->params->get('marketplace_orderpush_endpoint');
  105.             $log .= "\r\n";
  106.             try {
  107.                 $response $this->marketplaceClient->pushOrderUpdate($bookingApiOrder);
  108.                 $statusCode $response->getStatusCode();
  109.                 $bodyContent $response->getBody()->getContents();
  110.                 if ($statusCode == 200) {
  111.                     $responseData json_decode($bodyContent);
  112.                     if (isset($responseData->ok) && $responseData->ok == true) {
  113.                         $success true;
  114.                         $orderCustomizedBrick->setTransmitted(true);
  115.                         if ($object->getOrderState() == $object::ORDER_STATE_CANCELLED) {
  116.                             $orderCustomizedBrick->setTransmittedCancellation(true);
  117.                         }
  118.                     }
  119.                 }
  120.                 $log .= $statusCode "\r\n";
  121.                 $log .= $bodyContent "\r\n";
  122.                 $log .= "######### REQUEST CONTENT ##########\r\n";
  123.                 $log .= '{"order": ' json_encode($bookingApiOrder->jsonSerialize()) . '}';
  124.             } catch (RequestException $exception) {
  125.                 $body $exception->getRequest()->getBody();
  126.                 $body->rewind();
  127.                 $log .= $exception->getMessage();
  128.                 $log .= "######### REQUEST CONTENT ##########\r\n";
  129.                 $log .= $body->getContents();
  130.             }
  131.         } catch (\Throwable $throwable) {
  132.             $log .= "\r\n";
  133.             $log .= $throwable->getMessage();
  134.         }
  135.         $orderCustomizedBrick->setTransmissionLog($log);
  136.         $this->bookingapiLogger->info($log);
  137.         if (!$success) {
  138.             $this->applicationLogger->error('please check order Id' $object->getId() . ' transmission of order data to markeplace endpoint failed');
  139.         }
  140.         try {
  141.             $object->getCustomized()->setOrderCustomizedMarketplace($orderCustomizedBrick);
  142.             $object->save();
  143.         } catch (\Throwable $throwable) {
  144.             $this->bookingapiLogger->emergency('Could not save order id after transmission to marketplace' $object->getId());
  145.         }
  146.     }
  147. }