<?php
declare(strict_types=1);
namespace Abas\AbasConnector\Controller\Storefront;
use Abas\AbasConnector\Service\Component\AbasComponentFactory;
use Abas\AbasConnector\Service\Log\AbasLoggerFactory;
use Abas\AbasConnector\Service\Mapper\Orders\OrderAbasToShopwareMapper;
use Abas\AbasConnector\Service\RestApi\Client\AbasRestApiClient;
use Abas\AbasConnector\Service\RestApi\Editor\EditorCommandFactory;
use Abas\AbasConnector\Service\RestApi\Request\Factories\InfosystemRequestFactory;
use Abas\AbasConnector\Service\Utils\Config\PluginConfigReader;
use Exception;
use Shopware\Core\Checkout\Cart\Exception\CustomerNotLoggedInException;
use Shopware\Core\Framework\Routing\Annotation\LoginRequired;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Controller\StorefrontController;
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @RouteScope(scopes={"storefront"})
*/
class AbasAccountOrderInfoController extends StorefrontController
{
/**
* Es wird primär die Plugin-Konfiguration genutzt, TABLE_FIELDS ist ein Fallback
*
* @var string
*/
private const TABLE_FIELDS = "ttrans,ttrans^nummer,ttrans^id,ttrans^erfass,teprice,ttrans^bem,tauswaehr^name";
/**
* Es wird primär die Plugin-Konfiguration genutzt, INFOSYSTEM_NAME ist ein Fallback
*
* @var string
*/
private const INFOSYSTEM_NAME = "VKZENTRALE";
/**
* Es wird primär die Plugin-Konfiguration genutzt, DEFAULT_WORKSPACE ist ein Fallback
*
* @var string
*/
private const DEFAULT_WORKSPACE = "vk";
/**
* @var array
*/
private const FIELDSET_DEFAULT = [
'vktyp' => '(SalesOrder)',
'ablageart' => '(Both)',
'bstart' => '1'
];
/**
* @var AbasRestApiClient
*/
private $apiClient;
/**
* @var PluginConfigReader
*/
private $pluginConfigReader;
/**
* @var GenericPageLoaderInterface
*/
private $genericLoader;
/**
* @var AbasComponentFactory
*/
private $abasComponentFactory;
/**
* @var OrderAbasToShopwareMapper
*/
private $orderMapper;
/**
* @var AbasLoggerFactory
*/
private $loggerFactory;
/**
* @param AbasRestApiClient $apiClient
* @param PluginConfigReader $pluginConfigReader
* @param GenericPageLoaderInterface $genericLoader
* @param AbasComponentFactory $abasComponentFactory
* @param OrderAbasToShopwareMapper $orderMapper
* @param AbasLoggerFactory $loggerFactory
*/
public function __construct(
AbasRestApiClient $apiClient,
PluginConfigReader $pluginConfigReader,
GenericPageLoaderInterface $genericLoader,
AbasComponentFactory $abasComponentFactory,
OrderAbasToShopwareMapper $orderMapper,
AbasLoggerFactory $loggerFactory
) {
$this->apiClient = $apiClient;
$this->pluginConfigReader = $pluginConfigReader;
$this->genericLoader = $genericLoader;
$this->abasComponentFactory = $abasComponentFactory;
$this->orderMapper = $orderMapper;
// TODO: direkt einen spezifischen Logger anstatt eine Factory verwenden.
$this->loggerFactory = $loggerFactory;
}
/**
* @LoginRequired()
* @Route("/account/abas/order", name="abas.frontend.account.order.page", options={"seo"="false"}, methods={"GET"})
*
* @return Response
* @throws CustomerNotLoggedInException
* @throws Exception
*/
public function orderOverviewPage(Request $request, SalesChannelContext $context): Response
{
$page = $this->genericLoader->load($request, $context);
if (!$this->pluginConfigReader->getOrderInfoIsActive()) {
return $this->renderStorefront(
'@Storefront/storefront/page/account/order-history/index.html.twig',
['page' => $page]
);
}
return $this->renderStorefront(
'@Storefront/storefront/page/account/abas/order-info/index.html.twig',
['page' => $page]
);
}
/**
* Return JSON of kdinfo-Response.
*
* @Route("/account/abas/order/lines", name="abas.frontend.account.order.lines", options={"seo"="false"},
* methods={"GET"},defaults={"XmlHttpRequest"=true})
*
* @return JsonResponse
* @throws CustomerNotLoggedInException
* @throws Exception
*/
public function loadOrders(Request $request, SalesChannelContext $context): JsonResponse
{
if (!$this->pluginConfigReader->getOrderInfoIsActive()) {
return new JsonResponse('not allowed!');
}
$customer = $context->getCustomer();
if ($customer === null) {
throw new Exception('could not get customer.');
}
$customFields = $customer->getCustomFields();
if ($customFields !== null && isset($customFields['abas_id'])) {
$customerNum = $customFields['abas_id'];
} else {
return new JsonResponse("no valid user");
}
$dateFrom = $request->get("dateFrom", date("d.m.Y"));
$dateTo = $request->get("dateTo", date("d.m.Y"));
$actions = [
EditorCommandFactory::createSetFieldValue('datef', $dateFrom),
EditorCommandFactory::createSetFieldValue('datet', $dateTo),
EditorCommandFactory::createSetFieldValue('kuli', $customerNum)
];
$actions = \array_merge($actions, $this->getDefaultFieldsSets());
try {
$request = InfosystemRequestFactory::createInfosystemRequest(
$this->getAbasWorkspace(),
$this->getAbasInfosystem(),
$actions,
null,
$this->getAbasInfosystemTableFields()
);
$response = $this->apiClient->executeRequest($request);
$orders = $this->getOrdersFromResponse($response);
$out = \array_values($orders);
return new JsonResponse($out);
} catch (\Throwable $throwable) {
return new JsonResponse($throwable->getMessage());
}
}
/**
* @LoginRequired()
* @Route("/account/abas/orderDetail", name="abas.frontend.account.order.details", options={"seo"="false"},
* methods={"GET"}, defaults={"XmlHttpRequest"=true})
*
* @throws CustomerNotLoggedInException
* @throws Exception
*/
public function loadOrder(Request $request, SalesChannelContext $context): Response
{
$page = $this->genericLoader->load($request, $context);
if (!$this->pluginConfigReader->getOrderInfoIsActive()) {
return $this->renderStorefront(
'@Storefront/storefront/page/account/order-history/index.html.twig',
['page' => $page]
);
}
$order = null;
$abasDataComponent = $this->abasComponentFactory->createDataComponent("3:22");
try {
$abasDataComponent->view($request->get("orderId"), null, true);
$order = $this->orderMapper->map($abasDataComponent, $context->getSalesChannel());
} catch (Exception $e) {
$logger = $this->loggerFactory->createAbasLogger('abas_order_info');
$logger->error($e->getMessage(), $e->getTrace());
} finally {
$abasDataComponent->cancel();
}
return $this->renderStorefront(
'@Storefront/storefront/page/account/abas/order-info/order-detail.html.twig',
['order' => $order]
);
}
/**
* Builds action-set of default fieldset constant.
*
* @return array
*/
private function getDefaultFieldsSets(): array
{
$defaultFieldSets = [];
foreach (self::FIELDSET_DEFAULT as $field => $value) {
$defaultFieldSets[] = EditorCommandFactory::createSetFieldValue($field, $value);
}
return $defaultFieldSets;
}
/**
* returns KDINFO-Table as PHP array.
*
* @param \Abas\AbasConnector\Service\RestApi\Response\AbasResponse $response
* @return array
*/
private function getOrdersFromResponse(\Abas\AbasConnector\Service\RestApi\Response\AbasResponse $response): array
{
$arrayContent = $response->getArrayContent(true);
if (empty($arrayContent['content']['data']['table'])) {
return [];
}
return $arrayContent['content']['data']['table'];
}
/**
* @return string
* @throws Exception
*/
private function getAbasWorkspace(): string
{
return $this->pluginConfigReader->getOrderInfoAbasWorkspace() ?: self::DEFAULT_WORKSPACE;
}
/**
* @return string
* @throws Exception
*/
private function getAbasInfosystem(): string
{
return $this->pluginConfigReader->getOrderInfoInfosystemName() ?: self::INFOSYSTEM_NAME;
}
/**
* @return string
* @throws Exception
*/
private function getAbasInfosystemTableFields(): string
{
return $this->pluginConfigReader->getOrderInfoInfosystemTableFields() ?: self::TABLE_FIELDS;
}
}