src/Controller/Admin/UserController.php line 37

Open in your IDE?
  1. <?php
  2. namespace Slivki\Controller\Admin;
  3. use Slivki\Bundle\SubscriptionBundle\Request\Query\GetSubscriberHistoryQueryStringBuilder;
  4. use Slivki\Bundle\SubscriptionBundle\Services\SubscriptionHistoryServiceInterface;
  5. use Slivki\Dao\Statistic\User\UserBoughtCodesHistoryDaoInterface;
  6. use Slivki\Entity\MailingCampaignType;
  7. use Slivki\Entity\MediaType;
  8. use Slivki\Entity\OfferCode;
  9. use Slivki\Entity\OfferOrder;
  10. use Slivki\Entity\OfferOrderDetails;
  11. use Slivki\Entity\User;
  12. use Slivki\Entity\UserActivity;
  13. use Slivki\Entity\UserBalanceActivity;
  14. use Slivki\Entity\UserBalanceActivityType;
  15. use Slivki\Entity\UserConfirmation;
  16. use Slivki\Entity\UserGroup;
  17. use Slivki\Entity\UserProperty;
  18. use Slivki\Message\Query\Profile\GetBalanceHistoryQuery;
  19. use Slivki\Messenger\Query\QueryBusInterface;
  20. use Slivki\Repository\BatchCodes\BatchCodesPlanRepositoryInterface;
  21. use Slivki\Services\Mailer;
  22. use Slivki\Services\Subscription\SubscriptionService;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. class UserController extends AdminController
  27. {
  28.     private const USER_BALANCE_ACTIVITY_LIMIT 25;
  29.     private const USER_BOUGHT_OFFER_CODES_HISTORY_LIMIT 50;
  30.     /**
  31.      * @Route("/admin/users")
  32.      */
  33.     public function ajaxUsers(Request $request) {
  34.         if (!$request->isXmlHttpRequest()) {
  35.             return $this->redirect("/admin");
  36.         }
  37.         return $this->render('Slivki/admin/users/index.html.twig');
  38.     }
  39.     /**
  40.      * @Route("/admin/user/search")
  41.      */
  42.     public function userSearchAction(
  43.         Request $request,
  44.         BatchCodesPlanRepositoryInterface $batchCodesPlanRepository,
  45.         SubscriptionService $subscriptionService,
  46.         QueryBusInterface $queryBus,
  47.         UserBoughtCodesHistoryDaoInterface $userBoughtCodesHistoryDao
  48.     ): Response {
  49.         if (!$request->isMethod("POST")) {
  50.             return new Response();
  51.         }
  52.         $entityManager $this->getDoctrine()->getManager('admin');
  53.         $searchType $request->request->get('userSearchType');
  54.         $user null;
  55.         if ($searchType == 'id') {
  56.             $user $entityManager->find(User::class, $request->request->get('id'));
  57.         } else {
  58.             if ($searchType == 'email') {
  59.                 $dql 'select user from Slivki:User user where lower(user.email) = :query';
  60.                 $query strtolower($request->request->get('email'''));
  61.             } else if ($searchType == 'phone') {
  62.                 $dql 'select user from Slivki:User user join user.phones phone where phone.confirmed = true and phone.phoneNumber = :query';
  63.                 $query $request->request->get('phone''');
  64.             }
  65.             $users $entityManager->createQuery($dql)->setParameter("query",  $query)->getResult();
  66.             if (count($users) == 1) {
  67.                 $user $users[0];
  68.             } else if (count($users) > 1) {
  69.                 return $this->render('Slivki/admin/users/found_user_list.html.twig', ['users' => $users]);
  70.             } else if (count($users) == 0) {
  71.                 $dql 'select email from Slivki:UserEmailHistory email where lower(email.email) = :query';
  72.                 $query strtolower($request->request->get('email'''));
  73.                 $emails $entityManager->createQuery($dql)->setParameter("query",  $query)->getResult();
  74.                 if (count($emails) > 0) {
  75.                     $user $entityManager->find(User::class, $emails[0]->getUserID());
  76.                 }
  77.             }
  78.         }
  79.         if (!$user) {
  80.             return new Response("<strong>Клиенты с такими параметрами отсутствуют</strong>");
  81.         }
  82.         $userGroups $user->getUserGroups();
  83.         $userRepository $entityManager->getRepository(User::class);
  84.         $subscription $subscriptionService->getSubscription($user);
  85.         $subscriptionPlan $subscriptionService->getCurrentSubscriptionPlan($user);
  86.         if (null !== $subscription && $subscription->isSharedSubscription()) {
  87.             $parentSubscriber $subscriptionService->getParentSubscriber($user);
  88.             $data['parentSubscriberPhone'] = $parentSubscriber->getPhone();
  89.         }
  90.         foreach ($user->getUserGroups() as $group) {
  91.             if ($group->getID() == UserGroup::ROLE_ADMIN_ID) {
  92.                 $data['adminUser'] = true;
  93.             }
  94.             if ($group->getID() == UserGroup::ROLE_BANNED_USER_COMMENT_ID) {
  95.                 $data['bannedUserComment'] = true;
  96.             }
  97.         }
  98.         if ($user->getStatus() == User::STATUS_LOCKED) {
  99.             $data['bannedUser'] = true;
  100.         }
  101.         $data['user'] = $user;
  102.         $data['offerOrders'] = $userBoughtCodesHistoryDao->findUserBoughtCodesHistory(
  103.             $user->getID(),
  104.             self::USER_BOUGHT_OFFER_CODES_HISTORY_LIMIT
  105.         );
  106.         $data['userGroups'] = $userGroups;
  107.         $data['subscriptionPlan'] = $subscriptionPlan;
  108.         $data['allowedCodesCount'] = null !== $subscription $subscription->getNumberOfCodes() : null;
  109.         $data['subscribedTill'] = null;
  110.         if (null !== $subscriptionPlan) {
  111.             $data['subscribedTill'] = (new \DateTimeImmutable())->setTimestamp($subscription->getNextDateOfWriteOff());
  112.         }
  113.         $data['userBalanceActivities'] = $queryBus->handle(new GetBalanceHistoryQuery(
  114.             1,
  115.             self::USER_BALANCE_ACTIVITY_LIMIT,
  116.             $user->getID(),
  117.         ))->getItems();
  118.         $data['batchCodesPlanList'] = $batchCodesPlanRepository->findAllActive();
  119.         $data['emailHistory'] = $userRepository->getUserEmailHistory($user);
  120.         return $this->render('Slivki/admin/users/user_block.html.twig'$data);
  121.     }
  122.     /**
  123.      * @Route("/admin/user/avatar_remove")
  124.      */
  125.     public function userAvatarRemove(Request $request) {
  126.         if (!$request->isMethod("POST")) {
  127.             return new Response();
  128.         }
  129.         $entityManager $this->getDoctrine()->getManager();
  130.         $media $this->getMediaRepository()->findOneBy(array('entityID' => $request->request->get("userID"), 'typeID' => MediaType::TYPE_PROFILE_IMAGE_ID));
  131.         if($media) {
  132.             $entityManager->remove($media);
  133.             $entityManager->flush();
  134.         }
  135.         return new Response();
  136.     }
  137.     /** @Route("/admin/user/subscription/code/remove/{offerCodeID}") */
  138.     public function subscriptionCodeRemoveAction(Request $request$offerCodeID) {
  139.         $offerCodeID = (int)$offerCodeID;
  140.         if (!$offerCodeID) {
  141.             return new Response();
  142.         }
  143.         $entityManager $this->getEntityManager();
  144.         $offerCode $entityManager->find(OfferCode::class, $offerCodeID);
  145.         if (!$offerCode) {
  146.             return new Response();
  147.         }
  148.         $offerOrder $offerCode->getOfferOrder();
  149.         $code $offerCode->getCode();
  150.         $codeCount $offerOrder->getCodesCount() - 1;
  151.         $offerOrder->setCodesCount($codeCount);
  152.         if (!$codeCount) {
  153.             $offerOrder->setStatus(OfferOrder::STATUS_INIT);
  154.         }
  155.         /** @var OfferOrderDetails $detail */
  156.         foreach ($offerOrder->getOfferOrderDetails() as $detail) {
  157.             if ($detail->getCode() == $code) {
  158.                 $detail->setCode(null);
  159.             }
  160.         }
  161.         $entityManager->remove($offerCode);
  162.         $entityManager->flush();
  163.         return new Response();
  164.     }
  165.     /**
  166.      * @Route("/admin/users/nonactive")
  167.      */
  168.     public function ajaxUsersNonactive(Request $request) {
  169.         if (!$request->isXmlHttpRequest()) {
  170.             return $this->redirect("/admin");
  171.         }
  172.         $requestEmail $request->request->get('email');
  173.         $requestDateFrom $request->request->get('user-registered-since');
  174.         $requestDateTo $request->request->get('user-registered-till');
  175.         $from =  $requestDateFrom date('d.m.Y'strtotime($requestDateFrom)) : date('d.m.Y');
  176.         $to $requestDateTo date('d.m.Y'strtotime($requestDateTo)) : date('d.m.Y'strtotime('+1 days'));
  177.         $dateFrom date_create_from_format('d.m.Y'$from);
  178.         $dateTo date_create_from_format('d.m.Y'$to);
  179.         $userRepository $this->getUserRepository();
  180.         $query $userRepository->createQueryBuilder('user');
  181.         $query->where("user.status = :status");
  182.         if($requestEmail && trim($requestEmail) != '') {
  183.             $query->andWhere("user.email = :email");
  184.             $query->setParameter(":email"$requestEmail);
  185.         } else {
  186.             $query->andWhere("user.createdOn >= :dateFrom");
  187.             $query->andWhere("user.createdOn < :dateTo");
  188.             $query->setParameter(":dateFrom"$dateFrom);
  189.             $query->setParameter(":dateTo"$dateTo);
  190.         }
  191.         $query->setParameter(":status"User::STATUS_REGISTERED);
  192.         $query->orderBy("user.createdOn""desc");
  193.         $nonActiveUsers $query->getQuery()->getResult();
  194.         $data = [
  195.             'nonActiveUsers' => $nonActiveUsers,
  196.             'dateFrom' => $dateFrom,
  197.             'dateTo' => $dateTo
  198.         ];
  199.         return $this->render('Slivki/admin/users/activation.html.twig'$data);
  200.     }
  201.     /**
  202.      * @Route("/admin/user/activate/{userID}")
  203.      */
  204.     public function ajaxActivateUser($userID) {
  205.         $entityManager $this->getDoctrine()->getManager();
  206.         $userRepository $entityManager->getRepository(User::class);
  207.         $user $userRepository->find($userID);
  208.         if(!$user) {
  209.             return new Response();
  210.         }
  211.         $user->setStatus(User::STATUS_CONFIRMED);
  212.         $mainMailingCampaignType $entityManager->getRepository(MailingCampaignType::class)->find(MailingCampaignType::MAIN_ID);
  213.         $user->addMailingCampaignTypes($mainMailingCampaignType);
  214.         $entityManager->flush();
  215.         $userConfirmationRepository $entityManager->getRepository(UserConfirmation::class);
  216.         $userConfirmations $userConfirmationRepository->findByUserID($userID);
  217.         foreach ($userConfirmations as $userConfirmation) {
  218.             $entityManager->remove($userConfirmation);
  219.         }
  220.         $entityManager->flush();
  221.         $userRepository->addActivity($userUserActivity::SUBSCRIBE_ACTION$mainMailingCampaignType);
  222.         return new Response();
  223.     }
  224.     
  225.     /**
  226.      * @Route("/admin/user/replenishment_balance")
  227.      */
  228.     public function ajaxReplenishmentBalanceUser(Request $request){
  229.         if (!$request->isXmlHttpRequest()) {
  230.             return $this->redirect("/admin");
  231.         }
  232.         $userID $request->request->get("userID");
  233.         $replenishmentAmount = (float) $request->request->get("amount");
  234.         if($replenishmentAmount 0) {
  235.             $result['success'] = "false";
  236.             $result['message'] = "Введите положительное число";
  237.             return new Response(json_encode($result));
  238.         }
  239.         $isReplenishment $request->request->get("isReplenishment");
  240.         $entityManager $this->getDoctrine()->getManager();
  241.         $userRepository $entityManager->getRepository(User::class);
  242.         $user $userRepository->findOneBy(["ID" => $userID]);
  243.         $currentBalance $user->getBalance();
  244.         $result['userEmail'] = $user->getEmail();
  245.         if($isReplenishment == "true") {
  246.             $currentBalance += $replenishmentAmount;
  247.             $user->setBalance($currentBalance);
  248.             $entityManager->flush($user);
  249.             $result['newBalance'] = $currentBalance;
  250.             $result['success'] = "true";
  251.         } else {
  252.             if ($currentBalance $replenishmentAmount >= 0) {
  253.                 $currentBalance -= $replenishmentAmount;
  254.                 $user->setBalance($currentBalance);
  255.                 $entityManager->flush($user);
  256.                 $result['success'] = "true";
  257.                 $result['newBalance'] = $currentBalance;
  258.             } else {
  259.                 $result['success'] = "false";
  260.                 $result['message'] = "Баланс пользователя не может быть отрицательным";
  261.                 return new Response(json_encode($result));
  262.             }
  263.         }
  264.         $balanceActivity = new UserBalanceActivity();
  265.         $result['createdOn'] = date('d.m.Y H:i'$balanceActivity->getCreatedOn()->getTimestamp());
  266.         $replenishmentAmount number_format($replenishmentAmount2);
  267.         $result['replenishmentAmount'] = $replenishmentAmount;
  268.         if ($isReplenishment === 'true') {
  269.             $type UserBalanceActivity::TYPE_REPLENISHMENT_BY_OPERATOR;
  270.         } else {
  271.             $type UserBalanceActivity::TYPE_WITHDRAW_BY_OPERATOR;
  272.             $replenishmentAmount *= -1;
  273.         }
  274.         $balanceActivityType $entityManager->getRepository(UserBalanceActivityType::class)->find($type);
  275.         $balanceActivity->setType($balanceActivityType);
  276.         $balanceActivity->setUser($user);
  277.         $balanceActivity->setAmount($replenishmentAmount);
  278.         $balanceActivity->setOperatorID($this->getUser()->getID());
  279.         $entityManager->persist($balanceActivity);
  280.         $entityManager->flush($balanceActivity);
  281.         $user->addBalanceActivity($balanceActivity);
  282.         $result['status'] = $balanceActivityType->getName();
  283.         return new Response(json_encode($result));
  284.     }
  285.     
  286.     /**
  287.      * @Route("/admin/user/send_code")
  288.      */
  289.     public function ajaxSendCode(Request $requestMailer $mailer){
  290.         if (!$request->isXmlHttpRequest()) {
  291.             return $this->redirect("/admin");
  292.         }
  293.         $orderID $request->request->get("orderID");
  294.         $order $this->getOfferOrderRepository()->findOneBy(['ID' => $orderID]);
  295.         $result = [];
  296.         if ($order) {
  297.             $this->sendCode($mailer$order);
  298.             $result['success'] = "true";
  299.             $result['message'] = "Код успешно выслан на почту " $order->getUser()->getEmail();
  300.         } else {
  301.             $result['success'] = "false";
  302.             $result['message'] = "Заказ не найден";
  303.         }
  304.         return new Response(json_encode($result));
  305.     }
  306.     /**
  307.      * @Route("/admin/user/change_password")
  308.      */
  309.     public function ajaxChangePassword(Request $requestMailer $mailer){
  310.         if(!$request->isXmlHttpRequest()){
  311.             return $this->redirect("/admin");
  312.         }
  313.         $userID $request->request->get("userID");
  314.         $entityManager $this->getDoctrine()->getManager();
  315.         $user $entityManager->getRepository(User::class)->findOneBy(["ID" => $userID]);
  316.         $password $request->request->get("newPassword");
  317.         $sendEmail $request->request->get("sendEmail");
  318.         $result = [];
  319.         if(mb_strlen($password) >= 6) {
  320.             $user->encryptPassword($password);
  321.         } else {
  322.             $result['success'] = "false";
  323.             $result['message'] = "Пароль не может быть меньше 6 символов";
  324.             return new Response(json_encode($result));
  325.         }
  326.         if($sendEmail == "true"){
  327.             $message $mailer->createMessage();
  328.             $message->setSubject('Slivki.by - смена пароля')
  329.                 ->setFrom('info@slivki.by''Slivki.by')
  330.                 ->setTo($user->getEmail())
  331.                 ->setBody(
  332.                     $this->get('twig')->render(
  333.                         'Slivki/emails/change_password_by_operator.html.twig',
  334.                         array('password' => $password)
  335.                     ),
  336.                     'text/html'
  337.                 );
  338.             $mailer->send($message);
  339.             $result['success'] = "true";
  340.             $result['message'] = "Новый пароль был отправлен на почту пользователя" " (" $user->getEmail() . ")";
  341.             $entityManager->flush($user);
  342.             return new Response(json_encode($result));
  343.         }
  344.         $result['success'] = "true";
  345.         $result['message'] = "Пароль пользователя " $user->getEmail() . "был успешно изменен";
  346.         $entityManager->flush($user);
  347.         return new Response(json_encode($result));
  348.     }
  349.     /**
  350.      * @Route("/admin/user/allow-x2-bonus/{userID}/{bonusAllowed}")
  351.      */
  352.     public function allowX2BonusAction(Mailer $mailer$userID$bonusAllowed) {
  353.         $bonusAllowed $bonusAllowed == 'true';
  354.         $entityManager $this->getDoctrine()->getManager('admin');
  355.         $user $this->getUserRepository()->find($userID);
  356.         if ($user) {
  357.             $bonusProperty $user->getPropertyByName(UserProperty::NAME_BONUS_X2);
  358.             if ($bonusProperty && !$bonusAllowed) {
  359.                 $entityManager->remove($bonusProperty);
  360.             } else if (!$bonusProperty && $bonusAllowed) {
  361.                 $bonusProperty = new UserProperty();
  362.                 $bonusProperty->setName(UserProperty::NAME_BONUS_X2);
  363.                 $user->addProperty($bonusProperty);
  364.                 $bonusProperty->setUser($user);
  365.                 $message $mailer->createMessage();
  366.                 $message->setSubject('Акция! Ваш счет удвоится в течение первых 24 часов!')
  367.                     ->setFrom('info@slivki.by''Slivki.by')
  368.                     ->setTo($user->getEmail())
  369.                     ->setBody($this->get('twig')->render('Slivki/emails/double_replenishment.html.twig'), 'text/html');
  370.                 $mailer->send($message);
  371.             }
  372.             $entityManager->flush();
  373.         }
  374.         return new Response();
  375.     }
  376.     /**
  377.      * @Route("/admin/user/change_group")
  378.      */
  379.     public function userChangeGroupAction(Request $request) {
  380.         if(!$request->isXmlHttpRequest()){
  381.             return $this->redirect("/admin");
  382.         }
  383.         if ('volga@slivki.by' !== $this->getUser()->getEmail()) {
  384.             throw $this->createAccessDeniedException();
  385.         }
  386.         $userID $request->request->get("userID");
  387.         $groupID $request->request->get("groupID");
  388.         // $action = true - add group, false - remove group;
  389.         $action $request->request->get("action") == 'true';
  390.         $entityManager $this->getDoctrine()->getManager('admin');
  391.         $userRepository $this->getUserRepository();
  392.         if ($groupID == User::STATUS_LOCKED) {
  393.             $user $userRepository->find($userID);
  394.             if ($action) {
  395.                 $user->setStatus(User::STATUS_LOCKED);
  396.             } else {
  397.                 $user->setStatus(User::STATUS_CONFIRMED);
  398.             }
  399.             $entityManager->flush($user);
  400.             return new Response();
  401.         }
  402.         $user $userRepository->find($userID);
  403.         if(!$user) {
  404.             return new Response();
  405.         }
  406.         $userGroup $entityManager->getRepository(UserGroup::class)->find($groupID);
  407.         if(!$userGroup) {
  408.             return new Response();
  409.         }
  410.         if($action) {
  411.             $user->addUserGroup($userGroup);
  412.         } else {
  413.             $user->removeUserGroup($userGroup);
  414.         }
  415.         $entityManager->flush();
  416.         return new Response();
  417.     }
  418.     /**
  419.      * @Route("/admin/user/subscribe/{userID}/{subscribed}/{totally}")
  420.      */
  421.     public function unsubscribeAction($userID$subscribed$totally) {
  422.         $entityManager $this->getDoctrine()->getManager();
  423.         $user $entityManager->find(User::class, $userID);
  424.         $subscribed $subscribed == 'true';
  425.         if ($totally == 'true') {
  426.             $user->setTotallyUnsubscribed($subscribed);
  427.         } else {
  428.             $user->setAcceptNewsletter($subscribed);
  429.         }
  430.         $entityManager->flush($user);
  431.         return new Response();
  432.     }
  433.     /**
  434.      * @Route("/admin/user/get_permission")
  435.      */
  436.     public function userGetPermissionAction(Request $request) {
  437.         if (!$request->isXmlHttpRequest()){
  438.             return $this->redirect("/admin");
  439.         }
  440.         $userID $request->request->getInt("userID");
  441.         if ($userID == 0) {
  442.             throw $this->createNotFoundException("User not selected");
  443.         }
  444.         $entityManager $this->getEntityManager();
  445.         $userRepository $this->getUserRepository();
  446.         $user $userRepository->find($userID);
  447.         $data['groupsPermitted'] = $user->getUserGroups();
  448.         $data['groupsAll'] = $entityManager->getRepository(UserGroup::class)->findByHidden(false);
  449.         return $this->render('Slivki/admin/users/list_user_group.html.twig'$data);
  450.     }
  451.     /**
  452.      * @Route("/admin/user/set_permission")
  453.      */
  454.     public function userSetPermissionAction(Request $request) {
  455.         if (!$request->isXmlHttpRequest()){
  456.             return $this->redirect("/admin");
  457.         }
  458.         $userID $request->request->getInt("userID");
  459.         if ($userID == 0) {
  460.             throw $this->createNotFoundException("User not selected");
  461.         }
  462.         $groupList $request->request->get("groupList", []);
  463.         $entityManager $this->getEntityManager();
  464.         $userRepository $this->getUserRepository();
  465.         $userGroupRepository $entityManager->getRepository(UserGroup::class);
  466.         $user $userRepository->find($userID);
  467.         $userGroups $user->getUserGroups();
  468.         foreach($userGroups as $groupRemoved) {
  469.             if (!$groupRemoved->isHidden()) {
  470.                 $user->removeUserGroup($groupRemoved);
  471.             }
  472.         }
  473.         foreach ($groupList as $groupID) {
  474.             $group $userGroupRepository->find((int)$groupID);
  475.             if (!$group) {
  476.                 continue;
  477.             }
  478.             $user->addUserGroup($group);
  479.         }
  480.         $entityManager->flush();
  481.         return new Response();
  482.     }
  483.     /**
  484.      * @Route("/admin/user/manager-name/save")
  485.      */
  486.     public function saveManagerName(Request $request) {
  487.         if (!$request->isXmlHttpRequest()){
  488.             return $this->redirect("/admin");
  489.         }
  490.         $userID $request->request->getInt("userID");
  491.         if (!$this->isGranted('ROLE_ADMIN') && !($userID == $this->getUser()->getID())) {
  492.             return new Response();
  493.         }
  494.         $entityManager $this->getEntityManager();
  495.         $user $entityManager->find(User::class, $userID);
  496.         $user->setManagerName($request->request->get('managerName'));
  497.         $entityManager->flush();
  498.         return new Response('1');
  499.     }
  500.     /**
  501.      * @Route("/admin/user/subscribe/history")
  502.      */
  503.     public function getUserSubscribeHistory(
  504.         Request $request,
  505.         SubscriptionHistoryServiceInterface $subscriptionHistoryService
  506.     ) {
  507.         if (!$request->isXmlHttpRequest()){
  508.             return $this->redirect("/admin");
  509.         }
  510.         $entityManager $this->getEntityManager();
  511.         $userID $request->request->getInt("userID");
  512.         $user $entityManager->find(User::class, $userID);
  513.         if (!$user) {
  514.             return new Response("Пользователь не найден");
  515.         }
  516.         $result null !== $user->getToken()
  517.             ? $subscriptionHistoryService->getSubscriberHistory(
  518.                 (new GetSubscriberHistoryQueryStringBuilder())
  519.                     ->withPage(1)
  520.                     ->withPerPage(50),
  521.                 $user->getToken())
  522.             : null;
  523.         if (null !== $result && === \count($result->getItems())) {
  524.             return new Response('История пустая');
  525.         }
  526.         return $this->render('Slivki/admin/users/subscribe_history_table.html.twig', ['result' => $result]);
  527.     }
  528. }