src/Controller/IndexController.php line 422

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Answer;
  4. use App\Entity\Article;
  5. use App\Entity\ArticleHistory;
  6. use App\Entity\Question;
  7. use App\Entity\QuestionnaireResult;
  8. use App\Entity\Survey;
  9. use App\Entity\Transaction;
  10. use App\Entity\User;
  11. use App\Exception\UserBannedException;
  12. use App\Message\PaymentMessage;
  13. use App\Repository\QuestionnaireResultRepository;
  14. use App\Service\PaymentService;
  15. use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
  16. use GuzzleHttp\Client;
  17. use GuzzleHttp\Exception\GuzzleException;
  18. use Symfony\Component\HttpClient\HttpClient;
  19. use Symfony\Component\HttpFoundation\File\UploadedFile;
  20. use Symfony\Component\HttpFoundation\RedirectResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Exception;
  26. use Symfony\Component\String\Slugger\SluggerInterface;
  27. class IndexController extends AbstractController
  28. {
  29.     /**
  30.      * @var PaymentService
  31.      */
  32.     protected PaymentService $payment;
  33.     private SluggerInterface $slugger;
  34.     public function __construct(
  35.         PaymentService $payment,
  36.         SluggerInterface $slugger
  37.     ) {
  38.         $this->payment $payment;
  39.         $this->slugger $slugger;
  40.     }
  41.     private function normalizePhone(string $phone): string
  42.     {
  43.         $phone preg_replace('/\D+/'''$phone);
  44.         if (str_starts_with($phone'0')) {
  45.             $phone '996' substr($phone1);
  46.         } elseif (!str_starts_with($phone'996')) {
  47.             $phone '996' $phone;
  48.         }
  49.         return $phone;
  50.     }
  51.     public function getUserRequest(Request $request)
  52.     {
  53.             $em $this->getDoctrine()->getManager();
  54.             $data json_decode($request->getContent(), true);
  55.             $telegramId $data["telegramId"] ?? null;
  56.             $phoneInput $data["phone"] ?? null;
  57.             $isBanned false;
  58.             $user null;
  59.             if ($telegramId) {
  60.                 $user $em->getRepository(User::class)->findOneBy([
  61.                     "telegramId" => $telegramId
  62.                 ]);
  63.             }
  64.             if (!$user && $phoneInput) {
  65.                 $digits preg_replace('/\D+/'''$phoneInput);
  66.                 if (str_starts_with($digits'996')) {
  67.                     $phone trim($digits'996');
  68.                 } else {
  69.                     if ($digits !== '' && $digits[0] === '0') {
  70.                         $digits substr($digits1);
  71.                     }
  72.                     $phone $digits;
  73.                 }
  74.                 $users $em->getRepository(User::class)->createQueryBuilder('user')
  75.                     ->where("user.phone LIKE :phone")
  76.                     ->setParameter('phone''%'.$phone.'%')
  77.                     ->getQuery()->getResult()
  78.                 ;
  79.                 if (!empty($users)){
  80.                     foreach ($users as $user){
  81.                         if ($user->isBanned()){
  82.                             $isBanned true;
  83.                         }
  84.                     }
  85.                     $user $users[0];
  86.                 }else{
  87.                     $user false;
  88.                 }
  89.             }
  90.             if ($user and ($user->isBanned() or $isBanned)){
  91.                 throw new UserBannedException('banned');
  92.             }
  93.             return $user;
  94.     }
  95.     /**
  96.      * @Route("/gti/user/create", methods={"POST"})
  97.      */
  98.     public function createUser(Request $request): Response
  99.     {
  100.         try {
  101.             $em $this->getDoctrine()->getManager();
  102.             $data json_decode($request->getContent(), true);
  103.             $user $this->getUserRequest($request);
  104.             if ($user){
  105.                 return $this->json(['success' => false'massage' => 'User exist']);
  106.             }
  107.             $digits preg_replace('/\D+/'''$data["phone"]);
  108.             if (str_starts_with($digits'996')) {
  109.                 $phone $digits;
  110.             } else {
  111.                 if ($digits !== '' && $digits[0] === '0') {
  112.                     $digits substr($digits1);
  113.                 }
  114.                 $phone '996' $digits;
  115.             }
  116.             $user = new User();
  117.             $user->setCreateAt(new \DateTimeImmutable());
  118.             $user->setName($data["name"]??null);
  119.             $user->setPhone($phone);
  120.             $user->setCity($data["city"]??null);
  121.             $user->setTelegramId($data["telegramId"]);
  122.             $user->setBrandsHistory($data["brand"]??null);
  123.             $em->persist($user);
  124.             $em->flush();
  125.         }catch (\Error $error){
  126.             return $this->json(['success' => false'massage' => 'error']);
  127.         }
  128.         return $this->json(['success' => true'massage' => 'success']);
  129.     }
  130.     /**
  131.      * @Route("/gti/user", methods={"PATCH"})
  132.      */
  133.     public function updateUser(Request $request): Response
  134.     {
  135.         try {
  136.             $em $this->getDoctrine()->getManager();
  137.             $data json_decode($request->getContent(), true);
  138.             $user $this->getUserRequest($request);
  139.             if (!$user){
  140.                 return $this->json(['success' => false'massage' => 'User not exist']);
  141.             }
  142.             if (isset($data["phone"]) and $phone $data["phone"]){
  143.                 $user->setCity($phone);
  144.             }
  145.             if (isset($data["city"]) and $city $data["city"]){
  146.                 $user->setCity($city);
  147.             }
  148.             if (isset($data["brand"]) and $newBrand $data["brand"]){
  149.                 $currentHistory $user->getBrandsHistory();
  150.                 $brands array_filter(array_map('trim'explode(','$currentHistory ?: '')));
  151.                 if (!in_array($newBrand$brandstrue)) {
  152.                     $brands[] = $newBrand;
  153.                 }
  154.                 $user->setBrandsHistory(implode(','$brands));
  155.             }
  156.             $em->persist($user);
  157.             $em->flush();
  158.         }catch (\Error $error){
  159.             return $this->json(['success' => false'massage' => 'error']);
  160.         }
  161.         return $this->json(['success' => true'massage' => 'success']);
  162.     }
  163.     /**
  164.      * @Route("/gti/user/check-exist", methods={"POST"})
  165.      */
  166.     public function checkExistUser(Request $request): Response
  167.     {
  168.         try {
  169.             $user $this->getUserRequest($request);
  170.             if ($user){
  171.                 return $this->json(['success' => true'massage' => 'User exist']);
  172.             }
  173.             return $this->json(['success' => false'massage' => 'User not exist']);
  174.         }catch (\Error $error){
  175.             return $this->json(['success' => false'massage' => 'error']);
  176.         }
  177.     }
  178.     /**
  179.      * @Route("/gti/user/check-admin", methods={"GET"})
  180.      */
  181.     public function checkAdminUser(Request $request): Response
  182.     {
  183.         try {
  184.             $user $this->getUserRequest($request);
  185.             if (!$user){
  186.                 return $this->json(['success' => false'massage' => 'User not exist']);
  187.             }elseif ($user and $user->isIsAdmin()){
  188.                 return $this->json(['success' => true'massage' => 'User is admin']);
  189.             }
  190.             return $this->json(['success' => false'massage' => 'User is not admin']);
  191.         }catch (\Error $error){
  192.             return $this->json(['success' => false'massage' => 'error']);
  193.         }
  194.     }
  195.     /**
  196.      * @Route("/gti/user/chats", methods={"GET"})
  197.      */
  198.     public function getUserChats(Request $request): Response
  199.     {
  200.         try {
  201.             $em $this->getDoctrine()->getManager();
  202.             $users $em->getRepositoryUser::class )->getAllTelegramId();
  203.             $telegramIds array_map(function ($entry) {
  204.                 return $entry['telegramId'];
  205.             }, $users);
  206.             return $this->json(['success' => true'massage' => 'success''data' => $telegramIds]);
  207.         }catch (\Error $error){
  208.             return $this->json(['success' => false'massage' => 'error']);
  209.         }
  210.     }
  211.     /**
  212.      * @Route("/gti/survey", methods={"GET"})
  213.      */
  214.     public function getSurvey(Request $request): Response
  215.     {
  216.         $survey_images $this->getParameter('IMAGE_URL').'/survey_images/';
  217.         $question_images $this->getParameter('IMAGE_URL').'/question_images/';
  218.         try {
  219.             $em $this->getDoctrine()->getManager();
  220.             $data json_decode($request->getContent(), true);
  221.             $lang $data['lang'] ?? 'ru';
  222.             $user $this->getUserRequest($request);
  223.             if (!$user) {
  224.                 return $this->json(['success' => false'message' => 'User not found']);
  225.             }
  226.             $completedSurveys $em->getRepository(QuestionnaireResult::class)
  227.                 ->createQueryBuilder('qr')
  228.                 ->select('IDENTITY(qr.survey)')
  229.                 ->where('qr.user = :user')
  230.                 ->andWhere('qr.completed = true')
  231.                 ->setParameter('user'$user)
  232.                 ->distinct()
  233.                 ->getQuery()
  234.                 ->getScalarResult();
  235.             $completedSurveyIds array_map(fn($item) => current($item), $completedSurveys);
  236.             $surveys $em->getRepository(Survey::class)->createQueryBuilder('s')
  237.                 ->where('s.isActive = 1')
  238.                 ->andWhere('s.id NOT IN (:completed)')
  239.                 ->setParameter('completed'$completedSurveyIds ?: [0])
  240.                 ->getQuery()
  241.                 ->getResult();
  242.             $dataResult = [];
  243.             foreach ($surveys as $survey) {
  244.                 $images = [];
  245.                 foreach ($survey->getImages() as $image) {
  246.                     if ($lang === 'kg') {
  247.                         if ($image->isKg()) {
  248.                             $images[] = $survey_images.$image->getImageName();
  249.                         }
  250.                     } else {
  251.                         if (!$image->isKg()) {
  252.                             $images[] = $survey_images.$image->getImageName();
  253.                         }
  254.                     }
  255.                 }
  256.                 if ($lang === 'kg' && empty($images)) {
  257.                     foreach ($survey->getImages() as $image) {
  258.                         if (!$image->isKg()) {
  259.                             $images[] = $survey_images.$image->getImageName();
  260.                         }
  261.                     }
  262.                 }
  263.                 $questions = [];
  264.                 foreach ($survey->getQuestions() as $question) {
  265.                     $answers = [];
  266.                     $questionnaireResult $em->getRepositoryQuestionnaireResult::class )->findOneBy([
  267.                         "question"  => $question->getId(),
  268.                         'user'      => $user->getId()
  269.                     ]);
  270.                     if (!$questionnaireResult){
  271.                         foreach ($question->getAnswers() as $answer) {
  272.                             $answers[] = [
  273.                                 "id" => $answer->getId(),
  274.                                 "title" => $lang == 'kg' $answer->getTextLocal() ?? $answer->getText() : $answer->getText(),
  275.                                 "isEndSurvey" => $answer->isEndSurvey(),
  276.                                 "isCorrect" => $answer->isCorrect()
  277.                             ];
  278.                         }
  279.                         $imagesQes = [];
  280.                         foreach ($question->getImages() as $imageQue) {
  281.                             if ($lang === 'kg') {
  282.                                 if ($imageQue->isKg()) {
  283.                                     $imagesQes[] = $question_images.$imageQue->getImageName();
  284.                                 }
  285.                             } else {
  286.                                 if (!$imageQue->isKg()) {
  287.                                     $imagesQes[] = $question_images.$imageQue->getImageName();
  288.                                 }
  289.                             }
  290.                         }
  291.                         if ($lang === 'kg' && empty($imagesQes)) {
  292.                             foreach ($question->getImages() as $imageQue) {
  293.                                 if (!$imageQue->isKg()) {
  294.                                     $imagesQes[] = $question_images.$imageQue->getImageName();
  295.                                 }
  296.                             }
  297.                         }
  298.                         $questions[] = [
  299.                             "id" => $question->getId(),
  300.                             "title" => $lang == 'kg' $question->getTextLocal() ?? $question->getText() : $question->getText(),
  301.                             "type" => $question->getType(),
  302.                             "answers" => $answers,
  303.                             "images" => $imagesQes,
  304.                         ];
  305.                     }
  306.                 }
  307.                 $title $survey->getTitle();
  308.                 $description $survey->getDescription();
  309.                 if ($lang == 'kg'){
  310.                     $title $survey->getTitleLocal() ?? $title;
  311.                     $description $survey->getDescriptionLocal() ?? $description;
  312.                 }
  313.                 $dataResult[] = [
  314.                     "id" => $survey->getId(),
  315.                     "isPoll" => $survey->isPoll(),
  316.                     "title" => $title ,
  317.                     "description" => $description,
  318.                     "images" => $images,
  319.                     "questions" => $questions
  320.                 ];
  321.             }
  322.             return $this->json(['success' => true'massage' => 'success''data' => $dataResult]);
  323.         }catch (\Error $error){
  324.             return $this->json(['success' => false'massage' => 'error']);
  325.         }
  326.     }
  327.     private function handleImageUpload($imageDataSluggerInterface $sluggerstring $uploadDir): string
  328.     {
  329.         // Декодируем base64 или обрабатываем URL
  330.         if (preg_match('/^data:image\/(\w+);base64,/'$imageData$matches)) {
  331.             $data substr($imageDatastrpos($imageData',') + 1);
  332.             $extension $matches[1] ?? 'png';
  333.             $imageData base64_decode($data);
  334.             $fileName uniqid().'.'.$extension;
  335.             file_put_contents($uploadDir.'/'.$fileName$imageData);
  336.         }
  337.         // Если это URL
  338.         elseif (filter_var($imageDataFILTER_VALIDATE_URL)) {
  339.             $fileContent file_get_contents($imageData);
  340.             $extension pathinfo(parse_url($imageDataPHP_URL_PATH), PATHINFO_EXTENSION) ?: 'jpg';
  341.             $fileName uniqid().'.'.$extension;
  342.             file_put_contents($uploadDir.'/'.$fileName$fileContent);
  343.         }
  344.         // Если это UploadedFile (например, из формы)
  345.         elseif ($imageData instanceof UploadedFile) {
  346.             $originalFilename pathinfo($imageData->getClientOriginalName(), PATHINFO_FILENAME);
  347.             $safeFilename $slugger->slug($originalFilename);
  348.             $fileName $safeFilename.'-'.uniqid().'.'.$imageData->guessExtension();
  349.             $imageData->move($uploadDir$fileName);
  350.         } else {
  351.             throw new \InvalidArgumentException('Invalid image data');
  352.         }
  353.         return '/uploads/images/'.$fileName;
  354.     }
  355.     /**
  356.      * @Route("/gti/answer", methods={"POST"})
  357.      */
  358.     public function answer(Request $request): Response
  359.     {
  360.         try {
  361.             $data json_decode($request->getContent(), true);
  362.             $user $this->getUserRequest($request);
  363.             if (!$user){
  364.                 return $this->json(['success' => false'massage' => 'User not found']);
  365.             }
  366.             if (is_array($data["answerId"])){
  367.                 foreach ($data["answerId"] as $answerId){
  368.                     if($result $this->setAnswer($data$answerId$user)){
  369.                         return $result;
  370.                     }
  371.                 }
  372.             }else{
  373.                 if($result $this->setAnswer($data$data["answerId"], $user)){
  374.                     return $result;
  375.                 }
  376.             }
  377.         }catch (\Error $error){
  378.             return $this->json(['success' => false'massage' => 'error']);
  379.         }
  380.         return $this->json(['success' => true'massage' => 'success']);
  381.     }
  382.     function setAnswer($data$answerId$user){
  383.         $em $this->getDoctrine()->getManager();
  384.         $answerId $em->getRepositoryAnswer::class )->findOneBy([
  385.             "id"      =>  $answerId
  386.         ]);
  387.         if (!$answerId){
  388.             return $this->json(['success' => false'massage' => 'answerId not found']);
  389.         }
  390.         $questionnaireResult $em->getRepositoryQuestionnaireResult::class )->findOneBy([
  391.             "answer"  => $answerId->getId(),
  392.             'user'    => $user->getId()
  393.         ]);
  394.         if ($questionnaireResult and $answerId->isEndSurvey()){
  395.             return $this->json(['success' => false'massage' => 'This question has already been answered']);
  396.         }
  397.         $question $answerId->getQuestion();
  398.         $survey   $question->getSurvey();
  399.         $result $data["result"];
  400.         if ($question->getType() == 'img'){
  401.             $uploadDir $this->getParameter('kernel.project_dir').'/public/uploads/images';
  402.             if (!file_exists($uploadDir)) {
  403.                 mkdir($uploadDir0777true);
  404.             }
  405.             try {
  406.                 $result $this->handleImageUpload($result$this->slugger$uploadDir);
  407.             } catch (\Exception $e) {
  408.                 $result $data["result"];
  409.             }
  410.         }
  411.         $answer = new QuestionnaireResult();
  412.         $answer->setCreateAt(new \DateTimeImmutable());
  413.         $answer->setResult($result);
  414.         $answer->setSurvey($survey);
  415.         $answer->setQuestion($question);
  416.         $answer->setAnswer($answerId);
  417.         $answer->setUser($user);
  418.         if ($answerId->isEndSurvey()){
  419.             $answer->setCompleted(true);
  420.         }
  421.         $em->persist($answer);
  422.         $em->flush();
  423.         if ($answerId->isEndSurvey()){
  424.             $em $this->getDoctrine()->getManager();
  425.             /** @var QuestionnaireResultRepository $qrRepo */
  426.             $qrRepo        $em->getRepository(QuestionnaireResult::class);
  427.             $correctCount  $qrRepo->countCorrectByUserAndSurvey($user$answerId->getQuestion()->getSurvey());
  428.             $totalQuestions$survey->getTotalCorrect();
  429.             if (!$totalQuestions){
  430.                 $totalQuestions$survey->getQuestions()->count();
  431.             }
  432.             if ($correctCount >= $totalQuestions) {
  433.                 $this->sendArticle($survey->getArticleSuccess(), $user);
  434.                 if ($question->isAddBalance()){
  435.                     $this->addBalance($user);
  436.                 }
  437.             }else{
  438.                 $this->sendArticle($survey->getArticleFailed(), $user);
  439.             }
  440.             if ($survey->getType() == Survey::TYPE_SCORE){
  441.                 $totalScore $qrRepo->getTotalScore($user$answerId->getQuestion()->getSurvey());
  442.                 foreach ($survey->getArticles() as $article){
  443.                     if ($article->getScoreFrom() <= $totalScore and $article->getScoreTo() >= $totalScore){
  444.                         $this->sendArticle($article$user);
  445.                         break;
  446.                     }
  447.                 }
  448.             }
  449.         }
  450.         return false;
  451.     }
  452.     /**
  453.      * @Route("/gti/test/uploade", methods={"POST"})
  454.      */
  455.     public function testUpload(Request $request): Response
  456.     {
  457.         $data json_decode($request->getContent(), true);
  458.         $result $data["result"];
  459.         $uploadDir $this->getParameter('kernel.project_dir').'/public/uploads/images';
  460.         // Создаем директорию, если не существует
  461.         if (!file_exists($uploadDir)) {
  462.             mkdir($uploadDir0777true);
  463.         }
  464.         try {
  465.             $result $this->handleImageUpload($result$this->slugger$uploadDir);
  466.         } catch (\Exception $e) {
  467.             $result $data["result"];
  468.         }
  469.         return $this->json(['success' => true'massage' => $result]);
  470.     }
  471.     public function sendArticle(?Article $articleUser $user)
  472.     {
  473.         if ($article){
  474.             $tgBotUrl $this->getParameter('TG_BOT_TOKEN');
  475.             $client = new Client(['verify' => false]);
  476.             $articleImages $this->getParameter('IMAGE_URL').'/article_images/'.$article->getImageName();
  477.             $em $this->getDoctrine()->getManager();
  478.             try {
  479.                 if ($article->getImageName()) {
  480.                     $photoParams = [
  481.                         'chat_id' => $user->getTelegramId(),
  482.                         'photo'   => $articleImages,
  483.                         'caption' => $article->getDescription(),
  484.                     ];
  485.                     $response $client->get($tgBotUrl.'sendPhoto', ['query' => $photoParams]);
  486.                 } else {
  487.                     $messageParams = [
  488.                         'chat_id' => $user->getTelegramId(),
  489.                         'text'    => $article->getDescription(),
  490.                     ];
  491.                     $response $client->get($tgBotUrl.'sendMessage', ['query' => $messageParams]);
  492.                 }
  493.                 $articleHistory = new ArticleHistory();
  494.                 $articleHistory->setUser($user);
  495.                 $articleHistory->setArticle($article);
  496.                 $articleHistory->setMessageId(json_decode($response->getBody()->getContents(), true)['result']['message_id']);
  497.                 $em->persist($articleHistory);
  498.                 $em->flush();
  499.             } catch (GuzzleException $e) {}
  500.         }
  501.     }
  502.     /**
  503.      * @Route("/gti/answer-all/old", methods={"POST"})
  504.      */
  505.     public function answerAll(Request $request): Response
  506.     {
  507.         try {
  508.             $em $this->getDoctrine()->getManager();
  509.             $data json_decode($request->getContent(), true);
  510.             $user $em->getRepositoryUser::class )->findOneBy([
  511.                 "telegramId"      =>  $data["telegramId"]
  512.             ]);
  513.             if (!$user){
  514.                 return $this->json(['success' => false'massage' => 'User not found']);
  515.             }
  516.             foreach ($data["data"] as $result){
  517.                 $answer = new QuestionnaireResult();
  518.                 $answer->setCreateAt(new \DateTimeImmutable());
  519.                 $answer->setResult($result["result"]);
  520.                 $answer->setUser($user);
  521.                 $em->persist($answer);
  522.                 $em->flush();
  523.             }
  524.         }catch (\Error $error){
  525.             return $this->json(['success' => false'massage' => 'error']);
  526.         }
  527.         return $this->json(['success' => true'massage' => 'success']);
  528.     }
  529.     /**
  530.      * @Route("/gti/balance/test/add", methods={"POST"})
  531.      */
  532.     public function addBalanceTest(Request $request): Response
  533.     {
  534.         try {
  535.             $em $this->getDoctrine()->getManager();
  536.             $phones = [
  537.             ];
  538.             foreach ($phones as $phone){
  539.                 $user $em->getRepositoryUser::class )->findOneBy([
  540.                     "phone"      =>  $phone
  541.                 ]);
  542.                 if ($user){
  543.                     $this->addBalanceOld($user);
  544.                 }
  545.             }
  546.         }catch (\Error $error){
  547.             return $this->json(['success' => false'massage' => $error]);
  548.         }
  549.         return $this->json(['success' => true'massage' => 'success']);
  550.     }
  551.     public function addBalanceOld($user): bool
  552.     {
  553.         $balanceAmount $this->getParameter('BALANCE_AMOUNT') ?? 1;
  554.         $em $this->getDoctrine()->getManager();
  555.         try {
  556.             $transaction = new Transaction();
  557.             $transaction
  558.                 ->setUser($user)
  559.                 ->setAmount($balanceAmount);
  560.             $em->persist($transaction);
  561.             $em->flush();
  562.             $this->payment->makePayment($transaction);
  563.             $em->flush();
  564.         }catch (\Exception $d){}
  565.         return true;
  566.     }
  567.     public function addBalance($user): bool
  568.     {
  569.         $balanceAmount $this->getParameter('BALANCE_AMOUNT') ?? 1;
  570.         $em $this->getDoctrine()->getManager();
  571.         $transaction = new Transaction();
  572.         $transaction
  573.             ->setUser($user)
  574.             ->setAmount($balanceAmount);
  575.         $em->persist($transaction);
  576.         $em->flush();
  577.         $client HttpClient::create();
  578.         try {
  579.             $client->request("POST"$this->getParameter('SITE_URL')."gti/balance/add/".$transaction->getId(), [
  580.                 'buffer' => false,
  581.                 'timeout' => 0.1
  582.             ]);
  583.         }catch (Exception $exception){}
  584.         return true;
  585.     }
  586.     /**
  587.      * @Route("/gti/balance/add/{id}", methods={"POST"}, name="addBalancePending")
  588.      */
  589.     public function addBalancePending(Request $request$id)
  590.     {
  591.         $em $this->getDoctrine()->getManager();
  592.         $transaction $em->getRepository(Transaction::class)->find($id);
  593.         if ($transaction and $transaction->getStatus() == Transaction::STATUS_PENDING) {
  594.             $this->payment->makePayment($transaction);
  595.             $em->flush();
  596.         }
  597.     }
  598. }