src/Controller/UserController.php line 129

Open in your IDE?
  1. <?php
  2. namespace Slivki\Controller;
  3. use Doctrine\ORM\Query\ResultSetMapping;
  4. use Imagine\Gd\Imagine;
  5. use Imagine\Image\Box;
  6. use Imagine\Image\Point;
  7. use Slivki\Dto\User\OrderHistory\Factory\TireOrderHistoryDtoFactory;
  8. use Slivki\Entity\City;
  9. use Slivki\Entity\MailingCampaign;
  10. use Slivki\Entity\Subscriber;
  11. use Slivki\Entity\UserEmailHistory;
  12. use Slivki\Enum\Order\PaymentType;
  13. use Slivki\Factory\User\OrderHistory\FoodOrderHistoryDtoFactory;
  14. use Slivki\Handler\User\CreditCard\RemoveCreditCardHandler;
  15. use Slivki\Repository\Offer\DeliveryZoneRepositoryInterface;
  16. use Slivki\Repository\User\UserAddressRepositoryInterface;
  17. use Slivki\Response\Admin\Offer\CoordinatesResponse;
  18. use Slivki\Services\GiftCertificateService;
  19. use Slivki\Services\MapProviders\CoordinatesYandex;
  20. use Slivki\Services\OfferExtension\FoodOfferExtensionImageService;
  21. use Slivki\Services\Sms\Security\SmsLimiterService;
  22. use Slivki\Services\User\AccountMerger;
  23. use Slivki\Services\User\AuthorizationCodeSender;
  24. use Slivki\Services\User\UserPhoneService;
  25. use Slivki\Services\UserGetter;
  26. use Slivki\Util\Iiko\SushiVesla;
  27. use Doctrine\Persistence\ManagerRegistry;
  28. use Slivki\Util\Iiko\Tokiny;
  29. use Symfony\Component\HttpFoundation\Cookie;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use Slivki\Entity\Comment;
  32. use Slivki\Entity\DeliveryLocation;
  33. use Slivki\Entity\FoodOrder;
  34. use Slivki\Entity\GiftCertificateOrder;
  35. use Slivki\Entity\MailingCampaignType;
  36. use Slivki\Entity\MailingCampaignUnsubscribe;
  37. use Slivki\Entity\Media;
  38. use Slivki\Entity\Media\OfferExtensionMedia;
  39. use Slivki\Entity\MediaType;
  40. use Slivki\Entity\Offer;
  41. use Slivki\Entity\OfferOrder;
  42. use Slivki\Entity\OfferOrderDetails;
  43. use Slivki\Entity\Referral;
  44. use Slivki\Entity\SocialAccount;
  45. use Slivki\Entity\Street;
  46. use Slivki\Entity\SubscriptionOrder;
  47. use Slivki\Entity\TireOrder;
  48. use Slivki\Entity\User;
  49. use Slivki\Entity\UserActivity;
  50. use Slivki\Entity\UserAddress;
  51. use Slivki\Entity\UserBalanceActivity;
  52. use Slivki\Entity\UserBalanceActivityType;
  53. use Slivki\Entity\UserConfirmation;
  54. use Slivki\Entity\UserGroup;
  55. use Slivki\Entity\UserPhone;
  56. use Slivki\Repository\CityRepository;
  57. use Slivki\Services\Encoder;
  58. use Slivki\Services\ImageService;
  59. use Slivki\Services\Mailer;
  60. use Slivki\Services\Subscription\SubscriptionService;
  61. use Slivki\Util\Amplitude;
  62. use Slivki\Util\CommonUtil;
  63. use Slivki\Util\Iiko\AbstractDelivery;
  64. use Slivki\Util\Iiko\IikoUtil;
  65. use Slivki\Util\Logger;
  66. use Slivki\Util\OAuth2Client\AbstractOAuth2Client;
  67. use Slivki\Util\OAuth2Client\UserData;
  68. use Slivki\Util\SoftCache;
  69. use Symfony\Component\Filesystem\Filesystem;
  70. use Symfony\Component\HttpFoundation\JsonResponse;
  71. use Symfony\Component\HttpFoundation\Request;
  72. use Symfony\Component\HttpFoundation\Response;
  73. use Symfony\Component\HttpKernel\KernelInterface;
  74. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  75. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  76. use Symfony\Component\Validator\Validator\ValidatorInterface;
  77. use function sprintf;
  78. class UserController extends SiteController
  79. {
  80.     private ManagerRegistry $managerRegistry;
  81.     private TireOrderHistoryDtoFactory $tireOrderHistoryDtoFactory;
  82.     private FoodOrderHistoryDtoFactory $foodOrderHistoryDtoFactory;
  83.     public function __construct(
  84.         KernelInterface $kernel,
  85.         ManagerRegistry $managerRegistry,
  86.         TireOrderHistoryDtoFactory $tireOrderHistoryDtoFactory,
  87.         FoodOrderHistoryDtoFactory $foodOrderHistoryDtoFactory
  88.     ) {
  89.         parent::__construct($kernel);
  90.         $this->managerRegistry $managerRegistry;
  91.         $this->tireOrderHistoryDtoFactory $tireOrderHistoryDtoFactory;
  92.         $this->foodOrderHistoryDtoFactory $foodOrderHistoryDtoFactory;
  93.     }
  94.     /**
  95.      * @Route("/login")
  96.      */
  97.     public function loginPageAction(Request $request) {
  98.         $session $this->container->get('session');
  99.         $key 'returnUrl';
  100.         $data['tab'] = $request->query->get('tab''login');
  101.         $path urldecode($request->query->get('path',  '/'));
  102.         if ($path != '/') {
  103.             $session->set($key$path);
  104.         } else {
  105.             $referer $request->headers->get('referer');
  106.             $path parse_url($refererPHP_URL_PATH);
  107.             if ($path != '/login' && $path != $session->get($key)) {
  108.                 $query parse_url($refererPHP_URL_QUERY);
  109.                 if ($query != "") {
  110.                     $path .= "?$query";
  111.                 }
  112.                 $session->set($key$path);
  113.             }
  114.         }
  115.         if ($path == '' || $path == '/login') {
  116.             $path CityRepository::$mainPageURL;
  117.         }
  118.         if ($this->getUser()) {
  119.             return $this->redirect($path);
  120.         }
  121.         $data['email'] = $this->get('session')->get('restoredEmail''');
  122.         $data['afterLoginRedirectUri'] = strpos($path'http') === false $request->getSchemeAndHttpHost() . $path $path;
  123.         $flashBag $session->getFlashBag();
  124.         $data['registrationError'] = $flashBag->get('registrationError');
  125.         $data['registeredEmailSent'] = $flashBag->get('registeredEmailSent');
  126.         $data['registeredEmailSentRaw'] = $flashBag->get('registeredEmailSentRaw');
  127.         return $this->render('Slivki/mobile/login.html.twig'$data);
  128.     }
  129.     /**
  130.      * @Route("/register", name="register")
  131.      */
  132.     public function registerAction(Request $requestMailer $mailerValidatorInterface $validator) {
  133.         $isMobileDevice CommonUtil::isMobileDevice($request);
  134.         if ($request->getMethod() != "POST") {
  135.             if ($isMobileDevice) {
  136.                 return $this->redirect("/login");
  137.             }
  138.             return $this->redirect("/");
  139.         }
  140.         $utmSource $this->getUtmSourceCookie($request);
  141.         $user = new User();
  142.         $user->setAcceptNewsletter(true);
  143.         $user->setStatus(User::STATUS_REGISTERED);
  144.         $email mb_strtolower(trim($request->request->get("email")));
  145.         $userRepository $this->getDoctrine()->getRepository(User::class);
  146.         if ($userRepository->loadUserByUsername($emailfalse)) {
  147.             return new JsonResponse(['message' =>"Пользователь с таким e-mail-ом уже зарегистрирован"]);
  148.         }
  149.         $user->setEmail($email);
  150.         /** @var \Symfony\Component\Validator\ConstraintViolationList $errorList */
  151.         $errorList $validator->validate($user);
  152.         if ($errorList->count() > 0) {
  153.             return new JsonResponse(['message' =>$errorList->get(0)->getMessage()]);
  154.         }
  155.         $password trim($request->get("password"));
  156.         if (strlen($password) < 6) {
  157.             return new JsonResponse(['message' =>"Пароль не может быть меньше 6 символов"]);
  158.         }
  159.         if ($password != trim($request->get("confirmPassword"))) {
  160.             return new JsonResponse(['message' =>"Пароли не совпадают"]);
  161.         }
  162.         $user->encryptPassword($password);
  163.         $cityName $request->get("city");
  164.         $cityRepository $this->getDoctrine()->getRepository(City::class);
  165.         $city $cityRepository->findOneBy(array("name" => $cityName));
  166.         if (!$city) {
  167.             $city $cityRepository->findOneBy(array(), array("ID" => "asc"));
  168.         }
  169.         $user->setCity($city);
  170.         if ($utmSource) {
  171.             $user->setRegisteredFromUtmSource($utmSource['utmSource']);
  172.         }
  173.         $entityManager $this->getDoctrine()->getManager();
  174.         $entityManager->persist($user);
  175.         $userRepository->addDirectorGroupToUserByUser($user);
  176.         $entityManager->flush($user);
  177.         $this->checkUserIsSupplier($user);
  178.         $userConfirmation = new UserConfirmation();
  179.         $userConfirmation->setUserID($user->getID());
  180.         $userConfirmation->setReturnUrl($request->request->get('registerReturnUrl'));
  181.         $entityManager->persist($userConfirmation);
  182.         $this->subscriberRemove($email);
  183.         $entityManager->flush();
  184.         $this->checkReferer($request$user);
  185.         $eventData = ['city' => $cityName'ip' => $request->getClientIp()];
  186.         $userData = [
  187.             'userID' => $user->getID(),
  188.             'email' => $user->getEmail(),
  189.             'phone' => '',
  190.             'social' => '',
  191.             'user_type' => 'general',
  192.             'active' => true,
  193.             'region' => $cityName,
  194.             'date_created' => $user->getCreatedOn()->format('Y-m-d H:i:s')
  195.         ];
  196.         $utmData $this->getUtmSourceCookie($request);
  197.         if ($utmData) {
  198.             if (isset($utmData[$utmData['utmSource']])) {
  199.                 $utmData['utm_source'] = $utmData['utmSource'];
  200.                 unset($utmData['utmSource']);
  201.             }
  202.             if (isset($utmData['period'])) {
  203.                 unset($utmData['period']);
  204.             }
  205.         }
  206.         $amplitude = new Amplitude($user);
  207.         $amplitude->sendEvent('NewUserRegistered'$eventData$utmSource$userData);
  208.         $this->sendConfirm($mailer$user);
  209.         $data = [
  210.             'id' => 'modalAccountActivation',
  211.             'email' => $email,
  212.             'link' => Encoder::encodeString($user->getEmail(), $user->getSalt())
  213.         ];
  214.         $view $isMobileDevice 'Slivki/mobile_account_activation.html.twig' 'Slivki/popups/account_activation_popup.html.twig';
  215.         $popup $this->get('twig')->render($view$data);
  216.         return new JsonResponse(['popup' => $popup]);
  217.     }
  218.     /**
  219.      * @Route("/social-login/{socialNetwork}", name="socialLogin")
  220.      */
  221.     public function socialLoginAction(Request $request$socialNetwork) {
  222.         $redirectUri $request->query->get('state'CityRepository::$mainPageURL);
  223.         $className 'Slivki\Util\OAuth2Client\Provider\\' ucfirst($socialNetwork) . 'Client';
  224.         /** @var AbstractOAuth2Client $oAuthProvider */
  225.         $oAuthProvider = new $className();
  226.         $accessToken $oAuthProvider->getAccessToken($request);
  227.         if (!$accessToken) {
  228.             return $this->redirect($redirectUri);
  229.         }
  230.         /** @var UserData $userData */
  231.         $userData $oAuthProvider->getUserData($accessToken);
  232.         if (!$userData->getEmail()) {
  233.             return $this->redirect($redirectUri);
  234.         }
  235.         $entityManager $this->getDoctrine()->getManager();
  236.         $socialAccount $entityManager->getRepository(SocialAccount::class)->findOneBy([
  237.             'network' => $userData->getNetwork(),
  238.             'identity' => $userData->getID()
  239.         ]);
  240.         if ($socialAccount) {
  241.             $user $socialAccount->getUser();
  242.         } else {
  243.             $user $entityManager->getRepository(User::class)->findOneByEmail($userData->getEmail());
  244.         }
  245.         if (!$user) {
  246.             // Register new user
  247.             $utmSource $this->getUtmSourceCookie($request);
  248.             $user = new User();
  249.             $user->setAcceptNewsletter(true);
  250.             $user->setStatus(User::STATUS_CONFIRMED);
  251.             $user->setEmail($userData->getEmail());
  252.             $user->setLastName($userData->getLastName());
  253.             $user->setFirstName($userData->getFirstName());
  254.             $password substr(md5(microtime()), 05);
  255.             $user->encryptPassword($password);
  256.             if ($utmSource != '') {
  257.                 $user->setRegisteredFromUtmSource($utmSource);
  258.             }
  259.             $entityManager->persist($user);
  260.             $mainMailingCampaignType $entityManager->getRepository(MailingCampaignType::class)->find(MailingCampaignType::MAIN_ID);
  261.             $user->addMailingCampaignTypes($mainMailingCampaignType);
  262.             $userRepository $this->getUserRepository();
  263.             $userRepository->addDirectorGroupToUserByUser($user);
  264.             $entityManager->flush($user);
  265.             $userRepository->addActivity($userUserActivity::SUBSCRIBE_ACTION$mainMailingCampaignType);
  266.             $this->checkReferer($request$user);
  267.             $this->checkUserIsSupplier($user);
  268.             $this->subscriberRemove($user->getEmail() );
  269.         }
  270.         $linked false;
  271.         foreach($user->getSocialAccounts()->toArray() as $value) {
  272.             if ($userData->getNetwork() == $value->getNetwork() && $userData->getID() == $value->getIdentity()) {
  273.                 $linked true;
  274.                 break;
  275.             }
  276.         }
  277.         // Add social account
  278.         if (!$linked) {
  279.             $socialAccount = new SocialAccount();
  280.             $socialAccount->setNetwork($userData->getNetwork());
  281.             $socialAccount->setIdentity($userData->getID());
  282.             $socialAccount->setUser($user);
  283.             $user->addSocialAccount($socialAccount);
  284.         }
  285.         $entityManager->flush();
  286.         $entityManager->clear();
  287.         $user $this->getUserRepository()->find($user->getID());
  288.         $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  289.         $this->get('security.token_storage')->setToken($token);
  290.         return $this->redirect($redirectUri);
  291.     }
  292.     private function checkUserIsSupplier(User $user) {
  293.         $entityManager $this->getDoctrine()->getManager();
  294.         $director $this->getUserRepository()->getDirector($user);
  295.         if ($director) {
  296.             $supplierUserGroup $entityManager->getRepository(UserGroup::class)->find(UserGroup::ROLE_SUPPLIER_ID);
  297.             $user->addUserGroup($supplierUserGroup);
  298.             $entityManager->flush();
  299.         }
  300.     }
  301.     /**
  302.      * @Route("/sendconfirm", name="sendconfirm")
  303.      */
  304.     public function sendConfirmAction(Request $requestMailer $mailer) {
  305.         $email Encoder::decodeString($request->query->get('email'), User::SALT);
  306.         $user $this->getDoctrine()->getRepository(User::class)->findOneByEmail(pg_escape_string($email));
  307.         if (!$user){
  308.             if (self::getMobileDevice($request)) {
  309.                 return $this->redirect("/login");
  310.             }
  311.             return $this->redirect("/");
  312.         }
  313.         if ($this->sendConfirm($mailer$user)) {
  314.             $this->addFlash("registeredEmailSent"Encoder::encodeString($user->getEmail(), User::SALT));
  315.             $this->addFlash("registeredEmailSentRaw"$user->getEmail());
  316.         }
  317.         if (self::getMobileDevice($request)) {
  318.             return $this->redirect("/login");
  319.         }
  320.         return $this->redirect("/");
  321.     }
  322.     /**
  323.      * @Route("/lostpassword/{email}", name="lostpassword")
  324.      */
  325.     public function lostPasswordAction(Request $requestMailer $mailer$email null){
  326.         if ($request->getMethod() != "POST") {
  327.             if (self::getMobileDevice($request)) {
  328.                 return $this->render('Slivki/mobile/profile/restore_password.html.twig', ['email' => $email]);
  329.             }
  330.             return $this->redirect("/");
  331.         }
  332.         $result = [
  333.             'type' => 'error',
  334.             'html' => 'Введенный e-mail не найден'
  335.         ];
  336.         if ($this->sendPassword($mailer$request->request->get('email'))) {
  337.             $result = [
  338.                 'type' => 'success',
  339.                 'html' => '<p>Пароль отправлен на ваш электронный ящик</p>'
  340.                     .'<a href="/login" class="btn btn-success bg-slivki btn-block text-dark border-0">Войти</a>'
  341.             ];
  342.             $this->get('session')->set('restoredEmail'$request->request->get('email'));
  343.             if (!self::getMobileDevice($request)) {
  344.                 $result['html'] = '<p>Пароль отправлен на ваш электронный ящик</p>';
  345.             }
  346.         }
  347.         return new JsonResponse($result);
  348.     }
  349.     /**
  350.      * @Route("/profile/login", name="login")
  351.      */
  352.     public function loginAction(Request $requestAuthenticationUtils $utils) {
  353.         if (self::getMobileDevice($request)) {
  354.             return $this->redirect('/');
  355.         }
  356.         $redirectUri $request->headers->get('referer'CityRepository::$mainPageURL);
  357.         $authError $utils->getLastAuthenticationError();
  358.         $this->addFlash("openLoginPopup""true");
  359.         if ($authError) {
  360.             $this->addFlash("authError"$authError);
  361.         }
  362.         // if the user is disabled, show the link to send a confirmation letter
  363.         if (is_a($authError"Symfony\Component\Security\Core\Exception\DisabledException")) {
  364.             $this->addFlash("confirmEmail"Encoder::encodeString($authError->getToken()->getUserName(), User::SALT));
  365.         }
  366.         return $this->redirect($redirectUri);
  367.     }
  368.     /**
  369.      * @Route("/profile", name="profile")
  370.      */
  371.     public function profileAction(
  372.         Request $request,
  373.         ImageService $imageService,
  374.         SubscriptionService $subscriptionService,
  375.         UserGetter $userGetter
  376.     ) {
  377.         ini_set('memory_limit''1G'); // TODO: need refactoring
  378.         $entityManager $this->getDoctrine()->getManager();
  379.         $user $userGetter->get();
  380.         $limit 32;
  381.         // mark offer orders as seen by user
  382.         $notSeenOfferOrders $user->getNotSeenOfferOrders();
  383.         /** @var OfferOrder $offerOrder */
  384.         foreach($notSeenOfferOrders as $offerOrder) {
  385.             $offerOrder->setSeenByUser(true);
  386.         }
  387.         $entityManager->flush();
  388.         $mobileDevice CommonUtil::isMobileDevice($request);
  389.         $data['siteSettings'] = $this->getSiteSettings();
  390.         $bonusTypeBalanceActivityList '(' implode(','UserBalanceActivityType::BONUS_ACTIVITIES) . ')';
  391.         $sql "select coalesce(sum(amount), 0) from user_balance_activity where type in $bonusTypeBalanceActivityList and user_id = " $this->getUser()->getID();
  392.         $data['totalBonus'] = number_format($entityManager->getConnection()->executeQuery($sql)->fetchColumn(), 2'.''');
  393.         $data['totalBonusCodes'] = (int)($data['totalBonus'] / $data['siteSettings']->getCodeCost());
  394.         $data['allOfferOrders'] = $this->getCodesHistory($limit0,false);
  395.         $data['deliveryOrders'] = $this->getCodesHistory($limit0,falsetrue);
  396.         $deliveryOrdersHistory $this->getAllUserHistory($request$imageService$data['deliveryOrders'], $limit0false);
  397.         $data['deliveryOrdersHistory'] = $deliveryOrdersHistory['html'];
  398.         $data['deliveryOrdersHistoryShowMoreButton'] = count($data['deliveryOrders']) >= $limit;
  399.         $data['promocodesHistory'] = $this->getCodesHistoryHtml($request$data['allOfferOrders']);
  400.         $data['promocodesHistoryShowMoreButton'] = count($data['allOfferOrders']) >= $limit;
  401.         $balanceActivity $this->getBalanceActivity($limit0);
  402.         $all array_merge($data['allOfferOrders'], $balanceActivity);
  403.         $allUserHistory $this->getAllUserHistory($request$imageService$all$limit);
  404.         $data['allUserHistory'] = $allUserHistory['html'];
  405.         $data['balanceActivityHtml'] = $this->getBalanceActivityHtml($balanceActivity);
  406.         $data['balanceActivityShowMoreButton'] = count($balanceActivity) >= $limit;
  407.         $data['allShowMoreButton'] = $allUserHistory['count'] >= $limit;
  408.         $data['cities'] = $entityManager->getRepository(City::class)->findBy([], ['name' => 'asc']);
  409.         $data['mailingCampaignTypeList'] = $entityManager->getRepository(MailingCampaignType::class)->findBy([], ['ID' => 'ASC']);
  410.         $data['shareUrl'] = $request->getSchemeAndHttpHost() . '?ref=' $user->getID();
  411.         $data['user'] = $entityManager->merge($user);
  412.         $data['referralBonus'] = $this->getSiteSettings()->getReferralBonus();
  413.         $data['subscribed'] = $subscriptionService->isSubscriber($user);
  414.         $data['subscription'] = $subscriptionService->getSubscription($user);
  415.         $data['currentSubscriptionPlan'] = $subscriptionService->getCurrentSubscriptionPlan($user);
  416.         if ($mobileDevice) {
  417.             return $this->render('Slivki/mobile/profile/index.html.twig'$data);
  418.         }
  419.         return $this->render('Slivki/profile/index.html.twig'$data);
  420.     }
  421.     /**
  422.      * @Route("/profile/ajax_get_more_codes")
  423.      */
  424.     public function ajaxGetMoreCodesAction(
  425.         Request $request,
  426.         ImageService $imageService
  427.     ) {
  428.         if (!$request->isXmlHttpRequest()) {
  429.             return $this->redirect("/profile");
  430.         }
  431.         $offset $request->query->get('offset');
  432.         $type $request->query->get('type');
  433.         $limit $request->query->get('limit');
  434.         $result = [
  435.             'html' => '',
  436.             'hideShowMoreButton' => 0
  437.         ];
  438.         switch($type) {
  439.             case 'all':
  440.                 $balanceActivity $this->getBalanceActivity(null0);
  441.                 $activeCodes $this->getCodesHistory(null0,false);
  442.                 $all array_merge($balanceActivity$activeCodes);
  443.                 $allUserHistory $this->getAllUserHistory($request$imageService$all$limit$offset);
  444.                 $result = [
  445.                     'html' => $allUserHistory['html'],
  446.                     'hideShowMoreButton' => $allUserHistory['count'] < $limit '1' '0'
  447.                 ];
  448.                 break;
  449.             case 'balanceActivity':
  450.                 $balanceActivity $this->getBalanceActivity($limit$offset);
  451.                 $result = [
  452.                     'html' => $this->getBalanceActivityHtml($balanceActivity),
  453.                     'hideShowMoreButton' => count($balanceActivity) < $limit '1' '0'
  454.                 ];
  455.                 break;
  456.             case 'deliveryOrdersHistory':
  457.                 $deliveryOrdersHistory $this->getCodesHistory($limit0,falsetrue);
  458.                 $deliveryOrdersHistoryHtml $this->getAllUserHistory($request$imageService$deliveryOrdersHistory$limit$offsetfalse);
  459.                 $result = [
  460.                     'html' => $deliveryOrdersHistoryHtml['html'],
  461.                     'hideShowMoreButton' => count($deliveryOrdersHistory) < (int)$offset + (int)$limit '1' '0'
  462.                 ];
  463.                 break;
  464.             case 'promocodesHistory':
  465.                 $promocodesHistory $this->getCodesHistory($limit$offsetfalse);
  466.                 $result = [
  467.                     'html' => $this->getCodesHistoryHtml($request$promocodesHistory),
  468.                     'hideShowMoreButton' => count($promocodesHistory) < $limit '1' '0'
  469.                 ];
  470.                 break;
  471.         }
  472.         return new Response(json_encode($result));
  473.     }
  474.     private function getCodesHistory($limit$offset$onlyActive true$onlyFoodOrders false) {
  475.         $userID $this->getUser()->getID();
  476.         $onlyActiveCondition $onlyActive "AND offerOrderDetails.codeActiveTill >= CURRENT_TIMESTAMP() + '-1 day'" "";
  477.         $onlyFoodOrdersCondition $onlyFoodOrders "and (offerOrder instance of " FoodOrder::class
  478.             . " or offerOrder instance of " TireOrder::class . " or offerOrder instance of " GiftCertificateOrder::class . ")" "";
  479.         $entityManager $this->getDoctrine()->getManager();
  480.         $dql "SELECT offerOrder, offer, teaserMedia
  481.           FROM Slivki:OfferOrder offerOrder  
  482.           join offerOrder.offer offer
  483.           left join offer.teaserMedias teaserMedia
  484.           WHERE offerOrder.user = $userID and offerOrder.status > 0
  485.             $onlyActiveCondition
  486.             $onlyFoodOrdersCondition
  487.           ORDER BY offerOrder.ID DESC";
  488.         $query $entityManager->createQuery($dql);
  489.         if ($limit) {
  490.             $query->setMaxResults($limit);
  491.         }
  492.         $query->setFirstResult($offset);
  493.         return $query->getResult();
  494.     }
  495.     private function getCodesHistoryHtml(Request $request$codesHistory)
  496.     {
  497.         /** @var User $user */
  498.         $user $this->getUser();
  499.         $offerRepository $this->getOfferRepository();
  500.         $codesHistoryHtml '';
  501.         $mobileDevice CommonUtil::isMobileDevice($request);
  502.         $view $mobileDevice 'Slivki/mobile/profile/code_item.html.twig' 'Slivki/profile/codes/codes_item.html.twig';
  503.         foreach($codesHistory as $item) {
  504.             if ($item->getOfferOrderDetails()->count() == || ($item instanceof FoodOrder) || ($item instanceof TireOrder)) {
  505.                 continue;
  506.             }
  507.             $data['isTotalTab'] = false;
  508.             if ($mobileDevice) {
  509.                 $offer $item->getOffer();
  510.                 $data['offer'] = $offer;
  511.                 $codeCost $offerRepository->getCodeCost($offer);
  512.                 $offerIsFreeForUser $this->getOfferRepository()->isOfferFreeForUser($offer$user);
  513.                 $data['payLink'] = '/oplata-balance/' $offer->getID();
  514.                 if (!$offerIsFreeForUser && $user->getFullBalance() < $codeCost) {
  515.                     $data['payLink'] = '/oplata/' $offer->getID();
  516.                 }
  517.                 if ($offer->getID() == Offer::PETROL_OFFER_ID) {
  518.                     $data['payLink'] = '/oplata-promokoda-azs';
  519.                 }
  520.             }
  521.             $data['offerOrder'] = $item;
  522.             $codesHistoryHtml .= $this->renderView($view$data);
  523.         }
  524.         return $codesHistoryHtml;
  525.     }
  526.     private function getBalanceActivity($limit$offset) {
  527.         $userID $this->getUser()->getID();
  528.         $entityManager $this->getDoctrine()->getManager();
  529.         $user $this->getUser();
  530.         $userRegistrationBonusCancel $user->getBalanceActivityByType($entityManager->find(UserBalanceActivityType::class, UserBalanceActivity::TYPE_REGISTRATION_BONUS_CANCEL));
  531.         $userRegistrationBonusCancelCondition '';
  532.         if ($userRegistrationBonusCancel->count() > 0) {
  533.             $userRegistrationBonusCancelCondition ' AND UserBalanceActivity.type != ' UserBalanceActivity::TYPE_REGISTRATION_BONUS
  534.                 'AND UserBalanceActivity.type != ' UserBalanceActivity::TYPE_REGISTRATION_BONUS_CANCEL;
  535.         }
  536.         $dql "SELECT UserBalanceActivity
  537.           FROM Slivki:UserBalanceActivity UserBalanceActivity
  538.           WHERE UserBalanceActivity.user = $userID $userRegistrationBonusCancelCondition
  539.           AND UserBalanceActivity.type != :resetBalanceForInactiveUserType
  540.           ORDER BY UserBalanceActivity.createdOn DESC";
  541.         $query $entityManager->createQuery($dql);
  542.         $query->setParameter('resetBalanceForInactiveUserType'UserBalanceActivity::TYPE_RESET_BALANCE_FOR_INACTIVE_USER);
  543.         if ($limit) {
  544.             $query->setMaxResults($limit);
  545.         }
  546.         $query->setFirstResult($offset);
  547.         $balanceActivity $query->getResult();
  548.         return $balanceActivity;
  549.     }
  550.     private function getBalanceActivityHtml($balanceActivityList) {
  551.         $balanceActivityHtml '';
  552.         $bonusTypeBalanceActivityList UserBalanceActivityType::BONUS_ACTIVITIES;
  553.         /** @var UserBalanceActivity $balanceActivity */
  554.         foreach ($balanceActivityList as $balanceActivity) {
  555.             if (in_array($balanceActivity->getType()->getID(), $bonusTypeBalanceActivityList)) {
  556.                 $balanceActivityHtml .= $this->get('twig')->render('Slivki/profile/codes/bonus_item.html.twig', ['bonus' => $balanceActivity'siteSettings' => $this->getSiteSettings()]);
  557.             } else {
  558.                 $balanceActivityHtml .= $this->get('twig')->render('Slivki/profile/codes/payments_item.html.twig', ['payment' => $balanceActivity]);
  559.             }
  560.         }
  561.         return $balanceActivityHtml;
  562.     }
  563.     private function getAllUserHistory(Request $requestImageService $imageService$all$limit$offset 0$isTotalTab true) {
  564.         $isMobile self::getMobileDevice($request);
  565.         $siteSettings $this->getSiteSettings();
  566.         usort($all, function ($item1$item2) {
  567.             return $item2->getCreatedOn()->format('U') - $item1->getCreatedOn()->format('U');
  568.         });
  569.         $all array_slice($all$offset$limit);
  570.         $bonusTypeBalanceActivityList UserBalanceActivityType::BONUS_ACTIVITIES;
  571.         $result = [
  572.             'html' => '',
  573.             'count' => count($all)
  574.         ];
  575.         /** @var User $user */
  576.         $user $this->getUser();
  577.         $offerRepository $this->getOfferRepository();
  578.         $standardCodeCost $siteSettings->getCodeCost();
  579.         $seoRepository $this->getSeoRepository();
  580.         foreach ($all as $item) {
  581.             if ($item instanceof SubscriptionOrder) {
  582.                 continue;
  583.             }
  584.             if ($item instanceof OfferOrder) {
  585.                 $data = [];
  586.                 $data['isTotalTab'] = $isTotalTab;
  587.                 $view 'Slivki/profile/codes/codes_item.html.twig';
  588.                 if ($item instanceof FoodOrder) {
  589.                     if ($isMobile && $isTotalTab) {
  590.                         continue;
  591.                     }
  592.                     $data['foodOrder'] = $this->foodOrderHistoryDtoFactory->create($item);
  593.                     $view 'Slivki/profile/codes/food_item.html.twig';
  594.                 } elseif ($item instanceof TireOrder) {
  595.                     $data['tireOrder'] = $this->tireOrderHistoryDtoFactory->create($item);
  596.                     $view 'Slivki/profile/codes/tire_item.html.twig';
  597.                 } elseif ($item instanceof GiftCertificateOrder) {
  598.                     $view 'Slivki/profile/codes/gift_certificate_item.html.twig';
  599.                 }
  600.                 if ($isMobile) {
  601.                     if ($item instanceof FoodOrder) {
  602.                         $view 'Slivki/mobile/profile/food_item.html.twig';
  603.                     } elseif ($item instanceof TireOrder) {
  604.                         $view 'Slivki/mobile/profile/tire_item.html.twig';
  605.                     } elseif ($item instanceof GiftCertificateOrder) {
  606.                         $view 'Slivki/mobile/profile/gift_certificate_item.html.twig';
  607.                     } else {
  608.                         $view 'Slivki/mobile/profile/code_item.html.twig';
  609.                     }
  610.                     $offer $item->getOffer();
  611.                     $data['offer'] = $offer;
  612.                     $codeCost $offerRepository->getCodeCost($offer);
  613.                     $offerIsFreeForUser $this->getOfferRepository()->isOfferFreeForUser($offer$user);
  614.                     $data['payLink'] = '/oplata-balance/' $offer->getID();
  615.                     if ($user->getFullBalance() < $codeCost && !$offerIsFreeForUser) {
  616.                         $data['payLink'] = '/oplata/' $offer->getID();
  617.                     }
  618.                     if ($offer->getID() == Offer::PETROL_OFFER_ID) {
  619.                         $data['payLink'] = '/oplata-promokoda-azs';
  620.                     } else if ($codeCost != $standardCodeCost || ($item->getOfferOrderDetails()->count() > && $item->getOfferOrderDetails()->first()->getOfferExtension())) {
  621.                         $data['payLink'] = $seoRepository->getOfferURL($offer->getID())->getMainAlias();
  622.                     }
  623.                 }
  624.                 $data['offerOrder'] = $item;
  625.                 $result['html'] .= $this->renderView($view$data);
  626.             } else {
  627.                 if (!$isMobile) {
  628.                     if (in_array($item->getType()->getID(), $bonusTypeBalanceActivityList)) {
  629.                         $result['html'] .= $this->renderView('Slivki/profile/codes/bonus_item.html.twig', ['bonus' => $item'siteSettings' => $siteSettings]);
  630.                     } else {
  631.                         $result['html'] .= $this->renderView('Slivki/profile/codes/payments_item.html.twig', ['payment' => $item]);
  632.                     }
  633.                 }
  634.             }
  635.         }
  636.         return $result;
  637.     }
  638.     /**
  639.      * @Route("/profile/ajax_use_code/{codeID}")
  640.      */
  641.     public function ajaxUseCode($codeID) {
  642.         $code $this->getOfferOrderDetailsRepository()->find($codeID);
  643.         if (!$code) {
  644.             return new Response();
  645.         }
  646.         if ($code->getOfferOrder()->getUser() != $this->getUser()) {
  647.             return new Response();
  648.         }
  649.         $code->setUsed(true);
  650.         $this->getDoctrine()->getManager()->flush();
  651.         return new Response();
  652.     }
  653.     /**
  654.      * @Route("/profile/ajax_unuse_code/{codeID}")
  655.      */
  656.     public function ajaxUnuseCode($codeID) {
  657.         $code $this->getOfferOrderDetailsRepository()->find($codeID);
  658.         if (!$code) {
  659.             return new Response();
  660.         }
  661.         if ($code->getOfferOrder()->getUser() != $this->getUser()) {
  662.             return new Response();
  663.         }
  664.         $code->setUsed(false);
  665.         $this->getDoctrine()->getManager()->flush();
  666.         return new Response();
  667.     }
  668.     /**
  669.      * @Route("/ajax_get_user_social_accounts")
  670.      */
  671.     public function ajaxGetUserSocialAccounts() {
  672.         $user $this->getUser();
  673.         $result '';
  674.         $socialAccounts $user->getSocialAccounts();
  675.         foreach ($socialAccounts as $socialAccount) {
  676.             $result .= $socialAccount->getNetwork() . ' ';
  677.         }
  678.         return new Response($result);
  679.     }
  680.     /**
  681.      * @Route("/accept_newsletter")
  682.      */
  683.     public function acceptNewsletter(Request $requestSubscriptionService $subscriptionService)
  684.     {
  685.         $entityManager =  $this->getDoctrine()->getManager();
  686.         $user $this->getUser();
  687.         $requestMailingCampaignTypeIDList $request->request->get('newsletter', []);
  688.         foreach ($user->getMailingCampaignTypes() as $mailingCampaignType) {
  689.             if (!in_array($mailingCampaignType->getID(), $requestMailingCampaignTypeIDList)) {
  690.                 $user->removeMailingCampaignType($mailingCampaignType);
  691.                 $this->getUserRepository()->addActivity($userUserActivity::UNSUBSCRIBE_ACTION$mailingCampaignType);
  692.             }
  693.         }
  694.         $subscribe false;
  695.         foreach ($requestMailingCampaignTypeIDList as $mailingCampaignTypeID) {
  696.             if (!$user->hasMailingCampaignType($mailingCampaignTypeID)) {
  697.                 $mailingCampaignType $entityManager->getRepository(MailingCampaignType::class)->find($mailingCampaignTypeID);
  698.                 if ($mailingCampaignType) {
  699.                     $user->addMailingCampaignTypes($mailingCampaignType);
  700.                     $this->getUserRepository()->addActivity($userUserActivity::SUBSCRIBE_ACTION$mailingCampaignType);
  701.                     $subscribe true;
  702.                 }
  703.             }
  704.         }
  705.         if ($subscribe) {
  706.             $limitDate = new \DateTime('2017-09-20');
  707.             $activityType $entityManager->find(UserBalanceActivityType::class, UserBalanceActivity::TYPE_SUBSCRIBE_PROMO_BONUS);
  708.             $activityCount 0;
  709.             if ($user->getBalanceActivityByType($activityType)->count() == 0) {
  710.                 foreach ($user->getUserActivity() as $activity) {
  711.                     if ($activity->getCreatedOn() > $limitDate) {
  712.                         $activityCount++;
  713.                     }
  714.                 }
  715.                 if ($activityCount 2) {
  716.                     $entityManager->getRepository(User::class)->addBonus(
  717.                         $subscriptionService,
  718.                         $user,
  719.                         UserBalanceActivity::TYPE_SUBSCRIBE_PROMO_BONUS,
  720.                         1.5
  721.                     );
  722.                 }
  723.             }
  724.         }
  725.         $entityManager->flush($user);
  726.         return $this->redirect("/profile#profile_subscribe");
  727.     }
  728.     /**
  729.      * @Route("/unsubscribe")
  730.      */
  731.     public function unsubscribeNewsletters(Request $request) {
  732.         $entityManager $this->getDoctrine()->getManager();
  733.         if ($request->isMethod('POST')) {
  734.             $email $request->request->get('email''');
  735.             $mailingCampaignID $request->request->getInt('mailingCampaignID');
  736.             if ($email == '') {
  737.                 return $this->redirect("/");
  738.             }
  739.             $userRepository $this->getUserRepository();
  740.             $user $userRepository->findOneByEmail($email);
  741.             if (!$user) {
  742.                 return $this->redirect("/");
  743.             }
  744.             $requestMailingCampaignTypeIDList $request->request->get('newsletter', []);
  745.             $unsubscribed false;
  746.             foreach ($user->getMailingCampaignTypes() as $mailingCampaignType) {
  747.                 if (!in_array($mailingCampaignType->getID(), $requestMailingCampaignTypeIDList)) {
  748.                     $user->removeMailingCampaignType($mailingCampaignType);
  749.                     $userRepository->addActivity($userUserActivity::UNSUBSCRIBE_ACTION$mailingCampaignType);
  750.                     $unsubscribed true;
  751.                 }
  752.             }
  753.             if ($unsubscribed) {
  754.                 $mailingCampaign $entityManager->find(MailingCampaign::class, $mailingCampaignID);
  755.                 if ($mailingCampaign) {
  756.                     $mailingCampaignUnsubscribe $entityManager->getRepository(MailingCampaignUnsubscribe::class)->findBy(['user' => $user'mailingCampaign' => $mailingCampaign]);
  757.                     if (empty($mailingCampaignUnsubscribe)) {
  758.                         $mailingCampaignUnsubscribe = new MailingCampaignUnsubscribe();
  759.                         $mailingCampaignUnsubscribe->setUser($user);
  760.                         $mailingCampaignUnsubscribe->setMailingCampaign($mailingCampaign);
  761.                         $entityManager->persist($mailingCampaignUnsubscribe);
  762.                         $entityManager->flush();
  763.                     }
  764.                 }
  765.             }
  766.             foreach ($requestMailingCampaignTypeIDList as $mailingCampaignTypeID) {
  767.                 if (!$user->hasMailingCampaignType($mailingCampaignTypeID)) {
  768.                     $mailingCampaignType $entityManager->getRepository(MailingCampaignType::class)->find($mailingCampaignTypeID);
  769.                     if ($mailingCampaignType) {
  770.                         $user->addMailingCampaignTypes($mailingCampaignType);
  771.                         $userRepository->addActivity($userUserActivity::SUBSCRIBE_ACTION$mailingCampaignType);
  772.                     }
  773.                 }
  774.             }
  775.             $entityManager->flush($user);
  776.             return $this->render('Slivki/unsubscribe_results.html.twig');
  777.         }
  778.         $email $request->query->get('email''');
  779.         $subscriber $entityManager->getRepository(Subscriber::class)->findOneByEmail($email);
  780.         if ($subscriber) {
  781.             $entityManager->remove($subscriber);
  782.             $entityManager->flush($subscriber);
  783.             return $this->render('Slivki/unsubscribe_results.html.twig');
  784.         }
  785.         $data = [];
  786.         if ($email == '') {
  787.             return $this->redirect("/");
  788.         }
  789.         $userRepository $this->getUserRepository();
  790.         $user $userRepository->findOneByEmail($email);
  791.         if (!$user) {
  792.             return $this->redirect("/");
  793.         }
  794.         $mailingCampaignID $request->query->getInt('mc');
  795.         if ($mailingCampaignID) {
  796.             $data['mailingCampaignID'] = $mailingCampaignID;
  797.         }
  798.         $data['user'] = $user;
  799.         $data['mailingCampaignTypeList'] = $entityManager->getRepository(MailingCampaignType::class)->findBy([], ['ID' => 'ASC']);
  800.         return $this->render('Slivki/unsubscribe.html.twig'$data);
  801.     }
  802.     /**
  803.      * @Route("/profile_image_upload")
  804.      */
  805.     public function profileImageUpload(
  806.         Request $request,
  807.         ImageService $imageService,
  808.         KernelInterface $kernel,
  809.         SubscriptionService $subscriptionService
  810.     ) {
  811.         $actionRequest $request->query->get('actionRequest');
  812.         $error 'true';
  813.         $result '';
  814.         $user $this->getUser();
  815.         $entityManager $this->getDoctrine()->getManager();
  816.         $media $user->getProfileImageMedia();
  817.         switch ($actionRequest) {
  818.             case 'uploadFile':
  819.                 $imageFolder $kernel->getProjectDir() . '/public' User::MEDIA_PATH;
  820.                 $uploadedFile $request->files->get('profileImageUpload');
  821.                 if ($uploadedFile) {
  822.                     if (!in_array(mb_strtolower($uploadedFile->getClientOriginalExtension()), ['jpg''png''gif''jpeg'])) {
  823.                         return new Response("error=true;result=Разрешены только .jpg, .jpeg, .png или .gif изображения");
  824.                     };
  825.                     $fs = new Filesystem();
  826.                     $newFileName time() . '_' $uploadedFile->getClientOriginalName();
  827.                     while ($fs->exists($imageFolder $newFileName)) {
  828.                         $newFileName time() . '_' $newFileName;
  829.                     }
  830.                     $uploadedFile->move($imageFolder$newFileName);
  831.                     if (!$media) {
  832.                         $media = new Media\ProfileImageMedia();
  833.                         $media->setMediaType($entityManager->getRepository(MediaType::class)->find(MediaType::TYPE_PROFILE_IMAGE_ID));
  834.                         $media->setPath(MediaType::TYPE_PROFILE_IMAGE_PATH);
  835.                         $entityManager->persist($media);
  836.                     }
  837.                     $media->setName($newFileName);
  838.                     $user->setProfileImageMedia($media);
  839.                     $entityManager->flush();
  840.                     // Add bonus for avatar upload
  841.                     $siteSettings $this->getSiteSettings();
  842.                     $userRepository $entityManager->getRepository(User::class);
  843.                     if(!$userRepository->hasUserAvatarBonus($user)) {
  844.                         $userRepository->addBonus(
  845.                             $subscriptionService,
  846.                             $user,
  847.                             UserBalanceActivity::TYPE_PROFILE_IMAGE_BONUS,
  848.                             $siteSettings->getAvatarBonus()
  849.                         );
  850.                     }
  851.                     $result User::MEDIA_PATH $newFileName;
  852.                     $error 'false';
  853.                 }
  854.                 break;
  855.             case 'cropImage':
  856.                 $cropCoordinates $request->request->get('cropCoordinates');
  857.                 $cropCoordinates json_decode($cropCoordinates);
  858.                 $originalMediaPath $kernel->getProjectDir() . '/public/znijki-media/initial' $media->getPath() . $media->getName();
  859.                 $imagine = new Imagine();
  860.                 $image $imagine->open($originalMediaPath);
  861.                 $image->crop(new Point($cropCoordinates->x$cropCoordinates->y), new Box($cropCoordinates->w$cropCoordinates->h));
  862.                 $image->save($originalMediaPath);
  863.                 $softCache = new SoftCache(ImageService::CACHE_NAME);
  864.                 $mediaSizeList $media->getSizes();
  865.                 foreach ($mediaSizeList->toArray() as $mediaSize) {
  866.                     $cacheKey $media->getID() . "-url-" $mediaSize->getWidth() . "x" $mediaSize->getHeight();
  867.                     $softCache->set($cacheKeynull1);
  868.                     $imageService->resizeImage($media$mediaSize->getWidth(), $mediaSize->getHeight());
  869.                 }
  870.                 $result $imageService->getImageURL($media250250);
  871.                 $error 'false';
  872.                 break;
  873.             case 'deleteImage':
  874.                 $entityManager->remove($media);
  875.                 $entityManager->flush();
  876.                 $error 'false';
  877.                 break;
  878.         }
  879.         return new Response("error=$error;result=$result");
  880.     }
  881.     /**
  882.      * @Route("/ajax_profile_save")
  883.      */
  884.     public function ajaxProfileSave(Request $requestValidatorInterface $validator) {
  885.         $user $this->getUser();
  886.         $result['error'] = '';
  887.         $entityManager $this->getDoctrine()->getManager();
  888.         /** @var \Symfony\Component\Validator\ConstraintViolationList $errorList */
  889.         $errorList $validator->validate($user);
  890.         if ($errorList->count() > 0) {
  891.             $result['error'] .= $errorList->get(0)->getMessage();
  892.         }
  893.         if($request->request->get('user_name') == '') {
  894.             $result['error'] .= 'Поле "Имя" не может быть пустым!<br>';
  895.         }
  896.         $requestPassword trim($request->request->get('user_new_pass'));
  897.         if(strlen($requestPassword) > 0) {
  898.             if (strlen($requestPassword) < 6) {
  899.                 $result['error'] .= 'Пароль не может быть меньше 6 символов';
  900.             }
  901.             if($requestPassword != $request->request->get('user_confirm_pass')) {
  902.                 $result['error'] .= 'Введенные пароли не совпадают!<br>';
  903.             }
  904.             $user->encryptPassword($requestPassword$user->getSalt());
  905.         }
  906.         $user->setFirstName($request->request->get('user_name'));
  907.         $user->setLastName($request->request->get('user_last_name'));
  908.         $city $entityManager->getRepository(City::class)->find($request->request->get('city'));
  909.         $user->setCity($city);
  910.         if($result['error'] == '') {
  911.             $entityManager->flush($user);
  912.         }
  913.         return new Response(json_encode($result));
  914.     }
  915.     /**
  916.      * @Route("/confirm/{code}", name="confirm")
  917.      */
  918.     public function confirmAction(Request $request$code) {
  919.         $code pg_escape_string($code);
  920.         $entityManager $this->getDoctrine()->getManager();
  921.         $resultMapping = new ResultSetMapping();
  922.         $resultMapping->addEntityResult(UserConfirmation::class, "UserConfirmation");
  923.         $resultMapping->addFieldResult("UserConfirmation""user_id""userID");
  924.         $resultMapping->addFieldResult("UserConfirmation""id""ID");
  925.         $resultMapping->addFieldResult("UserConfirmation""return_url""returnUrl");
  926.         $query $entityManager->createNativeQuery("select user_id, id, return_url from user_confirmation where md5(id::text || user_id::text)=?"$resultMapping);
  927.         $query->setParameter(1$code);
  928.         $confirmation $query->getResult();
  929.         $returnUrl '/';
  930.         if ($confirmation) {
  931.             $userID $confirmation[0]->getUserID();
  932.             $user $entityManager->getRepository(User::class)->find($userID);
  933.             if (!$user) {
  934.                 $data['lastComments'] = $this->getDoctrine()->getRepository(Comment::class)->findBy(["hidden" => false], ["createdOn" => "desc"], 3);
  935.                 return $this->render('Slivki/register_confirm_error.html.twig'$data);
  936.             }
  937.             $user->setStatus(User::STATUS_CONFIRMED);
  938.             $mainMailingCampaignType $entityManager->getRepository(MailingCampaignType::class)->find(MailingCampaignType::MAIN_ID);
  939.             $user->addMailingCampaignTypes($mainMailingCampaignType);
  940.             foreach ($confirmation as $item) {
  941.                 $entityManager->remove($item);
  942.             }
  943.             $entityManager->flush();
  944.             $amplitude = new Amplitude($user);
  945.             $amplitude->sendEvent('NewUserConfirmed', []);
  946.             $userRepository $this->getUserRepository();
  947.             $userRepository->addActivity($userUserActivity::SUBSCRIBE_ACTION$mainMailingCampaignType);
  948.             $returnUrl $confirmation[0]->getReturnUrl() ? $confirmation[0]->getReturnUrl() : '/';
  949.         } else {
  950.             $data['lastComments'] = $this->getDoctrine()->getRepository(Comment::class)->findBy(["hidden" => false], ["createdOn" => "desc"], 3);
  951.             return $this->render('Slivki/register_confirm_error.html.twig'$data);
  952.         }
  953.         $this->addFlash("openThanksForRegisterPopup""true");
  954.         // Login user
  955.         $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  956.         $this->get('security.token_storage')->setToken($token);
  957.         return $this->redirect($returnUrl);
  958.     }
  959.     private function checkReferer(Request $requestUser $user) {
  960.         $refererID $request->cookies->get('refID');
  961.         if (!$refererID) {
  962.             return;
  963.         }
  964.         $entityManager $this->getDoctrine()->getManager();
  965.         $referer $entityManager->find(User::class, $refererID);
  966.         if (!$referer) {
  967.             return;
  968.         }
  969.         $referral $entityManager->getRepository(Referral::class)->findBy(['email' => $user->getEmail()]);
  970.         if (!$referral) {
  971.             $referral = new Referral();
  972.             $entityManager->persist($referral);
  973.         } else {
  974.             $referral $referral[0];
  975.         }
  976.         $referral->setReferral($user);
  977.         $referral->setReferer($referer);
  978.         $referral->setStatus(Referral::STATUS_REGISTERED);
  979.         $referer->addReferral($referral);
  980.         $entityManager->flush();
  981.     }
  982.     /**
  983.      * @Route("/ajax_set_favourite")
  984.      */
  985.     public function ajaxSetFavourite(Request $request) {
  986.         if (!$request->isXmlHttpRequest()) {
  987.             return $this->redirect("/");
  988.         }
  989.         $action $request->query->get('action');
  990.         $offerID $request->query->get('offerID');
  991.         $entityManager $this->getDoctrine()->getManager();
  992.         $user $this->getUser();
  993.         $offer $this->getOfferRepository()->find($offerID);
  994.         switch ($action) {
  995.             case 'addToFavourites':
  996.                 $user->addFavouriteOffer($offer);
  997.                 $entityManager->flush();
  998.                 $amplitude = new Amplitude($user);
  999.                 $amplitude->sendEvent('PromotionAddedToFavorite', ['promotion_id' => $offerID]);
  1000.                 break;
  1001.             case 'deleteFromFavourites':
  1002.                 $user->deleteFavouriteOffer($offer);
  1003.                 $entityManager->flush();
  1004.                 break;
  1005.         }
  1006.         return new Response('');
  1007.     }
  1008.     private function subscriberRemove($email) {
  1009.         $entityManager $this->getDoctrine()->getManager();
  1010.         $subscriber $entityManager->getRepository(Subscriber::class)->findOneByEmail($email);
  1011.         if ($subscriber) {
  1012.             $entityManager->remove($subscriber);
  1013.             $entityManager->flush($subscriber);
  1014.         }
  1015.     }
  1016.     /**
  1017.      * @Route("/profile/refresh_user_balance")
  1018.      */
  1019.     public function refreshUserBalance() {
  1020.         return new Response($this->getUser()->getBalance());
  1021.     }
  1022.     /** @Route("/user/offer-rate/defer") */
  1023.     public function deferOfferRateAction() {
  1024.         $sql "update offer_rate_schedule set show_on = show_on + '7 days' where user_id = " . (int)$this->getUser()->getID() . ';';
  1025.         $this->getDoctrine()->getManager()->getConnection()->executeQuery($sql);
  1026.         return new Response();
  1027.     }
  1028.     /** @Route("/user/offer-rate-popup/disable") */
  1029.     public function disableOfferRatePopup() {
  1030.         $entityManager $this->getDoctrine()->getManager();
  1031.         $user $entityManager->merge($this->getUser());
  1032.         $user->setNotShowRatePopupTill(new \DateTime('+30 days'));
  1033.         $entityManager->flush();
  1034.         return new Response();
  1035.     }
  1036.     /**
  1037.      * @Route("/mobile-logout")
  1038.      */
  1039.     public function mobileLogoutPageAction(Request $request) {
  1040.         if ($this->getUser() and self::getMobileDevice($request)) {
  1041.             return $this->render('Slivki/mobile_logout.html.twig');
  1042.         } else {
  1043.             return $this->redirect("/login");
  1044.         }
  1045.     }
  1046.     /**
  1047.      * @Route("/profile/ajax_get_favorite")
  1048.      */
  1049.     public function ajaxGetFavorite(Request $request) {
  1050.         if (!$request->isXmlHttpRequest()) {
  1051.             return $this->redirect("/profile");
  1052.         }
  1053.         $entityManager $this->getDoctrine()->getManager();
  1054.         $user $this->getUser();
  1055.         $data['allFavouriteOffers'] = $user->getFavouriteOffers()->toArray();
  1056.         $data['activeFavouriteOffers'] = [];
  1057.         $data['pastFavouriteOffers'] = [];
  1058.         $mediaRepository $entityManager->getRepository(Media::class);
  1059.         foreach ($data['allFavouriteOffers'] as $favouriteOffer) {
  1060.             if ($favouriteOffer->getActiveTill()->format('U') > time()) {
  1061.                 $data['activeFavouriteOffers'][] = $favouriteOffer;
  1062.             } else {
  1063.                 $data['pastFavouriteOffers'][] = $favouriteOffer;
  1064.             }
  1065.         }
  1066.         $view self::getMobileDevice($request) ? 'Slivki/mobile/profile/favorites.html.twig' 'Slivki/profile/favorites/index.html.twig';
  1067.         return $this->render($view$data);
  1068.     }
  1069.     /** @Route("/profile/invite/send") */
  1070.     public function sendInviteAction(Request $requestMailer $mailerValidatorInterface $validator) {
  1071.         $emailList $request->request->get('inviteTo');
  1072.         if (!$emailList) {
  1073.             return new JsonResponse(['message' => 'Введите адрес получателя']);
  1074.         }
  1075.         $emailList explode(','$emailList);
  1076.         $entityManager $this->getDoctrine()->getManager();
  1077.         $sql "select count(*) from referral where referer_id = " $this->getUser()->getID() . " and created_on > now() + '-1 day'";
  1078.         $invitesSentCount $entityManager->getConnection()->executeQuery($sql)->fetchColumn();
  1079.         if ($invitesSentCount count($emailList) > 10) {
  1080.             return new JsonResponse(['message' => 'Превышен суточный лимит отправки приглашений']);
  1081.         }
  1082.         $emailConstraint = new \Symfony\Component\Validator\Constraints\Email();
  1083.         foreach ($emailList as $email) {
  1084.             $error $validator->validate($email$emailConstraint);
  1085.             if ($error->count() > 0) {
  1086.                 return new JsonResponse(['message' => 'Неверный формат адреса электронной почты']);
  1087.             }
  1088.         }
  1089.         $referer $entityManager->merge($this->getUser());
  1090.         $inviteFrom $request->request->get('inviteFrom');
  1091.         foreach ($emailList as $email) {
  1092.             $email mb_strtolower(trim($email));
  1093.             $referral = new Referral();
  1094.             $referral->setEmail($email);
  1095.             $referral->setReferer($referer);
  1096.             $referral->setStatus(Referral::STATUS_WAIT);
  1097.             $entityManager->persist($referral);
  1098.             $referer->addReferral($referral);
  1099.             $entityManager->flush();
  1100.             $message $mailer->createMessage();
  1101.             $message->setTo($email);
  1102.             $message->setFrom('info@slivki.by'$inviteFrom);
  1103.             $message->returnPath($inviteFrom);
  1104.             $message->replyTo($inviteFrom);
  1105.             $message->setSubject('Рекомендую Slivki.by');
  1106.             $message->setBody($request->request->get('inviteText'));
  1107.             $mailer->send($message);
  1108.         }
  1109.         return new JsonResponse(['result' => true'message' => 'Приглашение отправлено']);
  1110.     }
  1111.     /** @Route("/profile/card", name = "profileMobileCardList") */
  1112.     public function creditCardAction(Request $request) {
  1113.         if (!self::getMobileDevice($request)) {
  1114.             return new Response();
  1115.         }
  1116.         return $this->render('Slivki/mobile/profile/card.html.twig');
  1117.     }
  1118.     /** @Route("/profile/card/add-form", name = "profileMobileCardAdd") */
  1119.     public function addCreditCardAction(Request $request) {
  1120.         if (!self::getMobileDevice($request)) {
  1121.             return new Response();
  1122.         }
  1123.         return $this->render('Slivki/mobile/profile/card_add.html.twig');
  1124.     }
  1125.     /**
  1126.      * @Route("/profile/card/remove/{cardID}")
  1127.      */
  1128.     public function cardRemoveAction(
  1129.         RemoveCreditCardHandler $removeCreditCardHandler,
  1130.         int $cardID
  1131.     ) {
  1132.         $removeCreditCardHandler->handle($this->getUser(), $cardID);
  1133.         return new Response();
  1134.     }
  1135.     /**
  1136.      * @Route("/profile/gift_certificates/pdf/{offerOrderDetailsID}")
  1137.      */
  1138.     public function giftCertificatesPdf(Request $requestKernelInterface $kernel$offerOrderDetailsID) {
  1139.         $action $request->query->get('action');
  1140.         /** @var OfferOrderDetails $offerOrderDetails */
  1141.         $offerOrderDetails $this->getOfferOrderDetailsRepository()->find($offerOrderDetailsID);
  1142.         if (!$offerOrderDetails) {
  1143.             return new Response();
  1144.         }
  1145.         if ($offerOrderDetails->getOfferOrder()->getUser() != $this->getUser()) {
  1146.             return new Response();
  1147.         }
  1148.         $mpdf $this->getGiftCertificateMpdf($kernel$offerOrderDetails);
  1149.         if (!$mpdf) {
  1150.             return new Response();
  1151.         }
  1152.         if ($action == 'save') {
  1153.             $mpdf->Output('certificate'.$offerOrderDetailsID.'.pdf''D');
  1154.         } else {
  1155.             $mpdf->Output();
  1156.         }
  1157.     }
  1158.     /** @Route("/profile/phone/confirm", name="phoneConfirm") */
  1159.     public function phoneConfirmAction(Request $request) {
  1160.         $user $this->getUser();
  1161.         $userPhone $user->getCurrentPhone();
  1162.         if ($userPhone && $userPhone->isConfirmed() && $userPhone->isBelorussian()) {
  1163.             return $this->redirectToRoute('homepage');
  1164.         }
  1165.         return $this->render(CommonUtil::isMobileDevice($request) ? 'Slivki/mobile/profile/phone_confirm.html.twig'
  1166.             'Slivki/profile/phone_confirm.html.twig');
  1167.     }
  1168.     /**
  1169.      * @Route("/profile/phone/sendsms", name="profile_phone_sendsms")
  1170.      */
  1171.     public function phoneSendSmsAction(
  1172.         Request $request,
  1173.         AuthorizationCodeSender $authorizationCodeSender,
  1174.         UserPhoneService $userPhoneService
  1175.     ): Response {
  1176.         $phoneNumber $request->request->get('userPhone''');
  1177.         if (strlen($phoneNumber) != 12) {
  1178.             return new Response('Wrong phone number!');
  1179.         }
  1180.         $entityManager $this->getDoctrine()->getManager();
  1181.         $user $this->getUser();
  1182.         $userPhone $user->getCurrentPhone();
  1183.         if ($userPhone && $userPhone->getPhoneNumber() == $phoneNumber && $userPhone->isConfirmed()) {
  1184.             return new Response('Allready confirmed!');
  1185.         }
  1186.         $existUserPhone $entityManager->getRepository(UserPhone::class)->findBy([
  1187.             'confirmed' => true,
  1188.             'phoneNumber' => $phoneNumber
  1189.         ]);
  1190.         if ($existUserPhone) {
  1191.             return new Response("Номер телефона $phoneNumber уже зарегистрирован!");
  1192.         }
  1193.         if (!$userPhone || !($userPhone->getPhoneNumber() == $phoneNumber)) {
  1194.             $userPhoneService->addUserPhone($user$phoneNumber);
  1195.         }
  1196.         $smsCode random_int(10009999);
  1197.         $this->get('session')->set('confirmPhoneNumber'$phoneNumber);
  1198.         $this->get('session')->set('confirmPhoneSmsCode'$smsCode);
  1199.         $authorizationCodeSender->send($phoneNumber$smsCode$request->getHost());
  1200.         return new Response();
  1201.     }
  1202.     /** @Route("/profile/phone/checkcode") */
  1203.     public function phoneCheckCodeAction(
  1204.         Request $request,
  1205.         Mailer $mailer,
  1206.         UserPhoneService $userPhoneService
  1207.     ): Response {
  1208.         $requestCode $request->request->get('smsCode''');
  1209.         $code $this->get('session')->get('confirmPhoneSmsCode');
  1210.         $phoneNumber $this->get('session')->get('confirmPhoneNumber');
  1211.         if ($requestCode != $code) {
  1212.             return new Response();
  1213.         }
  1214.         $user $this->getUser();
  1215.         $userPhone $user->getCurrentPhone();
  1216.         if ($userPhone && $userPhone->getPhoneNumber() == $phoneNumber) {
  1217.             $userPhoneService->confirmUserPhone($userPhone);
  1218.             $comments $this->getCommentRepository()->findBy(['user' => $user'confirmedPhone' => false], ['ID' => 'DESC']);
  1219.             if (isset($comments[0])) {
  1220.                 $comments[0]->setConfirmedPhone(true);
  1221.                 if ($comments[0]->getTypeID() == Comment::TYPE_OFFER_COMMENT) {
  1222.                     $offer $this->getOfferRepository()->find($comments[0]->getEntityID());
  1223.                     if ($offer) {
  1224.                         $this->sendOfferCommentNotice($mailer$offer$comments[0], $comments[0]->getParentComment());
  1225.                     }
  1226.                 }
  1227.             }
  1228.             $this->getDoctrine()->getManager()->flush();
  1229.             if (isset($comments[0])) {
  1230.                 $this->resetCommentsCache($comments[0]->getEntityID(), $comments[0]->getTypeID());
  1231.             }
  1232.             return new Response('1');
  1233.         }
  1234.         return new Response();
  1235.     }
  1236.     /**
  1237.      * @Route("/user/create/from-order", methods={"POST"}, name="user_create_from_order")
  1238.      */
  1239.     public function userCreateFromOrder(Request $requestMailer $mailerValidatorInterface $validator) {
  1240.         $entityManager $this->getDoctrine()->getManager();
  1241.         $order $entityManager->find(Offer::class, $request->request->get('orderID'));
  1242.         if (!$order) {
  1243.             return new Response('Произошла ошибка');
  1244.         }
  1245.         $email mb_strtolower(trim($request->request->get('email')));
  1246.         $user $entityManager->getRepository(User::class)->findByEmail($email);
  1247.         if ($user) {
  1248.             return new JsonResponse(['error' => true'message' => 'Пользователь с таким email уже зарегистрирован']);
  1249.         }
  1250.         $password rand(1111199999);
  1251.         $user = new User();
  1252.         $user->setEmail($email);
  1253.         $user->encryptPassword($password);
  1254.         $order->setUser($user);
  1255.         $user->setStatus(User::STATUS_CONFIRMED);
  1256.         /** @var \Symfony\Component\Validator\ConstraintViolationList $errorList */
  1257.         $errorList $validator->validate($user);
  1258.         if ($errorList->count() > 0) {
  1259.             return new JsonResponse(['error' => true'message' => $errorList->get(0)->getMessage()]);
  1260.         }
  1261.         $order->setUser($user);
  1262.         $entityManager->persist($user);
  1263.         $entityManager->getRepository(User::class)->addDirectorGroupToUserByUser($user);
  1264.         $entityManager->flush();
  1265.         $message $mailer->createMessage();
  1266.         $message->setTo($email);
  1267.         $message->setFrom('info@slivki.by''Slivki.by');
  1268.         $message->setSubject('Мы позаботились о том, чтобы вы не забыли');
  1269.         $message->setBody($this->renderView('Slivki/emails/code.html.twig', ['offerOrder' => $order'userCreated' => true]), 'text/html');
  1270.         $mailer->send($message);
  1271.         return new JsonResponse(['error' => false'message' => 'Письмо с кодом отправлено на Ваш адрес']);
  1272.     }
  1273.     /**
  1274.      * @Route("/profile/delivery/address/add")
  1275.      */
  1276.     public function addAddressAction(
  1277.         Request $request,
  1278.         CoordinatesYandex $coordinatesYandex,
  1279.         SubscriptionService $subscriptionService,
  1280.         DeliveryZoneRepositoryInterface $deliveryZoneRepository
  1281.     ): JsonResponse {
  1282.         $entityManager $this->getDoctrine()->getManager();
  1283.         $orderID $request->request->getInt('orderID');
  1284.         /** @var FoodOrder $order */
  1285.         $order $entityManager->find(FoodOrder::class, $orderID);
  1286.         $offer $order->getOffer();
  1287.         $offerID $offer->getID();
  1288.         $iikoUtil IikoUtil::instance($offer);
  1289.         $iikoUtil->setContainer($this->kernel->getContainer());
  1290.         if ($request->request->getBoolean('isStreetSelect')) {
  1291.             $street $entityManager->find(Street::class, $request->request->getInt('streetID'));
  1292.         } else {
  1293.             $streetName $request->request->get('streetID');
  1294.             $deliveryLocationID $request->request->getInt('deliveryLocationID');
  1295.             $deliveryLocation null;
  1296.             $streetFindByParameters = [
  1297.                 'name' => $streetName,
  1298.                 'offerID' => $offerID,
  1299.             ];
  1300.             if (!== $deliveryLocationID) {
  1301.                 $deliveryLocation $entityManager->find(DeliveryLocation::class, $deliveryLocationID);
  1302.                 $city $deliveryLocation->getName();
  1303.                 $streetFindByParameters['city'] = $city;
  1304.             }
  1305.             $street $entityManager->getRepository(Street::class)->findOneBy($streetFindByParameters);
  1306.             if (!$street) {
  1307.                 $street = new Street();
  1308.                 $street->setOfferID($offerID);
  1309.                 $street->setName($streetName);
  1310.                 $entityManager->persist($street);
  1311.                 if (null !== $deliveryLocation) {
  1312.                     $street->setDeliveryLocation($deliveryLocation);
  1313.                     $street->setCity($city);
  1314.                 }
  1315.             }
  1316.         }
  1317.         $address = new UserAddress();
  1318.         $address->setName($request->request->get('name'));
  1319.         $address->setStreet($street);
  1320.         $address->setHouse($request->request->get('house'));
  1321.         $address->setBlock($request->request->get('block'));
  1322.         $address->setAppartment($request->request->get('appartment'));
  1323.         $address->setEntrance($request->request->get('entrance'));
  1324.         $address->setFloor($request->request->get('floor'));
  1325.         $address->setDoorphone($request->request->get('doorphone'));
  1326.         $address->setOfferID($order->getOffer()->getID());
  1327.         $address->setActive(true);
  1328.         $address->setIsOnlineGift($request->request->getBoolean('isOnlineGift'));
  1329.         $address->setCompletedPurchase(false);
  1330.         $order->setDeliveryTime($request->request->get('deliveryTime'));
  1331.         $this->getUser()->addDeliveryAddress($address);
  1332.         $phone $request->request->get('phone');
  1333.         if ($phone) {
  1334.             $address->setPhone($phone);
  1335.         }
  1336.         $order->setDeliveryAddress($address);
  1337.         if (!($iikoUtil instanceof Tokiny)) {
  1338.             $order->setPaymentType($request->request->getInt('paymentType'PaymentType::ONLINE));
  1339.         }
  1340.         $result $this->getCheckAddressResponse($iikoUtil->checkOrder($entityManager$order$subscriptionService));
  1341.         if ($result['status'] === 'error') {
  1342.             return new JsonResponse([
  1343.                 'status' => $result['status'],
  1344.                 'message' => $result['message'],
  1345.             ], Response::HTTP_OK);
  1346.         }
  1347.         $entityManager->flush();
  1348.         $offerDeliveryZone $order->getOffer()->getOfferDeliveryZone();
  1349.         if (null !== $offerDeliveryZone && $offerDeliveryZone->count() > 0) {
  1350.             $points $address->getCoordinatesForDeliveryZone() ?? $coordinatesYandex->getGeoCoordinates(
  1351.                 $address->buildFullAddress(),
  1352.                 ['offerId' => (int)$order->getOffer()->getID()]
  1353.             );
  1354.             $deliveryZone $deliveryZoneRepository->getPolygonByPoint($order->getOffer(), $points);
  1355.             if (null !== $deliveryZone) {
  1356.                 $result['deliveryPrice'] = 0;
  1357.                 $coordinates explode(' '$points);
  1358.                 $result['coordinates'] = new CoordinatesResponse(
  1359.                     $coordinates[1],
  1360.                     $coordinates[0],
  1361.                 );
  1362.                 if (null === $address->getCoordinatesForDeliveryZone()) {
  1363.                     $address->setLatitude($coordinates[1]);
  1364.                     $address->setLongitude($coordinates[0]);
  1365.                 }
  1366.             }
  1367.         }
  1368.         if (isset($result['deliveryPrice']) && !== (int) $result['deliveryPrice']) {
  1369.             $order->setDeliveryCost($result['deliveryPrice']);
  1370.         }
  1371.         $result['deliveryPrice'] = $order->getDeliveryCost();
  1372.         $entityManager->flush();
  1373.         $view CommonUtil::isMobileDevice($request) ? 'Slivki/mobile/delivery/address_block.html.twig' 'Slivki/delivery/address_block.html.twig';
  1374.         $result['html']['address'] = $this->renderView($view, ['address' => $address'checked' => ' checked''offerID' => $offerID]);
  1375.         return new JsonResponse($resultResponse::HTTP_OK);
  1376.     }
  1377.     /**
  1378.      * @Route("/profile/devivery/address/delete/{addressID}/{offerID}", name="deleteDeliveryAddress", methods={"GET"})
  1379.      */
  1380.     public function deleteAddressAction(UserAddressRepositoryInterface $userAddressRepositoryint $addressIDint $offerID): JsonResponse
  1381.     {
  1382.         $userAddress $userAddressRepository->getByUserIdAndAddressId($this->getUser()->getID(), $addressID);
  1383.         if ($userAddress instanceof UserAddress) {
  1384.             $userAddress->disable();
  1385.             $userAddressRepository->save($userAddress);
  1386.         }
  1387.         return new JsonResponse(
  1388.             ['countDeliveryAddresses' => \count($this->getUser()->getAvailableUserAddresses($offerID))],
  1389.             Response::HTTP_OK,
  1390.         );
  1391.     }
  1392.     /** @Route("/profile/crt/{offerOrderDetailsID}", name="profileGetCrtPdf") */
  1393.     public function profileGetCrtPdfAction($offerOrderDetailsIDKernelInterface $kernelGiftCertificateService $giftCertificateService) {
  1394.         $entityManager $this->getDoctrine()->getManager();
  1395.         $dql "select offerOrderDetails from Slivki:OfferOrderDetails offerOrderDetails
  1396.             join offerOrderDetails.giftCertificate giftCertificate
  1397.             join offerOrderDetails.offerOrder offerOrder
  1398.             join offerOrder.offer offer
  1399.             where offerOrder.status > 0 and offerOrder.user = :user and offerOrderDetails.ID = :offerOrderDetailsID
  1400.         ";
  1401.         $offerOrderDetails $entityManager->createQuery($dql)
  1402.             ->setParameter('user'$this->getUser())
  1403.             ->setParameter('offerOrderDetailsID'$offerOrderDetailsID)
  1404.             ->getOneOrNullResult();
  1405.         if (!$offerOrderDetails) {
  1406.             die;
  1407.             return new Response();
  1408.         }
  1409.         $giftCertificateService->getCertificatePdf($kernel$offerOrderDetails);
  1410.         die;
  1411.     }
  1412.     /**
  1413.      * @Route("/profile/logout", name="app_logout", methods={"GET"})
  1414.      */
  1415.     public function logout() {
  1416.         // controller can be blank: it will never be executed!
  1417.         throw new \Exception('Don\'t forget to activate logout in security.yaml');
  1418.     }
  1419.     /**
  1420.      * @Route("/login/check-code/{code}", name="login_check_code")
  1421.      */
  1422.     public function checkCode(
  1423.         Request $request,
  1424.         SmsLimiterService $smsLimiterService,
  1425.         UserPhoneService $userPhoneService,
  1426.         $code
  1427.     )  {
  1428.         $session $request->getSession();
  1429.         $logger Logger::instance('PHONEAUTH');
  1430.         $logger->info($code);
  1431.         $logger->info($session->get('loginPhoneCode''empty'));
  1432.         if ((string)$session->get('loginPhoneCode''empty') != (string)$code) {
  1433.             $atemptsCount $session->get('loginAtemptsCount'0);
  1434.             if ($atemptsCount10) {
  1435.                 $session->remove('loginPhoneCode');
  1436.             } else {
  1437.                 $session->set('loginAtemptsCount'$atemptsCount++);
  1438.             }
  1439.             $logger->info('ERROR');
  1440.             return new JsonResponse(['error' => true'message' => 'Неверный код']);
  1441.         }
  1442.         $phoneNumber $session->get('loginPhoneNumber');
  1443.         $entityManager $this->getDoctrine()->getManager();
  1444.         $userPhone $entityManager->getRepository(UserPhone::class)->findOneBy(['phoneNumber' => $phoneNumber'confirmed' => true]);
  1445.         $proposeAccountsMerge false;
  1446.         if (!$userPhone) {
  1447.             $proposeAccountsMerge true;
  1448.             $user = new User();
  1449.             $token uniqid($user->getID(), true);
  1450.             $user->setToken($token);
  1451.             $user->setStatus(User::STATUS_CONFIRMED);
  1452.             $user->setDefaultPassword();
  1453.             $entityManager->persist($user);
  1454.             $userPhone $userPhoneService->addUserPhone($user$phoneNumber);
  1455.             $userPhoneService->confirmUserPhone($userPhone);
  1456.             $entityManager->flush();
  1457.         }
  1458.         /** @var User $user */
  1459.         $user $userPhone->getUser();
  1460.         Logger::instance('DEBUG')->info($user->getPasswordEncoded());
  1461.         if ($user->getPasswordEncoded() == '' || $user->getPasswordEncoded() == null) {
  1462.             $user->encryptPassword('111');
  1463.             $entityManager->flush();
  1464.         }
  1465.         Logger::instance('DEBUG')->info($user->getPassword());
  1466.         $token $user->getToken();
  1467.         if (!$token) {
  1468.             $token uniqid($user->getID(), true);
  1469.             $user->setToken($token);
  1470.             $entityManager->flush();
  1471.         }
  1472.         Logger::instance('DEBUG')->info('token');
  1473.         Logger::instance('DEBUG')->info($token);
  1474.         $this->addFlash("openMergeProfilePopup""true");
  1475.         $cookie Cookie::create(self::USER_TOKEN_COOKIE$tokentime() + 315360000'/'$this->getParameter('base_domain'));
  1476.         $response = new JsonResponse(['error' => false'proposeAccountsMerge' => $proposeAccountsMerge]);
  1477.         $response->headers->setCookie($cookie);
  1478.         if ($request->getClientIp() !== null) {
  1479.             $smsLimiterService->clearCache($request->getClientIp());
  1480.         }
  1481.         return $response;
  1482.     }
  1483.     /** @Route("/login/send-code-email") */
  1484.     public function sendCodeEmailAction(Request  $requestMailer  $mailer) {
  1485.         $email $request->request->get('email');
  1486.         if (!$email) {
  1487.             return new Response(''500);
  1488.         }
  1489.         $code rand(11119999);
  1490.         $email mb_strtolower($email);
  1491.         $entityManager $this->getDoctrine()->getManager();
  1492.         $this->log($email);
  1493.         $currentUser $user $this->getUser();
  1494.         if ($user && $currentUser->getEmail()) {
  1495.             return new Response(''500);
  1496.         }
  1497.         $alreadyMerged $entityManager->getRepository(User::class)->findOneByEmail($email "-merged");
  1498.         if ($alreadyMerged) {
  1499.             return new Response(''500);
  1500.         }
  1501.         $session $request->getSession();
  1502.         $session->set('mergeAcccountEmail'$email);
  1503.         $userConfirmation = new UserConfirmation();
  1504.         $userConfirmation->setEmail($email);
  1505.         $userConfirmation->setAuthCode($code);
  1506.         $entityManager->persist($userConfirmation);
  1507.         $entityManager->flush();
  1508.         $body $this->renderView('Slivki/emails/mail.html.twig', ['content' => $code]);
  1509.         $message $mailer->createMessage('Код для привязки аккаунта'$body'html');
  1510.         $message->setFrom('info@slivki.by''Slivki.by');
  1511.         $this->log($email);
  1512.         $message->setTo($email);
  1513.         $mailer->send($message);
  1514.         return new Response();
  1515.     }
  1516.     /**
  1517.      * @Route("/login/check-code-mail/{code}", name="user_login_check_code_mail")
  1518.      */
  1519.     public function checkEmailCodeAction(
  1520.         Request $request,
  1521.         Mailer $mailer,
  1522.         AccountMerger $mergeAccount,
  1523.         $code
  1524.     ) {
  1525.         $entityManager $this->getDoctrine()->getManager();
  1526.         $session $request->getSession();
  1527.         if ($request->getSession()->get('mergeAcccountEmail')) {
  1528.             $userConfirmation $entityManager->getRepository(UserConfirmation::class)->findOneBy([
  1529.                 'authCode' => $code,
  1530.                 'email' => $request->getSession()->get('mergeAcccountEmail')
  1531.             ]);
  1532.             if ($userConfirmation) {
  1533.                 $userRepository $this->getDoctrine()->getManager('admin')->getRepository(User::class);
  1534.                 $emailUser $userRepository->findOneByEmail($userConfirmation->getEmail());
  1535.                 if (!$emailUser) {
  1536.                     $this->getUser()->setEmail($request->getSession()->get('mergeAcccountEmail'));
  1537.                     $entityManager->flush();
  1538.                 } else {
  1539.                     $mergeAccount->merge($this->getUser(), $emailUser);
  1540.                 }
  1541.                 $session->set('mergeAcccountEmail'null);
  1542.                 return new JsonResponse(['domain' => $this->getParameter('base_domain')]);
  1543.             }
  1544.         } else if ($request->getSession()->get('changeAcccountEmail')) {
  1545.             $email $request->getSession()->get('changeAcccountEmail');
  1546.             $userConfirmation $entityManager->getRepository(UserConfirmation::class)->findOneBy([
  1547.                 'authCode' => $code,
  1548.                 'email' => $email
  1549.             ]);
  1550.             if ($userConfirmation) {
  1551.                 $user $this->getUser();
  1552.                 if (!$user) {
  1553.                     return new Response(''404);
  1554.                 }
  1555.                 $oldEmail $user->getEmail();
  1556.                 $userEmails = new UserEmailHistory();
  1557.                 $userEmails->setEmail($oldEmail);
  1558.                 $userEmails->setCreatedOn(new \DateTime());
  1559.                 $userEmails->setUserID($user->getID());
  1560.                 $entityManager->persist($userEmails);
  1561.                 $user->setEmail($email);
  1562.                 $entityManager->flush();
  1563.                 $body "Добрый день.<br>Уведомляем Вас о том, что почта вашего аккаунта на сайте Slivki.by изменена на $email.<br>С уважением, команда Slivki.by";
  1564.                 $message $mailer->createMessage('Код для привязки аккаунта'$body'html');
  1565.                 $message->setFrom('info@slivki.by''Slivki.by');
  1566.                 $this->log($oldEmail);
  1567.                 $message->setTo($oldEmail);
  1568.                 $mailer->send($message);
  1569.                 $session->set('changeAcccountEmail'null);
  1570.                 return new Response(''200);
  1571.             }
  1572.         }
  1573.         return new Response(''404);
  1574.     }
  1575.     /** @Route("/change/send-code-email") */
  1576.     public function changeCodeEmailAction(Request  $requestMailer  $mailer) {
  1577.         $email $request->request->get('email');
  1578.         if (!$email) {
  1579.             return new Response(''500);
  1580.         }
  1581.         $code rand(11119999);
  1582.         $email mb_strtolower($email);
  1583.         $entityManager $this->getDoctrine()->getManager();
  1584.         $user $entityManager->getRepository(User::class)->findOneByEmail($email);
  1585.         $this->log($email);
  1586.         if ($user) {
  1587.             return new Response(''500);
  1588.         }
  1589.         $session $request->getSession();
  1590.         $session->set('changeAcccountEmail'$email);
  1591.         $userConfirmation = new UserConfirmation();
  1592.         $userConfirmation->setEmail($email);
  1593.         $userConfirmation->setAuthCode($code);
  1594.         $entityManager->persist($userConfirmation);
  1595.         $entityManager->flush();
  1596.         $body $this->renderView('Slivki/emails/mail.html.twig', ['content' => $code]);
  1597.         $message $mailer->createMessage('Код для привязки аккаунта'$body'html');
  1598.         $message->setFrom('info@slivki.by''Slivki.by');
  1599.         $this->log($email);
  1600.         $message->setTo($email);
  1601.         $mailer->send($message);
  1602.         return new Response();
  1603.     }
  1604. }