custom/plugins/CioCustomerMailbox/src/Controller/MailboxController.php line 71

Open in your IDE?
  1. <?php
  2. namespace CioCustomerMailbox\Controller;
  3. use CioCustomerMailbox\Definition\Message\MessageEntity;
  4. use CioCustomerPermissionGroups\Service\CustomerPermissionService;
  5. use CioMasterdata\Definition\Masterdata\MasterdataEntity;
  6. use CioMasterdata\Service\MasterdataService;
  7. use Shopware\Core\Checkout\Cart\Exception\CustomerNotLoggedInException;
  8. use Shopware\Core\Checkout\Customer\CustomerEntity;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  15. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  16. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  17. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  18. use Shopware\Core\Framework\Struct\ArrayStruct;
  19. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  20. use Shopware\Storefront\Controller\StorefrontController;
  21. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  22. use Shopware\Storefront\Page\GenericPageLoader;
  23. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. /**
  28.  * @RouteScope(scopes={"storefront"})
  29.  */
  30. class MailboxController extends StorefrontController
  31. {
  32.     private GenericPageLoader $pageLoader;
  33.     private CustomerPermissionService $customerPermissionsService;
  34.     /**
  35.      * @var EntityRepository
  36.      */
  37.     protected EntityRepository $cioMessageRepository;
  38.     /**
  39.      * @var EntityRepository
  40.      */
  41.     protected EntityRepository $cioMessageContentRepository;
  42.     protected MasterdataService $masterdataService;
  43.     public function __construct(
  44.         GenericPageLoader         $pageLoader,
  45.         CustomerPermissionService $customerPermissionsService,
  46.         EntityRepository $cioMessageRepository,
  47.         EntityRepository $cioMessageContentRepository,
  48.         MasterdataService $masterdataService
  49.     )
  50.     {
  51.         $this->customerPermissionsService $customerPermissionsService;
  52.         $this->pageLoader $pageLoader;
  53.         $this->cioMessageRepository $cioMessageRepository;
  54.         $this->cioMessageContentRepository $cioMessageContentRepository;
  55.         $this->masterdataService $masterdataService;
  56.     }
  57.     /**
  58.      * @Route("/account/mailbox", name="storefront.account.mailbox.home", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  59.      * @param Request $request
  60.      * @param SalesChannelContext $context
  61.      * @return Response
  62.      */
  63.     public function mailbox(Request $requestSalesChannelContext $context)
  64.     {
  65.         if (is_null($context->getCustomer())) {
  66.             throw new CustomerNotLoggedInException();
  67.         }
  68.         $page $this->pageLoader->load($request$context);
  69.         $criteria = new Criteria();
  70.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  71.         return $this->renderStorefront('@CioCustomerMailbox/storefront/page/account/mailbox.html.twig', ['page' => $page]);
  72.     }
  73.     /**
  74.      * @Route("/account/mailbox/overview", name="storefront.mailbox.overview", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  75.      * @param Request $request
  76.      * @param SalesChannelContext $context
  77.      * @return Response
  78.      */
  79.     public function overview(Request $requestSalesChannelContext $context)
  80.     {
  81.         if (is_null($context->getCustomer())) {
  82.             throw new CustomerNotLoggedInException();
  83.         }
  84.         $page $this->pageLoader->load($request$context);
  85.         /** @var EntityRepository $salesRepresentativeRepository */
  86.         $salesRepresentativeRepository $this->container->get('cio_sales_representative.repository');
  87.         $criteria = new Criteria();
  88.         $criteria->addFilter(new EqualsFilter('email'$context->getCustomer()->getEmail()));
  89.         $salesRepresentativeId $salesRepresentativeRepository->searchIds($criteria$context->getContext())->firstId();
  90.         if ($salesRepresentativeId === null) {
  91.             throw new NotFoundHttpException();
  92.         }
  93.         $masterDataCollection $this->masterdataService->getMasterdasByPartnerId($salesRepresentativeId);
  94.         $customers = [];
  95.         /** @var MasterdataEntity $masterData */
  96.         foreach ($masterDataCollection as $masterData) {
  97.             $allCustomers $this->masterdataService->getCustomersByMasterdataId($masterData->getId(), false);
  98.             /** @var CustomerEntity $customer */
  99.             foreach ($allCustomers as $customer) {
  100.                 if (!$customer->getActive()) {
  101.                     continue;
  102.                 }
  103.                 if (array_search($customer->getId(), array_column($customers'id')) !== false) {
  104.                     continue;
  105.                 }
  106.                 $customer $this->getCustomerMessages$customer$context$masterData);
  107.                 $customers[$customer->getId()] = $customer;
  108.                 if(is_null($customer->getExtension('customerParent'))) {
  109.                     $subAccounts $this->masterdataService->getSubaccounts($customer->getId(), $context->getContext());
  110.                     foreach ($subAccounts as $subAccount) {
  111.                         if (!key_exists($subAccount->getId(), $customers)) {
  112.                             $subAccount $this->getCustomerMessages$subAccount$context$masterData);
  113.                             $customers[$subAccount->getId()] = $subAccount;
  114.                         }
  115.                     }
  116.                 }
  117.             }
  118.         }
  119.         return $this->renderStorefront('@CioCustomerMailbox/storefront/page/overview/index.html.twig', ['page' => $page'customers' => $customers]);
  120.     }
  121.     protected function getCustomerMessages(CustomerEntity $customerSalesChannelContext $contextMasterdataEntity $masterData): CustomerEntity
  122.     {
  123.         $criteria = new Criteria();
  124.         $criteria->addFilter(new EqualsFilter('customer_id'$customer->getId()));
  125.         $criteria->addSorting((new FieldSorting('message_content.number'FieldSorting::DESCENDING)));
  126.         $criteria->addFilter(new EqualsFilter('read_at'null));
  127.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  128.             new EqualsFilter('message_content.visible_from'null),
  129.             new RangeFilter('message_content.visible_from', [
  130.                 RangeFilter::LTE => (new \DateTime())->setTimezone(new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i:s')
  131.             ])
  132.         ]));
  133.         $criteria->addAssociation('message_content');
  134.         $messages $this->cioMessageRepository->search($criteria$context->getContext());
  135.         $customer->addExtension('runtime', new ArrayStruct([
  136.             'messages' => $messages->getEntities()->getElements(),
  137.             'countImportantMessages' => $messages->filter(function (MessageEntity $message) {
  138.                 return $message->getMessageContent()->getImportant() == true;
  139.             })->count(),
  140.             'countMessages' => $messages->filter(function (MessageEntity $message) {
  141.                 return $message->getMessageContent()->getImportant() == false;
  142.             })->count(),
  143.             'vpNumber' => $masterData->getVpNummer()
  144.         ]));
  145.         return $customer;
  146.     }
  147.     /**
  148.      * @Route("/account/mailbox/list", name="storefront.account.mailbox.list", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  149.      * @param Request $request
  150.      * @param SalesChannelContext $context
  151.      * @return Response
  152.      */
  153.     public function list(Request $requestSalesChannelContext $context)
  154.     {
  155.         if (is_null($context->getCustomer())) {
  156.             throw new CustomerNotLoggedInException();
  157.         }
  158.         $page $request->query->getInt('page'1);
  159.         $category $request->query->get('category''inbox');
  160.         $search $request->query->get('search');
  161.         $criteria = new Criteria();
  162.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  163.         $criteria->addSorting((new FieldSorting('message_content.number'FieldSorting::DESCENDING)));
  164.         $criteria->setLimit(20);
  165.         $criteria->setOffset(($page 1) * 20);
  166.         $criteria->addAssociation('message_content');
  167.         if ($category === 'important') {
  168.             $criteria->addFilter(new EqualsFilter('message_content.important'1));
  169.             $criteria->addFilter(new EqualsFilter('read_at'null));
  170.         } else if ($category === 'read') {
  171.             $criteria->addFilter(new NotFilter(NotFilter::CONNECTION_OR, [
  172.                 new EqualsFilter('read_at'null)
  173.             ]));
  174.         } else if ($category === 'bookmark') {
  175.             $criteria->addFilter(new EqualsFilter('bookmark'true));
  176.         } else {
  177.             $criteria->addFilter(new EqualsFilter('read_at'null));
  178.         }
  179.         if ($search) {
  180.             $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  181.                 new ContainsFilter('message_content.subject'$search),
  182.                 new ContainsFilter('message_content.content'$search)
  183.             ]));
  184.         }
  185.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  186.             new EqualsFilter('message_content.visible_from'null),
  187.             new RangeFilter('message_content.visible_from', [
  188.                 RangeFilter::LTE => (new \DateTime())->setTimezone(new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i:s')
  189.             ])
  190.         ]));
  191.         $messages $this->cioMessageRepository->search($criteria$context->getContext());
  192.         /** @var EntityRepositoryInterface $mediaRepository */
  193.         $mediaRepository $this->container->get('media.repository');
  194.         /** @var MessageEntity $message */
  195.         foreach ($messages->getEntities() as $message) {
  196.             $shortMessage html_entity_decode(strip_tags($message->getMessageContent()->getContent()));
  197.             $attachmentUrl null;
  198.             if ($attachment $mediaRepository->search(new Criteria([$message->getMessageContent()->getAttachment()]), $context->getContext())->first()) {
  199.                 // check if attachment is a pdf
  200.                 if (strpos($attachment->getMimeType(), 'pdf') !== false) {
  201.                     $attachmentUrl $attachment->getUrl();
  202.                 }
  203.             }
  204.             $message->addExtension('runtime', new ArrayStruct([
  205.                 'shortMessage' => substr($shortMessage075) . (strlen($shortMessage) > 75 '...' ''),
  206.                 'attachmentUrl' => $attachmentUrl
  207.             ]));
  208.         }
  209.         return $this->json($messages);
  210.     }
  211.     /**
  212.      * @Route("/account/mailbox/list/count", name="storefront.account.mailbox.list.count", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  213.      * @param Request $request
  214.      * @param SalesChannelContext $context
  215.      * @return Response
  216.      */
  217.     public function countMessages(Request $requestSalesChannelContext $context)
  218.     {
  219.         if (is_null($context->getCustomer())) {
  220.             throw new CustomerNotLoggedInException();
  221.         }
  222.         $criteria = new Criteria();
  223.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  224.         $criteria->addFilter(new EqualsFilter('read_at'null));
  225.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  226.             new EqualsFilter('message_content.visible_from'null),
  227.             new RangeFilter('message_content.visible_from', [
  228.                 RangeFilter::LTE => (new \DateTime())->setTimezone(new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i:s')
  229.             ])
  230.         ]));
  231.         $inboxCount $this->cioMessageRepository->search($criteria$context->getContext())->getTotal();
  232.         $criteria = new Criteria();
  233.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  234.         $criteria->addFilter(new EqualsFilter('read_at'null));
  235.         $criteria->addFilter(new EqualsFilter('message_content.important'1));
  236.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  237.             new EqualsFilter('message_content.visible_from'null),
  238.             new RangeFilter('message_content.visible_from', [
  239.                 RangeFilter::LTE => (new \DateTime())->setTimezone(new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i:s')
  240.             ])
  241.         ]));
  242.         $importantCount $this->cioMessageRepository->search($criteria$context->getContext())->getTotal();
  243.         return $this->json(['inbox' => $inboxCount'important' => $importantCount]);
  244.     }
  245.     /**
  246.      * @Route("/account/mailbox/{id}/markasread", name="storefront.account.mailbox.markasread", methods={"GET"})
  247.      * @param Request $request
  248.      * @param SalesChannelContext $context
  249.      * @return Response
  250.      */
  251.     public function markAsRead(Request $requestSalesChannelContext $context)
  252.     {
  253.         if (is_null($context->getCustomer())) {
  254.             throw new CustomerNotLoggedInException();
  255.         }
  256.         $id $request->get('id');
  257.         $criteria = new Criteria();
  258.         $criteria->addFilter(new EqualsFilter('id'$id));
  259.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  260.         $message $this->cioMessageRepository->search($criteria$context->getContext())->first();
  261.         if ($message instanceof MessageEntity) {
  262.             $this->cioMessageRepository->update([[
  263.                 'id' => $id,
  264.                 'read_at' => new \DateTime()
  265.             ]], $context->getContext());
  266.             return $this->json(['success' => true]);
  267.         }
  268.         return $this->json(['success' => false]);
  269.     }
  270.     /**
  271.      * @Route("/account/mailbox/{id}/togglebookmark", name="storefront.account.mailbox.togglebookmark", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  272.      * @param Request $request
  273.      * @param SalesChannelContext $context
  274.      * @return Response
  275.      */
  276.     public function toggleBookmark(Request $requestSalesChannelContext $context)
  277.     {
  278.         if (is_null($context->getCustomer())) {
  279.             throw new CustomerNotLoggedInException();
  280.         }
  281.         $id $request->get('id');
  282.         $criteria = new Criteria();
  283.         $criteria->addFilter(new EqualsFilter('id'$id));
  284.         $criteria->addFilter(new EqualsFilter('customer_id'$context->getCustomer()->getId()));
  285.         $message $this->cioMessageRepository->search($criteria$context->getContext())->first();
  286.         if ($message instanceof MessageEntity) {
  287.             $this->cioMessageRepository->update([[
  288.                 'id' => $id,
  289.                 'bookmark' => !$message->getBookmark()
  290.             ]], $context->getContext());
  291.             return $this->json(['success' => true]);
  292.         }
  293.         return $this->json(['success' => false]);
  294.     }
  295.     /**
  296.      * @Route("/mailbox/remindlater", name="storefront.mailbox.remindlater", methods={"GET"}, defaults={"_routeScope"="storefront"})}}
  297.      * @param Request $request
  298.      * @param SalesChannelContext $context
  299.      * @return Response
  300.      */
  301.     public function remindLater(Request $requestSalesChannelContext $context): Response
  302.     {
  303.         if (is_null($context->getCustomer())) {
  304.             throw new CustomerNotLoggedInException();
  305.         }
  306.         $request->getSession()->set('mailbox_remind_later', (new \DateTime())->modify('+30 minutes'));
  307.         return $this->json(['success' => true]);
  308.     }
  309. }