<?php
namespace MyBundle\Controller;
use AcquiringBundle\Entity\Order;
use AutomarketBundle\Component\EstimateCaptcha;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Entity\Brand;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Post;
use CoreBundle\Entity\User;
use CoreBundle\Model\Api\OnlineService\ApiServer1C;
use CoreBundle\Services\Cart\CartService;
use DateTime;
use DcSiteBundle\Services\AccessoryService;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use FOS\UserBundle\Model\UserManagerInterface;
use InsuranceBundle\Entity\CaseDocument;
use InsuranceBundle\Model\InsuranceCase;
use InsuranceBundle\Model\Program;
use MyBundle\Component\InfobipSmsSender;
use MyBundle\Component\SmsSender;
use MyBundle\Entity\UserEmailChange;
use MyBundle\Entity\UserInfo;
use MyBundle\Entity\UserMessage;
use MyBundle\Entity\UserReferral;
use MyBundle\Entity\UserSignRequest;
use MyBundle\Entity\UserSigns;
use MyBundle\Exception\DataNotValidException;
use MyBundle\Factory\ReferralDataDTOFactory;
use MyBundle\Factory\StringGenerator;
use MyBundle\Factory\UserEntityFactory;
use MyBundle\Messages;
use MyBundle\Service\AuthDataValidator;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
use Twig\Environment;
class ProfileController extends MyBaseController
{
private RouterInterface $router;
public function __construct(EntityManagerInterface $em, RequestStack $requestStack, Messages $messages,
\CoreBundle\Model\User $userModel, Environment $twig, RouterInterface $router)
{
$this->router = $router;
parent::__construct($em, $requestStack, $messages, $userModel, $twig);
}
private function getActions(): array
{
$actions = $this->em->getRepository(Post::class)->getActions(null);
//TODO remove to some config and remove magic numbers
$routesByDealer = [
3 => [
'key' => 'url',
'name' => 'ford_get_post'
],
4 => [
'key' => 'url',
'name' => 'toyota_action_single'
],
7 => [
'key' => 'url',
'name' => 'toyota_odessa_action_single'
],
8 => [
'key' => 'url',
'name' => 'nissan_stocks_single'
],
14 => [
'key' => 'url',
'name' => 'lexus_stocks_single'
],
15 => [
'key' => 'url',
'name' => 'nissan_armada_stocks_single'
],
16 => [
'key' => 'url',
'name' => 'yamaha_stocks_single'
],
];
$actionsResult = [];
/** @var Post $row */
foreach ($actions as $row) {
$postDealer = $row->getDealer();
if (!$postDealer) {
continue;
}
if (!isset($routesByDealer[$postDealer->getId()])) {
continue;
}
$paramName = $routesByDealer[$postDealer->getId()]['key'];
$routeName = $routesByDealer[$postDealer->getId()]['name'];
$actionsResult[] = [
'item' => $row,
'url' => $this->router->generate($routeName, ["$paramName" => $row->getUrl()])
];
if (count($actionsResult) >= 3) {
break;
}
}
return $actionsResult;
}
public function index(Request $request): Response
{
return $this->baseMyRender('@My/Profile/index.html.twig', [
'actions' => $this->getActions(),
'genders' => \CoreBundle\Model\User::GENDERS[$request->getLocale()],
'user' => $this->getUser()
]);
}
public function confirmChangeEmail(Request $request, $userHash, $emailHash): Response
{
$success = false;
$email = '';
if ($this->userModel->initByHash($userHash)) {
$user = $this->userModel->getUser();
if ($emailHash == $user->getEmailHash()) {
/** @var UserEmailChange $userEmailChange [] */
$userEmailChange = $this->em->getRepository(UserEmailChange::class)->findBy(['user' => $user, 'hash' => $emailHash]);
if ($userEmailChange) {
$email = current($userEmailChange)->getEmail();
$success = true;
$user->setEmail($email);
$user->setEmailCanonical($email);
$this->em->flush();
}
}
}
return $this->baseMyRender('@My/Profile/confirm_email_change.html.twig', [
'success' => $success,
'email' => $email
]);
}
public function updateUser(Request $request): JsonResponse
{
$errors = [];
$response = ['success' => true];
/** @var User $User */
$User = $this->getUser();
if ($request->request->get('name')) {
$User->setName($request->request->get('name'));
} else {
$errors['name'] = true;
}
if ($request->request->get('last-name')) {
$User->setLastName($request->request->get('last-name'));
} else {
$errors['lastName'] = true;
}
if ($request->request->get('middle-name')) {
$User->setMiddleName($request->request->get('middle-name'));
} else {
$errors['middleName'] = true;
}
if ($request->request->get('birth-date'))
$User->setBirthDate(new DateTime($request->request->get('birth-date')));
//$User->setFullName($request->request->get('full-name'));
$User->setGender((int)$request->request->get('gender'));
$userInfo = $User->getInfo();
if (!$userInfo) {
$User->setInfo(new UserInfo());
}
$User->getInfo()->setCity($request->request->get('city'));
$error = $this->updateEmail($request);
if ($error) {
$response = ['success' => false, 'error' => $error];
}
$this->em->persist($User);
$this->em->persist($User->getInfo());
$this->em->flush();
return new JsonResponse($response);
}
public function updateEmail(Request $request, MailerInterface $mailer, UserManagerInterface $userManager): array
{
/** @var User $User */
$User = $this->getUser();
$email = $request->request->get('email');
if ($email && ($email != $User->getEmail())) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return ['email' => 'Некорректно введен email.'];
}
if ($userManager->findUserByEmail($email)) {
return ['email' => 'Данный email уже используется в системе. Укажите другой.'];
}
$userHash = md5($User->getId() . time() . 'vidisecrettertsalt1ws!@3');
$emailHash = md5($User->getId() . time() . 'emailconfirmsecrethash123et&!^');
$userEmailChange = new UserEmailChange();
$userEmailChange->setUser($User);
$userEmailChange->setHash($emailHash);
$userEmailChange->setEmail($email);
$this->em->persist($userEmailChange);
$User->setEmailHash($emailHash);
$User->setHash($userHash);
$mailBody = $this->baseMyRender('@My/Mail/confirm_change_email.html.twig', ['hash' => $emailHash, 'uHash' => $userHash, 'user' => $User])->getContent();
$message = (new Email())
->subject('Подтверждение изменения электронного адреса в программе лояльности')
->from(new Address('info@vidi.ua', 'Автодинастия'))
->html($mailBody)
->to($email);
$mailer->send($message);
$this->em->persist($User);
$this->em->flush();
}
return [];
}
public function aboutcar(): Response
{
$User = $this->getUser();
$this->userModel->initByEntity($User);
return $this->baseMyRender('@My/Profile/aboutcar.html.twig', [
'user' => $this->userModel,
'actions' => $this->getActions()
]);
}
public function car()
{
return $this->baseMyRender('@My/Profile/car.html.twig', [
'user' => $this->getUser(),
]);
}
public function carSingle(Request $request, ApiServer1C $apiServer1C)
{
$carId = $request->get('id');
$User = $this->getUser();
$this->userModel->initByEntity($User);
$Car = $this->userModel->getCarById($carId);
if (!$Car) {
return $this->createNotFoundException();
}
$serviceHistory = $apiServer1C->getUserCarHistory($Car->getVin(), $this->userModel->getPhone());
$history = [];
if ($serviceHistory['data']) {
foreach ($serviceHistory['data'] as $item) {
$history[] = [
'number' => $item['number'],
'date' => (new DateTime($item['date']))->format('d.m.Y'),
'millage' => $item['millage'],
'sum' => $item['sum'],
'parts' => $item['parts'] ?? [],
'works' => $item['works'] ?? [],
];
}
}
$history = $this->array_unique($history);
usort($history, fn($a, $b) => strtotime($a['date']) < strtotime($b['date']));
$availBrands = $this->em->getRepository(Brand::class)->getAvailBrandsInstanceName();
return $this->baseMyRender('@My/Profile/car-single.html.twig', [
'car' => $Car,
'history' => $history,
'availBrands' => $availBrands,
]);
}
private function array_unique($array): array
{
$temp_array = [];
$key_array = [];
$i = 0;
foreach ($array as $val) {
if (!in_array($val['number'], $key_array)) {
$key_array[$i] = $val['number'];
$temp_array[$i] = $val;
}
$i++;
}
return $temp_array;
}
public function message(): Response
{
$result = [];
$messages = $this->messages->getUserMessages();
$nowDate = new DateTime();
$yesterdayDate = new DateTime('-1 day');
foreach ($messages as $message) {
$key = $message['date'];
if ($key == $nowDate->format('d.m.Y')) {
$key = 'today';
}
if ($key == $yesterdayDate->format('d.m.Y')) {
$key = 'yesterday';
}
$result[$key][] = $message;
}
return $this->baseMyRender('@My/Profile/message.html.twig', [
'messages' => $result,
'actions' => $this->getActions()
]);
}
public function setIsRead(Request $request): JsonResponse
{
$id = $request->get('id');
$message = $this->em->getRepository(UserMessage::class)->find($id);
if ($message && $message->getUser()->getId() == $this->getUser()->getId()) {
$message->setIsRead(1);
$this->em->persist($message);
$this->em->flush($message);
}
return $this->json(['success' => true]);
}
public function insuranceLongation(Request $request)
{
$this->baseMyRender('@My/profile.html.twig');
}
public function orderService(Request $request, CoreFormFactory $coreFormFactory): Response
{
//TODO add params or what??
return $this->baseMyRender('@My/Profile/order-service.html.twig', [
'actions' => $this->getActions(),
'serviceForm' => $coreFormFactory->serviceForm(null, false)->createView(),
]);
}
public function orderServiceByParameters($hash, Request $request, CoreFormFactory $coreFormFactory): ?Response
{
$params = json_decode(base64_decode($hash));
return $this->baseMyRender('@My/Profile/order-service.html.twig', [
'params' => $params,
'actions' => $this->getActions(),
'serviceForm' => $coreFormFactory->serviceForm(null, false)->createView(),
]);
}
public function orderTestDrive(CoreFormFactory $coreFormFactory): Response
{
$tdForm = $coreFormFactory->testDriveForm();
return $this->baseMyRender('@My/Profile/order-test-drive.html.twig', [
'actions' => $this->getActions(),
'testDrivePageForm' => $tdForm->createView()
]);
}
public function insurance(): Response
{
$user = $this->getUser();
$cases = $this->em->getRepository(InsuranceCase::class)->findBy(['user' => $user]);
return $this->baseMyRender('@My/Profile/insurance.html.twig', [
'actions' => $this->getActions(),
'cases' => $cases,
]);
}
public function sendCaseToEmail(Request $request, $caseId, MailerInterface $mailer): JsonResponse
{
$case = $this->em->getRepository(InsuranceCase::class)->find($caseId);
if (!$case) {
throw new NotFoundHttpException();
}
$mailBody = $this->baseMyRender('@Insurance/Cabinet/stikcer.html.twig', ['case' => $case]);
$message = (new Email())
->subject('ВиДи Страхование - страховое дело')
->from(new Address('info@vidi.ua', 'Автодинастия'))
->html($mailBody)
->to($this->getUser()->getEmail());
try {
$mailer->send($message);
return $this->json(['success' => true]);
} catch (Exception $e) {
}
return $this->json(['success' => false]);
}
public function caseDetails($caseId): Response
{
$case = $this->em->getRepository(InsuranceCase::class)->find($caseId);
if (!$case) {
throw new NotFoundHttpException();
}
$count = 0;
foreach ($case->getDocuments() as $document) {
if (!$document->isReceived()) {
$count += 1;
}
}
return $this->baseMyRender('@My/Profile/insurance-details.html.twig', ['case' => $case, 'receivedCount' => $count]);
}
public function download(Request $request, $id): BinaryFileResponse
{
$User = $this->getUser();
$Case = $this->em->getRepository(InsuranceCase::class)->find($id);
if (!$Case || $Case->getState() < 2 || $Case->getUser()->getId() != $User->getId()) {
throw new NotFoundHttpException();
}
$filesDir = $this->getParameter('kernel.project_dir') . '/public/uploads/insurance';
$fullPath = $filesDir . '/' . $Case->getWMail();
if (!$Case->getWMail() || !file_exists($fullPath)) {
throw new NotFoundHttpException();
}
return $this->file($fullPath);
}
public function print(Request $request): BinaryFileResponse
{
$User = $this->getUser();
$id = $request->get('id');
$Case = $this->em->getRepository(InsuranceCase::class)->find($id);
if (!$Case || $Case->getUser()->getId() != $User->getId()) {
throw new NotFoundHttpException();
}
$filesDir = $this->container->getParameter('kernel.project_dir') . '/public/uploads/insurance';
$fullPath = $filesDir . '/' . $Case->getWMail();
if (!$Case->getWMail() || !file_exists($fullPath)) {
throw new NotFoundHttpException();
}
$response = new BinaryFileResponse($fullPath);
$response->headers->set('Content-Type', 'application/pdf');
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
$Case->getWMail()
);
return $response;
}
public function sticker(Request $request, $id): ?Response
{
$User = $this->getUser();
$Case = $this->em->getRepository(InsuranceCase::class)->find($id);
if (!$Case || ($Case->getUser()->getId() != $User->getId() && !$this->isGranted())) {
throw new NotFoundHttpException();
}
return $this->baseMyRender('@Insurance/Cabinet/stikcer.html.twig', [
'case' => $Case
]);
}
public function docAdd(Request $request): JsonResponse
{
$User = $this->getUser();
$id = $request->request->get('id');
$Case = $this->em->getRepository(InsuranceCase::class)->find($id);
if (!$Case || $Case->getState() < 2 || $Case->getUser()->getId() != $User->getId()) {
return new JsonResponse(['success' => false]);
}
$filesDir = $this->getParameter('kernel.project_dir') . '/public/uploads/insurance';
/** @var Up $file */
foreach ($request->files as $docId => $file) {
$Document = $this->em->getRepository(CaseDocument::class)->find($docId);
if (!$Document || $Document->getCase()->getUser()->getId() != $User->getId()) {
continue;
}
$fileName = md5(uniqid()) . '.' . $file->guessExtension();
$file->move($filesDir, $fileName);
$Document->setFile($fileName);
$Document->setState(InsuranceCase::DOC_STATE_NEW);
$this->em->persist($Document);
$this->em->flush($Document);
}
return new JsonResponse(['success' => true]);
}
public function downloadBlank(Request $request): BinaryFileResponse
{
$sample = $request->query->get('sample');
$fileName = $sample ? 'Зразок_заяви_страхового випадку_ВІДІ-СТРАХУВАННЯ.pdf' : 'Заява про настання страхового випадку_Новий_Бланк.pdf';
$dir = realpath($this->getParameter('kernel.project_dir') . '/public');
$fullPath = $dir . '/bundles/insurance/files/' . $fileName;
if (!file_exists($fullPath)) {
throw new NotFoundHttpException();
}
return $this->file($fullPath);
}
public function orders(Request $request, CartService $cartService): ?Response
{
$accessories = [];
$acquiringOrders = $this->em->getRepository(Order::class)->findBy(['user' => $this->getUser(), 'state' => 2]);
/** @var Order $acquiring */
foreach ($acquiringOrders as $acquiring) {
$accessories[$acquiring->getId()] = [
'price' => $acquiring->getOrder()->getOrderAmount(),
'title' => $acquiring->getId(),
'images' => [],
'dateCreate' => $acquiring->getDateCreate()->format('d.m.Y H:i'),
];
foreach ($acquiring->getOrder()->getOrderItem() as $item) {
$cartType = $cartService->getCartType($item->getType());
$dataItem = json_decode($item->getData());
$cart = $cartType->getCart($dataItem, $request->getLocale());
$accessories[$acquiring->getId()]['images'] = $cart['image'];
}
}
return $this->baseMyRender('@My/Profile/orders.html.twig', [
'actions' => $this->getActions(),
'accessories' => $accessories,
]);
}
public function calendar(Request $request): ?Response
{
return $this->baseMyRender('@My/Profile/calendar.html.twig', [
'actions' => $this->getActions(),
'currentYear' => date('Y'),
'currentMonth' => date('n'),
]);
}
public function onlineActivity(): ?Response
{
return $this->baseMyRender('@My/Profile/online-activity.html.twig', [
'actions' => $this->getActions(),
]);
}
public function support(Request $request, RouterInterface $router, CoreFormFactory $factory): ?Response
{
return $this->baseMyRender('@My/Profile/support.html.twig', [
'actions' => $this->getActions(),
'privacyUrl' => $router->generate('portal_privacy_policy'),
'supportForm' => $factory
->supportForm(null, $request->getLocale(), true)
->createView()
]);
}
public function wishList(Request $request, RouterInterface $router, AccessoryService $accessoryService): ?Response
{
$result = $accessoryService->getListFavoritesAccessory($this->getUser());
return $this->baseMyRender('@My/Profile/wish-list.html.twig', [
'result' => $result,
'actions' => $this->getActions(),
'catalogUrl' => $router->generate('portal_new_catalog_b', ['state' => 'new', 'type' => 'car', 'brand' => 'all']),
]);
}
public function insCalc(EstimateCaptcha $estimateCaptcha): ?Response
{
return $this->baseMyRender('@My/Profile/ins-calc.html.twig', [
'baseType' => Program::BASE_COEFFICIENT_TYPE,
'listType' => Program::LIST_COEFFICIENT_TYPE,
'optionType' => Program::OPTION_COEFFICIENT_TYPE,
'token' => $estimateCaptcha->generateToken(),
]);
}
public function insCalcByCar(Request $request, EstimateCaptcha $estimateCaptcha)
{
$carId = $request->get('id');
$User = $this->getUser();
$this->userModel->initByEntity($User);
$Car = $this->userModel->getCarById($carId);
if (!$Car) {
return $this->createNotFoundException();
}
return $this->baseMyRender('@My/Profile/ins-calc-by-car.html.twig', [
'car' => $Car,
'baseType' => Program::BASE_COEFFICIENT_TYPE,
'listType' => Program::LIST_COEFFICIENT_TYPE,
'optionType' => Program::OPTION_COEFFICIENT_TYPE,
'token' => $estimateCaptcha->generateToken(),
]);
}
public function documents()
{
$UserSigns = $this->em
->getRepository(UserSigns::class)->findBy(['user' => $this->getUser()]);
$UserSignsRequest = $this->em
->getRepository(UserSignRequest::class)->findBy(['user' => $this->getUser()]);
$userSignClose = [];
$userSignOpen = [];
foreach ($UserSignsRequest as $userSignRequest) {
$isSearched = false;
foreach ($UserSigns as $userSign) {
if ($userSignRequest->getSignCode() === $userSign->getSignCode()) {
$userSignClose[] = $userSign;
$isSearched = true;
break;
}
}
if (!$isSearched) {
$userSignOpen[] = $userSignRequest;
}
}
return $this->baseMyRender('@My/Profile/documents.html.twig', [
'actions' => $this->getActions(),
'signsOpen' => $userSignOpen,
'signsClose' => $userSignClose,
]);
}
public function orderParts(): ?Response
{
return $this->baseMyRender('@My/Profile/order-parts.html.twig');
}
public function tradeIn(): ?Response
{
return $this->baseMyRender('@My/Profile/trade-in.html.twig');
}
public function insuranceNew(): ?Response
{
return $this->baseMyRender('@My/Insurance/index.html.twig');
}
public function quality(Request $request, ApiServer1C $apiServer1C): ?Response
{
$type = $request->get('type');
$dealer = $request->get('dealer');
$documentId = $request->get('document');
/** @var Dealer $dealer */
$dealer = $this->em->getRepository(Dealer::class)->findOneBy(['uid_1c' => $dealer]);
if (!$dealer) {
throw $this->createNotFoundException();
}
try {
$documentData = $apiServer1C->getDocumentInfo($type, $documentId, $dealer);
} catch (Exception $e) {
$documentData = false;
}
if (!$documentData) {
$documentData = [
"Date" => false,
"Number" => false,
"Customer" => false
];
}
$documentData['id'] = $documentId;
return $this->baseMyRender(
'@My/Profile/quality.html.twig',
['data' => $documentData, 'type' => $type, 'dealer' => $dealer]
);
}
public function sendSmsCode(Request $request, SmsSender $smsSender, InfobipSmsSender $infobipSmsSender): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
$phone = $this->formatPhone($request->get('new-phone'));
if (!$phone) {
return new JsonResponse(['success' => false, 'error' => 'Phone does not correct formatted']);
}
$userPhones = $user->getInfo()->getPhones();
foreach ($userPhones as $userPhone) {
if ($userPhone === $phone) {
return new JsonResponse(['success' => false, 'error' => 'This phone already exists']);
}
}
$permitted_chars = '0123456789';
$smscode = strtoupper(substr(str_shuffle($permitted_chars), 0, 6));
$smsSender->setAccount(SmsSender::LOYALTY_ACCOUNT)->sendSms($phone, $smscode);
$infobipSmsSender->sendSms($phone, $smscode);
$user->getInfo()->setConfirmCode($smscode);
$user->getInfo()->setSmsCount($user->getInfo()->getSmsCount() + 1);
$this->em->persist($user->getInfo());
$this->em->flush();
return new JsonResponse(['success' => true]);
}
public function confirmSmsCode(Request $request): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
$requestPhone = $this->formatPhone($request->get('confirm-phone'));
if (!$requestPhone) {
return new JsonResponse(['success' => false, 'error' => 'Некоректно введений телефон']);
}
$smsCode = $user->getInfo()->getConfirmCode();
if (!$smsCode || $smsCode !== (int)$request->get('sms-code')) {
return new JsonResponse(['success' => false, 'error' => 'Не вірно введений код']);
}
$user->getInfo()->setPhones(array_merge($user->getInfo()->getPhones(), [$user->getPhone()]));
$user->getInfo()->setConfirmCode(null);
$user->setPhone($requestPhone);
$this->em->persist($user);
$this->em->persist($user->getInfo());
$this->em->flush();
return new JsonResponse(['success' => true]);
}
public function setMainPhone(Request $request): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
$requestPhone = $this->formatPhone($request->get('personal-phone'));
$userPhones = $user->getInfo()->getPhones();
if (array_search($requestPhone, $userPhones) !== false) {
unset($userPhones[array_search($requestPhone, $userPhones)]);
} else {
return new JsonResponse(['success' => false]);
}
array_push($userPhones, $user->getPhone());
$user->getInfo()->setPhones(array_values($userPhones));
$user->setPhone($requestPhone);
$this->em->persist($user);
$this->em->persist($user->getInfo());
$this->em->flush();
return new JsonResponse(['success' => true]);
}
public function deletePhone(Request $request): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
$requestPhone = $this->formatPhone($request->get('delete-phone'));
$userPhones = $user->getInfo()->getPhones();
if (array_search($requestPhone, $userPhones) !== false) {
unset($userPhones[array_search($requestPhone, $userPhones)]);
$user->getInfo()->setPhones(array_values($userPhones));
$this->em->persist($user->getInfo());
$this->em->flush();
return new JsonResponse(['success' => true]);
}
return new JsonResponse(['success' => false]);
}
public function formatPhone($phone)
{
$phone = preg_replace("/[^0-9]/", '', $phone);
if (strlen($phone) >= 10) {
return substr($phone, -10);
}
return false;
}
public function auction(): ?Response
{
return $this->baseMyRender('@My/Auction/auction.html.twig');
}
public function auctionSingle(): ?Response
{
return $this->baseMyRender('@My/Auction/auction-single.html.twig');
}
public function referral(Request $request): ?Response
{
$referrals = $this->em
->getRepository(UserReferral::class)->findBy(['owner_user' => $this->getUser()]);
return $this->baseMyRender('@My/Profile/referral.html.twig', compact('referrals'));
}
public function referralSend(
Request $request,
StringGenerator $stringGenerator,
AuthDataValidator $validator,
UserEntityFactory $userEntityFactory,
LoggerInterface $logger,
ReferralDataDTOFactory $referralDataDTOFactory,
RouterInterface $router,
InfobipSmsSender $infobipSmsSender
): JsonResponse
{
if (!$User = $this->getUser()) {
return new JsonResponse(['success' => false, 'error' => 'Операцію заборонено, користувач не знайдено']);
}
$data = $request->request->all();
try {
$validator->validateForReferral($data);
} catch (DataNotValidException $e) {
$logger->error($e->getMessage(), $data);
return new JsonResponse(['success' => false, 'error' => $e->getMessage()]);
}
$referralDataDTO = $referralDataDTOFactory->createReferralDTO($data);
if (
$this->em
->getRepository(User::class)
->checkUsersByParams(['phone' => $referralDataDTO->phone])
) {
return new JsonResponse([
'success' => false,
'error' => 'Користувач із таким номером телефону вже зареєстрований'
]
);
}
$usersReferral = $this->em->getRepository(UserReferral::class);
do {
$promoCode = $stringGenerator->generateUpperCaseAndNumbers();
} while ($usersReferral->findOneBy(['promo_code' => $promoCode]));
$referralDataDTO->promoCode = $promoCode;
$referralDataDTO->user = $User;
$newUser = $userEntityFactory->createNotActivatedUserWithoutMail($referralDataDTO);
if ($newUser) {
$referralLink =
$router->generate(
'my_user_referral',
['promoCode' => $promoCode],
UrlGeneratorInterface::ABSOLUTE_URL
);
$message = 'Запрошення в особистий кабінет VIDI. Для завершення реєстрації перейдіть за посиланням: ' .
$referralLink;
$infobipSmsSender->sendSms($referralDataDTO->phone, $message);
$userReferral = $userEntityFactory->createUserReferral($referralDataDTO);
$this->em->persist($userReferral);
$this->em->flush();
return new JsonResponse(['success' => true]);
}
return new JsonResponse(['success' => false, 'error' => 'Поле "Прізвище" обов\'язкове до заповнення']);
}
public function referralRegister($promoCode)
{
$ReferralUser = $this->em
->getRepository(UserReferral::class)
->findOneBy(['promo_code' => $promoCode]);
$OwnerUser = $ReferralUser->getOwnerUser();
return $this->baseMyRender('@My/Modules/user-referral.html.twig', [
'OwnerUser' => $OwnerUser,
'ReferralUser' => $ReferralUser,
]);
}
}