custom/plugins/CogiAdvancedDeliveryDate/src/Subscriber/OrderSubscriber.php line 121

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Cogi\CogiAdvancedDeliveryDate\Subscriber;
  3. use Exception;
  4. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  5. use Shopware\Core\Checkout\Cart\Order\CartConvertedEvent;
  6. use Shopware\Core\Checkout\Customer\CustomerEntity;
  7. use Shopware\Core\Checkout\Order\OrderEntity;
  8. use Shopware\Core\Checkout\Order\OrderEvents;
  9. use Shopware\Core\Framework\Context;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  13. use Shopware\Core\System\SystemConfig\SystemConfigService;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\Session\Session;
  16. use webkon\ClickAndCollect\webkonClickAndCollect6;
  17. class OrderSubscriber implements EventSubscriberInterface {
  18.     /**
  19.      * @var SystemConfigService
  20.      */
  21.     private $systemConfigService;
  22.     /**
  23.      * @var EntityRepositoryInterface
  24.      */
  25.     private $orderRepository;
  26.     /**
  27.      * @var EntityRepositoryInterface
  28.      */
  29.     private $customerRepository;
  30.     /**
  31.      * @var Session
  32.      */
  33.     private $session;
  34.     public function __construct(SystemConfigService       $systemConfigService,
  35.                                 Session                   $session,
  36.                                 EntityRepositoryInterface $orderRepository,
  37.                                 EntityRepositoryInterface $customerRepository) {
  38.         $this->systemConfigService $systemConfigService;
  39.         $this->session $session;
  40.         $this->orderRepository $orderRepository;
  41.         $this->customerRepository $customerRepository;
  42.     }
  43.     public static function getSubscribedEvents(): array {
  44.         return [
  45.             CartConvertedEvent::class => 'onOrderPlaced',
  46.             OrderEvents::ORDER_WRITTEN_EVENT => "onOrderWritten"
  47.         ];
  48.     }
  49.     /**
  50.      * @param CartConvertedEvent $event
  51.      * @deprecated Replaced with onOrderWritten event
  52.      */
  53.     public function onOrderPlaced(CartConvertedEvent $event) {
  54.         $convertedCart $event->getConvertedCart();
  55.         $config $this->systemConfigService->get('CogiAdvancedDeliveryDate.config'$convertedCart['salesChannelId']);
  56.         $currentContext $event->getContext();
  57.         // this event is just for shops with pickup
  58.         if ($config['pickupActive'] !== true) return;
  59.         $customer $this->getCustomer($convertedCart['orderCustomer']['customerId'], $currentContext);
  60.         $shippingMethodIds array_filter(array_map(function (array $orderDelivery) {
  61.             return $orderDelivery['shippingMethodId'];
  62.         }, $convertedCart['deliveries']));
  63.         $deliveryDate $this->session->get('cogiAdvancedDeliveryDate'null);
  64.         // region validate config rules
  65.         if (in_array($customer->getGroupId(), $config['disabledCustomerGroups'] ?? []))
  66.             $deliveryDate null;
  67.         if (in_array(array_values($shippingMethodIds)[0], $config['disabledShippingMethods'] ?? []))
  68.             $deliveryDate null;
  69.         // endregion
  70.         // set default date if necessary
  71.         if ($config['setDefaultDate'] && !$deliveryDate) {
  72.             $startTime time() + ($config['minDays'] * 86400);
  73.             // skip to next day if hour is exceeded
  74.             if (isset($config['timeExceeded']) && strtotime(date('H:i')) > strtotime(date($config['timeExceeded']))) {
  75.                 $startTime += 86400;
  76.             }
  77.             $deliveryDate date('d.m.Y'$startTime);
  78.         }
  79.         if ($deliveryDate) {
  80.             $customFields = array();
  81.             $customFields['cogiAdvancedDeliveryDate'] = date('Y-m-d'strtotime($deliveryDate));
  82.             // check for pickup
  83.             if ($this->isPickupActive($configarray_values($shippingMethodIds)[0])) {
  84.                 $deliveryPickupHour $this->session->get('cogiAdvancedDeliveryPickupHour'null);
  85.                 $customFields['cogiAdvancedDeliveryDateIsPickup'] = true;
  86.                 $customFields['cogiAdvancedDeliveryDate'] .= {$deliveryPickupHour}";
  87.             }
  88.             $convertedCart['customFields'] = $customFields;
  89.             $event->setConvertedCart($convertedCart);
  90.         }
  91.         $this->session->remove('cogiAdvancedDeliveryDate');
  92.         $this->session->remove('cogiAdvancedDeliveryPickupHour');
  93.     }
  94.     /**
  95.      * @param EntityWrittenEvent $event
  96.      * @deprecated Replaced with onOrderWritten event
  97.      */
  98.     public function onOrderWritten(EntityWrittenEvent $event) {
  99.         $context $event->getContext();
  100.         // hast writeResult
  101.         foreach ($event->getWriteResults() as $_key => $writeResult) {
  102.             if ($writeResult->getExistence() !== null && $writeResult->getExistence()->exists()) {
  103.                 break;
  104.             }
  105.             $payload $writeResult->getPayload();
  106.             if (empty($payload)) {
  107.                 continue;
  108.             }
  109.             /** @var EntitySearchResult $orderResult */
  110.             $orderResult $this->orderRepository->search(
  111.                 (new Criteria([$payload['id']]))->addAssociation('orderCustomer'),
  112.                 $context
  113.             );
  114.             /** @var OrderEntity $order */
  115.             $order $orderResult->first();
  116.             $config $this->systemConfigService->get('CogiAdvancedDeliveryDate.config'$order->getSalesChannelId());
  117.             // this event is just for shops WITHOUT pickup
  118.             if ($config['pickupActive'] === true) return;
  119.             $customer $this->getCustomer($order->getOrderCustomer()->getCustomerId(), $context);
  120.             $deliveryDate $this->session->get('cogiAdvancedDeliveryDate');
  121.             // validate customer group
  122.             if (in_array($customer->getGroupId(), $config['disabledCustomerGroups'] ?? []))
  123.                 $deliveryDate null;
  124.             // set default date if necessary
  125.             if ($config['setDefaultDate'] && !$deliveryDate) {
  126.                 $startTime time() + ($config['minDays'] * 86400);
  127.                 // skip to next day if hour is exceeded
  128.                 if (isset($config['timeExceeded']) && strtotime(date('H:i')) > strtotime(date($config['timeExceeded']))) {
  129.                     $startTime += 86400;
  130.                 }
  131.                 $deliveryDate date('d.m.Y'$startTime);
  132.             }
  133.             if ($deliveryDate) {
  134.                 $customFields $order->getCustomFields();
  135.                 $customFields['cogiAdvancedDeliveryDate'] = date('Y-m-d'strtotime($deliveryDate));
  136.                 $data = [
  137.                     'id' => $payload['id'],
  138.                     'customFields' => $customFields
  139.                 ];
  140.                 $this->orderRepository->update([$data], $event->getContext());
  141.             }
  142.             $this->session->remove('cogiAdvancedDeliveryDate');
  143.             $this->session->remove('cogiAdvancedDeliveryPickupHour');
  144.         }
  145.         return;
  146.     }
  147.     private function getDisabledDays(array $config) {
  148.         $disabledHolidayDates = [];
  149.         foreach (json_decode(file_get_contents(__DIR__ '/../Resources/holidays.json')) as $key => $item) {
  150.             if (in_array($item$config['holidayDatesDisabled'] ?? [])) {
  151.                 $disabledHolidayDates[] = date('d.m.Y'strtotime($key));
  152.             }
  153.         }
  154.         return array_merge($disabledHolidayDatesexplode("\n"$config['datesDisabled']));
  155.     }
  156.     /**
  157.      * @param array $config
  158.      * @param $currentShippingMethodId
  159.      * @return bool
  160.      */
  161.     private function isPickupActive(array $config$currentShippingMethodId) {
  162.         return $config['pickupActive'] === true && $currentShippingMethodId === $config['pickupShippingMethod'];
  163.     }
  164.     /**
  165.      * @param string $id
  166.      * @param Context $context
  167.      * @return false|CustomerEntity
  168.      */
  169.     private function getCustomer(string $idContext $context) {
  170.         $customerData $this->customerRepository->search(new Criteria([$id]), $context);
  171.         if ($customerData->getTotal() === 0) return false;
  172.         return $customerData->first();
  173.     }
  174. }