src/Elements/Bundle/DemiFrontendBundle/Controller/BrochureController.php line 58

Open in your IDE?
  1. <?php
  2. /**
  3.  * Elements DeMI
  4.  *
  5.  * This source file is available under the elements DeMI license version 1
  6.  *
  7.  *  @copyright  Copyright (c) elements.at New Media Solutions GmbH (https://www.elements.at/)
  8.  *  @license    elements DeMI Lizenz Version 1 (https://www.elements.at/de/demi-lizenz)
  9.  */
  10. namespace Elements\Bundle\DemiFrontendBundle\Controller;
  11. use Carbon\Carbon;
  12. use Elements\Bundle\DemiFrontendBundle\Service\BrochureSearchFrontend;
  13. use Elements\Bundle\DemiFrontendBundle\Service\CartItemInfo;
  14. use Elements\Demi\Frontend\Service\Configuration;
  15. use Elements\Bundle\DemiFrontendBundle\Service\DemiUrl;
  16. use Elements\Bundle\DemiFrontendBundle\Service\DesklineCart;
  17. use Elements\Bundle\DemiFrontendBundle\Service\EcommerceHelper;
  18. use Elements\Bundle\DemiFrontendBundle\Service\Newsletter;
  19. use Elements\Bundle\DemiFrontendBundle\Service\Redirect;
  20. use Elements\Bundle\DemiFrontendBundle\Service\Validation;
  21. use Elements\Demi\DataObject\AbstractCustomer;
  22. use Elements\Demi\Deskline\Config;
  23. use Elements\Demi\Deskline\Constant\PaymentMethodInterface;
  24. use Elements\Demi\Info\CartItemInfoHolder;
  25. use Elements\Demi\Model\Language;
  26. use Elements\Demi\Model\ShopItem;
  27. use Exception;
  28. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  29. use Pimcore\Db;
  30. use Pimcore\Localization\LocaleService;
  31. use Pimcore\Model\DataObject\DemiShopItem;
  32. use Pimcore\Model\DataObject\DemiShopItemGroup\Listing;
  33. use Pimcore\Tool\DeviceDetector;
  34. use Symfony\Component\HttpFoundation\Request;
  35. use Symfony\Component\HttpFoundation\Response;
  36. use Symfony\Component\Security\Core\User\UserInterface;
  37. class BrochureController extends BookingController
  38. {
  39.     public const BROCHURE_CART_NAME 'demi_brochures';
  40.     protected array $owners = [];
  41.     protected array $dbCodes = [];
  42.     protected array $langauges = [];
  43.     protected array $groupIds = [];
  44.     public function __construct(EcommerceHelper                  $ecommerceHelperValidation $validationServiceRedirect $redirectServiceCartItemInfo $cartItemInfoService,
  45.                                 Configuration                    $configuration, protected DemiUrl $demiUrl, protected LocaleService $locale, protected DesklineCart $desklineCartHelper,
  46.                                 protected BrochureSearchFrontend $brochureSearchFrontend, protected ?Newsletter $newsletterHandler null, protected ?string $fallbackBrochureOwner null)
  47.     {
  48.         parent::__construct($ecommerceHelper$validationService$redirectService$cartItemInfoService$configuration);
  49.         $this->initFilters();
  50.     }
  51.     public function overviewAction(Request $requestbool $listOnly false): array|Response
  52.     {
  53.         if($listOnly){
  54.             $this->addResponseHeader('X-Robots-Tag''noindex,nofollow');
  55.         }
  56.         $selectedLanguages $request->get('languages-filter');
  57.         $selectedGroups $request->get('type');
  58.         $allowedOwners $this->owners;
  59.         $editableSelectedOwner =$this->getDocumentEditable('select''owner')->getData();
  60.         if ($editableSelectedOwner !== null && $editableSelectedOwner !== 'undefined') {
  61.             $allowedOwners = [$editableSelectedOwner];
  62.         }
  63.         $selectedOwner $editableSelectedOwner !== null && $editableSelectedOwner !== 'undefined' ?
  64.             [$editableSelectedOwner] : $this->owners;
  65.         if ($request->get('owner') && in_array($request->get('owner'), $allowedOwnerstrue)) {
  66.             //only allow filtering of owners which are included/allowed by document
  67.             $selectedOwner = [$request->get('owner')];
  68.         }
  69.         $predefinedHolidaythemes $this->getDocumentEditable('relations''included-themes')->getData();
  70.         $themeIds $request->get('holidayThemeIds');
  71.         if (!empty($predefinedHolidaythemes) && empty($themeIds)) {
  72.             foreach ($predefinedHolidaythemes as $predefinedHolidaytheme) {
  73.                 $themeIds[] = $predefinedHolidaytheme->getId();
  74.             }
  75.         }
  76.         $selectedLanguage $this->locale->getLocale();
  77.         $selectedLanguage = (is_array($selectedLanguages) && !in_array($this->locale->getLocale(), $selectedLanguagestrue)) ? $selectedLanguages[0] : $selectedLanguage;
  78.         $this->brochureSearchFrontend->setLanguages($selectedLanguages ?? [$selectedLanguage]);
  79.         $selectedGroup = !empty($selectedGroups) ? $selectedGroups[0] : null;
  80.         $this->brochureSearchFrontend->setShopItemGroupIds($selectedGroups ?? []);
  81.         $error $this->ecommerceHelper->getError();
  82.         $this->ecommerceHelper->setError('');
  83.         $this->brochureSearchFrontend->setObjects(null);
  84.         $this->brochureSearchFrontend->applyCustomFiltering();
  85.         $this->brochureSearchFrontend->applyCustomSorting();
  86.         $brochures $this->brochureSearchFrontend->getObjectListing($selectedOwnertrue);
  87.         $brochures $brochures->getObjects();
  88.         $variantLanguages = [];
  89.         if (is_array($brochures)) {
  90.             foreach ($brochures as $b) {
  91.                 foreach ($b->getVariants() as $v) {
  92.                     $variantLanguages[] = $v->getVariationLanguage();
  93.                 }
  94.             }
  95.         }
  96.         $variantLanguages array_unique($variantLanguages);
  97.         $availableLanguageObjects = [];
  98.         foreach ($this->langauges as $language) {
  99.             $availableLanguages[] = $language;
  100.             $o Language::getByFid($language);
  101.             //only use languages available in the overall result set
  102.             if ($o instanceof Language and in_array($o->getFid(), $variantLanguages)) {
  103.                 $availableLanguageObjects[] = $o;
  104.             }
  105.         }
  106.         uasort($brochures, static function (ShopItem $brochureAShopItem $brochureB) {
  107.             if (($brochureA->getGroup() && $brochureB->getGroup()) && ($brochureA->getGroup()->getOrder() - $brochureB->getGroup()->getOrder() !== 0)) {
  108.                 return $brochureA->getGroup()->getOrder() - $brochureB->getGroup()->getOrder();
  109.             }
  110.             return $brochureA->getOrder() - $brochureB->getOrder();
  111.         });
  112.         $viewParams['selectedOwner'] = $request->get('owner') ?? [];
  113.         $ownerSelect[] = ['undefined''--------'];
  114.         foreach ($this->owners as $owner) {
  115.             $ownerSelect[] = [$owner$owner];
  116.         }
  117.         $brochureIds array_map(static function ($brochure) {
  118.             if (!$brochure->getParent() instanceof DemiShopItem) {
  119.                 return $brochure->getId();
  120.             }
  121.         }, $brochures);
  122.         $groups = new Listing();
  123.         $groups->addConditionParam('o_id in (' implode(','$this->groupIds) . ") and o_id in (select dest_id from
  124.         object_relations_{$this->brochureSearchFrontend->getClassId()} where src_id in (" implode(','$brochureIds) . '))');
  125.         $groups->setOrder('order ASC');
  126.         $viewParams['ownersForSelect'] = $ownerSelect;
  127.         $viewParams['owners'] = $this->owners;
  128.         $viewParams['brochureList'] = $brochures;
  129.         $viewParams['availableLanguages'] = array_unique($availableLanguages); //compatibility (unused in standard)
  130.         $viewParams['availableLanguageObjects'] = array_unique($availableLanguageObjects);
  131.         $viewParams['selectedLanguages'] = $selectedLanguages ?: [];
  132.         $viewParams['selectedLanguage'] = $selectedLanguage;
  133.         $viewParams['availableGroups'] = $groups->getObjects();
  134.         $viewParams['selectedGroups'] = $selectedGroups ?: [];
  135.         $viewParams['selectedGroup'] = $selectedGroup;
  136.         $viewParams['currentLanguage'] = $this->locale->getLocale();
  137.         $viewParams['error'] = $error 'demi.booking.error.' $error null;
  138.         $deviceDetector DeviceDetector::getInstance();
  139.         $device $deviceDetector?->isPhone() ? 'mobile' 'desktop';
  140.         if (!$listOnly) {
  141.             return $this->renderTemplate('@ElementsDemiFrontend/Brochure/overview.'.$device.'.html.twig'$viewParams);
  142.         }
  143.         return $viewParams;
  144.     }
  145.     public function listAction(Request $request): Response
  146.     {
  147.         return $this->renderTemplate('@ElementsDemiFrontend/Brochure/list.html.twig'$this->overviewAction($requesttrue));
  148.     }
  149.     public function prepareCheckoutAction(Request $request): void
  150.     {
  151.         $this->addResponseHeader('X-Robots-Tag''noindex,nofollow');
  152.         $brochures $request->get('prospekte');
  153.         $languages $request->get('language');
  154.         $count $request->get('count');
  155.         $now = new Carbon();
  156.         $cart $this->ecommerceHelper->clear();
  157.         foreach ($brochures as $brochure) {
  158.             $product DemiShopItem::getById($brochure);
  159.             $brocount = (int)$count[$brochure];
  160.             $language $languages[$brochure];
  161.             $cartItemInfo = new CartItemInfoHolder();
  162.             $cartItemInfo->setCurrency(Factory::getInstance()->getEnvironment()->getDefaultCurrency()->getShortName());
  163.             $cartItemInfo->setDateFrom($now);
  164.             $cartItemInfo->setDateTo($cartItemInfo->getDateFrom());
  165.             $cartItemInfo->setDbCode($product->getDataBaseCode());
  166.             $cartItemInfo->setType($language);
  167.             $cartItemInfo->setSettlerCode($product->getOwner());
  168.             $this->ecommerceHelper->addProductToCart($brocount$product$cartItemInfo$cart);
  169.         }
  170.     }
  171.     public function step1Action(Request $requestUserInterface $user null) : Response
  172.     {
  173.         Factory::getInstance()->getEnvironment()->setCustomItem('demi_cartName'self::BROCHURE_CART_NAME);
  174.         if ($request->get('clear')) {
  175.             $this->prepareCheckoutAction($request);
  176.         }
  177.         $this->addResponseHeader('X-Robots-Tag''noindex,nofollow');
  178.         $cart $this->ecommerceHelper->getCart();
  179.         $error $this->ecommerceHelper->getError();
  180.         $this->ecommerceHelper->setError('');
  181.         $manager Factory::getInstance()->getCheckoutManager($cart);
  182.         $env Factory::getInstance()->getEnvironment();
  183.         $language $request->get('_locale');
  184.         $cartItems $cart->getItems();
  185.         if(!empty($cartItems)){
  186.             Config::setClientKeyOverrideFromObject(reset($cartItems)->getProduct());
  187.         }
  188.         $desklineCartService $this->desklineCartHelper->getDesklineCartService($cart);
  189.         if ($this->getDocumentEditable('select','owner') === null || $this->getDocumentEditable('select','owner')->getData() === null) {
  190.             $this->ecommerceHelper->setError('no-owner-given');
  191.             return $this->redirect($this->configuration->getBrochurePath()?->getFullPath());
  192.         }
  193.         try {
  194.             $selectedOwner $this->getDocumentEditable('select','owner')->getData() !== 'undefined' $this->getDocumentEditable('select','owner')->getData() : $this->fallbackBrochureOwner;
  195.             // we need to check in brochures with a different originator according to their settlerCode in order to mark
  196.             // them for the right salesPoint at deskline.
  197.             $desklineCart $desklineCartService->createCart($language$selectedOwner);
  198.         } catch (Exception $exception) {
  199.             $this->ecommerceHelper->setError('create-deskline-cart');
  200.             return $this->redirect($this->configuration->getBrochurePath()?->getFullPath());
  201.         }
  202.         /** @var ShopItem $firstProduct */
  203.         $firstProduct $this->ecommerceHelper->getFirstProductFromCart($cart);
  204.         $organisationInformation $desklineCartService->getOrganisationForSettler($firstProduct->getOwner(), $this->locale->getLocale());
  205.         $desklineCart->setOrganisationInformation($organisationInformation);
  206.         $paymentInfoStep $manager->getCheckoutStep('paymentInfo');
  207.         $choosableMethods = ['free-brochure' => PaymentMethodInterface::NO_PAYMENT];
  208.         $selectedPaymentMethod PaymentMethodInterface::NO_PAYMENT;
  209.         $manager->commitStep($paymentInfoStep, ['paymentMethod' => $selectedPaymentMethod]);
  210.         $env->setCustomItem('desklineCart'$desklineCart);
  211.         $env->save();
  212.         $shopItems = [];
  213.         $languages = [];
  214.         foreach ($cart->getShopItems() as $shopItem) {
  215.             $shopItems[] = $shopItem->getProduct();
  216.             $languages[$shopItem->getProduct()->getId()] = $shopItem->getCartItemInfo()->getType();
  217.         }
  218.         $viewParams['languages'] = $languages;
  219.         $viewParams['shopItems'] = $shopItems;
  220.         $viewParams['choosablePaymentMethods'] = $choosableMethods;
  221.         $viewParams['selectedPaymentMethod'] = $selectedPaymentMethod;
  222.         $viewParams['organisationInfo'] = $organisationInformation;
  223.         $viewParams['customer'] = $manager->getCheckoutStep('customer')->getData() ? $manager->getCheckoutStep('customer')->getData()['deliveryCustomer'] : null;
  224.         $viewParams['optionalData'] = $manager->getCheckoutStep('optionalData')->getData();
  225.         $viewParams['isNoPayment'] = true;
  226.         $viewParams['error'] = $error 'demi.booking.error.' $error null;
  227.         $viewParams['cart'] = $cart;
  228.         $viewParams['cartName'] = self::BROCHURE_CART_NAME;
  229.         $viewParams['user'] = $user instanceof AbstractCustomer $user null;
  230.         $viewParams['isBrochure'] = true;
  231.         $deviceDetector DeviceDetector::getInstance();
  232.         $device $deviceDetector->isPhone() ? 'mobile' 'desktop';
  233.         return $this->renderTemplate('@ElementsDemiFrontend/Brochure/step1.'.$device.'.html.twig'$viewParams);
  234.     }
  235.     public function cardAction(Request $request)
  236.     {
  237.         $this->addResponseHeader('X-Robots-Tag''noindex,nofollow');
  238.         $brochures $request->get('prospekte');
  239.         $languages $request->get('language');
  240.         $selectedBrochures = [];
  241.         foreach ($brochures as $brochure) {
  242.             $shopItem DemiShopItem::getById($brochure);
  243.             if ($shopItem instanceof DemiShopItem) {
  244.                 $selectedBrochures[] = $shopItem;
  245.             }
  246.         }
  247.         $viewParams['selectedBrochures'] = $selectedBrochures;
  248.         $viewParams['selectedLanguages'] = $languages;
  249.         return $this->renderTemplate('@ElementsDemiFrontend/Brochure/card.html.twig'$viewParams);
  250.     }
  251.     public function finishedAction(Request $request) : Response
  252.     {
  253.         $this->addResponseHeader('X-Robots-Tag''noindex,nofollow');
  254.         $viewParams['order'] = $request->get('order');
  255.         $deviceDetector DeviceDetector::getInstance();
  256.         $device $deviceDetector->isPhone() ? 'mobile' 'desktop';
  257.         return $this->renderTemplate('@ElementsDemiFrontend/Brochure/finished.'.$device.'.html.twig'$viewParams);
  258.     }
  259.     protected function initFilters(): void
  260.     {
  261.         $query Db::get()->createQueryBuilder();
  262.         $query->select('owner')
  263.             ->distinct()
  264.             ->from('object_' DemiShopItem::classId())
  265.             ->where('o_published = 1 and active = 1')
  266.             ->orderBy('owner');
  267.         $res $query->execute()->fetchAllNumeric();
  268.         if (!empty($res)) {
  269.             $res array_merge(...$res);
  270.             $this->owners $res;
  271.         }
  272.         $query->select('distinct dataBaseCode')
  273.             ->from('object_' DemiShopItem::classId())
  274.             ->where('o_published = 1 and active = 1')
  275.             ->orderBy('dataBaseCode');
  276.         $res $query->execute()->fetchAllNumeric();
  277.         if (!empty($res)) {
  278.             $res array_merge(...$res);
  279.             $this->dbCodes $res;
  280.         }
  281.         $query->select('distinct variationLanguage')
  282.             ->from('object_' DemiShopItem::classId())
  283.             ->where('o_published = 1 and active = 1 and variationLanguage is not null')
  284.             ->orderBy('variationLanguage');
  285.         $res $query->execute()->fetchAllNumeric();
  286.         if (!empty($res)) {
  287.             $res array_merge(...$res);
  288.             $this->langauges $res;
  289.         }
  290.         $query->select('distinct group__id')
  291.             ->from('object_' DemiShopItem::classId())
  292.             ->where('o_published = 1 and active = 1 and group__id is not null')
  293.             ->orderBy('group__id');
  294.         $res $query->execute()->fetchAllNumeric();
  295.         if (!empty($res)) {
  296.             $res array_merge(...$res);
  297.             $this->groupIds $res;
  298.         }
  299.     }
  300. }