vendor/store.shopware.com/webkulmvmarketplace/src/EventSubscriber/ShopwareSubscriber.php line 40

Open in your IDE?
  1. <?php
  2. namespace Webkul\MultiVendor\EventSubscriber;
  3. use Exception;
  4. use Shopware\Core\Checkout\Cart\Order\IdStruct;
  5. use Shopware\Core\Framework\Uuid\Uuid;
  6. use Shopware\Core\Checkout\Order\OrderEvents;
  7. use Shopware\Core\Checkout\Customer\CustomerEvents;
  8. use Shopware\Core\Framework\Context;
  9. use Symfony\Component\DependencyInjection\ContainerInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  16. use Shopware\Storefront\Page\Account\Order\AccountOrderPageLoadedEvent;
  17. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  18. class ShopwareSubscriber implements EventSubscriberInterface
  19. {
  20.     private $container;
  21.     public function __construct(ContainerInterface $container)
  22.     {
  23.         $this->container $container;
  24.     }
  25.     public static function getSubscribedEvents()
  26.     {
  27.         return [
  28.             CustomerEvents::CUSTOMER_WRITTEN_EVENT => 'createCustomer',
  29.             OrderEvents::ORDER_WRITTEN_EVENT => 'createMarketplaceOrder',
  30.             AccountOrderPageLoadedEvent::class => 'orderPageLoadedEvent',
  31.             CheckoutConfirmPageLoadedEvent::class => 'onloadcheckoutpage'
  32.         ];
  33.     }
  34.     public function createCustomer(EntityWrittenEvent $event)
  35.     {
  36.         $context $event->getContext();
  37.         $storefrontHelper $this->container->get('storefront.helper');
  38.         $sellerRepository $this->container->get('marketplace_seller.repository');
  39.         $requestStack $this->container->get('request_stack');
  40.         $request $requestStack->getCurrentRequest();
  41.         $isSellerRequested $request->request->get('sellerRequest');
  42.         $isSellerRequested $isSellerRequested === "true" true false;
  43.         foreach ($event->getWriteResults() as $writeResult) {
  44.             if ($writeResult->getExistence() !== null && $writeResult->getExistence()->exists()) {
  45.                 break;
  46.             }
  47.             if ($isSellerRequested) {
  48.                 $payload $writeResult->getPayload();
  49.                 $salesChannelId $payload['salesChannelId'];
  50.                 // check for auto approval of seller
  51.                 $autoApproveSeller $storefrontHelper->getSystemConfigurationValue('WebkulMVMarketplace.config.sellerAutoApprove'$salesChannelId);
  52.                 $mpMailHelper $this->container->get('mpmail.helper');
  53.                 $id Uuid::randomHex();
  54.                 try {
  55.                     $sellerRepository->create([[
  56.                         "id" => $id,
  57.                         "isApplied" => (bool) $isSellerRequested,
  58.                         "isApproved" => (bool) $autoApproveSeller,
  59.                         "profileStatus" => (bool) $storefrontHelper->getSystemConfigurationValue('WebkulMVMarketplace.config.profileAutoApprove'$salesChannelId),
  60.                         "storeSlug" => $request->request->get('storeSlug'),
  61.                         "type" => (int) $request->request->get('sellerType'),
  62.                         "storeTitle" => $request->request->get('storeTitle'),
  63.                         "storeOwner" => $payload['firstName'] . ' ' $payload['lastName'],
  64.                         "customer" => [
  65.                             "id" => $payload['id']
  66.                         ],
  67.                     ]], $context);
  68.                 } catch (Exception $ex) {
  69.                 }
  70.                 // sending mail to admin and customer both
  71.                 try {
  72.                     $mpMailHelper->applySellerShipMailToAdmin($payload['id'], $payload['salesChannelId']);
  73.                 } catch (Exception $ex) {
  74.                 }
  75.                 // assign auto membership to seller when membership add on is active
  76.                 $membershiPlugin $this->container->get('plugin.repository')->search((new Criteria())->addFilter(new EqualsFilter('name''WebkulMPMembership'))->addFilter(new EqualsFilter('active'1)), context::createDefaultContext())->first();
  77.                 if ($membershiPlugin) {
  78.                     $membershipHelper $this->container->get('membership.helper');
  79.                     $membershipHelper->assignAutoMembershipToSeller($id);
  80.                 }
  81.             }
  82.         }
  83.         return;
  84.     }
  85.     public function createMarketplaceOrder(EntityWrittenEvent $event)
  86.     {
  87.         $requestStack $this->container->get('request_stack');
  88.         $request $requestStack->getCurrentRequest();
  89.         
  90.         if ($event->getEntityName() !== 'order' || $request->get('_route') != 'frontend.checkout.finish.order') {
  91.             return;
  92.         }
  93.         
  94.         $context $event->getContext();
  95.         foreach ($event->getWriteResults() as $writeResult) {
  96.             if ($writeResult->getExistence() !== null && $writeResult->getExistence()->exists()) {
  97.                 break;
  98.             }
  99.             $payload $writeResult->getPayload();
  100.             if (isset($payload['salesChannelId'])) {
  101.                 $salesChannelId $payload['salesChannelId'];
  102.             }
  103.             $orderRepository $this->container->get('order.repository');
  104.             $storefrontHelperService $this->container->get('storefront.helper');
  105.             $marketplaceOrderRepository $this->container->get('marketplace_order.repository');
  106.             $marketplaceProductRepository $this->container->get('marketplace_product.repository');
  107.             $marketplaceCommissionRepository $this->container->get('marketplace_commission.repository');
  108.             $sellerRepository $this->container->get('marketplace_seller.repository');
  109.             if (isset($payload['id'])) {
  110.                 $criteria = (new Criteria())
  111.                     ->addFilter(new EqualsFilter('order.id'$payload['id']))
  112.                     ->addAssociation('lineItems');
  113.                 // get order data
  114.                 $order $orderRepository->search($criteria$context)
  115.                     ->first();
  116.                 // get order initial state id
  117.                 $stateId $this->container->get('state_machine.repository')->search((new Criteria())->addFilter(new EqualsFilter('technicalName''order.state')), $context)->first();
  118.                 $lineItemsCollection $order->get('lineItems')->getElements();
  119.                 foreach ($lineItemsCollection as $lineItem) {
  120.                     $lineItemId $lineItem->getId();
  121.                     $productId $lineItem->getIdentifier();
  122.                     $quantity $lineItem->getQuantity();
  123.                     $productName $lineItem->getLabel();
  124.                     $totalPrice $lineItem->getTotalPrice();
  125.                     $lineItemTax $lineItem->getPrice()->getCalculatedTaxes()->first()->getTax();
  126.                     // get marketplace product by product id
  127.                     $criteria = (new Criteria())
  128.                         ->addFilter(new EqualsFilter('marketplace_product.productId.id'$productId))
  129.                         ->addAssociation('product');
  130.                     $marketplaceProduct $marketplaceProductRepository->search($criteria$context)
  131.                         ->first();
  132.                     // verify if product is of seller
  133.                     if ($marketplaceProduct) {
  134.                         $marketplaceProductId $marketplaceProduct->getUniqueIdentifier();
  135.                         // create marketplace order
  136.                         $data = [
  137.                             'id' => UUID::randomHex(),
  138.                             'orderLineItemId' => $lineItemId,
  139.                             'orderId' => $payload['id'],
  140.                             'orderStatus' => $stateId->get('initialStateId'),
  141.                             'currencyId' => $payload['currencyId'],
  142.                             'marketplaceProductId' => $marketplaceProductId,
  143.                         ];
  144.                         $marketplaceOrderRepository->create([$data], $context);
  145.                         // store commission details in database
  146.                         // check membership plugin
  147.                         $membershiPlugin $this->container->get('plugin.repository')->search((new Criteria())->addFilter(new EqualsFilter('name''WebkulMPMembership'))->addFilter(new EqualsFilter('active'1)), context::createDefaultContext())->first();
  148.                         if ($storefrontHelperService->getSystemConfigurationValue('WebkulMVMarketplace.config.commissionOnTax'$salesChannelId) === true) {
  149.                             $marketplaceProductPrice $totalPrice;
  150.                         } else {
  151.                             $marketplaceProductPrice $totalPrice $lineItemTax;
  152.                         }
  153.                         $commissionAmount null;
  154.                         if ($membershiPlugin) {
  155.                             $criteria = new Criteria();
  156.                             $criteria->addFilter(new EqualsFilter('seller'$marketplaceProduct['marketplaceSellerId']))->addAssociation('marketplace_membership_group');
  157.                             $memberRepository $this->container->get('marketplace_membership_members.repository');
  158.                             $membership $memberRepository->search($criteria$context)->first();
  159.                             $groupCommission $membership->get('marketplace_membership_group')->get('groupCommission');
  160.                             if ($groupCommission) {
  161.                                 $categoryIds $lineItem->getPayload()['categoryIds'];
  162.                                 foreach ($groupCommission as $commission) {
  163.                                     if (in_array($commission['category'], $categoryIds)) {
  164.                                         $commissionAmount = (($commission['percent'] * $marketplaceProductPrice) / 100) + $commission['fixed'];
  165.                                         break;
  166.                                     }
  167.                                 }
  168.                             }
  169.                         }
  170.                         if (is_null($commissionAmount)) {
  171.                             $sellerCriteria = (new Criteria())
  172.                                 ->addFilter(new EqualsFilter('marketplace_seller.id'$marketplaceProduct['marketplaceSellerId']));
  173.                             // get admin particular commission
  174.                             $adminCommission $sellerRepository->search($sellerCriteria$context)->first()->get('adminCommission');
  175.                             if ($adminCommission == null) {
  176.                                 $adminCommission $storefrontHelperService->getSystemConfigurationValue('WebkulMVMarketplace.config.commission'$salesChannelId);
  177.                             }
  178.                             $commissionAmount = (($adminCommission $marketplaceProductPrice) / 100);
  179.                         }
  180.                         $commissionDetails = [
  181.                             'isPaid' => false,
  182.                             'marketplaceOrderId' => $data['id'],
  183.                             'marketplaceSellerId' => $marketplaceProduct['marketplaceSellerId'],
  184.                             'commissionAmount' => $commissionAmount,
  185.                             'sellerEarning' => ($totalPrice $commissionAmount),
  186.                         ];
  187.                         $marketplaceCommissionRepository->create([$commissionDetails], $context);
  188.                         // check low stock and send notification to seller
  189.                         $lowStockStatus $storefrontHelperService->getSystemConfigurationValue('WebkulMVMarketplace.config.isLowStockNotify'$salesChannelId);
  190.                         if ($lowStockStatus) {
  191.                             $lowStockQty $storefrontHelperService->getSystemConfigurationValue('WebkulMVMarketplace.config.lowStockCount'$salesChannelId);
  192.                             $product $this->container->get('product.repository')->search((new Criteria())->addFilter(new EqualsFilter('id'$productId)), $context)->first();
  193.                             if ($product->getAvailableStock() < $lowStockQty) {
  194.                                 $customerId $sellerRepository->search((new Criteria())->addFilter(new EqualsFilter('id'$marketplaceProduct['marketplaceSellerId'])), $context)->first()->get('customerId');
  195.                                 $storefrontHelperService->sendLowStockMail($productName$customerId$salesChannelId);
  196.                             }
  197.                         }
  198.                     }
  199.                 }
  200.             }
  201.         }
  202.         return;
  203.     }
  204.     public function orderPageLoadedEvent(AccountOrderPageLoadedEvent $event)
  205.     {
  206.         $customerId $event->getSalesChannelContext()->getCustomer()->getId();
  207.         $criteria = new Criteria();
  208.         $criteria->addFilter(new EqualsFilter('technicalName''cancelled'));
  209.         $criteria->addAssociation('stateMachine');
  210.         $criteria->addFilter(new EqualsFilter('stateMachine.technicalName''order.state'));
  211.         $stateMachineRepository $this->container->get('state_machine_state.repository');
  212.         $cancelStateId $stateMachineRepository->search($criteriaContext::createDefaultContext())->first()->getId();
  213.         $mpOrderCriteria = new Criteria();
  214.         $mpOrderCriteria->addAssociation('order');
  215.         $mpOrderCriteria->addAssociation('order.customer');
  216.         $mpOrderCriteria->addFilter(new EqualsFilter('orderStatus'$cancelStateId));
  217.         $mpOrderCriteria->addFilter(new EqualsFilter('order.orderCustomer.customerId'$customerId));
  218.         $marketplaceOrderRepository $this->container->get('marketplace_order.repository');
  219.         $mpOrderItem $marketplaceOrderRepository->search($mpOrderCriteriaContext::createDefaultContext())->getElements();
  220.         $cancelLineItemIds = [];
  221.         $cancelOrderIds = [];
  222.         foreach ($mpOrderItem as $order) {
  223.             array_push($cancelLineItemIds$order->get('orderLineItemId'));
  224.             array_push($cancelOrderIds$order->get('orderId'));
  225.         }
  226.         $cancelMpOrderId =  array_unique($cancelOrderIds);
  227.         $marketplaceOrderRepository $this->container->get('marketplace_order.repository');
  228.         $marketplaceOrderLineItem $marketplaceOrderRepository->search((new Criteria()), Context::createDefaultContext())->getElements();
  229.         $shopwareOrder $event->getPage()->getOrders()->getElements();
  230.         foreach ($shopwareOrder as $order) {
  231.             foreach ($order->getLineItems() as $lineItem) {
  232.                 if (in_array($order->getId(), $cancelMpOrderId)) {
  233.                     if (in_array($lineItem->getId(), $cancelLineItemIds)) {
  234.                         $order->setAmountTotal($order->getAmountTotal() - $lineItem->getTotalPrice());
  235.                     }
  236.                 }
  237.                 foreach ($marketplaceOrderLineItem as $mpOrder) {
  238.                     if ($lineItem->getId() === $mpOrder->get('orderLineItemId')) {
  239.                         $lineItem->addExtension('itemStatus', new IdStruct($mpOrder->get('state_machine_state')->getName()));
  240.                     }
  241.                 }
  242.             }
  243.         }
  244.     }
  245.     public function onloadcheckoutpage(CheckoutConfirmPageLoadedEvent $event)
  246.     {
  247.         // check DHL module is active or not
  248.         $criteria = new Criteria();
  249.         $criteria->addFilter(new EqualsFilter('name''WebkulMPDhlShipping'))->addFilter(new EqualsFilter('active'1));
  250.         $pluginStatus $this->container->get('plugin.repository')->search($criteriaContext::createDefaultContext());
  251.         if ($pluginStatus->getTotal() == 0) {
  252.             $shippingMethods $this->container->get('shipping_method.repository')->search((new Criteria())->addFilter(new EqualsFilter('tags.name''MP-DHL'))->addAssociation('tags'), Context::createDefaultContext())->getElements();
  253.             foreach ($shippingMethods as $shippingMethod) {
  254.                 $dhlShippingMethodIds[] = $shippingMethod->getId();
  255.             }
  256.             if (isset($dhlShippingMethodIds)) {
  257.                 $criteria = new Criteria();
  258.                 $criteria->addFilter(new NotFilter(
  259.                     NotFilter::CONNECTION_AND,
  260.                     [
  261.                         new EqualsAnyFilter('id'$dhlShippingMethodIds)
  262.                     ]
  263.                 ))->addFilter(new EqualsFilter('active'1));
  264.                 $shippingMethodsCollection $this->container->get('shipping_method.repository')->search(
  265.                     $criteria,
  266.                     Context::createDefaultContext()
  267.                 );
  268.                 $event->getPage()->setShippingMethods($shippingMethodsCollection->getEntities());
  269.             }
  270.         }
  271.     }
  272. }