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

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