src/MyBundle/Controller/ProfileController.php line 578

Open in your IDE?
  1. <?php
  2. namespace MyBundle\Controller;
  3. use AcquiringBundle\Entity\Order;
  4. use AutomarketBundle\Component\EstimateCaptcha;
  5. use CoreBundle\Component\CoreFormFactory;
  6. use CoreBundle\Entity\Brand;
  7. use CoreBundle\Entity\Dealer;
  8. use CoreBundle\Entity\Post;
  9. use CoreBundle\Entity\User;
  10. use CoreBundle\Model\Api\OnlineService\ApiServer1C;
  11. use CoreBundle\Services\Cart\CartService;
  12. use DateTime;
  13. use DcSiteBundle\Services\AccessoryService;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Exception;
  16. use FOS\UserBundle\Model\UserManagerInterface;
  17. use InsuranceBundle\Entity\CaseDocument;
  18. use InsuranceBundle\Model\InsuranceCase;
  19. use InsuranceBundle\Model\Program;
  20. use MyBundle\Component\InfobipSmsSender;
  21. use MyBundle\Component\SmsSender;
  22. use MyBundle\Entity\UserEmailChange;
  23. use MyBundle\Entity\UserInfo;
  24. use MyBundle\Entity\UserMessage;
  25. use MyBundle\Entity\UserReferral;
  26. use MyBundle\Entity\UserSignRequest;
  27. use MyBundle\Entity\UserSigns;
  28. use MyBundle\Exception\DataNotValidException;
  29. use MyBundle\Factory\ReferralDataDTOFactory;
  30. use MyBundle\Factory\StringGenerator;
  31. use MyBundle\Factory\UserEntityFactory;
  32. use MyBundle\Messages;
  33. use MyBundle\Service\AuthDataValidator;
  34. use Psr\Log\LoggerInterface;
  35. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  36. use Symfony\Component\HttpFoundation\JsonResponse;
  37. use Symfony\Component\HttpFoundation\Request;
  38. use Symfony\Component\HttpFoundation\RequestStack;
  39. use Symfony\Component\HttpFoundation\Response;
  40. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  41. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  42. use Symfony\Component\Mailer\MailerInterface;
  43. use Symfony\Component\Mime\Address;
  44. use Symfony\Component\Mime\Email;
  45. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  46. use Symfony\Component\Routing\RouterInterface;
  47. use Twig\Environment;
  48. class ProfileController extends MyBaseController
  49. {
  50.     private RouterInterface $router;
  51.     public function __construct(EntityManagerInterface $emRequestStack $requestStackMessages $messages,
  52.                                 \CoreBundle\Model\User $userModelEnvironment $twigRouterInterface $router)
  53.     {
  54.         $this->router $router;
  55.         parent::__construct($em$requestStack$messages$userModel$twig);
  56.     }
  57.     private function getActions(): array
  58.     {
  59.         $actions $this->em->getRepository(Post::class)->getActions(null);
  60.         //TODO remove to some config and remove magic numbers
  61.         $routesByDealer = [
  62.             => [
  63.                 'key' => 'url',
  64.                 'name' => 'ford_get_post'
  65.             ],
  66.             => [
  67.                 'key' => 'url',
  68.                 'name' => 'toyota_action_single'
  69.             ],
  70.             => [
  71.                 'key' => 'url',
  72.                 'name' => 'toyota_odessa_action_single'
  73.             ],
  74.             => [
  75.                 'key' => 'url',
  76.                 'name' => 'nissan_stocks_single'
  77.             ],
  78.             14 => [
  79.                 'key' => 'url',
  80.                 'name' => 'lexus_stocks_single'
  81.             ],
  82.             15 => [
  83.                 'key' => 'url',
  84.                 'name' => 'nissan_armada_stocks_single'
  85.             ],
  86.             16 => [
  87.                 'key' => 'url',
  88.                 'name' => 'yamaha_stocks_single'
  89.             ],
  90.         ];
  91.         $actionsResult = [];
  92.         /** @var Post $row */
  93.         foreach ($actions as $row) {
  94.             $postDealer $row->getDealer();
  95.             if (!$postDealer) {
  96.                 continue;
  97.             }
  98.             if (!isset($routesByDealer[$postDealer->getId()])) {
  99.                 continue;
  100.             }
  101.             $paramName $routesByDealer[$postDealer->getId()]['key'];
  102.             $routeName $routesByDealer[$postDealer->getId()]['name'];
  103.             $actionsResult[] = [
  104.                 'item' => $row,
  105.                 'url' => $this->router->generate($routeName, ["$paramName=> $row->getUrl()])
  106.             ];
  107.             if (count($actionsResult) >= 3) {
  108.                 break;
  109.             }
  110.         }
  111.         return $actionsResult;
  112.     }
  113.     public function index(Request $request): Response
  114.     {
  115.         return $this->baseMyRender('@My/Profile/index.html.twig', [
  116.             'actions' => $this->getActions(),
  117.             'genders' => \CoreBundle\Model\User::GENDERS[$request->getLocale()],
  118.             'user' => $this->getUser()
  119.         ]);
  120.     }
  121.     public function confirmChangeEmail(Request $request$userHash$emailHash): Response
  122.     {
  123.         $success false;
  124.         $email '';
  125.         if ($this->userModel->initByHash($userHash)) {
  126.             $user $this->userModel->getUser();
  127.             if ($emailHash == $user->getEmailHash()) {
  128.                 /** @var UserEmailChange $userEmailChange [] */
  129.                 $userEmailChange $this->em->getRepository(UserEmailChange::class)->findBy(['user' => $user'hash' => $emailHash]);
  130.                 if ($userEmailChange) {
  131.                     $email current($userEmailChange)->getEmail();
  132.                     $success true;
  133.                     $user->setEmail($email);
  134.                     $user->setEmailCanonical($email);
  135.                     $this->em->flush();
  136.                 }
  137.             }
  138.         }
  139.         return $this->baseMyRender('@My/Profile/confirm_email_change.html.twig', [
  140.             'success' => $success,
  141.             'email' => $email
  142.         ]);
  143.     }
  144.     public function updateUser(Request $request): JsonResponse
  145.     {
  146.         $errors = [];
  147.         $response = ['success' => true];
  148.         /** @var User $User */
  149.         $User $this->getUser();
  150.         if ($request->request->get('name')) {
  151.             $User->setName($request->request->get('name'));
  152.         } else {
  153.             $errors['name'] = true;
  154.         }
  155.         if ($request->request->get('last-name')) {
  156.             $User->setLastName($request->request->get('last-name'));
  157.         } else {
  158.             $errors['lastName'] = true;
  159.         }
  160.         if ($request->request->get('middle-name')) {
  161.             $User->setMiddleName($request->request->get('middle-name'));
  162.         } else {
  163.             $errors['middleName'] = true;
  164.         }
  165.         if ($request->request->get('birth-date'))
  166.             $User->setBirthDate(new DateTime($request->request->get('birth-date')));
  167.         //$User->setFullName($request->request->get('full-name'));
  168.         $User->setGender((int)$request->request->get('gender'));
  169.         $userInfo $User->getInfo();
  170.         if (!$userInfo) {
  171.             $User->setInfo(new UserInfo());
  172.         }
  173.         $User->getInfo()->setCity($request->request->get('city'));
  174.         $error $this->updateEmail($request);
  175.         if ($error) {
  176.             $response = ['success' => false'error' => $error];
  177.         }
  178.         $this->em->persist($User);
  179.         $this->em->persist($User->getInfo());
  180.         $this->em->flush();
  181.         return new JsonResponse($response);
  182.     }
  183.     public function updateEmail(Request $requestMailerInterface $mailerUserManagerInterface $userManager): array
  184.     {
  185.         /** @var User $User */
  186.         $User $this->getUser();
  187.         $email $request->request->get('email');
  188.         if ($email && ($email != $User->getEmail())) {
  189.             if (!filter_var($emailFILTER_VALIDATE_EMAIL)) {
  190.                 return ['email' => 'Некорректно введен email.'];
  191.             }
  192.             if ($userManager->findUserByEmail($email)) {
  193.                 return ['email' => 'Данный email уже используется в системе. Укажите другой.'];
  194.             }
  195.             $userHash md5($User->getId() . time() . 'vidisecrettertsalt1ws!@3');
  196.             $emailHash md5($User->getId() . time() . 'emailconfirmsecrethash123et&!^');
  197.             $userEmailChange = new UserEmailChange();
  198.             $userEmailChange->setUser($User);
  199.             $userEmailChange->setHash($emailHash);
  200.             $userEmailChange->setEmail($email);
  201.             $this->em->persist($userEmailChange);
  202.             $User->setEmailHash($emailHash);
  203.             $User->setHash($userHash);
  204.             $mailBody $this->baseMyRender('@My/Mail/confirm_change_email.html.twig', ['hash' => $emailHash'uHash' => $userHash'user' => $User])->getContent();
  205.             $message = (new Email())
  206.                 ->subject('Подтверждение изменения электронного адреса в программе лояльности')
  207.                 ->from(new Address('info@vidi.ua''Автодинастия'))
  208.                 ->html($mailBody)
  209.                 ->to($email);
  210.             $mailer->send($message);
  211.             $this->em->persist($User);
  212.             $this->em->flush();
  213.         }
  214.         return [];
  215.     }
  216.     public function aboutcar(): Response
  217.     {
  218.         $User $this->getUser();
  219.         $this->userModel->initByEntity($User);
  220.         return $this->baseMyRender('@My/Profile/aboutcar.html.twig', [
  221.             'user' => $this->userModel,
  222.             'actions' => $this->getActions()
  223.         ]);
  224.     }
  225.     public function car()
  226.     {
  227.         return $this->baseMyRender('@My/Profile/car.html.twig', [
  228.             'user' => $this->getUser(),
  229.         ]);
  230.     }
  231.     public function carSingle(Request $requestApiServer1C $apiServer1C)
  232.     {
  233.         $carId $request->get('id');
  234.         $User $this->getUser();
  235.         $this->userModel->initByEntity($User);
  236.         $Car $this->userModel->getCarById($carId);
  237.         if (!$Car) {
  238.             return $this->createNotFoundException();
  239.         }
  240.         $serviceHistory $apiServer1C->getUserCarHistory($Car->getVin(), $this->userModel->getPhone());
  241.         $history = [];
  242.         if ($serviceHistory['data']) {
  243.             foreach ($serviceHistory['data'] as $item) {
  244.                 $history[] = [
  245.                     'number' => $item['number'],
  246.                     'date' => (new DateTime($item['date']))->format('d.m.Y'),
  247.                     'millage' => $item['millage'],
  248.                     'sum' => $item['sum'],
  249.                     'parts' => $item['parts'] ?? [],
  250.                     'works' => $item['works'] ?? [],
  251.                 ];
  252.             }
  253.         }
  254.         $history $this->array_unique($history);
  255.         usort($history, fn($a$b) => strtotime($a['date']) < strtotime($b['date']));
  256.         $availBrands $this->em->getRepository(Brand::class)->getAvailBrandsInstanceName();
  257.         return $this->baseMyRender('@My/Profile/car-single.html.twig', [
  258.             'car' => $Car,
  259.             'history' => $history,
  260.             'availBrands' => $availBrands,
  261.         ]);
  262.     }
  263.     private function array_unique($array): array
  264.     {
  265.         $temp_array = [];
  266.         $key_array = [];
  267.         $i 0;
  268.         foreach ($array as $val) {
  269.             if (!in_array($val['number'], $key_array)) {
  270.                 $key_array[$i] = $val['number'];
  271.                 $temp_array[$i] = $val;
  272.             }
  273.             $i++;
  274.         }
  275.         return $temp_array;
  276.     }
  277.     public function message(): Response
  278.     {
  279.         $result = [];
  280.         $messages $this->messages->getUserMessages();
  281.         $nowDate = new DateTime();
  282.         $yesterdayDate = new DateTime('-1 day');
  283.         foreach ($messages as $message) {
  284.             $key $message['date'];
  285.             if ($key == $nowDate->format('d.m.Y')) {
  286.                 $key 'today';
  287.             }
  288.             if ($key == $yesterdayDate->format('d.m.Y')) {
  289.                 $key 'yesterday';
  290.             }
  291.             $result[$key][] = $message;
  292.         }
  293.         return $this->baseMyRender('@My/Profile/message.html.twig', [
  294.             'messages' => $result,
  295.             'actions' => $this->getActions()
  296.         ]);
  297.     }
  298.     public function setIsRead(Request $request): JsonResponse
  299.     {
  300.         $id $request->get('id');
  301.         $message $this->em->getRepository(UserMessage::class)->find($id);
  302.         if ($message && $message->getUser()->getId() == $this->getUser()->getId()) {
  303.             $message->setIsRead(1);
  304.             $this->em->persist($message);
  305.             $this->em->flush($message);
  306.         }
  307.         return $this->json(['success' => true]);
  308.     }
  309.     public function insuranceLongation(Request $request)
  310.     {
  311.         $this->baseMyRender('@My/profile.html.twig');
  312.     }
  313.     public function orderService(Request $requestCoreFormFactory $coreFormFactory): Response
  314.     {
  315.         //TODO add params or what??
  316.         return $this->baseMyRender('@My/Profile/order-service.html.twig', [
  317.             'actions' => $this->getActions(),
  318.             'serviceForm' => $coreFormFactory->serviceForm(nullfalse)->createView(),
  319.         ]);
  320.     }
  321.     public function orderServiceByParameters($hashRequest $requestCoreFormFactory $coreFormFactory): ?Response
  322.     {
  323.         $params json_decode(base64_decode($hash));
  324.         return $this->baseMyRender('@My/Profile/order-service.html.twig', [
  325.             'params' => $params,
  326.             'actions' => $this->getActions(),
  327.             'serviceForm' => $coreFormFactory->serviceForm(nullfalse)->createView(),
  328.         ]);
  329.     }
  330.     public function orderTestDrive(CoreFormFactory $coreFormFactory): Response
  331.     {
  332.         $tdForm $coreFormFactory->testDriveForm();
  333.         return $this->baseMyRender('@My/Profile/order-test-drive.html.twig', [
  334.             'actions' => $this->getActions(),
  335.             'testDrivePageForm' => $tdForm->createView()
  336.         ]);
  337.     }
  338.     public function insurance(): Response
  339.     {
  340.         $user $this->getUser();
  341.         $cases $this->em->getRepository(InsuranceCase::class)->findBy(['user' => $user]);
  342.         return $this->baseMyRender('@My/Profile/insurance.html.twig', [
  343.             'actions' => $this->getActions(),
  344.             'cases' => $cases,
  345.         ]);
  346.     }
  347.     public function sendCaseToEmail(Request $request$caseIdMailerInterface $mailer): JsonResponse
  348.     {
  349.         $case $this->em->getRepository(InsuranceCase::class)->find($caseId);
  350.         if (!$case) {
  351.             throw new NotFoundHttpException();
  352.         }
  353.         $mailBody $this->baseMyRender('@Insurance/Cabinet/stikcer.html.twig', ['case' => $case]);
  354.         $message = (new Email())
  355.             ->subject('ВиДи Страхование - страховое дело')
  356.             ->from(new Address('info@vidi.ua''Автодинастия'))
  357.             ->html($mailBody)
  358.             ->to($this->getUser()->getEmail());
  359.         try {
  360.             $mailer->send($message);
  361.             return $this->json(['success' => true]);
  362.         } catch (Exception $e) {
  363.         }
  364.         return $this->json(['success' => false]);
  365.     }
  366.     public function caseDetails($caseId): Response
  367.     {
  368.         $case $this->em->getRepository(InsuranceCase::class)->find($caseId);
  369.         if (!$case) {
  370.             throw new NotFoundHttpException();
  371.         }
  372.         $count 0;
  373.         foreach ($case->getDocuments() as $document) {
  374.             if (!$document->isReceived()) {
  375.                 $count += 1;
  376.             }
  377.         }
  378.         return $this->baseMyRender('@My/Profile/insurance-details.html.twig', ['case' => $case'receivedCount' => $count]);
  379.     }
  380.     public function download(Request $request$id): BinaryFileResponse
  381.     {
  382.         $User $this->getUser();
  383.         $Case $this->em->getRepository(InsuranceCase::class)->find($id);
  384.         if (!$Case || $Case->getState() < || $Case->getUser()->getId() != $User->getId()) {
  385.             throw new NotFoundHttpException();
  386.         }
  387.         $filesDir $this->getParameter('kernel.project_dir') . '/public/uploads/insurance';
  388.         $fullPath $filesDir '/' $Case->getWMail();
  389.         if (!$Case->getWMail() || !file_exists($fullPath)) {
  390.             throw new NotFoundHttpException();
  391.         }
  392.         return $this->file($fullPath);
  393.     }
  394.     public function print(Request $request): BinaryFileResponse
  395.     {
  396.         $User $this->getUser();
  397.         $id $request->get('id');
  398.         $Case $this->em->getRepository(InsuranceCase::class)->find($id);
  399.         if (!$Case || $Case->getUser()->getId() != $User->getId()) {
  400.             throw new NotFoundHttpException();
  401.         }
  402.         $filesDir $this->container->getParameter('kernel.project_dir') . '/public/uploads/insurance';
  403.         $fullPath $filesDir '/' $Case->getWMail();
  404.         if (!$Case->getWMail() || !file_exists($fullPath)) {
  405.             throw new NotFoundHttpException();
  406.         }
  407.         $response = new BinaryFileResponse($fullPath);
  408.         $response->headers->set('Content-Type''application/pdf');
  409.         $response->setContentDisposition(
  410.             ResponseHeaderBag::DISPOSITION_INLINE,
  411.             $Case->getWMail()
  412.         );
  413.         return $response;
  414.     }
  415.     public function sticker(Request $request$id): ?Response
  416.     {
  417.         $User $this->getUser();
  418.         $Case $this->em->getRepository(InsuranceCase::class)->find($id);
  419.         if (!$Case || ($Case->getUser()->getId() != $User->getId() && !$this->isGranted())) {
  420.             throw new NotFoundHttpException();
  421.         }
  422.         return $this->baseMyRender('@Insurance/Cabinet/stikcer.html.twig', [
  423.             'case' => $Case
  424.         ]);
  425.     }
  426.     public function docAdd(Request $request): JsonResponse
  427.     {
  428.         $User $this->getUser();
  429.         $id $request->request->get('id');
  430.         $Case $this->em->getRepository(InsuranceCase::class)->find($id);
  431.         if (!$Case || $Case->getState() < || $Case->getUser()->getId() != $User->getId()) {
  432.             return new JsonResponse(['success' => false]);
  433.         }
  434.         $filesDir $this->getParameter('kernel.project_dir') . '/public/uploads/insurance';
  435.         /** @var Up $file */
  436.         foreach ($request->files as $docId => $file) {
  437.             $Document $this->em->getRepository(CaseDocument::class)->find($docId);
  438.             if (!$Document || $Document->getCase()->getUser()->getId() != $User->getId()) {
  439.                 continue;
  440.             }
  441.             $fileName md5(uniqid()) . '.' $file->guessExtension();
  442.             $file->move($filesDir$fileName);
  443.             $Document->setFile($fileName);
  444.             $Document->setState(InsuranceCase::DOC_STATE_NEW);
  445.             $this->em->persist($Document);
  446.             $this->em->flush($Document);
  447.         }
  448.         return new JsonResponse(['success' => true]);
  449.     }
  450.     public function downloadBlank(Request $request): BinaryFileResponse
  451.     {
  452.         $sample $request->query->get('sample');
  453.         $fileName $sample 'Зразок_заяви_страхового випадку_ВІДІ-СТРАХУВАННЯ.pdf' 'Заява про настання страхового випадку_Новий_Бланк.pdf';
  454.         $dir realpath($this->getParameter('kernel.project_dir') . '/public');
  455.         $fullPath $dir '/bundles/insurance/files/' $fileName;
  456.         if (!file_exists($fullPath)) {
  457.             throw new NotFoundHttpException();
  458.         }
  459.         return $this->file($fullPath);
  460.     }
  461.     public function orders(Request $requestCartService $cartService): ?Response
  462.     {
  463.         $accessories = [];
  464.         $acquiringOrders $this->em->getRepository(Order::class)->findBy(['user' => $this->getUser(), 'state' => 2]);
  465.         /** @var Order $acquiring */
  466.         foreach ($acquiringOrders as $acquiring) {
  467.             $accessories[$acquiring->getId()] = [
  468.                 'price' => $acquiring->getOrder()->getOrderAmount(),
  469.                 'title' => $acquiring->getId(),
  470.                 'images' => [],
  471.                 'dateCreate' => $acquiring->getDateCreate()->format('d.m.Y H:i'),
  472.             ];
  473.             foreach ($acquiring->getOrder()->getOrderItem() as $item) {
  474.                 $cartType $cartService->getCartType($item->getType());
  475.                 $dataItem json_decode($item->getData());
  476.                 $cart $cartType->getCart($dataItem$request->getLocale());
  477.                 $accessories[$acquiring->getId()]['images'] = $cart['image'];
  478.             }
  479.         }
  480.         return $this->baseMyRender('@My/Profile/orders.html.twig', [
  481.             'actions' => $this->getActions(),
  482.             'accessories' => $accessories,
  483.         ]);
  484.     }
  485.     public function calendar(Request $request): ?Response
  486.     {
  487.         return $this->baseMyRender('@My/Profile/calendar.html.twig', [
  488.             'actions' => $this->getActions(),
  489.             'currentYear' => date('Y'),
  490.             'currentMonth' => date('n'),
  491.         ]);
  492.     }
  493.     public function onlineActivity(): ?Response
  494.     {
  495.         return $this->baseMyRender('@My/Profile/online-activity.html.twig', [
  496.             'actions' => $this->getActions(),
  497.         ]);
  498.     }
  499.     public function support(Request $requestRouterInterface $routerCoreFormFactory $factory): ?Response
  500.     {
  501.         return $this->baseMyRender('@My/Profile/support.html.twig', [
  502.             'actions' => $this->getActions(),
  503.             'privacyUrl' => $router->generate('portal_privacy_policy'),
  504.             'supportForm' => $factory
  505.                 ->supportForm(null$request->getLocale(), true)
  506.                 ->createView()
  507.         ]);
  508.     }
  509.     public function wishList(Request $requestRouterInterface $routerAccessoryService $accessoryService): ?Response
  510.     {
  511.         $result $accessoryService->getListFavoritesAccessory($this->getUser());
  512.         return $this->baseMyRender('@My/Profile/wish-list.html.twig', [
  513.             'result' => $result,
  514.             'actions' => $this->getActions(),
  515.             'catalogUrl' => $router->generate('portal_new_catalog_b', ['state' => 'new''type' => 'car''brand' => 'all']),
  516.         ]);
  517.     }
  518.     public function insCalc(EstimateCaptcha $estimateCaptcha): ?Response
  519.     {
  520.         return $this->baseMyRender('@My/Profile/ins-calc.html.twig', [
  521.             'baseType' => Program::BASE_COEFFICIENT_TYPE,
  522.             'listType' => Program::LIST_COEFFICIENT_TYPE,
  523.             'optionType' => Program::OPTION_COEFFICIENT_TYPE,
  524.             'token' => $estimateCaptcha->generateToken(),
  525.         ]);
  526.     }
  527.     public function insCalcByCar(Request $requestEstimateCaptcha $estimateCaptcha)
  528.     {
  529.         $carId $request->get('id');
  530.         $User $this->getUser();
  531.         $this->userModel->initByEntity($User);
  532.         $Car $this->userModel->getCarById($carId);
  533.         if (!$Car) {
  534.             return $this->createNotFoundException();
  535.         }
  536.         return $this->baseMyRender('@My/Profile/ins-calc-by-car.html.twig', [
  537.             'car' => $Car,
  538.             'baseType' => Program::BASE_COEFFICIENT_TYPE,
  539.             'listType' => Program::LIST_COEFFICIENT_TYPE,
  540.             'optionType' => Program::OPTION_COEFFICIENT_TYPE,
  541.             'token' => $estimateCaptcha->generateToken(),
  542.         ]);
  543.     }
  544.     public function documents()
  545.     {
  546.         $UserSigns $this->em
  547.             ->getRepository(UserSigns::class)->findBy(['user' => $this->getUser()]);
  548.         $UserSignsRequest $this->em
  549.             ->getRepository(UserSignRequest::class)->findBy(['user' => $this->getUser()]);
  550.         $userSignClose = [];
  551.         $userSignOpen = [];
  552.         foreach ($UserSignsRequest as $userSignRequest) {
  553.             $isSearched false;
  554.             foreach ($UserSigns as $userSign) {
  555.                 if ($userSignRequest->getSignCode() === $userSign->getSignCode()) {
  556.                     $userSignClose[] = $userSign;
  557.                     $isSearched true;
  558.                     break;
  559.                 }
  560.             }
  561.             if (!$isSearched) {
  562.                 $userSignOpen[] = $userSignRequest;
  563.             }
  564.         }
  565.         return $this->baseMyRender('@My/Profile/documents.html.twig', [
  566.             'actions' => $this->getActions(),
  567.             'signsOpen' => $userSignOpen,
  568.             'signsClose' => $userSignClose,
  569.         ]);
  570.     }
  571.     public function orderParts(): ?Response
  572.     {
  573.         return $this->baseMyRender('@My/Profile/order-parts.html.twig');
  574.     }
  575.     public function tradeIn(): ?Response
  576.     {
  577.         return $this->baseMyRender('@My/Profile/trade-in.html.twig');
  578.     }
  579.     public function insuranceNew(): ?Response
  580.     {
  581.         return $this->baseMyRender('@My/Insurance/index.html.twig');
  582.     }
  583.     public function quality(Request $requestApiServer1C $apiServer1C): ?Response
  584.     {
  585.         $type $request->get('type');
  586.         $dealer $request->get('dealer');
  587.         $documentId $request->get('document');
  588.         /** @var Dealer $dealer */
  589.         $dealer $this->em->getRepository(Dealer::class)->findOneBy(['uid_1c' => $dealer]);
  590.         if (!$dealer) {
  591.             throw $this->createNotFoundException();
  592.         }
  593.         try {
  594.             $documentData $apiServer1C->getDocumentInfo($type$documentId$dealer);
  595.         } catch (Exception $e) {
  596.             $documentData false;
  597.         }
  598.         if (!$documentData) {
  599.             $documentData = [
  600.                 "Date" => false,
  601.                 "Number" => false,
  602.                 "Customer" => false
  603.             ];
  604.         }
  605.         $documentData['id'] = $documentId;
  606.         return $this->baseMyRender(
  607.             '@My/Profile/quality.html.twig',
  608.             ['data' => $documentData'type' => $type'dealer' => $dealer]
  609.         );
  610.     }
  611.     public function sendSmsCode(Request $requestSmsSender $smsSenderInfobipSmsSender $infobipSmsSender): JsonResponse
  612.     {
  613.         /** @var User $user */
  614.         $user $this->getUser();
  615.         $phone $this->formatPhone($request->get('new-phone'));
  616.         if (!$phone) {
  617.             return new JsonResponse(['success' => false'error' => 'Phone does not correct formatted']);
  618.         }
  619.         $userPhones $user->getInfo()->getPhones();
  620.         foreach ($userPhones as $userPhone) {
  621.             if ($userPhone === $phone) {
  622.                 return new JsonResponse(['success' => false'error' => 'This phone already exists']);
  623.             }
  624.         }
  625.         $permitted_chars '0123456789';
  626.         $smscode strtoupper(substr(str_shuffle($permitted_chars), 06));
  627.         $smsSender->setAccount(SmsSender::LOYALTY_ACCOUNT)->sendSms($phone$smscode);
  628.         $infobipSmsSender->sendSms($phone$smscode);
  629.         $user->getInfo()->setConfirmCode($smscode);
  630.         $user->getInfo()->setSmsCount($user->getInfo()->getSmsCount() + 1);
  631.         $this->em->persist($user->getInfo());
  632.         $this->em->flush();
  633.         return new JsonResponse(['success' => true]);
  634.     }
  635.     public function confirmSmsCode(Request $request): JsonResponse
  636.     {
  637.         /** @var User $user */
  638.         $user $this->getUser();
  639.         $requestPhone $this->formatPhone($request->get('confirm-phone'));
  640.         if (!$requestPhone) {
  641.             return new JsonResponse(['success' => false'error' => 'Некоректно введений телефон']);
  642.         }
  643.         $smsCode $user->getInfo()->getConfirmCode();
  644.         if (!$smsCode || $smsCode !== (int)$request->get('sms-code')) {
  645.             return new JsonResponse(['success' => false'error' => 'Не вірно введений код']);
  646.         }
  647.         $user->getInfo()->setPhones(array_merge($user->getInfo()->getPhones(), [$user->getPhone()]));
  648.         $user->getInfo()->setConfirmCode(null);
  649.         $user->setPhone($requestPhone);
  650.         $this->em->persist($user);
  651.         $this->em->persist($user->getInfo());
  652.         $this->em->flush();
  653.         return new JsonResponse(['success' => true]);
  654.     }
  655.     public function setMainPhone(Request $request): JsonResponse
  656.     {
  657.         /** @var User $user */
  658.         $user $this->getUser();
  659.         $requestPhone $this->formatPhone($request->get('personal-phone'));
  660.         $userPhones $user->getInfo()->getPhones();
  661.         if (array_search($requestPhone$userPhones) !== false) {
  662.             unset($userPhones[array_search($requestPhone$userPhones)]);
  663.         } else {
  664.             return new JsonResponse(['success' => false]);
  665.         }
  666.         array_push($userPhones$user->getPhone());
  667.         $user->getInfo()->setPhones(array_values($userPhones));
  668.         $user->setPhone($requestPhone);
  669.         $this->em->persist($user);
  670.         $this->em->persist($user->getInfo());
  671.         $this->em->flush();
  672.         return new JsonResponse(['success' => true]);
  673.     }
  674.     public function deletePhone(Request $request): JsonResponse
  675.     {
  676.         /** @var User $user */
  677.         $user $this->getUser();
  678.         $requestPhone $this->formatPhone($request->get('delete-phone'));
  679.         $userPhones $user->getInfo()->getPhones();
  680.         if (array_search($requestPhone$userPhones) !== false) {
  681.             unset($userPhones[array_search($requestPhone$userPhones)]);
  682.             $user->getInfo()->setPhones(array_values($userPhones));
  683.             $this->em->persist($user->getInfo());
  684.             $this->em->flush();
  685.             return new JsonResponse(['success' => true]);
  686.         }
  687.         return new JsonResponse(['success' => false]);
  688.     }
  689.     public function formatPhone($phone)
  690.     {
  691.         $phone preg_replace("/[^0-9]/"''$phone);
  692.         if (strlen($phone) >= 10) {
  693.             return substr($phone, -10);
  694.         }
  695.         return false;
  696.     }
  697.     public function auction(): ?Response
  698.     {
  699.         return $this->baseMyRender('@My/Auction/auction.html.twig');
  700.     }
  701.     public function auctionSingle(): ?Response
  702.     {
  703.         return $this->baseMyRender('@My/Auction/auction-single.html.twig');
  704.     }
  705.     public function referral(Request $request): ?Response
  706.     {
  707.         $referrals $this->em
  708.             ->getRepository(UserReferral::class)->findBy(['owner_user' => $this->getUser()]);
  709.         return $this->baseMyRender('@My/Profile/referral.html.twig'compact('referrals'));
  710.     }
  711.     public function referralSend(
  712.         Request                $request,
  713.         StringGenerator        $stringGenerator,
  714.         AuthDataValidator      $validator,
  715.         UserEntityFactory      $userEntityFactory,
  716.         LoggerInterface        $logger,
  717.         ReferralDataDTOFactory $referralDataDTOFactory,
  718.         RouterInterface        $router,
  719.         InfobipSmsSender       $infobipSmsSender
  720.     ): JsonResponse
  721.     {
  722.         if (!$User $this->getUser()) {
  723.             return new JsonResponse(['success' => false'error' => 'Операцію заборонено, користувач не знайдено']);
  724.         }
  725.         $data $request->request->all();
  726.         try {
  727.             $validator->validateForReferral($data);
  728.         } catch (DataNotValidException $e) {
  729.             $logger->error($e->getMessage(), $data);
  730.             return new JsonResponse(['success' => false'error' => $e->getMessage()]);
  731.         }
  732.         $referralDataDTO $referralDataDTOFactory->createReferralDTO($data);
  733.         if (
  734.             $this->em
  735.                 ->getRepository(User::class)
  736.                 ->checkUsersByParams(['phone' => $referralDataDTO->phone])
  737.         ) {
  738.             return new JsonResponse([
  739.                     'success' => false,
  740.                     'error' => 'Користувач із таким номером телефону вже зареєстрований'
  741.                 ]
  742.             );
  743.         }
  744.         $usersReferral $this->em->getRepository(UserReferral::class);
  745.         do {
  746.             $promoCode $stringGenerator->generateUpperCaseAndNumbers();
  747.         } while ($usersReferral->findOneBy(['promo_code' => $promoCode]));
  748.         $referralDataDTO->promoCode $promoCode;
  749.         $referralDataDTO->user $User;
  750.         $newUser $userEntityFactory->createNotActivatedUserWithoutMail($referralDataDTO);
  751.         if ($newUser) {
  752.             $referralLink =
  753.                 $router->generate(
  754.                     'my_user_referral',
  755.                     ['promoCode' => $promoCode],
  756.                     UrlGeneratorInterface::ABSOLUTE_URL
  757.                 );
  758.             $message 'Запрошення в особистий кабінет VIDI. Для завершення реєстрації перейдіть за посиланням: ' .
  759.                 $referralLink;
  760.             $infobipSmsSender->sendSms($referralDataDTO->phone$message);
  761.             $userReferral $userEntityFactory->createUserReferral($referralDataDTO);
  762.             $this->em->persist($userReferral);
  763.             $this->em->flush();
  764.             return new JsonResponse(['success' => true]);
  765.         }
  766.         return new JsonResponse(['success' => false'error' => 'Поле "Прізвище" обов\'язкове до заповнення']);
  767.     }
  768.     public function referralRegister($promoCode)
  769.     {
  770.         $ReferralUser $this->em
  771.             ->getRepository(UserReferral::class)
  772.             ->findOneBy(['promo_code' => $promoCode]);
  773.         $OwnerUser $ReferralUser->getOwnerUser();
  774.         return $this->baseMyRender('@My/Modules/user-referral.html.twig', [
  775.             'OwnerUser' => $OwnerUser,
  776.             'ReferralUser' => $ReferralUser,
  777.         ]);
  778.     }
  779. }