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

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