custom/plugins/CioBudget/src/Subscriber/BudgetShiftOrderPlacedCustomFieldSubscriber.php line 50

Open in your IDE?
  1. <?php
  2. namespace CioBudget\Subscriber;
  3. use CioBudget\Service\BudgetLoaderService;
  4. use CioBudget\Service\SessionService;
  5. use Shopware\Core\Checkout\Order\OrderEntity;
  6. use Shopware\Core\Checkout\Order\OrderEvents;
  7. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  8. use Shopware\Core\Framework\Api\Context\AdminApiSource;
  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\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. class BudgetShiftOrderPlacedCustomFieldSubscriber implements EventSubscriberInterface
  16. {
  17.     public const CUSTOM_FIELD_BUDGET_NAME_SAVE_ON_ORDER = 'custom_field_budget_name_save_on_order';
  18.     private EntityRepositoryInterface $paymentMethodRepository;
  19.     private BudgetLoaderService $budgetLoaderService;
  20.     private SessionService $sessionService;
  21.     private EntityRepositoryInterface $orderRepository;
  22.     public function __construct(
  23.         EntityRepositoryInterface $paymentMethodRepository,
  24.         BudgetLoaderService       $budgetLoaderService,
  25.         SessionService            $sessionService,
  26.         EntityRepositoryInterface $orderRepository
  27.     )
  28.     {
  29.         $this->paymentMethodRepository = $paymentMethodRepository;
  30.         $this->budgetLoaderService = $budgetLoaderService;
  31.         $this->sessionService = $sessionService;
  32.         $this->orderRepository = $orderRepository;
  33.     }
  34.     public static function getSubscribedEvents(): array
  35.     {
  36.         return [
  37.             OrderEvents::ORDER_WRITTEN_EVENT => 'onCheckoutFinishPageLoaded'
  38.         ];
  39.     }
  40.     public function onCheckoutFinishPageLoaded(EntityWrittenEvent $event)
  41.     {
  42.         // if context is admin do nothing
  43.         if ($event->getContext()->getSource() instanceof AdminApiSource) {
  44.             return;
  45.         }
  46.         $writeResults = $event->getWriteResults();
  47.         if (!empty($writeResults) && isset($writeResults[0]) && isset($writeResults[0]->getPayload()['id'])) {
  48.             $orderId = $writeResults[0]->getPayload()['id'];
  49.             // Überprüfen, ob $orderId nicht leer ist
  50.             if (!empty($orderId)) {
  51.                 $criteria = (new Criteria())
  52.                     ->addFilter(new EqualsFilter('id', $orderId))
  53.                     ->addAssociation('transactions');
  54.                 $order = $this->orderRepository->search($criteria, $event->getContext())->first();
  55.                 $paymentMethods = $order->getTransactions()->getPaymentMethodIds();
  56.                 foreach ($paymentMethods as $paymentMethod) {
  57.                     /** @var PaymentMethodEntity $paymentMethod */
  58.                     if ($paymentMethod === $this->getBudgetPaymentMethodId()) {
  59.                         $budget = $this->budgetLoaderService->getBudgetById($this->sessionService->getBudgetIdFromSession());
  60.                         if (!is_null($budget)) {
  61.                             $customFields = $order->getCustomFields() ?? [];
  62.                             if (!array_key_exists(self::CUSTOM_FIELD_BUDGET_NAME_SAVE_ON_ORDER, $customFields)) {
  63.                                 $customFields[self::CUSTOM_FIELD_BUDGET_NAME_SAVE_ON_ORDER] = $budget->getName();
  64.                                 $data = [
  65.                                     [
  66.                                         'id' => $order->getId(),
  67.                                         'customFields' => $customFields
  68.                                     ]
  69.                                 ];
  70.                                 $this->orderRepository->upsert($data, $event->getContext());
  71.                             }
  72.                         }
  73.                     }
  74.                 }
  75.             }
  76.         }
  77.     }
  78.     private function getBudgetPaymentMethodId(): ?string
  79.     {
  80.         $paymentCriteria = (new Criteria())->addFilter(new EqualsFilter('name', 'budget'));
  81.         return $this->paymentMethodRepository->searchIds($paymentCriteria, Context::createDefaultContext())->firstId();
  82.     }
  83. }