custom/plugins/MolliePayments/src/Controller/Storefront/AccountController.php line 57

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Kiener\MolliePayments\Controller\Storefront;
  3. use Kiener\MolliePayments\Components\Subscription\Page\Account\SubscriptionPageLoader;
  4. use Kiener\MolliePayments\Components\Subscription\SubscriptionManager;
  5. use Psr\Log\LoggerInterface;
  6. use Shopware\Core\Framework\Routing\Annotation\LoginRequired;
  7. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  8. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  9. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  10. use Shopware\Storefront\Controller\StorefrontController;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. /**
  16.  * @RouteScope(scopes={"storefront"})
  17.  */
  18. class AccountController extends StorefrontController
  19. {
  20.     /**
  21.      * @var SubscriptionPageLoader
  22.      */
  23.     private $pageLoader;
  24.     /**
  25.      * @var SubscriptionManager
  26.      */
  27.     private $subscriptionManager;
  28.     /**
  29.      * @var LoggerInterface
  30.      */
  31.     private $logger;
  32.     /**
  33.      * @param SubscriptionPageLoader $pageLoader
  34.      * @param SubscriptionManager $subscriptionManager
  35.      * @param LoggerInterface $logger
  36.      */
  37.     public function __construct(SubscriptionPageLoader $pageLoaderSubscriptionManager $subscriptionManagerLoggerInterface $logger)
  38.     {
  39.         $this->pageLoader $pageLoader;
  40.         $this->subscriptionManager $subscriptionManager;
  41.         $this->logger $logger;
  42.     }
  43.     /**
  44.      * @LoginRequired()
  45.      * @Route("/account/mollie/subscriptions", name="frontend.account.mollie.subscriptions.page", options={"seo"="false"}, methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  46.      */
  47.     public function subscriptionsList(Request $requestSalesChannelContext $salesChannelContext): Response
  48.     {
  49.         $page $this->pageLoader->load($request$salesChannelContext);
  50.         return $this->renderStorefront(
  51.             '@Storefront/storefront/page/account/subscriptions/index.html.twig',
  52.             [
  53.                 'page' => $page
  54.             ]
  55.         );
  56.     }
  57.     /**
  58.      * @LoginRequired()
  59.      * @Route("/account/mollie/subscriptions/{subscriptionId}/billing/update", name="frontend.account.mollie.subscriptions.billing.update", methods={"POST"})
  60.      *
  61.      * @param string $subscriptionId
  62.      * @param RequestDataBag $data
  63.      * @param SalesChannelContext $salesChannelContext
  64.      * @return Response
  65.      */
  66.     public function updateBilling(string $subscriptionIdRequestDataBag $dataSalesChannelContext $salesChannelContext): Response
  67.     {
  68.         try {
  69.             $address $data->get('address'null);
  70.             if (!$address instanceof RequestDataBag) {
  71.                 throw new \Exception('Missing address data in request');
  72.             }
  73.             $salutationId $address->get('salutationId''');
  74.             $title $address->get('title''');
  75.             $firstName $address->get('firstName''');
  76.             $lastName $address->get('lastName''');
  77.             $company $address->get('company''');
  78.             $department $address->get('department''');
  79.             $additionalField1 $address->get('additionalField1''');
  80.             $additionalField2 $address->get('additionalField2''');
  81.             $phoneNumber $address->get('phoneNumber''');
  82.             $street $address->get('street''');
  83.             $zipcode $address->get('zipcode''');
  84.             $city $address->get('city''');
  85.             # COUNTRY change not allowed for billing
  86.             $countryStateId $address->get('countryStateId''');
  87.             $this->subscriptionManager->updateBillingAddress(
  88.                 $subscriptionId,
  89.                 $salutationId,
  90.                 $title,
  91.                 $firstName,
  92.                 $lastName,
  93.                 $company,
  94.                 $department,
  95.                 $additionalField1,
  96.                 $additionalField2,
  97.                 $phoneNumber,
  98.                 $street,
  99.                 $zipcode,
  100.                 $city,
  101.                 $countryStateId,
  102.                 $salesChannelContext->getContext()
  103.             );
  104.             $this->addFlash(self::SUCCESS$this->trans('molliePayments.subscriptions.account.successUpdateAddress'));
  105.             return $this->redirectToRoute('frontend.account.mollie.subscriptions.page');
  106.         } catch (\Throwable $exception) {
  107.             return $this->routeToErrorPage(
  108.                 'molliePayments.subscriptions.account.errorUpdateAddress',
  109.                 'Error when updating billing address of subscription ' $subscriptionId ': ' $exception->getMessage()
  110.             );
  111.         }
  112.     }
  113.     /**
  114.      * @LoginRequired()
  115.      * @Route("/account/mollie/subscriptions/{subscriptionId}/shipping/update", name="frontend.account.mollie.subscriptions.shipping.update", methods={"POST"})
  116.      *
  117.      * @param string $subscriptionId
  118.      * @param RequestDataBag $data
  119.      * @param SalesChannelContext $salesChannelContext
  120.      * @return Response
  121.      */
  122.     public function updateShipping(string $subscriptionIdRequestDataBag $dataSalesChannelContext $salesChannelContext): Response
  123.     {
  124.         try {
  125.             $address $data->get('address'null);
  126.             if (!$address instanceof RequestDataBag) {
  127.                 throw new \Exception('Missing address data in request');
  128.             }
  129.             $salutationId $address->get('salutationId''');
  130.             $title $address->get('title''');
  131.             $firstName $address->get('firstName''');
  132.             $lastName $address->get('lastName''');
  133.             $company $address->get('company''');
  134.             $department $address->get('department''');
  135.             $additionalField1 $address->get('additionalField1''');
  136.             $additionalField2 $address->get('additionalField2''');
  137.             $phoneNumber $address->get('phoneNumber''');
  138.             $street $address->get('street''');
  139.             $zipcode $address->get('zipcode''');
  140.             $city $address->get('city''');
  141.             # COUNTRY change not allowed for billing
  142.             $countryStateId $address->get('countryStateId''');
  143.             $this->subscriptionManager->updateShippingAddress(
  144.                 $subscriptionId,
  145.                 $salutationId,
  146.                 $title,
  147.                 $firstName,
  148.                 $lastName,
  149.                 $company,
  150.                 $department,
  151.                 $additionalField1,
  152.                 $additionalField2,
  153.                 $phoneNumber,
  154.                 $street,
  155.                 $zipcode,
  156.                 $city,
  157.                 $countryStateId,
  158.                 $salesChannelContext->getContext()
  159.             );
  160.             $this->addFlash(self::SUCCESS$this->trans('molliePayments.subscriptions.account.successUpdateAddress'));
  161.             return $this->redirectToRoute('frontend.account.mollie.subscriptions.page');
  162.         } catch (\Throwable $exception) {
  163.             return $this->routeToErrorPage(
  164.                 'molliePayments.subscriptions.account.errorUpdateAddress',
  165.                 'Error when updating shipping address of subscription ' $subscriptionId ': ' $exception->getMessage()
  166.             );
  167.         }
  168.     }
  169.     /**
  170.      * @LoginRequired()
  171.      * @Route("/account/mollie/subscriptions/{swSubscriptionId}/payment/update", name="frontend.account.mollie.subscriptions.payment.update", methods={"POST"})
  172.      *
  173.      * @param string $swSubscriptionId
  174.      * @param SalesChannelContext $salesChannelContext
  175.      * @return Response
  176.      */
  177.     public function updatePaymentStart(string $swSubscriptionIdSalesChannelContext $salesChannelContext): Response
  178.     {
  179.         try {
  180.             $checkoutUrl $this->subscriptionManager->updatePaymentMethodStart($swSubscriptionId''$salesChannelContext->getContext());
  181.             return $this->redirect($checkoutUrl);
  182.         } catch (\Throwable $exception) {
  183.             return $this->routeToErrorPage(
  184.                 'molliePayments.subscriptions.account.errorUpdatePayment',
  185.                 'Error when updating payment method of subscription ' $swSubscriptionId ': ' $exception->getMessage()
  186.             );
  187.         }
  188.     }
  189.     /**
  190.      * @LoginRequired()
  191.      * @Route("/account/mollie/subscriptions/{swSubscriptionId}/payment/update/finish", name="frontend.account.mollie.subscriptions.payment.update-success", methods={"GET", "POST"})
  192.      *
  193.      * @param string $swSubscriptionId
  194.      * @param SalesChannelContext $salesChannelContext
  195.      * @return Response
  196.      */
  197.     public function updatePaymentFinish(string $swSubscriptionIdSalesChannelContext $salesChannelContext): Response
  198.     {
  199.         try {
  200.             $this->subscriptionManager->updatePaymentMethodConfirm($swSubscriptionId$salesChannelContext->getContext());
  201.             $this->addFlash(self::SUCCESS$this->trans('molliePayments.subscriptions.account.successUpdatePayment'));
  202.             return $this->redirectToRoute('frontend.account.mollie.subscriptions.page');
  203.         } catch (\Throwable $exception) {
  204.             return $this->routeToErrorPage(
  205.                 'molliePayments.subscriptions.account.errorUpdatePayment',
  206.                 'Error when updating payment method of subscription ' $swSubscriptionId ': ' $exception->getMessage()
  207.             );
  208.         }
  209.     }
  210.     /**
  211.      * @LoginRequired()
  212.      * @Route("/account/mollie/subscriptions/{swSubscriptionId}/pause", name="frontend.account.mollie.subscriptions.pause", methods={"POST"})
  213.      * @param string $swSubscriptionId
  214.      */
  215.     public function pauseSubscription(string $swSubscriptionIdSalesChannelContext $context): Response
  216.     {
  217.         try {
  218.             $this->subscriptionManager->pauseSubscription($swSubscriptionId$context->getContext());
  219.             $this->addFlash(self::SUCCESS$this->trans('molliePayments.subscriptions.account.successPause'));
  220.             return $this->redirectToRoute('frontend.account.mollie.subscriptions.page');
  221.         } catch (\Throwable $exception) {
  222.             return $this->routeToErrorPage(
  223.                 'molliePayments.subscriptions.account.errorPause',
  224.                 'Error when pausing subscription ' $swSubscriptionId ': ' $exception->getMessage()
  225.             );
  226.         }
  227.     }
  228.     /**
  229.      * @LoginRequired()
  230.      * @Route("/account/mollie/subscriptions/{swSubscriptionId}/skip", name="frontend.account.mollie.subscriptions.skip", methods={"POST"})
  231.      * @param string $swSubscriptionId
  232.      */
  233.     public function skipSubscription(string $swSubscriptionIdSalesChannelContext $context): Response
  234.     {
  235.         try {
  236.             $this->subscriptionManager->skipSubscription($swSubscriptionId1$context->getContext());
  237.             $this->addFlash(self::SUCCESS$this->trans('molliePayments.subscriptions.account.successSkip'));
  238.             return $this->redirectToRoute('frontend.account.mollie.subscriptions.page');
  239.         } catch (\Throwable $exception) {
  240.             return $this->routeToErrorPage(
  241.                 'molliePayments.subscriptions.account.errorSkip',
  242.                 'Error when skipping subscription ' $swSubscriptionId ': ' $exception->getMessage()
  243.             );
  244.         }
  245.     }
  246.     /**
  247.      * @LoginRequired()
  248.      * @Route("/account/mollie/subscriptions/{swSubscriptionId}/resume", name="frontend.account.mollie.subscriptions.resume", methods={"POST"})
  249.      * @param string $swSubscriptionId
  250.      */
  251.     public function resumeSubscription(string $swSubscriptionIdSalesChannelContext $context): Response
  252.     {
  253.         try {
  254.             $this->subscriptionManager->resumeSubscription($swSubscriptionId$context->getContext());
  255.             $this->addFlash(self::SUCCESS$this->trans('molliePayments.subscriptions.account.successResume'));
  256.             return $this->redirectToRoute('frontend.account.mollie.subscriptions.page');
  257.         } catch (\Throwable $exception) {
  258.             return $this->routeToErrorPage(
  259.                 'molliePayments.subscriptions.account.errorResume',
  260.                 'Error when resuming subscription ' $swSubscriptionId ': ' $exception->getMessage()
  261.             );
  262.         }
  263.     }
  264.     /**
  265.      * @LoginRequired()
  266.      * @Route("/account/mollie/subscriptions/{subscriptionId}/cancel", name="frontend.account.mollie.subscriptions.cancel", methods={"POST"})
  267.      * @param mixed $subscriptionId
  268.      */
  269.     public function cancelSubscription($subscriptionIdSalesChannelContext $context): Response
  270.     {
  271.         try {
  272.             $this->subscriptionManager->cancelSubscription($subscriptionId$context->getContext());
  273.             $this->addFlash(self::SUCCESS$this->trans('molliePayments.subscriptions.account.cancelSubscription'));
  274.             return $this->redirectToRoute('frontend.account.mollie.subscriptions.page');
  275.         } catch (\Throwable $exception) {
  276.             return $this->routeToErrorPage(
  277.                 'molliePayments.subscriptions.account.errorCancelSubscription',
  278.                 'Error when canceling subscription ' $subscriptionId ': ' $exception->getMessage()
  279.             );
  280.         }
  281.     }
  282.     /**
  283.      * @param string $errorSnippetKey
  284.      * @param string $logMessage
  285.      * @return RedirectResponse
  286.      */
  287.     private function routeToErrorPage(string $errorSnippetKeystring $logMessage): RedirectResponse
  288.     {
  289.         $this->logger->error($logMessage);
  290.         $this->addFlash(self::DANGER$this->trans($errorSnippetKey));
  291.         return $this->redirectToRoute('frontend.account.mollie.subscriptions.page');
  292.     }
  293. }