custom/static-plugins/AbasConnector/src/Controller/Storefront/AbasAccountOrderInfoController.php line 124

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Abas\AbasConnector\Controller\Storefront;
  4. use Abas\AbasConnector\Service\Component\AbasComponentFactory;
  5. use Abas\AbasConnector\Service\Log\AbasLoggerFactory;
  6. use Abas\AbasConnector\Service\Mapper\Orders\OrderAbasToShopwareMapper;
  7. use Abas\AbasConnector\Service\RestApi\Client\AbasRestApiClient;
  8. use Abas\AbasConnector\Service\RestApi\Editor\EditorCommandFactory;
  9. use Abas\AbasConnector\Service\RestApi\Request\Factories\InfosystemRequestFactory;
  10. use Abas\AbasConnector\Service\Utils\Config\PluginConfigReader;
  11. use Exception;
  12. use Shopware\Core\Checkout\Cart\Exception\CustomerNotLoggedInException;
  13. use Shopware\Core\Framework\Routing\Annotation\LoginRequired;
  14. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  15. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  16. use Shopware\Storefront\Controller\StorefrontController;
  17. use Shopware\Storefront\Page\GenericPageLoaderInterface;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. /**
  23.  * @RouteScope(scopes={"storefront"})
  24.  */
  25. class AbasAccountOrderInfoController extends StorefrontController
  26. {
  27.     /**
  28.      * Es wird primär die Plugin-Konfiguration genutzt, TABLE_FIELDS ist ein Fallback
  29.      *
  30.      * @var string
  31.      */
  32.     private const TABLE_FIELDS "ttrans,ttrans^nummer,ttrans^id,ttrans^erfass,teprice,ttrans^bem,tauswaehr^name";
  33.     /**
  34.      * Es wird primär die Plugin-Konfiguration genutzt, INFOSYSTEM_NAME ist ein Fallback
  35.      *
  36.      * @var string
  37.      */
  38.     private const INFOSYSTEM_NAME "VKZENTRALE";
  39.     /**
  40.      * Es wird primär die Plugin-Konfiguration genutzt, DEFAULT_WORKSPACE ist ein Fallback
  41.      *
  42.      * @var string
  43.      */
  44.     private const DEFAULT_WORKSPACE "vk";
  45.     /**
  46.      * @var array
  47.      */
  48.     private const FIELDSET_DEFAULT = [
  49.         'vktyp' => '(SalesOrder)',
  50.         'ablageart' => '(Both)',
  51.         'bstart' => '1'
  52.     ];
  53.     /**
  54.      * @var AbasRestApiClient
  55.      */
  56.     private $apiClient;
  57.     /**
  58.      * @var PluginConfigReader
  59.      */
  60.     private $pluginConfigReader;
  61.     /**
  62.      * @var GenericPageLoaderInterface
  63.      */
  64.     private $genericLoader;
  65.     /**
  66.      * @var AbasComponentFactory
  67.      */
  68.     private $abasComponentFactory;
  69.     /**
  70.      * @var OrderAbasToShopwareMapper
  71.      */
  72.     private $orderMapper;
  73.     /**
  74.      * @var AbasLoggerFactory
  75.      */
  76.     private $loggerFactory;
  77.     /**
  78.      * @param AbasRestApiClient $apiClient
  79.      * @param PluginConfigReader $pluginConfigReader
  80.      * @param GenericPageLoaderInterface $genericLoader
  81.      * @param AbasComponentFactory $abasComponentFactory
  82.      * @param OrderAbasToShopwareMapper $orderMapper
  83.      * @param AbasLoggerFactory $loggerFactory
  84.      */
  85.     public function __construct(
  86.         AbasRestApiClient $apiClient,
  87.         PluginConfigReader $pluginConfigReader,
  88.         GenericPageLoaderInterface $genericLoader,
  89.         AbasComponentFactory $abasComponentFactory,
  90.         OrderAbasToShopwareMapper $orderMapper,
  91.         AbasLoggerFactory $loggerFactory
  92.     ) {
  93.         $this->apiClient $apiClient;
  94.         $this->pluginConfigReader $pluginConfigReader;
  95.         $this->genericLoader $genericLoader;
  96.         $this->abasComponentFactory $abasComponentFactory;
  97.         $this->orderMapper $orderMapper;
  98.         // TODO: direkt einen spezifischen Logger anstatt eine Factory verwenden.
  99.         $this->loggerFactory $loggerFactory;
  100.     }
  101.     /**
  102.      * @LoginRequired()
  103.      * @Route("/account/abas/order", name="abas.frontend.account.order.page", options={"seo"="false"}, methods={"GET"})
  104.      *
  105.      * @return Response
  106.      * @throws CustomerNotLoggedInException
  107.      * @throws Exception
  108.      */
  109.     public function orderOverviewPage(Request $requestSalesChannelContext $context): Response
  110.     {
  111.         $page $this->genericLoader->load($request$context);
  112.         if (!$this->pluginConfigReader->getOrderInfoIsActive()) {
  113.             return $this->renderStorefront(
  114.                 '@Storefront/storefront/page/account/order-history/index.html.twig',
  115.                 ['page' => $page]
  116.             );
  117.         }
  118.         return $this->renderStorefront(
  119.             '@Storefront/storefront/page/account/abas/order-info/index.html.twig',
  120.             ['page' => $page]
  121.         );
  122.     }
  123.     /**
  124.      * Return JSON of kdinfo-Response.
  125.      *
  126.      * @Route("/account/abas/order/lines", name="abas.frontend.account.order.lines", options={"seo"="false"},
  127.      * methods={"GET"},defaults={"XmlHttpRequest"=true})
  128.      *
  129.      * @return JsonResponse
  130.      * @throws CustomerNotLoggedInException
  131.      * @throws Exception
  132.      */
  133.     public function loadOrders(Request $requestSalesChannelContext $context): JsonResponse
  134.     {
  135.         if (!$this->pluginConfigReader->getOrderInfoIsActive()) {
  136.             return new JsonResponse('not allowed!');
  137.         }
  138.         $customer $context->getCustomer();
  139.         if ($customer === null) {
  140.             throw new Exception('could not get customer.');
  141.         }
  142.         $customFields $customer->getCustomFields();
  143.         if ($customFields !== null && isset($customFields['abas_id'])) {
  144.             $customerNum $customFields['abas_id'];
  145.         } else {
  146.             return new JsonResponse("no valid user");
  147.         }
  148.         $dateFrom $request->get("dateFrom"date("d.m.Y"));
  149.         $dateTo $request->get("dateTo"date("d.m.Y"));
  150.         $actions = [
  151.             EditorCommandFactory::createSetFieldValue('datef'$dateFrom),
  152.             EditorCommandFactory::createSetFieldValue('datet'$dateTo),
  153.             EditorCommandFactory::createSetFieldValue('kuli'$customerNum)
  154.         ];
  155.         $actions \array_merge($actions$this->getDefaultFieldsSets());
  156.         try {
  157.             $request InfosystemRequestFactory::createInfosystemRequest(
  158.                 $this->getAbasWorkspace(),
  159.                 $this->getAbasInfosystem(),
  160.                 $actions,
  161.                 null,
  162.                 $this->getAbasInfosystemTableFields()
  163.             );
  164.             $response $this->apiClient->executeRequest($request);
  165.             $orders $this->getOrdersFromResponse($response);
  166.             $out \array_values($orders);
  167.             return new JsonResponse($out);
  168.         } catch (\Throwable $throwable) {
  169.             return new JsonResponse($throwable->getMessage());
  170.         }
  171.     }
  172.     /**
  173.      * @LoginRequired()
  174.      * @Route("/account/abas/orderDetail", name="abas.frontend.account.order.details", options={"seo"="false"},
  175.      * methods={"GET"}, defaults={"XmlHttpRequest"=true})
  176.      *
  177.      * @throws CustomerNotLoggedInException
  178.      * @throws Exception
  179.      */
  180.     public function loadOrder(Request $requestSalesChannelContext $context): Response
  181.     {
  182.         $page $this->genericLoader->load($request$context);
  183.         if (!$this->pluginConfigReader->getOrderInfoIsActive()) {
  184.             return $this->renderStorefront(
  185.                 '@Storefront/storefront/page/account/order-history/index.html.twig',
  186.                 ['page' => $page]
  187.             );
  188.         }
  189.         $order null;
  190.         $abasDataComponent $this->abasComponentFactory->createDataComponent("3:22");
  191.         try {
  192.             $abasDataComponent->view($request->get("orderId"), nulltrue);
  193.             $order $this->orderMapper->map($abasDataComponent$context->getSalesChannel());
  194.         } catch (Exception $e) {
  195.             $logger $this->loggerFactory->createAbasLogger('abas_order_info');
  196.             $logger->error($e->getMessage(), $e->getTrace());
  197.         } finally {
  198.             $abasDataComponent->cancel();
  199.         }
  200.         return $this->renderStorefront(
  201.             '@Storefront/storefront/page/account/abas/order-info/order-detail.html.twig',
  202.             ['order' => $order]
  203.         );
  204.     }
  205.     /**
  206.      * Builds action-set of default fieldset constant.
  207.      *
  208.      * @return array
  209.      */
  210.     private function getDefaultFieldsSets(): array
  211.     {
  212.         $defaultFieldSets = [];
  213.         foreach (self::FIELDSET_DEFAULT as $field => $value) {
  214.             $defaultFieldSets[] = EditorCommandFactory::createSetFieldValue($field$value);
  215.         }
  216.         return $defaultFieldSets;
  217.     }
  218.     /**
  219.      * returns KDINFO-Table as PHP array.
  220.      *
  221.      * @param \Abas\AbasConnector\Service\RestApi\Response\AbasResponse $response
  222.      * @return array
  223.      */
  224.     private function getOrdersFromResponse(\Abas\AbasConnector\Service\RestApi\Response\AbasResponse $response): array
  225.     {
  226.         $arrayContent $response->getArrayContent(true);
  227.         if (empty($arrayContent['content']['data']['table'])) {
  228.             return [];
  229.         }
  230.         return $arrayContent['content']['data']['table'];
  231.     }
  232.     /**
  233.      * @return string
  234.      * @throws Exception
  235.      */
  236.     private function getAbasWorkspace(): string
  237.     {
  238.         return $this->pluginConfigReader->getOrderInfoAbasWorkspace() ?: self::DEFAULT_WORKSPACE;
  239.     }
  240.     /**
  241.      * @return string
  242.      * @throws Exception
  243.      */
  244.     private function getAbasInfosystem(): string
  245.     {
  246.         return $this->pluginConfigReader->getOrderInfoInfosystemName() ?: self::INFOSYSTEM_NAME;
  247.     }
  248.     /**
  249.      * @return string
  250.      * @throws Exception
  251.      */
  252.     private function getAbasInfosystemTableFields(): string
  253.     {
  254.         return $this->pluginConfigReader->getOrderInfoInfosystemTableFields() ?: self::TABLE_FIELDS;
  255.     }
  256. }