src/Controller/UserController.php line 340

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