custom/plugins/LeadManager/src/Storefront/Controller/VirginRegisterController.php line 288

Open in your IDE?
  1. <?php
  2. namespace Virgin\LeadManager\Storefront\Controller;
  3. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  4. use Shopware\Core\Checkout\Customer\SalesChannel\AbstractLogoutRoute;
  5. use Shopware\Core\Content\Category\SalesChannel\AbstractCategoryRoute;
  6. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  7. use Shopware\Core\Framework\Context;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  9. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  10. use Shopware\Storefront\Page\GenericPageLoader;
  11. use Symfony\Component\HttpFoundation\Cookie;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Monolog\Logger;
  16. use Shopware\Core\Checkout\Customer\CustomerEntity;
  17. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  18. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  19. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  22. use Shopware\Core\Framework\Validation\DataValidationDefinition;
  23. use Shopware\Core\Framework\Validation\Exception\ConstraintViolationException;
  24. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  25. use Shopware\Storefront\Controller\StorefrontController;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  28. use Symfony\Component\Routing\RouterInterface;
  29. use Symfony\Component\Validator\Constraints\Email;
  30. use Virgin\LeadManager\Service\AccountRegistrationServiceDecorator;
  31. use Virgin\LeadManager\Utils\Services\LeadGenerationService;
  32. use Virgin\LeadManager\Utils\UserActivationHelper;
  33. use Virgin\ProductModelExtension\Services\ProductService;
  34. use Virgin\SystemIntegration\Services\RestApiClient;
  35. use Virgin\SystemIntegration\Services\VirginUser\VirginUser;
  36. use Virgin\VirginCustomElement\Service\LandingPageService;
  37. /**
  38. * @Route(defaults={"_routeScope"={"storefront"}})
  39. */
  40. class VirginRegisterController extends StorefrontController
  41. {
  42. /**
  43. * @var AccountRegistrationServiceDecorator
  44. */
  45. private AccountRegistrationServiceDecorator $accountRegistrationService;
  46. /**
  47. * @var EntityRepository
  48. */
  49. private EntityRepository $customerRepository;
  50. /**
  51. * @var Logger
  52. */
  53. private Logger $logger;
  54. /**
  55. * @var GenericPageLoader
  56. */
  57. private $genericLoader;
  58. /**
  59. * @var EntityRepository
  60. */
  61. private EntityRepository $clubRepository;
  62. /**
  63. * @var AbstractLogoutRoute
  64. */
  65. private AbstractLogoutRoute $logoutRoute;
  66. /**
  67. * @var VirginUser
  68. */
  69. private VirginUser $virginUser;
  70. /**
  71. * @var AbstractCategoryRoute
  72. */
  73. private AbstractCategoryRoute $categoryRoute;
  74. /**
  75. * @var EntityRepository
  76. */
  77. private EntityRepository $categoryRepository;
  78. /**
  79. * @var RestApiClient
  80. */
  81. private RestApiClient $restApiClient;
  82. /**
  83. * @var RouterInterface
  84. */
  85. private RouterInterface $router;
  86. /**
  87. * @var CartService
  88. */
  89. private CartService $cartService;
  90. /**
  91. * @var LandingPageService
  92. */
  93. private LandingPageService $landingPageService;
  94. /**
  95. * @var ProductService
  96. */
  97. private ProductService $productService;
  98. public function __construct(
  99. AccountRegistrationServiceDecorator $accountRegistrationService,
  100. EntityRepository $customerRepository,
  101. Logger $logger,
  102. GenericPageLoader $genericLoader,
  103. GenericPageLoader $genericPageLoader,
  104. EntityRepository $clubRepository,
  105. VirginUser $virginUser,
  106. AbstractCategoryRoute $categoryRoute,
  107. EntityRepository $categoryRepository,
  108. RestApiClient $restApiClient,
  109. AbstractLogoutRoute $logoutRoute,
  110. RouterInterface $router,
  111. CartService $cartService,
  112. LandingPageService $landingPageService,
  113. ProductService $productService,
  114. )
  115. {
  116. $this->accountRegistrationService = $accountRegistrationService;
  117. $this->customerRepository = $customerRepository;
  118. $this->logger = $logger;
  119. $this->genericLoader = $genericLoader;
  120. $this->genericPageLoader = $genericPageLoader;
  121. $this->clubRepository = $clubRepository;
  122. $this->virginUser = $virginUser;
  123. $this->categoryRoute = $categoryRoute;
  124. $this->categoryRepository = $categoryRepository;
  125. $this->restApiClient = $restApiClient;
  126. $this->logoutRoute = $logoutRoute;
  127. $this->router = $router;
  128. $this->cartService = $cartService;
  129. $this->landingPageService = $landingPageService;
  130. $this->productService = $productService;
  131. }
  132. /**
  133. * @Route("/account/register", name="frontend.account.register.page", methods={"GET"})
  134. */
  135. public function showRegisterPage(Request $request, RequestDataBag $data, SalesChannelContext $context): Response
  136. {
  137. $this->logger->log(Logger::DEBUG, 'Contact form request - print data');
  138. $customer = $context->getCustomer();
  139. try {
  140. if (isset($customer) || $this->virginUser->getCurrentLead()) {
  141. return $this->redirectToRoute('frontend.configurator');
  142. }
  143. } catch (\Exception $e) {
  144. }
  145. $page = $this->genericLoader->load($request, $context);
  146. $criteria = new Criteria();
  147. $criteria->addFilter(new EqualsFilter('visible', true));
  148. $criteria->addSorting(new FieldSorting('club.name', FieldSorting::ASCENDING));
  149. $clubs = $this->container->get('club.repository')->search($criteria, $context->getContext())->getEntities()->getElements();
  150. return $this->renderStorefront('@Storefront/storefront/page/registration.html.twig', [
  151. 'clubs' => $clubs,
  152. 'page' => $page,
  153. 'loginError' => (bool)$request->get('loginError'),
  154. 'errorSnippet' => $request->get('errorSnippet'),
  155. 'successSnippet' => $request->get('successSnippet'),
  156. 'warningSnippet' => $request->get('warningSnippet') ?? $request->getSession()->get('warningSnippet'),
  157. ]);
  158. }
  159. /**
  160. * @Route("/account/register", name="frontend.account.register.save", methods={"POST"})
  161. * @param Request $request
  162. * @param RequestDataBag $data
  163. * @param SalesChannelContext $context
  164. * @return RedirectResponse
  165. */
  166. public function virginRegister(Request $request, RequestDataBag $data, SalesChannelContext $context): \Symfony\Component\HttpFoundation\RedirectResponse
  167. {
  168. if ($data->get('promoTag')){
  169. try {
  170. $redirectObject = $this->landingPageService->getRedirectObjectFromTag($data->get('promoTag'), 'cards', $context);
  171. } catch (\Exception $e) {
  172. $redirectObject = [
  173. 'route' => 'frontend.home',
  174. 'params' =>[]
  175. ];
  176. }
  177. }
  178. else {
  179. $redirectObject = [
  180. 'route' => 'frontend.configurator',
  181. 'params' =>[]
  182. ];
  183. }
  184. try {
  185. if ($this->virginUser->getCurrentLead()) {
  186. return $this->redirectToRoute($redirectObject['route'], $redirectObject['params']);
  187. }
  188. } catch (\Exception $e) {
  189. }
  190. $this->logger->log(Logger::DEBUG, 'Registration form submit data: ' . serialize($data));
  191. $page = $this->genericLoader->load($request, $context);
  192. $firstname = $data->get('name');
  193. $lastname = $data->get('lastname');
  194. $phonePrefix = $data->get('intlPrefix');
  195. $phone = $data->get('phone');
  196. $email = $data->get('email');
  197. $club = $data->get('club');
  198. $privacy = $data->get('privacy');
  199. $validation = new DataValidationDefinition('customer.email');
  200. $validation->add('email', new Email());
  201. $error = $this->virginUser->CheckFormParamsToStorefront($data);
  202. if ($error != null) {
  203. $redirectObject['route'] = 'frontend.account.register.page';
  204. $redirectObject['params']['loginError'] = true;
  205. $redirectObject['params']['errorSnippet'] = $error;
  206. return $this->redirectToRoute($redirectObject['route'], $redirectObject['params']);
  207. }
  208. setcookie(LeadGenerationService::ECOMMERCE_COOKIE_NAME, '', time() - 3600);
  209. $registerFormParams['route'] = $request->getPathInfo();
  210. $registerFormParams['email'] = $email;
  211. $registerFormParams['firstName'] = $firstname;
  212. $registerFormParams['lastName'] = $lastname;
  213. $registerFormParams['phone'] = $phonePrefix.$phone;
  214. $registerFormParams['privacy'] = $privacy;
  215. $registerFormParams['club'] = $club;
  216. $registerFormParams['page'] = $page;
  217. $registerFormParams['promoTag'] = $data->get('promoTag') ?? null;
  218. try{
  219. $this->virginUser->checkPerson($email);
  220. $error = $this->virginUser->handlePerson($registerFormParams, $context);
  221. if ($error){
  222. $redirectObject['params']['loginError'] = true;
  223. $redirectObject['params']['errorSnippet'] = $error;
  224. if ($error == 'lead-manager.form.message.userRegistered'){
  225. $redirectObject['route'] = 'frontend.account.login.page';
  226. if ($data->get('promoTag')) {
  227. try {
  228. $pageId = $this->landingPageService->getCmsPageIdFromPromoTag($data->get('promoTag'), "login", $context);
  229. $url = $this->landingPageService->getSEOUrlFromPageId($pageId, $context);
  230. return $this->redirect($url.'?'. http_build_query($redirectObject['params']));
  231. } catch (\Exception $e) {}
  232. }
  233. } else {
  234. $redirectObject['route'] = 'frontend.account.register.page';
  235. }
  236. }
  237. } catch (\Exception $e) {
  238. $redirectObject['route'] = 'frontend.account.register.page';
  239. $redirectObject['params']['loginError'] = true;
  240. $redirectObject['params']['errorSnippet'] = $e->getMessage();
  241. }
  242. return $this->redirectToRoute($redirectObject['route'], $redirectObject['params'] ?? []);
  243. }
  244. /**
  245. * @Route("/account/login", name="frontend.account.login.page", methods={"GET"})
  246. */
  247. public function showLoginPage(Request $request, RequestDataBag $data, SalesChannelContext $context)
  248. {
  249. $customer = $context->getCustomer();
  250. if (isset($customer)) {
  251. return $this->redirectToRoute('frontend.configurator');
  252. }
  253. $page = $this->genericLoader->load($request, $context);
  254. $page = $this->genericPageLoader->load($request, $context);
  255. return $this->renderStorefront('@Storefront/storefront/page/login.html.twig', [
  256. 'page' => $page,
  257. 'loginError' => (bool)$request->get('loginError'),
  258. 'errorSnippet' => $request->get('errorSnippet'),
  259. 'successSnippet' => $request->get('successSnippet'),
  260. 'warningSnippet' => $request->get('warningSnippet') ?? $request->getSession()->get('warningSnippet'),
  261. ]);
  262. }
  263. /**
  264. * @Route("/account/login", name="frontend.account.login", methods={"POST"}, defaults={"XmlHttpRequest" = true})
  265. */
  266. public function login(Request $request, RequestDataBag $data, SalesChannelContext $context): \Symfony\Component\HttpFoundation\Response
  267. {
  268. if (isset($_SESSION['accountLoginRequestDataBag'])) {
  269. unset($_SESSION['accountLoginRequestDataBag']);
  270. }
  271. $email = $data->get('username');
  272. $criteria = new Criteria();
  273. $criteria->addFilter(new EqualsFilter('customer.email', $email));
  274. $response = $this->virginUser->LoginManager($data, $context);
  275. if (!$request->getSession()->get("landingExSocio")){
  276. $this->cartService->deleteCart($context);
  277. }
  278. if ($response) {
  279. if($response['login']) {
  280. switch($response['personType']) {
  281. case VirginUser::PERSONTYPE_EXSOCIO:
  282. case VirginUser::PERSONTYPE_SOCIO:
  283. $request->getSession()->remove('warningSnippet');
  284. if ($request->getSession()->get("landingExSocio") && $response['personType'] === VirginUser::PERSONTYPE_EXSOCIO){
  285. $request->request->add([
  286. 'redirectTo' => 'frontend.checkout.confirm.page',
  287. 'redirectParameters' => [
  288. "productId" => $this->productService->getProductFromCart($this->cartService->getCart($context->getToken(), $context), $context)->getId()
  289. ]
  290. ]);
  291. } else if ($data->get('promoTag')) {
  292. try {
  293. $redirectObject = $this->landingPageService->getRedirectObjectFromTag($data->get('promoTag'), 'cards', $context);
  294. $request->request->add([
  295. 'redirectTo' => $redirectObject['route'],
  296. 'redirectParameters' => $redirectObject['params']
  297. ]);
  298. } catch (\Exception $e) {
  299. $request->request->add(['redirectTo' => 'frontend.account.subscription.page']);
  300. }
  301. } else {
  302. $request->request->add(['redirectTo' => 'frontend.account.subscription.page']);
  303. }
  304. break;
  305. case VirginUser::PERSONTYPE_INSOLUTO:
  306. $request->getSession()->set('insoluto', true);
  307. $request->request->add(['redirectTo' => 'frontend.insoluto']);
  308. break;
  309. case VirginUser::PERSONTYPE_BLACKLIST:
  310. $request->request->add(['redirectTo' => 'frontend.blacklist']);
  311. break;
  312. case VirginUser::PERSONTYPE_DROPECCEZ:
  313. case VirginUser::PERSONTYPE_NN:
  314. $request->request->add(['redirectTo' => 'frontend.account.profile.page']);
  315. break;
  316. }
  317. return $this->createActionResponse($request);
  318. } else {
  319. if ($response['personType'] == VirginUser::PERSONTYPE_LEAD || $response['personType'] == VirginUser::PERSONTYPE_LEADLAYER) {
  320. $redirectObject = [
  321. 'route' => 'frontend.account.register.page',
  322. 'params' => [
  323. 'loginError' => true,
  324. 'errorSnippet' => $response['errorMessage'],
  325. ]
  326. ];
  327. if ($data->get('promoTag')) {
  328. try {
  329. $pageId = $this->landingPageService->getCmsPageIdFromPromoTag($data->get('promoTag'), "register", $context);
  330. $url = $this->landingPageService->getSEOUrlFromPageId($pageId, $context);
  331. return $this->redirect($url.'?'. http_build_query($redirectObject['params']));
  332. } catch (\Exception $e) {}
  333. }
  334. return $this->forwardToRoute(
  335. $redirectObject['route'], $redirectObject['params']
  336. );
  337. }
  338. $request->getSession()->set('recoveryEmail', $email);
  339. return $this->forwardToRoute(
  340. 'frontend.account.login.page',
  341. [
  342. 'loginError' => true,
  343. 'errorSnippet' => $response['errorMessage'],
  344. ]
  345. );
  346. }
  347. } else {
  348. return $this->forwardToRoute(
  349. 'frontend.account.login.page',
  350. [
  351. 'loginError' => true,
  352. 'errorSnippet' => $errorSnippet ?? null,
  353. ]
  354. );
  355. }
  356. }
  357. /**
  358. * @Route("/account/logout", name="frontend.account.logout.page", methods={"GET"})
  359. */
  360. public function logout(Request $request, SalesChannelContext $context): Response
  361. {
  362. $request->getSession()->clear();
  363. if (isset($_SESSION['accountLoginRequestDataBag'])) {
  364. unset($_SESSION['accountLoginRequestDataBag']);
  365. unset($_SESSION['forcedLoginAttempt']);
  366. unset($_SESSION['customerEntity']);
  367. }
  368. $parameters = [];
  369. try {
  370. $isForcedLogout = $request->get('forcedLogout');
  371. if ($isForcedLogout) {
  372. $this->addFlash('danger', $this->trans('lead-manager.account.genericErrorLogin'));
  373. } else {
  374. $this->addFlash('success', $this->trans('account.logoutSucceeded'));
  375. }
  376. $this->cartService->deleteCart($context);
  377. $this->logoutRoute->logout($context);
  378. if (isset($_COOKIE[LeadGenerationService::ECOMMERCE_COOKIE_NAME])) {
  379. unset($_COOKIE[LeadGenerationService::ECOMMERCE_COOKIE_NAME]);
  380. setcookie(LeadGenerationService::ECOMMERCE_COOKIE_NAME, '', time() - 3600, '/'); // empty value and old timestamp
  381. }
  382. } catch (ConstraintViolationException $formViolations) {
  383. $parameters = ['formViolations' => $formViolations];
  384. } catch (\Exception $exception) {}
  385. if(!empty($_SESSION['mc_code'])) {
  386. unset($_SESSION['mc_code']);
  387. }
  388. $response = $this->redirectToRoute('frontend.account.login.page', $parameters);
  389. $response->headers->setCookie(
  390. Cookie::create('leadUser', '', 1, '/', null, $request->isSecure(), true, false, 'Lax')
  391. );
  392. return $response;
  393. }
  394. /**
  395. * @Route("/noscript", name="frontend.noscript", methods={"GET"})
  396. */
  397. public function noscript(Request $request, SalesChannelContext $context): Response
  398. {
  399. return new Response("
  400. <html>
  401. <head></head>
  402. <body>
  403. Please enable javascript in order to use the website and refresh this page -
  404. Per favore abilitare il javascript per poter utilizzare il sito e ricaricare la pagina
  405. </body>
  406. <script>
  407. window.location.href = '/';
  408. </script>
  409. </html>
  410. ");
  411. }
  412. /**
  413. * @return string
  414. */
  415. private function getClubNameForPromoLandingPage(string $clubId)
  416. {
  417. $criteria = new Criteria();
  418. $criteria->addFilter(new EqualsFilter('club.id', $clubId));
  419. $club = $this->clubRepository->search($criteria, Context::createDefaultContext())->first();
  420. return str_replace(" ", "-", strtolower(trim($club->getName())));
  421. }
  422. /**
  423. * @Route("/account/can-buy", name="frontend.account.canbuy", methods={"GET"})
  424. * @param Request $request
  425. * @param RequestDataBag $data
  426. * @param SalesChannelContext $context
  427. * @return JsonResponse
  428. */
  429. public function canBuy(Request $request, RequestDataBag $data, SalesChannelContext $context): JsonResponse
  430. {
  431. $email = $request->query->get('email');
  432. if (!$email){
  433. return new JsonResponse([
  434. 'success' => false
  435. ]);
  436. }
  437. return new JsonResponse([
  438. 'success' => $this->virginUser->canBuy($email)
  439. ]);
  440. }
  441. }