src/Controller/Frontend/FmRegistrationController.php line 146

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Entity\Gos\LeadFormCompleted;
  4. use App\Entity\Gos\LeadFormResponse;
  5. use App\Entity\Gos\LeadFormResponseItem;
  6. use App\Entity\Gos\Term;
  7. use App\Entity\Gos\TermType;
  8. use App\Form\Frontend\RegistrationType;
  9. use App\Message\LeadEventBok;
  10. use App\Utils\AddressUtils;
  11. use App\Utils\CartServices;
  12. use App\Utils\ClickMeetingUtils;
  13. use App\Utils\Encryption;
  14. use App\Utils\FacebookPixel\Api\FacebookPixelService;
  15. use App\Utils\LeadFormCompletedUtils;
  16. use App\Utils\NotificationForUserUtils;
  17. use App\Utils\OneTimePasswordService;
  18. use App\Utils\OrderFreeAccessService;
  19. use App\Utils\Email\SendMail;
  20. use App\Utils\PortalSettingsService;
  21. use App\Utils\RegistrationUtils;
  22. use App\Utils\SalesManago\SalesManagoTagUtils;
  23. use App\Utils\SalesManago\v2\Action\Contact\Upsert\Events\SalesManagoUpsertEventsV2;
  24. use App\Utils\SalesManago\v2\Action\SalesManagoEventDispatcher;
  25. use App\Utils\TermsService;
  26. use App\Utils\UrlParser;
  27. use App\Utils\UserBenefits;
  28. use App\Utils\UserFlagService;
  29. use App\Utils\UserServices;
  30. use App\Entity\Gos\PortalSettings;
  31. use App\Entity\Gos\User;
  32. use Doctrine\ORM\EntityManagerInterface;
  33. use FOS\UserBundle\Event\FilterUserResponseEvent;
  34. use FOS\UserBundle\Event\FormEvent;
  35. use FOS\UserBundle\Event\GetResponseUserEvent;
  36. use FOS\UserBundle\FOSUserEvents;
  37. use FOS\UserBundle\Model\UserInterface;
  38. use FOS\UserBundle\Model\UserManagerInterface;
  39. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  40. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  41. use Symfony\Component\Form\FormError;
  42. use Symfony\Component\HttpFoundation\JsonResponse;
  43. use Symfony\Component\HttpFoundation\RedirectResponse;
  44. use Symfony\Component\HttpFoundation\Request;
  45. use Symfony\Component\HttpFoundation\Response;
  46. use Symfony\Component\HttpFoundation\Session\Session;
  47. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  48. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  49. use Symfony\Component\HttpKernel\KernelInterface;
  50. use Symfony\Component\Messenger\MessageBusInterface;
  51. use Symfony\Component\Routing\Annotation\Route;
  52. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  53. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  54. use FOS\UserBundle\Controller\RegistrationController as FOSBaseController;
  55. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  56. use Symfony\Contracts\Translation\TranslatorInterface;
  57. use Twig\Environment;
  58. use Twig\TemplateWrapper;
  59. class FmRegistrationController extends FOSBaseController
  60. {
  61.     private $oneTimePasswordService;
  62.     private $portalSettingsService;
  63.     private $em;
  64.     private $userManager;
  65.     private $eventDispatcher;
  66.     private $termsService;
  67.     private $addressUtils;
  68.     private $registrationUtils;
  69.     private $orderFreeAccessService;
  70.     private $encryption;
  71.     private $userBenefits;
  72.     private $cartServices;
  73.     private $userServices;
  74.     private $sendMail;
  75.     private $tokenStorage;
  76.     private $fileDirPath;
  77.     private $matchRegex;
  78.     private $facebookPixelService;
  79.     private $messageBus;
  80.     private $userFlagService;
  81.     private Environment $twig;
  82.     private $salesManagoEventDispatcher;
  83.     private TranslatorInterface $translator;
  84.     public function __construct(
  85.         OneTimePasswordService     $oneTimePasswordService,
  86.         PortalSettingsService      $portalSettingsService,
  87.         EntityManagerInterface     $em,
  88.         UserManagerInterface       $userManager,
  89.         EventDispatcherInterface   $eventDispatcher,
  90.         TermsService               $termsService,
  91.         AddressUtils               $addressUtils,
  92.         RegistrationUtils          $registrationUtils,
  93.         OrderFreeAccessService     $orderFreeAccessService,
  94.         Encryption                 $encryption,
  95.         UserBenefits               $userBenefits,
  96.         CartServices               $cartServices,
  97.         UserServices               $userServices,
  98.         SendMail                   $sendMail,
  99.         TokenStorageInterface      $tokenStorage,
  100.         KernelInterface            $kernel,
  101.         FacebookPixelService       $facebookPixelService,
  102.         MessageBusInterface        $messageBus,
  103.         UserFlagService            $userFlagService,
  104.         Environment                $twig,
  105.         SalesManagoEventDispatcher $salesManagoEventDispatcherTranslatorInterface $translator
  106.     ) {
  107.         $this->oneTimePasswordService $oneTimePasswordService;
  108.         $this->portalSettingsService  $portalSettingsService;
  109.         $this->em                     $em;
  110.         $this->userManager            $userManager;
  111.         $this->eventDispatcher        $eventDispatcher;
  112.         $this->termsService           $termsService;
  113.         $this->addressUtils           $addressUtils;
  114.         $this->registrationUtils      $registrationUtils;
  115.         $this->orderFreeAccessService $orderFreeAccessService;
  116.         $this->encryption             $encryption;
  117.         $this->userBenefits           $userBenefits;
  118.         $this->cartServices           $cartServices;
  119.         $this->userServices           $userServices;
  120.         $this->sendMail               $sendMail;
  121.         $this->tokenStorage           $tokenStorage;
  122.         $this->fileDirPath            $kernel->getProjectDir() . '/public/uploads/events/';
  123.         $this->matchRegex             true;
  124.         $this->facebookPixelService   $facebookPixelService;
  125.         $this->messageBus             $messageBus;
  126.         $this->userFlagService        $userFlagService;
  127.         $this->twig                   $twig;
  128.         $this->salesManagoEventDispatcher $salesManagoEventDispatcher;
  129.         $this->translator $translator;
  130.     }
  131.     public function registerAction(Request $request): Response
  132.     {
  133.         $isAjax             $request->request->get('isAjax');
  134.         $templateId         $request->query->get('template'false);
  135.         $portalSettingsHash $this->portalSettingsService->getPortalSettingsHashForIframe($request);
  136.         $currentRoute       $request->attributes->get('_route');
  137.         $pdfArticleUrl      $request->query->get('articleUrl'false);
  138.         if ($portalSettingsHash)
  139.         {
  140.             $request->getSession()->set('portalSettingsHash'$portalSettingsHash);
  141.         }
  142.         //redirect to the same route if portal settings hasn't been set
  143.         if (empty($portalSettingsHash))
  144.         {
  145.             if ($request->request->get('return') === 'json_format')
  146.             {
  147.                 return $this->json(['status' => 'error''message' => 'notFoundPortalSettingsHash'], 400);
  148.             }
  149.             if ($currentRoute === 'eforum_register')
  150.             {
  151.                 return $this->redirectToRoute('efShowDynamicTemplate');
  152.             }
  153.             if ($currentRoute === 'uniqskills_register')
  154.             {
  155.                 return $this->redirectToRoute('fmUniqskillsHomePage', [
  156.                     '_locale' => $request->getSession()->get('userLocale''pl')
  157.                 ]);
  158.             }
  159.             return $this->render('frontend/base/reloadPage.html.twig', [
  160.                 'method' => 'replaceUrl',
  161.                 'domain' => UrlParser::getFullPath($request->headers->get('referer'))
  162.             ]);
  163.         }
  164.         if ($currentRoute === 'eforum_register' && !empty($this->getUser()))
  165.         {
  166.             return $this->redirectToRoute('efShowDynamicTemplate');
  167.         }
  168.         if ($currentRoute === 'uniqskills_register' && !empty($this->getUser()))
  169.         {
  170.             return $this->redirectToRoute('fmUniqskillsHomePage');
  171.         }
  172.         /** @var User $user */
  173.         $user $this->userManager->createUser();
  174.         $portalSettings $this->em->getRepository(PortalSettings::class)->findOneByHash($portalSettingsHash);
  175.         $terms         = [];
  176.         $termsRequired = [];
  177.         
  178.         if (in_array($currentRoute, ['eforum_register''uniqskills_register''order_register']))
  179.         {
  180.             $terms         $this->termsService->getTerms($portalSettingsnullfalsetruefalse);
  181.             $termsRequired $this->termsService->getTerms($portalSettingsnulltruetruefalse);
  182.         }
  183.         $termsAccepted $request->get('terms');
  184.         $termInfo      $this->em->getRepository(Term::class)->findTermInfoForPortal($portalSettings);
  185.         $leadTemplate  $this->em->getRepository(LeadFormResponse::class)->find($templateId);
  186.         if ($leadTemplate !== null)
  187.         {
  188.             if (!$leadTemplate->getTerms()->isEmpty())
  189.             {
  190.                 $leadTerms     $leadTemplate->getTerms()->toArray();
  191.                 $terms         array_merge($terms$leadTerms);
  192.                 $termsRequired array_merge($termsRequiredarray_filter($leadTerms, function (Term $term) {
  193.                     return $term->getIsRequired() === true;
  194.                 }));
  195.             }
  196.             if ($isEnglish = ($leadTemplate->isEnglish() === true)) {
  197.                 $this->translator->setLocale('en');
  198.             }
  199.         }
  200.         $event = new GetResponseUserEvent($user$request);
  201.         $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_INITIALIZE);
  202.         if (null !== $event->getResponse())
  203.         {
  204.             return $event->getResponse();
  205.         }
  206.         $form $this->createForm(RegistrationType::class, $user, [
  207.             'phoneRequired'        => RegistrationUtils::isPhoneRequired($request$leadTemplate),
  208.             'phoneHidden'          => $leadTemplate $leadTemplate->isPhoneHidden() : false,
  209.             'isEnglishLead'        => $leadTemplate $leadTemplate->isEnglish() : false,
  210.             'csrf_protection'      => $request->request->get('remove_csrf_protection'true),
  211.             'is_uniqskills_portal' => $currentRoute,
  212.             'is_from_application'  => $request->request->get('from_app'false),
  213.             'portalSettingsId'     => $portalSettings->getId(),
  214.             'requiredNPWZ'         => RegistrationUtils::requiredNPWZ($leadTemplate),
  215.             'isLeading'            => $leadTemplate !== null,
  216.         ])->handleRequest($request);
  217.         if ($form->isSubmitted())
  218.         {
  219.             if (!$this->termsService->areTermsSelected($termsAccepted$termsRequired))
  220.             {
  221.                 if ($request->request->get('return') == 'json_format')
  222.                 {
  223.                     return $this->json(['status'  => 'error''message' => 'notSelectedRequiredTerms'], 400);
  224.                 }
  225.                 $request->getSession()->getFlashBag()->add('warning''Musisz zaznaczyć wymagane zgody.');
  226.             }
  227.             if ($form->has('npwz'))
  228.             {
  229.                 if ($this->cartServices->checkValidityNpwz($form->get('npwz')->getData()) == false)
  230.                 {
  231.                     $form->get('npwz')->addError(new FormError('Błędny numer PWZ'));
  232.                 }
  233.             }
  234.             if (!$portalSettings->getIsUniqskillsPortal() && empty($isEnglish))
  235.             {
  236.                 $phone $form->getData()->getPhoneNumber();
  237.                 if (!empty($phone) && !$this->addressUtils->checkPhoneForPl($phone))
  238.                 {
  239.                     $form->get('phoneNumber')->addError(new FormError('Błędny numer telefonu'));
  240.                 }
  241.             }
  242.             $existingUser $this->em->getRepository(User::class)->findOneByEmailCanonical($user->getEmail());
  243.             $isLeadValid  $this->registrationUtils->validateLeadForm($leadTemplate ?? null$existingUser ?? $user);
  244.             $reginfo      $this->registrationUtils->resolveReginfo($request$leadTemplate);
  245.             if ($form->isValid() && $isLeadValid)
  246.             {
  247.                 $this->registrationUtils->checkAdditionalFields($request$templateId$form);
  248.                 if (is_null($user->getPassword()))
  249.                 {
  250.                     $user->setPassword(md5(strtotime(time())));
  251.                 }
  252.                 if ($user->getPhoneNumber())
  253.                 {
  254.                     $user->setPhoneNumberPrefix($request->request->get('numberPrefix'));
  255.                 }
  256.                 $user->setRegisteredFrom($portalSettings);
  257.                 $this->registrationUtils->setUserCountry($user);
  258.                 $this->registrationUtils->setUserTimezone($user);
  259.                 RegistrationUtils::setUserCampaignInfo($request$user$portalSettings);
  260.                 if ($reginfo !== null)
  261.                 {
  262.                     $user->setReginfo($reginfo);
  263.                     $leadFormCompleted LeadFormCompletedUtils::createLeadForm($user$portalSettings);
  264.                     $leadFormCompleted->setRegInfo($reginfo);
  265.                     $leadFormCompleted->setActionNumber($leadTemplate $leadTemplate->getActionNumber() : $user->getActionNumber());
  266.                     LeadFormCompletedUtils::setLeadFormCampaignInfoFromUser($leadFormCompleted$user);
  267.                     if ($leadTemplate)
  268.                     {
  269.                         $this->facebookPixelService->setEvent('Lead')->request();
  270.                         $leadFormCompleted->setTemplate($leadTemplate);
  271.                         $this->registrationUtils->setRemindersAboutActivation($leadFormCompleted$leadTemplate);
  272.                         if ($leadTemplate->isIncludingAddress())
  273.                         {
  274.                             LeadFormCompletedUtils::updateLeadFormAddress($request$leadFormCompleted);
  275.                         }
  276.                         if (!is_null($request->get('source'))) $leadFormCompleted->setFromSource($request->get('source'));
  277.                     }
  278.                     LeadFormCompletedUtils::updateLeadPosition($request$leadFormCompleted$this->em);
  279.                 }
  280.                 $this->registrationUtils->setUserAdditionalInfo($request$user$leadFormCompleted ?? null);
  281.                 if ($form->has('npwz'))
  282.                 {
  283.                     $this->registrationUtils->saveNpwz($user$leadFormCompleted ?? null$form->get('npwz')->getData());
  284.                 }
  285.                 $notificationForUserUtils = new NotificationForUserUtils($this->em);
  286.                 $notificationForUserUtils->saveNotificationToUserByLanguage($user$user->getCountry()->getLanguage(), $portalSettings);
  287.                 if ($request->request->get('from_app'))
  288.                 {
  289.                     $digits         6;
  290.                     $activationCode str_pad(rand(0pow(10$digits) - 1), $digits'0'STR_PAD_LEFT);
  291.                     $user->setActivationCode($activationCode);
  292.                 }
  293.                 $session = new Session();
  294.                 $session->set('email'$user->getEmail());
  295.                 $event = new FormEvent($form$request);
  296.                 $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_SUCCESS);
  297.                 $this->userManager->updateUser($user);
  298.                 if ($termInfo !== null$terms[] = $termInfo;
  299.                 $this->termsService->saveUserTerms($terms$termsAccepted$user$portalSettings);
  300.                 $this->em->refresh($user);
  301.                 if (isset($leadFormCompleted))
  302.                 {
  303.                     $this->em->persist($leadFormCompleted);
  304.                     $this->em->flush();
  305.                 }
  306.                 $this->userServices->sendUserLeadToDB(
  307.                     $user,
  308.                     $portalSettings,
  309.                     $reginfo,
  310.                     __METHOD__,
  311.                     null,
  312.                     $leadFormCompleted ?? null
  313.                 );
  314.                 if (null === $response $event->getResponse())
  315.                 {
  316.                     $response $this->redirectToRoute('fos_user_registration_confirmed');
  317.                 }
  318.                 if ($leadTemplate)
  319.                 {
  320.                     if ($leadTemplate->getEmailTemplate()) $request->getSession()->set('leadIdFromRegister'$leadTemplate->getId());
  321.                     if ($leadTemplate->getFromEmail()) $request->getSession()->set('leadFromEmail'$leadTemplate->getFromEmail());
  322.                     if ($leadTemplate->getSender()) $request->getSession()->set('leadSender'$leadTemplate->getSender());
  323.                     if ($leadTemplate->getIsClickmeeting())
  324.                     {
  325.                         try
  326.                         {
  327.                             ClickMeetingUtils::addConferenceRegistration($user$leadTemplate);
  328.                         }
  329.                         catch (\Exception $e)
  330.                         {
  331.                             error_log($e->getMessage());
  332.                         }
  333.                     }
  334.                     if ($productVariant $leadTemplate->getProductVariant())
  335.                     {
  336.                         $accessTo = (new \DateTime())->modify('50 years');
  337.                         $this->orderFreeAccessService->addFreeAccessToUser($user$accessTo$productVariant);
  338.                         $this->userFlagService->assignToUserByProductVariant($user$productVariant);
  339.                     }
  340.                     if ($leadTemplate->getUseEventBok() === true) {
  341.                         $this->messageBus->dispatch(
  342.                             new LeadEventBok(
  343.                                 'lead_event_confirm',
  344.                                 $user->getId(),
  345.                                 $leadTemplate->getId(),
  346.                                 $portalSettingsHash,
  347.                                 true,
  348.                                 $request->request->get('leadExtraEvents', [])
  349.                             )
  350.                         );
  351.                     }
  352.                     //new user - SB lead
  353.                     $this->salesManagoEventDispatcher->dispatchContactUpsert(
  354.                         $user,
  355.                         SalesManagoUpsertEventsV2::ON_LEADING,
  356.                         $leadTemplate,
  357.                         $reginfo
  358.                     );
  359.                     if ($leadTemplate->getOneTimePassword() && (!$user->isEnabled() || $user->getIsRobinson()))
  360.                     {
  361.                         $this->oneTimePasswordService->generateCodeForAccount($user);
  362.                         $this->oneTimePasswordService->sendMailWithCode($user$portalSettings'leadTemplate'$leadTemplate->getId(), null$leadTemplate->getFromEmail(), $leadTemplate->getSender(), $pdfArticleUrl);
  363.                         $this->eventDispatcher->dispatch(
  364.                             new FilterUserResponseEvent($user$request$response),
  365.                             FOSUserEvents::REGISTRATION_COMPLETED
  366.                         );
  367.                         if ($isAjax)
  368.                         {
  369.                             $request->query->add([
  370.                                 'leadTemplate'  => $leadTemplate->getId(),
  371.                                 'email'         => $user->getEmail(),
  372.                                 'token'         => $user->getOtpToken(),
  373.                                 'pdfArticleUrl' => $pdfArticleUrl
  374.                             ]);
  375.                             return $this->forward('\App\Controller\Frontend\OneTimePasswordController::showActivationPage', [
  376.                                 'request' => $request
  377.                             ]);
  378.                         }
  379.                         return $this->redirect(
  380.                             $this->generateUrl('fmOneTimePasswordActivationPage')
  381.                             . '?leadTemplate=' $leadTemplate->getId()
  382.                             . '&email=' $user->getEmail()
  383.                             . '&token=' $user->getOtpToken()
  384.                             . '&pdfArticleUrl=' $pdfArticleUrl
  385.                         );
  386.                     }
  387.                 }
  388.                 $this->eventDispatcher->dispatch(
  389.                     new FilterUserResponseEvent($user$request$response),
  390.                     FOSUserEvents::REGISTRATION_COMPLETED
  391.                 );
  392.                 // Uncomment to auto login after registration
  393. //                $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
  394. //                $this->tokenStorage->setToken($token);
  395. //                $request->getSession()->set('_security_main', serialize($token));
  396.                 if (null !== $cartHash $request->cookies->get('cartHash'))
  397.                 {
  398.                     $this->cartServices->addCartToUser($cartHash$user);
  399.                 }
  400.                 if ($request->isXmlHttpRequest())
  401.                 {
  402.                     $access $this->userBenefits->get($user);
  403.                     $access4cms $this->userBenefits->get($usertrue);
  404.                     if ($request->request->get('return') == 'json_format')
  405.                     {
  406.                         return $this->json(['status' => 'ok']);
  407.                     }
  408.                     return $this->json(['success' => true'data' => $this->encryption->encryptUser($user$access$access4cms)]);
  409.                 }
  410.                 else
  411.                 {
  412.                     if ($request->request->get('return') == 'json_format')
  413.                     {
  414.                         $data = ['status' => 'ok'];
  415.                         if($request->request->get('from_app'))
  416.                             $data['user'] = $user->getToken();
  417.                         return $this->json($data);
  418.                     }
  419.                 }
  420.                 return $response;
  421.             }
  422.             else if ($templateId && isset($this->getErrors($form)['email']) && !isset($this->getErrors($form)['npwz']))
  423.             {
  424.                 // this is wrong and needs to be changed
  425.                 // in case of lead and existing user every other field can be wrong, and it will pass anyway
  426.                 $this->registrationUtils->checkAdditionalFields($request$templateId$form$this->matchRegex);
  427.                 if ($this->matchRegex && $isLeadValid)
  428.                 {
  429.                     if ($existingUser instanceof User)
  430.                     {
  431.                         $session = new Session();
  432.                         $session->set('email'$user->getEmail());
  433.                         $this->registrationUtils->updateUserData($user$existingUser);
  434.                         $existingLeadFormCompleted $this->em->getRepository(LeadFormCompleted::class)->findOneBy([
  435.                             'user'    => $existingUser,
  436.                             'regInfo' => $reginfo,
  437.                         ]);
  438.                         if ($existingLeadFormCompleted instanceof LeadFormCompleted)
  439.                         {
  440.                             $existingLeadFormCompleted->setCreatedAt(new \DateTime());
  441.                             LeadFormCompletedUtils::setLeadFormCampaignInfoFromRequest($existingLeadFormCompleted$request$portalSettings);
  442.                             if ($user->getPhoneNumber()) $existingLeadFormCompleted->setPhoneNumber($user->getPhoneNumber());
  443.                             if ($leadTemplate->isIncludingAddress())
  444.                             {
  445.                                 LeadFormCompletedUtils::updateLeadFormAddress($request$existingLeadFormCompleted);
  446.                             }
  447.                             LeadFormCompletedUtils::updateLeadPosition($request$existingLeadFormCompleted$this->em);
  448.                         }
  449.                         elseif ($reginfo !== null)
  450.                         {
  451.                             $leadFormCompleted LeadFormCompletedUtils::createLeadForm($existingUser$portalSettings);
  452.                             $leadFormCompleted->setRegInfo($reginfo);
  453.                             LeadFormCompletedUtils::setLeadFormCampaignInfoFromRequest($leadFormCompleted$request$portalSettings);
  454.                             if ($leadTemplate)
  455.                             {
  456.                                 $leadFormCompleted->setTemplate($leadTemplate);
  457.                                 $this->registrationUtils->setRemindersAboutActivation($leadFormCompleted$leadTemplate);
  458.                                 if ($leadTemplate->isIncludingAddress())
  459.                                 {
  460.                                     LeadFormCompletedUtils::updateLeadFormAddress($request$leadFormCompleted);
  461.                                 }
  462.                                 if (!is_null($request->get('source'))) $leadFormCompleted->setFromSource($request->get('source'));
  463.                             }
  464.                             LeadFormCompletedUtils::updateLeadPosition($request$leadFormCompleted$this->em);
  465.                             $this->em->persist($leadFormCompleted);
  466.                         }
  467.                         if ($form->has('npwz'))
  468.                         {
  469.                             $this->registrationUtils->saveNpwz($existingUser$existingLeadFormCompleted ?? $leadFormCompleted ?? null$form->get('npwz')->getData());
  470.                         }
  471.                         $this->registrationUtils->setUserAdditionalInfo($request$existingUser$existingLeadFormCompleted ?? $leadFormCompleted ?? null);
  472.                         $this->em->flush();
  473.                         $this->userServices->sendUserLeadToDB(
  474.                             $existingUser,
  475.                             $portalSettings,
  476.                             $reginfo,
  477.                             __METHOD__,
  478.                             null,
  479.                             $existingLeadFormCompleted ?? $leadFormCompleted ?? null
  480.                         );
  481.                         //existing user - SB lead
  482.                         $this->salesManagoEventDispatcher->dispatchContactUpsert(
  483.                             $user,
  484.                             SalesManagoUpsertEventsV2::ON_LEADING,
  485.                             $leadTemplate,
  486.                             $reginfo
  487.                         );
  488.                         if ($reginfo !== null)
  489.                         {
  490.                             $this->userServices->updateContactTags(
  491.                                 $user,
  492.                                 SalesManagoTagUtils::getTagsAsArray($reginfo$leadTemplate)
  493.                             );
  494.                         }
  495.                         if ($productVariant $leadTemplate->getProductVariant())
  496.                         {
  497.                             $accessTo = (new \DateTime())->modify('50 years');
  498.                             $this->orderFreeAccessService->addFreeAccessToUser($existingUser$accessTo$productVariant);
  499.                             $this->userFlagService->assignToUserByProductVariant($existingUser$productVariant);
  500.                         }
  501.                         if ($leadTemplate->getIsClickmeeting())
  502.                         {
  503.                             try
  504.                             {
  505.                                 ClickMeetingUtils::addConferenceRegistration($user$leadTemplate);
  506.                             }
  507.                             catch (\Exception $e)
  508.                             {
  509.                                 error_log($e->getMessage());
  510.                             }
  511.                         }
  512.                         if (!$existingUser->isEnabled() || $existingUser->getIsRobinson())
  513.                         {
  514.                             if ($leadTemplate->getOneTimePassword()) {
  515.                                 $this->oneTimePasswordService->generateCodeForAccount($existingUser);
  516.                                 $this->oneTimePasswordService->sendMailWithCode(
  517.                                     $existingUser,
  518.                                     $portalSettings,
  519.                                     'leadTemplate',
  520.                                     $leadTemplate->getId(),
  521.                                     null,
  522.                                     $leadTemplate->getFromEmail(),
  523.                                     $leadTemplate->getSender(),
  524.                                     $pdfArticleUrl
  525.                                 );
  526.                                 if ($isAjax)
  527.                                 {
  528.                                     $request->query->add([
  529.                                         'leadTemplate'  => $leadTemplate->getId(),
  530.                                         'email'         => $existingUser->getEmail(),
  531.                                         'token'         => $existingUser->getOtpToken()
  532.                                     ]);
  533.                                     return $this->forward('\App\Controller\Frontend\OneTimePasswordController::showActivationPage', [
  534.                                         'request' => $request
  535.                                     ]);
  536.                                 }
  537.                                 return new RedirectResponse(
  538.                                     $this->generateUrl('fmOneTimePasswordActivationPage')
  539.                                     .'?leadTemplate=' .$leadTemplate->getId()
  540.                                     .'&email='.$existingUser->getEmail()
  541.                                     .'&token='.$existingUser->getOtpToken()
  542.                                 );
  543.                             }
  544.                             $this->eventDispatcher->dispatch(
  545.                                 new FilterUserResponseEvent($existingUser$request, new Response()),
  546.                                 FOSUserEvents::REGISTRATION_COMPLETED
  547.                             );
  548.                         }
  549.                         if ($leadTemplate->getEmailTemplate())
  550.                         {
  551.                             // add .ics file from event do attachments
  552.                             if ($leadEvent $leadTemplate->getEvent())
  553.                             {
  554.                                 if ($leadEvent->getICalCalendarFileName())
  555.                                 {
  556.                                     $attachment['add_me_to_calendar.ics'] = $this->fileDirPath $leadEvent->getICalCalendarFileName();
  557.                                 }
  558.                             }
  559.                             if ($leadTemplate->getUseEventBok() === true) {
  560.                                 $this->messageBus->dispatch(
  561.                                     new LeadEventBok(
  562.                                         'lead_event_confirm',
  563.                                         $existingUser->getId(),
  564.                                         $leadTemplate->getId(),
  565.                                         $portalSettingsHash,
  566.                                         true,
  567.                                         $request->request->get('leadExtraEvents', [])
  568.                                     )
  569.                                 );
  570.                             } else {
  571.                                 $this->sendMail->sendMail(
  572.                                     'lead_user_already_exist',
  573.                                     $user->getEmail(),
  574.                                     [
  575.                                         'user' => $user,
  576.                                         'event' => $leadTemplate->getEvent() ?? null,
  577.                                         'attachment' => $attachment ?? null
  578.                                     ],
  579.                                     $portalSettingsHash,
  580.                                     false,
  581.                                     null,
  582.                                     ['emailTemplate' => $leadTemplate->getEmailTemplate(), 'sender' => $leadTemplate->getSender(), 'fromEmail' =>$leadTemplate->getFromEmail()]
  583.                                 );
  584.                             }
  585.                         }
  586.                         if ($isAjax)
  587.                         {
  588.                             if ($pdfArticleUrl)
  589.                             {
  590.                                 $template $this->twig->load('frontend/article_pdf/after_register_content.html.twig');
  591.                                 $content $template->renderBlock('content', [
  592.                                     'pdfUrl' => $this->pdfResponseUrl($pdfArticleUrl)
  593.                                 ]);
  594.                                 $response = new Response();
  595.                                 $response->setContent($content);
  596.                                 return $response;
  597.                             }
  598.                             $request->query->add([
  599.                                 'type'     => 'register',
  600.                                 'template' => $request->query->get('template'),
  601.                                 'newUser'  => false
  602.                             ]);
  603.                             return $this->forward('\App\Controller\Frontend\UserController::afterLoginAction', [
  604.                                 'request' => $request,
  605.                                 'facebookPixelService' => $this->facebookPixelService,
  606.                                 'type' => 'register'
  607.                             ]);
  608.                         }
  609.                         if ($pdfArticleUrl) {
  610.                             return $this->render('frontend/article_pdf/after_register_content.html.twig', [
  611.                                 'pdfUrl' => $this->pdfResponseUrl($pdfArticleUrl)
  612.                             ]);
  613.                         }
  614.                         return $this->redirectToRoute('fmUserAfterLogin', [
  615.                             'type'     => 'register',
  616.                             'template' => $request->query->get('template'),
  617.                             'newUser'  => false,
  618.                         ]);
  619.                     }
  620.                 }
  621.             }
  622.             $event = new FormEvent($form$request);
  623.             $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_FAILURE);
  624.             if (null !== $response $event->getResponse())
  625.             {
  626.                 if ($request->request->get('return') == 'json_format')
  627.                 {
  628.                     return $this->json(['status' => 'error''message' => 'error'], 400);
  629.                 }
  630.                 if ($request->isXmlHttpRequest())
  631.                 {
  632.                     return $this->json(['success' => false'body' => 'Ups, coÅ› jest nie tak']);
  633.                 }
  634.                 return $response;
  635.             }
  636.         }
  637.         if ($request->isXmlHttpRequest() || 'order_register' === $currentRoute)
  638.         {
  639.             $template 'frontend/order/user/register.html.twig';
  640.             $request->getSession()->set('registerFrom''FROM_CART');
  641.         }
  642.         elseif ('eforum_register' === $currentRoute)
  643.         {
  644.             $template 'frontend-eforum/security/register.html.twig';
  645.             $request->getSession()->set('registerFrom''FROM_SIGNUP');
  646.         }
  647.         elseif ('uniqskills_register' === $currentRoute)
  648.         {
  649.             $template 'uniqskills/security/register.html.twig';
  650.             $request->getSession()->set('registerFrom''FROM_SIGNUP');
  651.         }
  652.         else
  653.         {
  654.             $template 'frontend/registration/register.html.twig';
  655.             $request->getSession()->set('registerFrom''FROM_SIGNUP');
  656.         }
  657.         if ($request->query->get('hideAddContent'))
  658.         {
  659.             $portalSettings->setRegistrationAdditionalContent(null);
  660.         }
  661.         if ($request->cookies->get('f'))
  662.         {
  663.             $request->getSession()->set('f'$request->cookies->get('f'));
  664.         }
  665.         if ($request->request->get('return') == 'json_format')
  666.         {
  667.             return $this->json([
  668.                 'status'      => 'error',
  669.                 'isValid'     => $form->isValid(),
  670.                 'validErrors' => $this->getErrors($form)
  671.             ], 400);
  672.         }
  673.         $parameters = [
  674.             'termInfo'           => $termInfo,
  675.             'terms'              => $terms,
  676.             'termsAccepted'      => $termsAccepted,
  677.             'form'               => $form->createView(),
  678.             'portalSettings'     => $portalSettings,
  679.             'source'             => $request->query->get('source''default'),
  680.             'userCountry'        => $user->getCountry(),
  681.             'ups'                => $user->getRegisteredFrom(),
  682.             'isFromLeadTemplate' => !is_null($leadTemplate),
  683.             'hideLastName'       => !is_null($leadTemplate) && (($leadTemplate->getHideLastName() ?? false)),
  684.             'leadTemplate'       => $leadTemplate,
  685.             'phoneRequired'      => RegistrationUtils::isPhoneRequired($request$leadTemplate),
  686.             'isEnglish'          => $isEnglish ?? false
  687.         ];
  688.         if ($templateId && $leadTemplate !== null)
  689.         {
  690.             $leadFormAdditionalFields $this->em->getRepository(LeadFormResponseItem::class)->findByLeadFormResponse($templateId);
  691.             $parameters['legalRule'] = $leadTemplate->getLegalRule();
  692.             if ($leadFormAdditionalFields !== null)
  693.             {
  694.                 $parameters['additionalFields'] = $leadFormAdditionalFields;
  695.             }
  696.             if ($leadTemplate->isIncludingPosition())
  697.             {
  698.                 $parameters['positionField'] = $leadTemplate->getLeadFormResponsePosition();
  699.             }
  700.             if ($leadTemplate->isIncludingAddress())
  701.             {
  702.                 $parameters['addressFields'] = $leadTemplate->getLeadFormResponseAddress();
  703.             }
  704.             if ($leadTemplate->getIsLeadForPartner())
  705.             {
  706.                 $parameters['leadForPartner'] = true;
  707.                 $parameters['linkToPartner']  = $leadTemplate->getLinkToPartner();
  708.             }
  709.             if (isset($isLeadValid) && $isLeadValid == false)
  710.             {
  711.                 $parameters['emailValidationError'] = $leadTemplate->getEmailValidationErrorMessage();
  712.             }
  713.             if ($leadFormResponsePosition $leadTemplate->getLeadFormResponsePosition())
  714.             {
  715.                 $parameters['hidePortalPositions'] = $leadFormResponsePosition->getHidePortalPositions();
  716.             }
  717.             if ($leadTemplate->getRequiredNPWZ())
  718.             {
  719.                 $parameters['requiredNPWZ'] = true;
  720.             }
  721.             if ($leadTemplate->getAdditionalStyle())
  722.             {
  723.                 $parameters['additionalStyleFromLead'] = $leadTemplate->getAdditionalStyle();
  724.             }
  725.             if ($leadTemplate->getUseEventBok() === true && $leadTemplate->getAdditionalEvents()->isEmpty() === false) {
  726.                 $parameters['additionalEventsDescription'] = $leadTemplate->getAdditionalEventsDescription();
  727.                 $parameters['additionalEvents'] = $leadTemplate->getAdditionalEvents();
  728.             }
  729.         }
  730.         if ($isAjax)
  731.         {
  732.             $template $this->twig->load($template);
  733.             $content "";
  734.             if ($template->hasBlock('customcss'))
  735.             {
  736.                 $content .= $template->renderBlock('customcss');
  737.             }
  738.             $content .= $template->renderBlock('content'$parameters);
  739.             if ($template->hasBlock('customjs'))
  740.             {
  741.                 $content .= $template->renderBlock('customjs');
  742.             }
  743.             $response = new Response();
  744.             $response->headers->set('Content-Language', !empty($isEnglish) ? 'en' 'pl');
  745.             $response->setContent($content);
  746.             return $response;
  747.         }
  748.         return $this->render($template$parameters);
  749.     }
  750.     /**
  751.      * @Route("/outside-register", name="fmUserFrontendOutsideSourceRegister")
  752.      * @Template()
  753.      */
  754.     public function outsideSourceRegistrationAction(Request $request): JsonResponse
  755.     {
  756.         /** @var User $user */
  757.         $user $this->userManager->createUser();
  758.         $user->setEnabled(true);
  759.         $user->setActivationDate(new \DateTime());
  760.         $portalSettingsHash $request->getSession()->get('portalSettingsHash');
  761.         $portalSettings $this->em->getRepository(PortalSettings::class)->findOneByHash($portalSettingsHash);
  762.         if ($portalSettings instanceof PortalSettings)
  763.         {
  764.             $user->setRegisteredFrom($portalSettings);
  765.         }
  766.         $form $this->createForm(RegistrationType::class, $user, ['csrf_protection' => false]);
  767.         $form->handleRequest($request);
  768.         if ($form->isSubmitted() && $form->isValid())
  769.         {
  770.             $user->setAllowedAdvertising($request->request->get('advertisingAgreement'));
  771.             $this->userManager->updateUser($user);
  772.             $this->userServices->activateVouchersForUser($user);
  773.             return $this->json('success'200, ['Access-Control-Allow-Origin' => '*']);
  774.         }
  775.         $advertisingAgreement $this->em->getRepository(Term::class)->findOneBy([
  776.             'termType' => $this->em->getRepository(TermType::class)->findOneBy(['slug' => 'advertising-agreement'])
  777.         ]);
  778.         $response $this->render('frontend/registration/outside_register.html.twig', [
  779.             'form'                  => $form->createView(),
  780.             'action'                => $this->generateUrl(
  781.                 'fmUserFrontendOutsideSourceRegister',
  782.                 [],
  783.                 UrlGeneratorInterface::NETWORK_PATH
  784.             ),
  785.             'advertisingAgreement'  => $advertisingAgreement
  786.         ]);
  787.         return $this->json($response->getContent(), 200, ['Access-Control-Allow-Origin' => '*']);
  788.     }
  789.     /**
  790.      * Tell the user to check their email provider.
  791.      */
  792.     public function checkEmailAction(Request $request): Response
  793.     {
  794.         $email $request->getSession()->get('fos_user_send_confirmation_email/email');
  795.         if (empty($email))
  796.         {
  797.             return $this->redirectToRoute('fos_user_registration_register');
  798.         }
  799.         $request->getSession()->remove('fos_user_send_confirmation_email/email');
  800.         $user $this->userManager->findUserByEmail($email);
  801.         if (null === $user)
  802.         {
  803.             return $this->redirectToRoute('fos_user_security_login');
  804.         }
  805.         return $this->render('@FOSUser/Registration/check_email.html.twig', [
  806.             'user' => $user,
  807.         ]);
  808.     }
  809.     /**
  810.      * Receive the confirmation token from user email provider, login the user.
  811.      *
  812.      * @param Request $request
  813.      * @param string  $token
  814.      *
  815.      * @return Response
  816.      */
  817.     public function confirmAction(Request $request$token): Response
  818.     {
  819.         $user $this->userManager->findUserByConfirmationToken($token);
  820.         if (null === $user)
  821.         {
  822.             throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist'$token));
  823.         }
  824.         $user->setConfirmationToken(null);
  825.         $user->setEnabled(true);
  826.         $user->setActivationDate(new \DateTime());
  827.         $event = new GetResponseUserEvent($user$request);
  828.         $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_CONFIRM);
  829.         $this->userManager->updateUser($user);
  830.         $this->userServices->activateVouchersForUser($user);
  831.         if (null === $response $event->getResponse())
  832.         {
  833.             $response $this->redirectToRoute('fos_user_registration_confirmed');
  834.         }
  835.         $this->eventDispatcher->dispatch(
  836.             new FilterUserResponseEvent($user$request$response),
  837.             FOSUserEvents::REGISTRATION_CONFIRMED
  838.         );
  839.         return $response;
  840.     }
  841.     /**
  842.      * Tell the user his account is now confirmed.
  843.      */
  844.     public function confirmedAction(Request $request): Response
  845.     {
  846.         $user $this->getUser();
  847.         if (!is_object($user) || !$user instanceof UserInterface)
  848.         {
  849.             throw new AccessDeniedException('This user does not have access to this section.');
  850.         }
  851.         return $this->render('@FOSUser/Registration/confirmed.html.twig', [
  852.             'user'      => $user,
  853.             'targetUrl' => $this->getTargetUrlFromSession($request->getSession()),
  854.         ]);
  855.     }
  856.     private function getTargetUrlFromSession(SessionInterface $session): ?string
  857.     {
  858.         $key sprintf('_security.%s.target_path'$this->tokenStorage->getToken()->getProviderKey());
  859.         if ($session->has($key))
  860.         {
  861.             return $session->get($key);
  862.         }
  863.         return null;
  864.     }
  865.     private function getErrors($form): array
  866.     {
  867.         $errors = [];
  868.         foreach ($form as $fieldName => $formField)
  869.         {
  870.             foreach ($formField->getErrors(true) as $error)
  871.             {
  872.                 $errors[$fieldName] = $error->getMessage();
  873.             }
  874.         }
  875.         return $errors;
  876.     }
  877.     private function pdfResponseUrl(string $url): string
  878.     {
  879.         $url parse_url($url);
  880.         $path $url['path'] . '/pdf';
  881.         $scheme str_replace('http''https'$url['scheme']);
  882.         $host $url['host'];
  883.         $query = isset($url['query']) ? '?' $url['query'] : '';
  884.         return $scheme '://' $host $path $query;
  885.     }
  886. }