custom/static-plugins/CioFormBuilder/src/Subscriber/CheckoutConfirmSubscriber.php line 180

Open in your IDE?
  1. <?php
  2. namespace CioFormBuilder\Subscriber;
  3. use CioFormBuilder\Definition\CioForm\CioFormEntity;
  4. use CioFormBuilder\Error\CioFormBuilderBasicProductError;
  5. use CioFormBuilder\Model\CioFormBuilder;
  6. use Shopware\Core\Checkout\Cart\Cart;
  7. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  8. use Shopware\Core\Checkout\Customer\CustomerEntity;
  9. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
  10. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  11. use Shopware\Core\Content\Product\ProductEntity;
  12. use Shopware\Core\Framework\Context;
  13. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  16. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  17. use Shopware\Core\System\SystemConfig\SystemConfigService;
  18. use Shopware\Storefront\Event\StorefrontRenderEvent;
  19. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPage;
  20. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\RequestStack;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. use function PHPUnit\Framework\isInstanceOf;
  26. class CheckoutConfirmSubscriber implements EventSubscriberInterface
  27. {
  28.     private EntityRepository $productRepository;
  29.     private EntityRepository $cioFormRepository;
  30.     private ?Request $request;
  31.     private EntityRepository $orderRepository;
  32.     private EntityRepository $productManufacturerRepository;
  33.     private SystemConfigService $systemConfigService;
  34.     private TranslatorInterface $translator;
  35.     public function __construct(
  36.         RequestStack $requestStack,
  37.         EntityRepository $productRepository,
  38.         EntityRepository $cioFormRepository,
  39.         EntityRepository $orderRepository,
  40.         EntityRepository $productManufacturerRepository,
  41.         SystemConfigService $systemConfigService,
  42.         TranslatorInterface       $translator
  43.     ){
  44.         $this->request $requestStack->getCurrentRequest();
  45.         $this->productRepository $productRepository;
  46.         $this->cioFormRepository $cioFormRepository;
  47.         $this->orderRepository $orderRepository;
  48.         $this->productManufacturerRepository $productManufacturerRepository;
  49.         $this->systemConfigService $systemConfigService;
  50.         $this->translator $translator;
  51.     }
  52.     public static function getSubscribedEvents(): array
  53.     {
  54.         return [
  55.             StorefrontRenderEvent::class => 'onStorefrontRenderEvent',
  56.             CheckoutOrderPlacedEvent::class => 'onCheckoutOrderPlacedEvent',
  57.             CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinishPageLoadedEvent'
  58.         ];
  59.     }
  60.     public function onStorefrontRenderEvent(StorefrontRenderEvent $event): void
  61.     {
  62.         $formToManufacturer = [];
  63.         $manufacturerForms = [];
  64.         $setCostcenter false;
  65.         $customer $event->getSalesChannelContext()->getCustomer();
  66.         $noBasicProduct true;
  67.         $allEventProduct true;
  68.         $errors = [];
  69.         $cioCostcenter $this->systemConfigService->get('CioFormBuilder.config.eventReleaseCostcenter');
  70.         if ($customer instanceof CustomerEntity) {
  71.             if (is_array($event->getParameters()) && key_exists('page'$event->getParameters())) {
  72.                 $page $event->getParameters()['page'];
  73.                 if ($page instanceof CheckoutConfirmPage) {
  74.                     $items $page->getCart()->getLineItems();
  75.                     foreach ($items as $item) {
  76.                         $productNumber $item->getPayload()['productNumber'];
  77.                         $criteria = new Criteria();
  78.                         $criteria->addFilter(new EqualsFilter('productNumber'$productNumber));
  79.                         $criteria->addAssociation('manufacturer');
  80.                         $criteria->addAssociation('formData');
  81.                         $criteria->addAssociation('fields');
  82.                         /** @var ?ProductEntity $productEntity */
  83.                         $productEntity $this->productRepository->search($criteria$event->getContext())->first();
  84.                         if ($productEntity ){
  85.                             $customFields $productEntity->getCustomFields();
  86.                             if(isset($customFields['custom_event_basic_package']) && $customFields['custom_event_basic_package'] === true){
  87.                                 $noBasicProduct false;
  88.                             }
  89.                             if(isset($customFields['custom_event_article']) && $customFields['custom_event_article'] === true){
  90.                                 $setCostcenter true;
  91.                             }else{
  92.                                 $allEventProduct false;
  93.                             }
  94.                         }
  95.                         if ($productEntity && $productEntity->getManufacturer()) {
  96.                             $manufacturerEntity $productEntity->getManufacturer();
  97.                             if (!is_null($manufacturerEntity->getExtension('formData'))) {
  98.                                 /** @var CioFormEntity $formBuilderEntity */
  99.                                 $formBuilderEntity $manufacturerEntity->getExtension('formData');
  100.                                 if (!isset($manufacturerForms[$manufacturerEntity->getId()])) {
  101.                                     $formCriteria = new Criteria();
  102.                                     $formCriteria->addFilter(new EqualsFilter('id'$formBuilderEntity->getId()));
  103.                                     $formCriteria->addAssociation('fields');
  104.                                     $formCriteria->addAssociation('mailTemplate');
  105.                                     $formEntity $this->cioFormRepository->search($formCriteria$event->getContext())->first();
  106.                                     $formBuilder = new CioFormBuilder($formEntity);
  107.                                     if (!isset($formToManufacturer[$formEntity->getId()]) && !isset($manufacturerForms[$manufacturerEntity->getId()])) {
  108.                                         $manufacturerForms[$manufacturerEntity->getId()] = $formBuilder;
  109.                                     }
  110.                                     if (!isset($formToManufacturer[$formEntity->getId()]) || !in_array($formEntity->getId() . '_' $manufacturerEntity->getId(), $formToManufacturer)) {
  111.                                         $formToManufacturer[$formEntity->getId()][] = $formEntity->getId() . '_' $manufacturerEntity->getId();
  112.                                     }
  113.                                 }
  114.                             }
  115.                         }
  116.                     }
  117.                     if ($setCostcenter === true ){
  118.                         /** @var Cart $cart */
  119.                         $cart $event->getParameters()['page']->getCart();
  120.                         if( $noBasicProduct === true || $allEventProduct === false) {
  121.                             $cart->addErrors(new CioFormBuilderBasicProductError());
  122.                         }
  123.                         if( $noBasicProduct === true) {
  124.                             $errors[] = ['type' => 'raw''message' => 'checkout.event.noBasisProduct' ];
  125.                         }
  126.                         if( $allEventProduct === false) {
  127.                             $errors[] = ['type' => 'norm''message' => 'checkout.event.notAllEventProducts' ];
  128.                         }
  129.                     }
  130.                 }
  131.             }
  132.         }
  133.         $event->setParameter('manufacturerForms'$manufacturerForms);
  134.         $event->setParameter('formToManufacturer'$formToManufacturer);
  135.         if(!empty($errors)){
  136.             if (array_key_exists('errors'$event->getParameters())) {
  137.                 $event->setParameter('errors'array_merge($event->getParameters()['errors'], $errors));
  138.             } else {
  139.                 $event->setParameter('errors'$errors);
  140.             }
  141.         }
  142.         if($setCostcenter && !empty($cioCostcenter)){
  143.             $event->setParameter('cio_costcenter'$cioCostcenter);
  144.         }
  145.     }
  146.     public function onCheckoutOrderPlacedEvent(CheckoutOrderPlacedEvent $event): void
  147.     {
  148.         $request $this->request->request;
  149.         $order $event->getOrder();
  150.         $customFields $order->getCustomFields();
  151.         if ($this->request && $request->get('cioFormManufactorerIds') &&
  152.             $order->getTransactions()->first() instanceof OrderTransactionEntity &&
  153.             $order->getTransactions()->first()->getPaymentMethod() instanceof PaymentMethodEntity &&
  154.             $order->getTransactions()->first()->getPaymentMethod()->getName() == 'Kostenstelle Event'
  155.         ) {
  156.             $cioFormManufactorerIds = (array)$request->get('cioFormManufactorerIds');
  157.             $manufacturerForm = [];
  158.             $formIds = [];
  159.             $i 0;
  160.             foreach ($cioFormManufactorerIds as $formManIds) {
  161.                 $form = [];
  162.                 $tmp explode('_'$formManIds);
  163.                 if (count($tmp) == 2) {
  164.                     $formEntity $this->getCioFormById($tmp[0], $event->getContext());
  165.                     if (!is_null($formEntity)) {
  166.                         $fields $formEntity->getFields();
  167.                         if(!in_array($tmp[0] , $formIds)){
  168.                             $formIds[] = $tmp[0];
  169.                             $form = [
  170.                                 'id' => $tmp[0],
  171.                                 'name' => $formEntity->getName(),
  172.                                 'description' => $formEntity->getDescription(),
  173.                                 'fields' => []
  174.                             ];
  175.                             foreach ($fields as $key => $field) {
  176.                                 $form['fields'][] = [
  177.                                     'id' => $key,
  178.                                     'position' => intval($field->getPosition()),
  179.                                     'name' => $field->getLabel(),
  180.                                     'value' => $request->get($key),
  181.                                     'required' => $field->getRequired(),
  182.                                     'type' => $field->getType()
  183.                                 ];
  184.                             }
  185.                             $dataColumns  array_column($form['fields'], 'position');
  186.                             array_multisort($dataColumns,SORT_ASC$form['fields']);
  187.                             $manufacturerForm['form'][] = $form;
  188.                         }
  189.                         $manufacturerForm['manufacturer'][] = [
  190.                             'id' => $tmp[1],
  191.                             'name' => $this->getManufacturerNameById($tmp[1], $event->getContext()),
  192.                             'formId' => $tmp[0],
  193.                         ];
  194.                     }
  195.                 }
  196.             }
  197.             $customFields['dynamicForms'] = $manufacturerForm;
  198.             $event->getOrder()->setCustomFields($customFields);
  199.             try {
  200.                 $this->orderRepository->update([
  201.                     [
  202.                         'id' => $event->getOrder()->getId(),
  203.                         'customFields' => $customFields
  204.                     ]
  205.                 ], $event->getContext());
  206.             } catch (\Throwable $e) {
  207.             }
  208.         }
  209.     }
  210.     public function getCioFormById(string $formId$context): ?CioFormEntity
  211.     {
  212.         $criteria = new Criteria();
  213.         $criteria->addFilter(new EqualsFilter('id'$formId));
  214.         $criteria->addAssociation('fields');
  215.         $criteria->addAssociation('mailTemplate');
  216.         $criteria->addSorting(new FieldSorting('fields.position'FieldSorting::ASCENDING));
  217.         $formEntity $this->cioFormRepository->search($criteria$context)->first();
  218.         if ($formEntity instanceof CioFormEntity) {
  219.             return $formEntity;
  220.         }
  221.         return null;
  222.     }
  223.     public function onCheckoutFinishPageLoadedEvent(CheckoutFinishPageLoadedEvent $event)
  224.     {
  225.         $orderEntity $event->getPage()->getOrder();
  226.         $customFields $orderEntity->getCustomFields();
  227.         $manufacturerForms = [];
  228.         if (isset($customFields['dynamicForms'])) {
  229.             $formData = [];
  230.             $dynamicForms $customFields['dynamicForms'];
  231.             foreach ($dynamicForms['form'] as $form) {
  232.                 $formEntity $this->getCioFormById($form['id'], $event->getContext());
  233.                 $formBuilder = new CioFormBuilder($formEntity);
  234.                 if(!isset($formData[$formEntity->getId()])){
  235.                     $formData[$formEntity->getId()] = $form;
  236.                     $manufacturerForms[] = $formBuilder->buildEmailDataFromArray($form);
  237.                 }
  238.             }
  239.             $event->getPage()->assign([
  240.                 'formData' => $formData,
  241.                 'manufacturerForms' => $manufacturerForms
  242.             ]);
  243.         }
  244.     }
  245.     private function getManufacturerNameById(string $manufacturerIdContext $context)
  246.     {
  247.         $criteria = new Criteria();
  248.         $criteria->addFilter(new EqualsFilter('id'$manufacturerId));
  249.         $formEntity $this->productManufacturerRepository->search($criteria$context)->first();
  250.         if ($formEntity instanceof CioFormEntity) {
  251.             return $formEntity->getTranslation('name');
  252.         }
  253.         return null;
  254.     }
  255. }