vendor/shopware/storefront/Controller/AccountOrderController.php line 99

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Controller;
  3. use Shopware\Core\Checkout\Cart\Exception\CustomerNotLoggedInException;
  4. use Shopware\Core\Checkout\Order\OrderEntity;
  5. use Shopware\Core\Checkout\Order\SalesChannel\AbstractCancelOrderRoute;
  6. use Shopware\Core\Checkout\Order\SalesChannel\AbstractOrderRoute;
  7. use Shopware\Core\Checkout\Order\SalesChannel\AbstractSetPaymentOrderRoute;
  8. use Shopware\Core\Checkout\Order\SalesChannel\OrderRouteResponseStruct;
  9. use Shopware\Core\Checkout\Payment\Exception\PaymentProcessException;
  10. use Shopware\Core\Checkout\Payment\SalesChannel\AbstractHandlePaymentMethodRoute;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\RequestCriteriaBuilder;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  14. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  15. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  16. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  17. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
  18. use Shopware\Core\System\SalesChannel\SalesChannel\ContextSwitchRoute;
  19. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  20. use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoader;
  21. use Shopware\Storefront\Page\Account\Order\AccountOrderPageLoader;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. /**
  27.  * @RouteScope(scopes={"storefront"})
  28.  */
  29. class AccountOrderController extends StorefrontController
  30. {
  31.     /**
  32.      * @var AccountOrderPageLoader
  33.      */
  34.     private $orderPageLoader;
  35.     /**
  36.      * @var AbstractOrderRoute
  37.      */
  38.     private $orderRoute;
  39.     /**
  40.      * @var RequestCriteriaBuilder
  41.      */
  42.     private $requestCriteriaBuilder;
  43.     /**
  44.      * @var ContextSwitchRoute
  45.      */
  46.     private $contextSwitchRoute;
  47.     /**
  48.      * @var AccountEditOrderPageLoader
  49.      */
  50.     private $accountEditOrderPageLoader;
  51.     /**
  52.      * @var AbstractCancelOrderRoute
  53.      */
  54.     private $orderStateChangeRoute;
  55.     /**
  56.      * @var AbstractSetPaymentOrderRoute
  57.      */
  58.     private $setPaymentOrderRoute;
  59.     /**
  60.      * @var AbstractHandlePaymentMethodRoute
  61.      */
  62.     private $handlePaymentMethodRoute;
  63.     public function __construct(
  64.         AccountOrderPageLoader $orderPageLoader,
  65.         AbstractOrderRoute $orderRoute,
  66.         RequestCriteriaBuilder $requestCriteriaBuilder,
  67.         AccountEditOrderPageLoader $accountEditOrderPageLoader,
  68.         ContextSwitchRoute $contextSwitchRoute,
  69.         AbstractCancelOrderRoute $orderStateChangeRoute,
  70.         AbstractSetPaymentOrderRoute $setPaymentOrderRoute,
  71.         AbstractHandlePaymentMethodRoute $handlePaymentMethodRoute
  72.     ) {
  73.         $this->orderPageLoader $orderPageLoader;
  74.         $this->orderRoute $orderRoute;
  75.         $this->requestCriteriaBuilder $requestCriteriaBuilder;
  76.         $this->contextSwitchRoute $contextSwitchRoute;
  77.         $this->accountEditOrderPageLoader $accountEditOrderPageLoader;
  78.         $this->orderStateChangeRoute $orderStateChangeRoute;
  79.         $this->setPaymentOrderRoute $setPaymentOrderRoute;
  80.         $this->handlePaymentMethodRoute $handlePaymentMethodRoute;
  81.     }
  82.     /**
  83.      * @Route("/account/order", name="frontend.account.order.page", options={"seo"="false"}, methods={"GET"})
  84.      *
  85.      * @throws CustomerNotLoggedInException
  86.      */
  87.     public function orderOverview(Request $requestSalesChannelContext $context): Response
  88.     {
  89.         $this->denyAccessUnlessLoggedIn();
  90.         $page $this->orderPageLoader->load($request$context);
  91.         return $this->renderStorefront('@Storefront/storefront/page/account/order-history/index.html.twig', ['page' => $page]);
  92.     }
  93.     /**
  94.      * @Route("/account/order/{deepLinkCode}", name="frontend.account.order.single.page", options={"seo"="false"}, methods={"GET"})
  95.      *
  96.      * @throws CustomerNotLoggedInException
  97.      */
  98.     public function orderSingleOverview(Request $requestSalesChannelContext $context): Response
  99.     {
  100.         $page $this->orderPageLoader->load($request$context);
  101.         return $this->renderStorefront('@Storefront/storefront/page/account/order-history/index.html.twig', ['page' => $page]);
  102.     }
  103.     /**
  104.      * @Route("/widgets/account/order/detail/{id}", name="widgets.account.order.detail", options={"seo"="false"}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
  105.      */
  106.     public function ajaxOrderDetail(Request $requestSalesChannelContext $context): Response
  107.     {
  108.         $this->denyAccessUnlessLoggedIn();
  109.         $orderId = (string) $request->get('id');
  110.         if ($orderId === '') {
  111.             throw new MissingRequestParameterException('id');
  112.         }
  113.         $criteria = new Criteria([$orderId]);
  114.         $criteria
  115.             ->addAssociation('lineItems')
  116.             ->addAssociation('orderCustomer')
  117.             ->addAssociation('transactions.paymentMethod')
  118.             ->addAssociation('deliveries.shippingMethod')
  119.             ->addAssociation('lineItems.cover');
  120.         $criteria->getAssociation('transactions')->addSorting(new FieldSorting('createdAt'));
  121.         $orderRequest = new Request();
  122.         $orderRequest->query->replace($this->requestCriteriaBuilder->toArray($criteria));
  123.         /** @var OrderRouteResponseStruct $result */
  124.         $result $this->orderRoute->load($orderRequest$context)->getObject();
  125.         $order $result->getOrders()->first();
  126.         if (!$order instanceof OrderEntity) {
  127.             throw new NotFoundHttpException();
  128.         }
  129.         $lineItems $order->getNestedLineItems();
  130.         return $this->renderStorefront('@Storefront/storefront/page/account/order-history/order-detail-list.html.twig', ['orderDetails' => $lineItems'orderId' => $orderId]);
  131.     }
  132.     /**
  133.      * @Route("/account/order/cancel", name="frontend.account.order.cancel", methods={"POST"})
  134.      */
  135.     public function cancelOrder(Request $requestSalesChannelContext $context): Response
  136.     {
  137.         $cancelOrderRequest = new Request();
  138.         $cancelOrderRequest->request->set('orderId'$request->get('orderId'));
  139.         $cancelOrderRequest->request->set('transition''cancel');
  140.         $this->orderStateChangeRoute->cancel($cancelOrderRequest$context);
  141.         if ($context->getCustomer() && $context->getCustomer()->getGuest() === true) {
  142.             return $this->redirectToRoute(
  143.                 'frontend.account.order.single.page',
  144.                 [
  145.                     'deepLinkCode' => $request->get('deepLinkCode'),
  146.                 ]
  147.             );
  148.         }
  149.         return $this->redirectToRoute('frontend.account.order.page');
  150.     }
  151.     /**
  152.      * @Route("/account/order/edit/{orderId}", name="frontend.account.edit-order.page", methods={"GET"})
  153.      */
  154.     public function editOrder(string $orderIdRequest $requestSalesChannelContext $context): Response
  155.     {
  156.         $this->denyAccessUnlessLoggedIn(true);
  157.         $page $this->accountEditOrderPageLoader->load($request$context);
  158.         if ($page->isPaymentChangeable() === false) {
  159.             $this->addFlash('danger'$this->trans('account.editOrderPaymentNotChangeable'));
  160.         }
  161.         return $this->renderStorefront('@Storefront/storefront/page/account/order/index.html.twig', ['page' => $page]);
  162.     }
  163.     /**
  164.      * @Route("/account/order/payment/{orderId}", name="frontend.account.edit-order.change-payment-method", methods={"POST"})
  165.      */
  166.     public function orderChangePayment(string $orderIdRequest $requestSalesChannelContext $salesChannelContext): Response
  167.     {
  168.         $this->contextSwitchRoute->switchContext(
  169.             new RequestDataBag(
  170.                 [
  171.                     SalesChannelContextService::PAYMENT_METHOD_ID => $request->get('paymentMethodId'),
  172.                 ]
  173.             ),
  174.             $salesChannelContext
  175.         );
  176.         return $this->redirectToRoute('frontend.account.edit-order.page', ['orderId' => $orderId]);
  177.     }
  178.     /**
  179.      * @Route("/account/order/update/{orderId}", name="frontend.account.edit-order.update-order", methods={"POST"})
  180.      */
  181.     public function updateOrder(string $orderIdRequest $requestSalesChannelContext $salesChannelContext): Response
  182.     {
  183.         $finishUrl $this->generateUrl('frontend.checkout.finish.page', [
  184.             'orderId' => $orderId,
  185.             'changedPayment' => true,
  186.         ]);
  187.         $errorUrl $this->generateUrl('frontend.checkout.finish.page', [
  188.             'orderId' => $orderId,
  189.             'changedPayment' => true,
  190.             'paymentFailed' => true,
  191.         ]);
  192.         $setPaymentRequest = new Request();
  193.         $setPaymentRequest->request->set('orderId'$request->get('orderId'));
  194.         $setPaymentRequest->request->set('paymentMethodId'$request->get('paymentMethodId'));
  195.         $this->setPaymentOrderRoute->setPayment($setPaymentRequest$salesChannelContext);
  196.         $handlePaymentRequest = new Request();
  197.         $handlePaymentRequest->request->set('orderId'$request->get('orderId'));
  198.         $handlePaymentRequest->request->set('finishUrl'$finishUrl);
  199.         $handlePaymentRequest->request->set('errorUrl'$errorUrl);
  200.         try {
  201.             $routeResponse $this->handlePaymentMethodRoute->load($handlePaymentRequest$salesChannelContext);
  202.             $response $routeResponse->getRedirectResponse();
  203.         } catch (PaymentProcessException $paymentProcessException) {
  204.             return $this->forwardToRoute('frontend.checkout.finish.page', ['orderId' => $orderId'changedPayment' => true'paymentFailed' => true]);
  205.         }
  206.         if ($response !== null) {
  207.             return $response;
  208.         }
  209.         return $this->redirectToRoute('frontend.checkout.finish.page', ['orderId' => $orderId'changedPayment' => true]);
  210.     }
  211. }