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