src/Controller/UserController.php line 305

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