src/Controller/Front/CourseController.php line 1534

Open in your IDE?
  1. <?php
  2. /*
  3.  * Unauthorized copying of this file, via any medium is strictly prohibited
  4.  * Proprietary and confidential.
  5.  *
  6.  * @author Bilel AZRI          <azri.bilel@gmail.com>
  7.  * @author Assma BEN SASSI     <bensassiasma.bws@gmail.com>
  8.  *
  9.  * Bicking man (c) 2019-present.
  10.  */
  11. declare(strict_types=1);
  12. namespace App\Controller\Front;
  13. use _HumbugBox373c0874430e\Symfony\Component\Finder\Exception\AccessDeniedException;
  14. use App\Entity\Course\Course;
  15. use App\Entity\Course\CourseUserSubscription;
  16. use App\Entity\Course\CourseUserTransfert;
  17. use App\Entity\Document\Document;
  18. use App\Entity\Facture\Facture;
  19. use App\Entity\Document\DocumentModel;
  20. use App\Enum\DocumentStatusEnum;
  21. use App\Enum\DocumentModelTypeEnum;
  22. use App\Entity\User\User;
  23. use App\Enum\CourseUserSubscriptionCategoryEnum;
  24. use App\Enum\CourseUserSubscriptionPaymentStatusEnum;
  25. use App\Enum\DocumentTypeEnum;
  26. use App\Form\Front\Course\CourseUserSubscriptionType;
  27. use App\Form\Front\Course\CourseUserTransfertType;
  28. use App\Form\Front\Course\CourseUserInvitationType;
  29. use App\Form\Front\Course\DocumentType;
  30. use App\Repository\Course\CourseRepository;
  31. use App\Repository\Course\CourseUserSubscriptionRepository;
  32. use App\Repository\Course\CourseUserTransfertRepository;
  33. use App\Repository\Document\DocumentRepository;
  34. use App\Repository\Facture\FactureRepository;
  35. use App\Repository\User\ParticipantRepository;
  36. use App\Entity\Promo\Code;
  37. use App\Form\Back\Promo\CodeType;
  38. use App\Repository\Promo\CodeRepository;
  39. use App\Service\CurrentUserGetterService;
  40. use App\Service\PaypalService;
  41. use App\Service\StripeNewService;
  42. use Doctrine\ORM\EntityManagerInterface;
  43. use PayPal\Exception\PayPalConnectionException;
  44. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  45. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  46. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  47. use Symfony\Component\Form\FormFactoryInterface;
  48. use Symfony\Component\HttpFoundation\JsonResponse;
  49. use Symfony\Component\HttpFoundation\RedirectResponse;
  50. use Symfony\Component\HttpFoundation\Request;
  51. use Symfony\Component\HttpFoundation\Response;
  52. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  53. use Symfony\Component\Mailer\MailerInterface;
  54. use Symfony\Component\Mime\Address;
  55. use Symfony\Component\Routing\Annotation\Route;
  56. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  57. use Symfony\Contracts\Translation\TranslatorInterface;
  58. use Twig\Environment;
  59. //use PayPal\v1\Payments\PaymentCreateRequest;
  60. //use PayPal\Core\PayPalHttpClient;
  61. //use PayPal\Core\ProductionEnvironment;
  62. use PayPalCheckoutSdk\Core\PayPalHttpClient;
  63. use PayPalCheckoutSdk\Core\ProductionEnvironment;
  64. use PayPalCheckoutSdk\Orders\OrdersCreateRequest;
  65. use PayPalCheckoutSdk\Orders\OrdersCaptureRequest;
  66. use PayPalHttp\HttpRequest;
  67. use PayPalHttp\HttpResponse;
  68. /**
  69.  * @Route("/course", name="course.")
  70.  * */
  71. class CourseController
  72. {
  73.     private Environment $twig;
  74.     private UrlGeneratorInterface $urlGenerator;
  75.     private DocumentRepository $DocumentRepository;
  76.     private FactureRepository $FactureRepository;
  77.     private CourseRepository $repository;
  78.     private FormFactoryInterface $formFactory;
  79.     private FlashBagInterface $flashBag;
  80.     private CurrentUserGetterService $currentUserGetterService;
  81.     private CourseUserSubscriptionRepository $courseUserSubscriptionRepository;
  82.     
  83.     private CourseUserTransfertRepository $CourseUserTransfertRepository;
  84.     private CodeRepository $CodeRepository;
  85.     private EventDispatcherInterface $dispatcher;
  86.     private EntityManagerInterface $entityManager;
  87.     private MailerInterface $mailer;
  88.     private PaypalService $paypalService;
  89.     private StripeNewService $stripeService;
  90.     private TranslatorInterface $translator;
  91.     private ParticipantRepository $ParticipantRepository;
  92.     public function __construct(Environment $twigUrlGeneratorInterface $urlGeneratorDocumentRepository $DocumentRepositoryFormFactoryInterface $formFactory,
  93.                                 CourseRepository $repositoryFlashBagInterface $flashBagMailerInterface $mailerTranslatorInterface $translator,
  94.                                 CourseUserTransfertRepository $CourseUserTransfertRepositoryCourseUserSubscriptionRepository $courseUserSubscriptionRepositoryEventDispatcherInterface $dispatcher,
  95.                                 ParticipantRepository $ParticipantRepositoryStripeNewService $stripeServiceFactureRepository $FactureRepositoryCurrentUserGetterService $currentUserGetterServiceCodeRepository $CodeRepositoryEntityManagerInterface $entityManagerPaypalService $paypalService)
  96.     {
  97.         $this->twig $twig;
  98.         $this->urlGenerator $urlGenerator;
  99.         $this->DocumentRepository $DocumentRepository;
  100.         $this->FactureRepository $FactureRepository;
  101.         $this->repository $repository;
  102.         $this->formFactory $formFactory;
  103.         $this->flashBag $flashBag;
  104.         $this->currentUserGetterService $currentUserGetterService;
  105.         $this->courseUserSubscriptionRepository $courseUserSubscriptionRepository;
  106.         $this->CourseUserTransfertRepository $CourseUserTransfertRepository;
  107.         $this->CodeRepository $CodeRepository;
  108.         $this->dispatcher $dispatcher;
  109.         $this->entityManager $entityManager;
  110.         $this->mailer $mailer;
  111.         $this->paypalService $paypalService;
  112.         $this->translator $translator;
  113.         $this->stripeService $stripeService;
  114.         $this->ParticipantRepository $ParticipantRepository;
  115.     }
  116.     /**
  117.      * @Route("/", name="index",
  118.      *     methods={"GET", "POST"},
  119.      * )
  120.      */
  121.     public function index(): Response
  122.     {
  123.         $courseUserSubscriptions $this->courseUserSubscriptionRepository->findBy([
  124.             'paymentStatus' => 2,
  125.         ]);
  126.         foreach ($courseUserSubscriptions as $sub) {
  127.             $subscriptionParent $this->courseUserSubscriptionRepository->findOneBy([
  128.                 'child' => $sub->getId(),
  129.             ]);
  130.             if($subscriptionParent != null){
  131.                 $subscriptionParent->setChild(null);
  132.                 $this->courseUserSubscriptionRepository->save($subscriptionParent);
  133.             }
  134.             $this->entityManager->remove($sub);
  135.             $this->entityManager->flush();
  136.         }
  137.         //$courses = $this->repository->findAll();
  138.         $courses $this->repository->createQueryBuilder('d')
  139.         ->where('d.bloqueCourse = false or d.bloqueCourse IS NULL')
  140.         //->andWhere('d.openingDate <= :datenow')
  141.         //->andWhere('d.closingDate > :datenow')
  142.         //->setParameter('datenow', new \DateTIME('NOW'))
  143.         ->addOrderBy('d.startDate''ASC'
  144.         ->getQuery()
  145.         ->getResult();
  146.  
  147.         return new Response($this->twig->render('front/course/index.html.twig', [
  148.             'courses' => $courses,
  149.         ]));
  150.     }
  151.     /**
  152.      * @Route("/{id}/show", name="show",
  153.      *     methods={"GET"},
  154.      * )
  155.      */
  156.     public function show(Request $requestCourse $course): Response
  157.     {
  158.         $course $this->repository->find($request->get('id'));
  159.         if (null === $user $this->currentUserGetterService->getUser()) {
  160.             $courseUserSubscription null;
  161.         }else{
  162.             $courseUserSubscription $this->entityManager->getRepository(CourseUserSubscription::class)->findOneBy([
  163.             'course' => $course->getId(),
  164.             'createdBy' => $user->getId(),
  165.         ]);
  166.         if($courseUserSubscription != null){
  167.             if($courseUserSubscription->getPaymentStatus() == 2){
  168.                 $subscriptionParent $this->courseUserSubscriptionRepository->findOneBy([
  169.                     'child' => $courseUserSubscription->getId(),
  170.                 ]);
  171.                 if($subscriptionParent != null){
  172.                     $subscriptionParent->setChild(null);
  173.                     $this->courseUserSubscriptionRepository->save($subscriptionParent);
  174.                 }
  175.                 $this->entityManager->remove($courseUserSubscription);
  176.                 $this->entityManager->flush();
  177.             }
  178.         }
  179.         
  180.  
  181.             
  182.     }
  183.         //$intent = $this->stripeService->paymentIntent($course);
  184.         
  185.         return new Response($this->twig->render('front/course/show.html.twig', [
  186.             'course' => $course,
  187.             'courseUserSubscription' => $courseUserSubscription,
  188.             'stripe_public_key_live' =>  $_ENV["STRIPE_PUBLIC_KEY_LIVE"],
  189.             //'intentSecret' => $intent['client_secret'],
  190.         ]));
  191.     }
  192.     /**
  193.      * @Route("/subscriptionsUser", name="subscriptionsUser",
  194.      *     methods={"GET"},
  195.      * )
  196.      */
  197.     public function subscriptionsUser(Request $request): Response
  198.     {
  199.         
  200.         $courseUserSubscriptions $this->courseUserSubscriptionRepository->createQueryBuilder('u')
  201.         ->where('u.status != 0')
  202.         ->andWhere('u.createdBy = :createdBy')
  203.         ->setParameter('createdBy'$this->currentUserGetterService->getUser())
  204.         ->getQuery()
  205.         ->getResult();
  206.         if (null === $user $this->currentUserGetterService->getUser()) {
  207.             //throw new AccessDeniedException();
  208.             return new RedirectResponse($this->urlGenerator->generate('front.security.app_login'));
  209.         }
  210.         /*foreach ($courseUserSubscriptions as $sub) {
  211.             $allfilesApprouved = true;
  212.             $otherDocs = [];
  213.             foreach ($sub->getCourse()->getDocumentModels() as $document) {
  214.                 $docFound = false;
  215.                 //$documentModelsEvent = $this->entityManager->getRepository(DocumentModel::class)->findAll();
  216.                 $docUser = $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  217.                     ->where('d.createdBy = :user and d.model = :type and d.LastDoc = true and d.status = 4')
  218.                     ->setParameter('user', $user->getId())
  219.                     ->setParameter('type', $document->getId())
  220.                     ->getQuery()
  221.                     ->getResult();
  222.                 foreach ($docUser as $doc) {
  223.                     if ($document->translate('fr')->getname() === $doc->getModel()->translate('fr')->getname()) {
  224.                         $docFound = true;
  225.                     }
  226.                 }
  227.                 if (true === $docFound) {
  228.                     $otherDocs[] = $document->translate('fr')->getname();
  229.                 }
  230.                 if (null == $docUser) {
  231.                     $allfilesApprouved = false;
  232.                 }
  233.             }
  234.             //////Asma - Documents globales
  235.             //var_dump(count($otherDocs));
  236.             //var_dump(count($sub->getCourse()->getDocumentModels()));
  237.             if(count($sub->getCourse()->getDocumentModels())>1){
  238.                 $pourcentageDoc = (80 / count($sub->getCourse()->getDocumentModels())) * count($otherDocs);
  239.             }else{
  240.                 if(count($otherDocs)>0){
  241.                     $pourcentageDoc = 80 * count($otherDocs);
  242.                 }else{
  243.                     $pourcentageDoc = 80;
  244.                 }
  245.                 
  246.             }
  247.             
  248.             $sub->setProgressiveStatus(intval($pourcentageDoc) + 20);
  249.         }
  250.         $this->entityManager->flush();
  251.         */
  252.         $courseUserInvitations $this->courseUserSubscriptionRepository->findBy([
  253.             'secondParticipantEmail' => $this->currentUserGetterService->getUser()->getEmail(),
  254.         ]);
  255.         return new Response($this->twig->render('front/course/subscriptionsUser.html.twig', [
  256.             'courseUserSubscription' => $courseUserSubscriptions,
  257.             'courseUserInvitations' => $courseUserInvitations
  258.         ]));
  259.     }
  260.      /**
  261.      * @Route("/invitationsUser", name="invitationsUser",
  262.      *     methods={"GET"}, options={"expose": true}
  263.      * )
  264.      */
  265.     public function invitationsUser(Request $request): Response
  266.     {
  267.         if (null === $user $this->currentUserGetterService->getUser()) {
  268.             //throw new AccessDeniedException();
  269.             return new RedirectResponse($this->urlGenerator->generate('front.security.app_login'));
  270.         }
  271.         $courseUserInvitations $this->courseUserSubscriptionRepository->findBy([
  272.             'secondParticipantEmail' => $this->currentUserGetterService->getUser()->getEmail(),
  273.             'child' => null
  274.         ]);
  275.         return new Response($this->twig->render('front/course/invitationsUser.html.twig', [
  276.             'courseUserSubscription' => $courseUserInvitations
  277.         ]));
  278.     }
  279.     /**
  280.      * @Route("/deleteInvitation", name="deleteInvitation",
  281.      *     methods={"GET"},
  282.      * )
  283.      */
  284.     public function deleteInvitation(Request $request): Response
  285.     {
  286.         $courseUserInvitations $this->courseUserSubscriptionRepository->findOneBy([
  287.             'id' => $request->get('id')
  288.         ]);
  289.         $courseUserInvitations
  290.                 ->setChild(null)
  291.                 ->setCategory(CourseUserSubscriptionCategoryEnum::SOLO)
  292.                 ->setSecondParticipant(null)
  293.                 ->setSecondParticipantName(null)
  294.                 ->setSecondParticipantLastname(null)
  295.                 ->setSecondParticipantEmail(null);                    
  296.           
  297.             $this->courseUserSubscriptionRepository->save($courseUserInvitations);
  298.             $this->sendMailInvitationRemovedCourse($courseUserInvitations);
  299.             return new Response("true");
  300.     }
  301.     
  302.     /**
  303.      * @Route("/update-subscription-document", name="update_subscription_document",
  304.      *     methods={"GET", "POST"},
  305.      * )
  306.      */
  307.     public function updateSubscriptionDocument(Request $request): Response
  308.     {
  309.         $document = new Document();
  310.         $form $this->formFactory->create(DocumentType::class, $document, [
  311.             'action' => $this->urlGenerator->generate('front.course.update_subscription_document'),
  312.         ]);
  313.         $form->handleRequest($request);
  314.         if ($form->isSubmitted() && $form->isValid()) {
  315.             $document->setLastDoc(true);
  316.             $this->entityManager->flush();
  317.             $this->flashBag->add('success'$this->translator->trans('Le document a été modifié avec succès!'));
  318.         }
  319.         return new Response($this->twig->render('front/course/_form_document.html.twig', [
  320.             'form' => $form->createView(),
  321.         ]));
  322.     }
  323.     /**
  324.      * @Route("/{id}/singleSubscriptionsUser", name="singleSubscriptionsUser",
  325.      *    methods={"GET", "POST"},
  326.      *  options={ "expose": true }, 
  327.      * )
  328.      */
  329.     public function singleSubscriptionsUser(Request $requestCourse $course): Response
  330.     {
  331.         
  332.         if (null === $user $this->currentUserGetterService->getUser()) {
  333.             //throw new AccessDeniedException();
  334.             return new RedirectResponse($this->urlGenerator->generate('front.security.app_login'));
  335.         }
  336.         $courseUserSubscription $this->entityManager->getRepository(CourseUserSubscription::class)->findOneBy([
  337.             'course' => $course->getId(),
  338.             'createdBy' => $user->getId(),
  339.         ]);
  340.         
  341.         if (null === $courseUserSubscription || null === $course) {
  342.             return new Response($this->twig->render('front/home/errorpage.html.twig', ['errorMessage' => "L'inscription à la course a été supprimé"]));
  343.         }
  344.         $allfilesApprouved true;
  345.         $otherDocs = [];
  346.         $allDocsUser $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  347.                 ->where('d.createdBy = :user and d.LastDoc = true')
  348.                 ->setParameter('user'$user->getId())
  349.                 ->getQuery()
  350.                 ->getResult();
  351.                 $pourcentageDocCourse $this->courseUserSubscriptionRepository->calculPourcDocCourse($courseUserSubscription,$allDocsUser);
  352.                 $courseUserSubscription->setProgressiveStatus($pourcentageDocCourse);
  353.                 $this->entityManager->persist($courseUserSubscription);
  354.         foreach ($courseUserSubscription->getCourse()->getDocumentModels() as $document) {
  355.             $docFound false;
  356.             //$documentModelsEvent = $this->entityManager->getRepository(DocumentModel::class)->findAll();
  357.             $docUser $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  358.                 ->where('d.createdBy = :user and d.model = :type and d.LastDoc = true and d.status = 4')
  359.                 ->setParameter('user'$user->getId())
  360.                 ->setParameter('type'$document->getId())
  361.                 ->getQuery()
  362.                 ->getResult();
  363.             foreach ($docUser as $doc) {
  364.                 if ($document->translate('fr')->getname() === $doc->getModel()->translate('fr')->getname()) {
  365.                     $docFound true;
  366.                 }
  367.             }
  368.             if (true === $docFound) {
  369.                 $otherDocs[] = $document->translate('fr')->getname();
  370.             }
  371.             if (null == $docUser) {
  372.                 $allfilesApprouved false;
  373.             }
  374.         }
  375.         //var_dump(count($otherDocs));
  376.         //var_dump(count($sub->getCourse()->getDocumentModels()));
  377.         //Asmaa A garder ancien calcul % Course
  378.        /* if(count($courseUserSubscription->getCourse()->getDocumentModels())>1){
  379.             $pourcentageDoc = (80 / count($courseUserSubscription->getCourse()->getDocumentModels())) * count($otherDocs);
  380.         }else{
  381.             if(count($otherDocs)>0){
  382.                 $pourcentageDoc = 80 * count($otherDocs);
  383.             }else{
  384.                 $pourcentageDoc = 80;
  385.             }
  386.             
  387.         }
  388.         $courseUserSubscription->setProgressiveStatus(intval($pourcentageDoc) + 20);*/
  389.         $this->entityManager->flush();
  390.         $documents $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  391.             ->where('d.createdBy = :user and d.LastDoc = true')
  392.             ->setParameter('user'$this->currentUserGetterService->getUser())
  393.             ->addOrderBy('d.updatedAt''DESC')
  394.             ->getQuery()
  395.             ->getResult();
  396.         return new Response($this->twig->render('front/course/singleSubscriptionsUser.html.twig', [
  397.             'sub' => $courseUserSubscription,
  398.             'documents' => $documents,
  399.             'documentModelsEvent' => $course->getDocumentModels(),
  400.         ]));
  401.     }
  402.     /**
  403.      * @Route("/{id}/singleInvitationsUser", name="singleInvitationsUser",
  404.      *    methods={"GET", "POST"},
  405.      *  options={ "expose": true }, 
  406.      * )
  407.      */
  408.     public function singleInvitationsUser(Request $requestCourse $course): Response
  409.     {
  410.         if (null === $user $this->currentUserGetterService->getUser()) {
  411.             //throw new AccessDeniedException();
  412.             return new RedirectResponse($this->urlGenerator->generate('front.security.app_login'));
  413.         }
  414.         $courseUserSubscription $this->entityManager->getRepository(CourseUserSubscription::class)->findOneBy([
  415.             'course' => $course->getId(),
  416.             'secondParticipantEmail' => $user->getEmail(),
  417.         ]);
  418.         
  419.         if (null === $courseUserSubscription || null === $course) {
  420.             return new Response($this->twig->render('front/home/errorpage.html.twig', ['errorMessage' => "L'inscription à la course a été supprimé"]));
  421.         }
  422.         return new Response($this->twig->render('front/course/singleInvitationUser.html.twig', [
  423.             'sub' => $courseUserSubscription,
  424.         ]));
  425.     }
  426.     /**
  427.      * @IsGranted("IS_AUTHENTICATED_REMEMBERED")
  428.      * @Route("/{id}/subscribeInvited", name="subscribeInvited",
  429.      *     methods={"GET", "POST"},
  430.      * )
  431.      */
  432.     public function subscribeInvited(Request $requestCourse $course): Response
  433.     {
  434.         $flashBagMessage 'L\'inscription a été effectué avec succès!';
  435.        
  436.          $courseUserSubscriptionFirst $this->courseUserSubscriptionRepository->findOneBy([
  437.             'course' => $course->getId(),
  438.             'secondParticipantEmail' => $this->currentUserGetterService->getUser()->getEmail(),
  439.         ]);
  440.         $newSubscription $this->courseUserSubscriptionRepository->findOneBy([
  441.             'course' => $course->getId(),
  442.             'createdBy' => $this->currentUserGetterService->getUser(),
  443.         ]);
  444.         if (null === $newSubscription) {
  445.             $flashBagMessage 'L\'inscription a été effectuée avec succès!';
  446.             $newSubscription = new CourseUserSubscription();
  447.             $newSubscription->setCourse($course);
  448.         }
  449.        
  450.       
  451.         $form $this->formFactory->create(CourseUserInvitationType::class, $newSubscription, [
  452.             'action' => $this->urlGenerator->generate('front.course.subscribeInvited', [
  453.                 'id' => $course->getId(),
  454.             ]),
  455.         ]);
  456.         $form->handleRequest($request);
  457.         if ($form->isSubmitted() && $form->isValid()) {
  458.             
  459.             //$newSubscription = new CourseUserSubscription();
  460.             
  461.             $newSubscription
  462.                 ->setParent($courseUserSubscriptionFirst)
  463.                 ->setIsChild(true)
  464.                 ->setCategory(CourseUserSubscriptionCategoryEnum::DUO)
  465.                 ->setCourse($courseUserSubscriptionFirst->getCourse())
  466.                 ->setPrice($courseUserSubscriptionFirst->getPrice())
  467.                 ->setAcceptContrat(true)
  468.                 ->setAcceptConditionsG(true)
  469.                 ->setAcceptPolitique(true)
  470.                 ->setSecondParticipant($courseUserSubscriptionFirst->getCreatedBy())
  471.                 ->setSecondParticipantName($courseUserSubscriptionFirst->getCreatedBy()->getName())
  472.                 ->setSecondParticipantLastname($courseUserSubscriptionFirst->getCreatedBy()->getLastname())
  473.                 ->setSecondParticipantEmail($courseUserSubscriptionFirst->getCreatedBy()->getEmail())  
  474.                 ->setReference(uniqid(''false))
  475.                 ->setBrandStripe($request->get('stripeIntentPaymentMethod'))
  476.                 ->setIdChargeStripe($request->get('stripeIntentId'))
  477.                 ->setLast4Stripe($request->get('stripeSubscription'))
  478.                 ->setStatusStripe($request->get('stripeIntentStatus'))
  479.                 ->setPaymentStatus(CourseUserSubscriptionPaymentStatusEnum::APPROVED)
  480.                 ->setProgressiveStatus(0);
  481.                 $price = (float)$courseUserSubscriptionFirst->getCourse()->getPrice();
  482.                 foreach ($newSubscription->getPaidOptions() as $paidOption) {
  483.                     $price += (float) $paidOption->getRate();
  484.                     $newSubscription->addPaidOption($paidOption);
  485.                 }
  486.                 /*foreach ($courseUserSubscriptionFirst->getPaidOptions() as $paidOption) {
  487.                     $price += (float) $paidOption->getRate();
  488.                     $newSubscription->addPaidOption($paidOption);
  489.                 }*/
  490.                 if($request->get('codePromo') != null){
  491.                     $codePromo $this->CodeRepository->findOneBy([
  492.                         'code' => $request->get('codePromo'),
  493.                     ]);
  494.                     if($codePromo != null){
  495.                         $newSubscription->setCode($codePromo);
  496.                         $reduc 0;
  497.                             if($codePromo->getType() == 4){
  498.                                 $reduc = ($price*$codePromo->getReduction())/100;
  499.                             }else{
  500.                                 $reduc = (float)$codePromo->getReduction();
  501.                             }
  502.                         // Frais Service 
  503.                         $newPrice $price $reduc;
  504.                         $newPrice += ($newPrice*5)/100;
  505.                     }
  506.                 }else{
  507.                     $newPrice $price + ($price*5)/100;
  508.                 }
  509.                 
  510.                 if($newPrice 0){ $newPrice 0;}
  511.                 $newSubscription->setPrice(strval($newPrice));
  512.                                 
  513.           
  514.             $this->courseUserSubscriptionRepository->save($newSubscription);
  515.             $courseUserSubscriptionFirst->setChild($newSubscription);
  516.             $this->courseUserSubscriptionRepository->save($courseUserSubscriptionFirst);
  517.             $oldUrl $this->urlGenerator->generate('front.course.singleSubscriptionsUser', [
  518.                 'id' => $newSubscription->getCourse()->getId(),
  519.             ]);
  520.             return new RedirectResponse($this->urlGenerator->generate('front.course.subscribe_payment_success',[
  521.                 'subscription_id' => (string) $newSubscription->getId(),
  522.                 'old_url' => $oldUrl
  523.             ]));
  524.             
  525.        /*     
  526.             return new JsonResponse([
  527.                 'status' => 'success', 
  528.                 'Subid' => $newSubscription->getId(), 
  529.                 'message' => $flashBagMessage,
  530.                 ]);
  531.                 */
  532.         }
  533.         return new Response($this->twig->render('front/course/_invitation-form.html.twig', [
  534.             'course' => $course,
  535.             'form' => $form->createView(),
  536.             'courseUserSubscription' => $courseUserSubscriptionFirst,
  537.             'stripe_public_key_live' =>  $_ENV["STRIPE_PUBLIC_KEY_LIVE"]
  538.         ]));
  539.     }
  540.     /**
  541.      * @IsGranted("IS_AUTHENTICATED_REMEMBERED")
  542.      * @Route("/{id}/subscribe", name="subscribe",
  543.      *     methods={"GET", "POST"},
  544.      * )
  545.      */
  546.     public function subscribe(Request $requestCourse $course): Response
  547.     {
  548.         $flashBagMessage 'L\'inscription a été modifiée avec succès!';
  549.         $courseUserSubscription $this->courseUserSubscriptionRepository->findOneBy([
  550.             'course' => $course->getId(),
  551.             'createdBy' => $this->currentUserGetterService->getUser(),
  552.         ]);
  553.         if (null === $courseUserSubscription) {
  554.             $flashBagMessage 'L\'inscription a été effectuée avec succès!';
  555.             $courseUserSubscription = new CourseUserSubscription();
  556.             $courseUserSubscription->setCourse($course);
  557.         }
  558.         
  559.         $form $this->formFactory->create(CourseUserSubscriptionType::class, $courseUserSubscription, [
  560.             'action' => $this->urlGenerator->generate('front.course.subscribe', [
  561.                 'id' => $course->getId(),
  562.             ]),
  563.         ]);
  564.         $form->handleRequest($request);
  565.         if ($form->isSubmitted() && $form->isValid()) {
  566.             //$courseUserSubscription->setCourse($course);
  567.             $courseUserSubscription->setReference(uniqid(''false));
  568.             $courseUserSubscription->setBrandStripe($request->get('stripeIntentPaymentMethod'));
  569.             $courseUserSubscription->setIdChargeStripe($request->get('stripeIntentId'));
  570.             $courseUserSubscription->setLast4Stripe($request->get('stripeSubscription'));
  571.             $courseUserSubscription->setStatusStripe($request->get('stripeIntentStatus'));
  572.             
  573.             $price = (float)$courseUserSubscription->getPrice();
  574.             if($request->get('codePromo') != null){
  575.                 $codePromo $this->CodeRepository->findOneBy([
  576.                     'code' => $request->get('codePromo'),
  577.                 ]);
  578.                 
  579.                 if($codePromo != null){
  580.                     $courseUserSubscription->setCode($codePromo);
  581.                     
  582.                     $reduc 0;
  583.                         if($codePromo->getType() == 4){
  584.                             $reduc = ($price*$codePromo->getReduction())/100;
  585.                         }else{
  586.                             $reduc = (float)$codePromo->getReduction();
  587.                         }
  588.                     // Frais Service 
  589.                     $newPrice $price $reduc;
  590.                     
  591.                     $newPrice += ($newPrice*5)/100;
  592.                 }
  593.             }else{
  594.                 $newPrice $price + ($price*5)/100;
  595.             }
  596.             
  597.             if($newPrice 0){ $newPrice 0;}
  598.             $courseUserSubscription->setPrice(strval($newPrice));
  599.             
  600.             if (CourseUserSubscriptionCategoryEnum::SOLO === $courseUserSubscription->getCategory()) {
  601.                 $courseUserSubscription
  602.                     ->setSecondParticipant(null)
  603.                     ->setSecondParticipantEmail(null);
  604.             }
  605.             $courseUserSubscription->setPaymentStatus(CourseUserSubscriptionPaymentStatusEnum::APPROVED);
  606.             $courseUserSubscription->setProgressiveStatus(0);
  607.             $this->courseUserSubscriptionRepository->save($courseUserSubscription);
  608.             $oldUrl $this->urlGenerator->generate('front.course.singleSubscriptionsUser', [
  609.                 'id' => $courseUserSubscription->getCourse()->getId(),
  610.             ]);
  611.             return new RedirectResponse($this->urlGenerator->generate('front.course.subscribe_payment_success',[
  612.                 'subscription_id' => (string) $courseUserSubscription->getId(),
  613.                 'old_url' => $oldUrl
  614.             ]));
  615.         }
  616.         //$intent = $this->stripeService->paymentIntent($course);
  617.         
  618.    
  619.         return new Response($this->twig->render('front/course/_subscription-form.html.twig', [
  620.             'course' => $course,
  621.             'form' => $form->createView(),
  622.             'stripe_public_key_live' =>  $_ENV["STRIPE_PUBLIC_KEY_LIVE"],
  623.             //'intentSecret' => $intent['client_secret'],
  624.         ]));
  625.        
  626.     }
  627.     /**
  628.      * @Route("/intentSecret", name="intentSecret",
  629.      *     methods={"GET"},
  630.      *      options={ "expose": true },
  631.      * )
  632.      */
  633.     public function intentSecret(Request $request): Response
  634.     {
  635.         $course $this->repository->find($request->get('course'));
  636.         $intent $this->stripeService->paymentIntentUpdate($request->get('price'), $course);
  637.         return new JsonResponse([
  638.             'status' => 'success'
  639.             'client_secret' => $intent['client_secret'], 
  640.             ]);
  641.     }
  642.     /**
  643.      * @Route("{courseUserSubscription}/subscribe-payment-payment", name="subscribe_payment",
  644.      *     methods={"GET"},
  645.      *     options={ "expose": true },
  646.      * )
  647.      */
  648.     public function subscribePayment(Request $requestCourseUserSubscription $courseUserSubscription): Response
  649.     {
  650.         /*$oldUrl = $request->get('old_url');
  651.         var_dump($oldUrl);
  652.         $request->get('old_url');
  653.         echo " laaa ";*/
  654.         $oldUrl $this->urlGenerator->generate('front.course.singleSubscriptionsUser', [
  655.             'id' => $courseUserSubscription->getCourse()->getId(),
  656.         ]);
  657.         //var_dump($newUrl);
  658.         //exit();
  659.         /*
  660.         try {
  661.            
  662.             $payment = $this->paypalService->getPayment(
  663.                 (string)$courseUserSubscription->getId(),
  664.                 (string)$courseUserSubscription->getPrice(),
  665.                 'EUR',
  666.                 $this->urlGenerator->generate('front.course.subscribe_payment_success', [
  667.                     'subscription_id' => (string) $courseUserSubscription->getId(),
  668.                     'old_url' => $oldUrl,
  669.                 ],UrlGeneratorInterface::ABSOLUTE_URL),
  670.                 $this->urlGenerator->generate('front.course.subscribe_payment_cancel', [
  671.                     'subscription_id' => (string) $courseUserSubscription->getId(),
  672.                     'old_url' => $oldUrl,
  673.                 ],UrlGeneratorInterface::ABSOLUTE_URL)
  674.             );
  675.             $clientID = 'Abe0ZVGKbSU6RPW6PtZ2M0lkQjVhig7ncpa57yvjPnhVJBvztXPrXa6EWak8ndaK53AvjjUBKakmk_gE';
  676.             $clientSecret = 'EBOz0K16ZMkxvxDrPnER_y3mEzEqcu3asM7yp_gZ92hdXs6r-pE9_3k2qEItUrseGwsVv5IroLnKvHm1';
  677.            
  678.             $environment = new ProductionEnvironment($clientID, $clientSecret); // Use `ProductionEnvironment` for production
  679.             $client = new PayPalHttpClient($environment);
  680.             
  681.           
  682.                 $request = new OrdersCaptureRequest($payment->result->id);
  683.                 $request->prefer('return=representation');
  684.                 try {
  685.                     // Call API with your client and get a response for your call
  686.                     $response = $client->execute($request);
  687.                     
  688.                     // If call returns body in response, you can get the deserialized version from the result attribute of the response
  689.                     return ($response);
  690.                 }catch (HttpException $ex) {
  691.                     echo $ex->statusCode;
  692.                     print_r($ex->getMessage());
  693.                 }
  694.             //var_dump($payment);
  695.             //exit();
  696.             //return new RedirectResponse($payment->result->links[1]->href);
  697.         } catch (PayPalConnectionException $ex) {
  698.        
  699.             $this->flashBag->add('warning', 'Oups! quelque chose a mal tourné');
  700.             return new RedirectResponse($oldUrl);
  701.             $this->urlGenerator->generate('front.course.subscribe_payment_cancel', [
  702.                 'subscription_id' => (string) $courseUserSubscription->getId(),
  703.                 'old_url' => $oldUrl,
  704.             ], UrlGeneratorInterface::ABSOLUTE_URL);
  705.         }
  706.         */
  707.        
  708.         return new RedirectResponse($this->urlGenerator->generate('front.course.subscribe_payment_success',[
  709.             'subscription_id' => (string) $courseUserSubscription->getId(),
  710.             'old_url' => $oldUrl
  711.         ]));
  712.     }
  713.     /**
  714.      * @Route("/subscribe-payment-success", name="subscribe_payment_success",
  715.      *     methods={"GET"},
  716.      * )
  717.      */
  718.     public function subscribePaymentSuccess(Request $request): Response
  719.     {
  720.         $subscriptionId $request->get('subscription_id');
  721.         $oldUrl $request->get('old_url');
  722.         
  723.         /** @var CourseUserSubscription $subscription */
  724.         $subscription $this->entityManager->find(CourseUserSubscription::class, $subscriptionId);
  725.         $this->flashBag->add('success''Votre paiement a bien été enregistré et votre inscription est effectué. Vous avez jusqu\'à '$subscription->getCourse()->getClosingDate()->format('d-m-Y') .' pour compléter votre inscription et fournir les documents requis ');
  726.         $subscription->setPaymentStatus(CourseUserSubscriptionPaymentStatusEnum::APPROVED);
  727.         $subscription->setProgressiveStatus(0);
  728.       
  729.         $this->entityManager->flush();
  730.         if($subscription->getIsChild() ==1){
  731.             $this->sendMailInvitationCourse($subscription);
  732.         }else{
  733.             $this->sendMailSubscribeCourse($subscription);
  734.         }
  735.         // Creation de la facture
  736.         $date = new \DateTime();
  737.         $Laststatement_num $this->FactureRepository->findOneBy(array(),array('orderKey'=>'DESC'),1,0);
  738.         if($Laststatement_num == null$numInscriment 1;
  739.         else $numInscriment $Laststatement_num->getOrderKey() + 1;
  740.         $numero $date->format("Ym").sprintf('%04d',$numInscriment);
  741.         $facture = new Facture();
  742.             
  743.             $facture
  744.                 ->setUser($subscription->getCreatedBy())
  745.                 ->setSubsciption($subscription)
  746.                 ->setCourse($subscription->getCourse())
  747.                 ->setTotal($subscription->getPrice())
  748.                 ->setStatut("1")
  749.                 ->setOrderKey($numInscriment)
  750.                 ->setNumero($numero);
  751.             $this->FactureRepository->save($facture);
  752.             $subscription->setFacture($facture);
  753.             $this->entityManager->flush();
  754.         return new RedirectResponse($oldUrl);
  755.     }
  756.     /**
  757.      * @Route("/subscribe-payment-cancel", name="subscribe_payment_cancel",
  758.      *     methods={"GET"},
  759.      * )
  760.      */
  761.     public function subscribePaymentCancel(Request $request): Response
  762.     {
  763.         $subscriptionId $request->get('subscription_id');
  764.         $oldUrl $request->get('old_url');
  765.         //$this->flashBag->add('warning', 'Oups! quelque chose à mal tourné');
  766.         /** @var CourseUserSubscription $subscription */
  767.         $subscription $this->entityManager->find(CourseUserSubscription::class, $subscriptionId);
  768. //        $subscription->setPaymentStatus(CourseUserSubscriptionPaymentStatusEnum::REJECTED);
  769.         $this->entityManager->remove($subscription);
  770.         $this->entityManager->flush();
  771.         return new RedirectResponse($oldUrl);
  772.     }
  773.     /**
  774.      * @Route("/", name="renderList",
  775.      *     methods={"GET"},
  776.      * )
  777.      */
  778.     public function renderList(Request $requestCourse $course): Response
  779.     {
  780.         $page = (int) $request->get('page'1);
  781.         $subscriptions $course->getCourseUserSubscriptions();
  782.         return new Response($this->twig->render('front/course/renderList.html.twig', [
  783.             'subscriptions' => $subscriptions,
  784.         ]));
  785.     }
  786.     public function sendMailSubscribeCourse(CourseUserSubscription $courseUserSubscription){
  787.         $user $courseUserSubscription->getCreatedBy();
  788.             $emailContent2 $this->twig->render('emails/user/course_subscription_confirmation.html.twig', [
  789.                 'subscription' => $courseUserSubscription,
  790.             ]);
  791.             if (null !== $user) {
  792.                 $email = (new TemplatedEmail())
  793.                     ->from(new Address('app@bikingman.com''BikingMan'))
  794.                     ->to((string) $user->getEmail())
  795.                     ->subject('Votre inscription au BikingMan '.$courseUserSubscription->getCourse()->translate('fr')->getname().' #'.$courseUserSubscription->getCourse()->getNumber().' '.$courseUserSubscription->getCourse()->getSeason())
  796.                     ->html($emailContent2)
  797.                 ;
  798.                 $this->mailer->send($email);
  799.             }
  800.             if (CourseUserSubscriptionCategoryEnum::DUO === $courseUserSubscription->getCategory()) {
  801.                 $secondUser $this->entityManager->getRepository(User::class)
  802.                     ->findOneBy(['email' => $courseUserSubscription->getSecondParticipantEmail()]);
  803.                 $courseUserSubscription->setSecondParticipant($secondUser);
  804.                 $emailContent $this->twig->render('emails/user/course_subscription_second_participant.html.twig', [
  805.                     'subscription' => $courseUserSubscription,
  806.                 ]);
  807.                 if (null !== $user) {
  808.                     $email = (new TemplatedEmail())
  809.                         ->from(new Address('app@bikingman.com''BikingMan'))
  810.                         ->to((string) $courseUserSubscription->getSecondParticipantEmail())
  811.                         ->subject('BikingMan - Votre invitation à participer à la course '.$courseUserSubscription->getCourse()->translate('fr')->getname().' #'.$courseUserSubscription->getCourse()->getNumber().' '.$courseUserSubscription->getCourse()->getSeason())
  812.                         ->html($emailContent)
  813.                     ;
  814.                     $this->mailer->send($email);
  815.                 }
  816.             }
  817.             return true;
  818.     }
  819.     public function sendMailInvitationCourse(CourseUserSubscription $courseUserSubscription){
  820.         $user $courseUserSubscription->getCreatedBy();
  821.             $emailContent2 $this->twig->render('emails/user/course_subscription_confirmation.html.twig', [
  822.                 'subscription' => $courseUserSubscription,
  823.             ]);
  824.             if (null !== $user) {
  825.                 $email = (new TemplatedEmail())
  826.                     ->from(new Address('app@bikingman.com''BikingMan'))
  827.                     ->to((string) $user->getEmail())
  828.                     ->subject('Votre inscription au BikingMan '.$courseUserSubscription->getCourse()->translate('fr')->getname().' #'.$courseUserSubscription->getCourse()->getNumber().' '.$courseUserSubscription->getCourse()->getSeason())
  829.                     ->html($emailContent2)
  830.                 ;
  831.                 $this->mailer->send($email);
  832.             }
  833.             if (CourseUserSubscriptionCategoryEnum::DUO === $courseUserSubscription->getCategory()) {
  834.                 $secondUser $this->entityManager->getRepository(User::class)
  835.                     ->findOneBy(['email' => $courseUserSubscription->getSecondParticipantEmail()]);
  836.                 $courseUserSubscription->setSecondParticipant($secondUser);
  837.                 $emailContent $this->twig->render('emails/user/course_subscription_accept_invit.html.twig', [
  838.                     'subscription' => $courseUserSubscription,
  839.                 ]);
  840.                 if (null !== $user) {
  841.                     $email = (new TemplatedEmail())
  842.                         ->from(new Address('app@bikingman.com''BikingMan'))
  843.                         ->to((string) $courseUserSubscription->getSecondParticipantEmail())
  844.                         ->subject('BikingMan - L\'invitation à la course '.$courseUserSubscription->getCourse()->translate('fr')->getname().' #'.$courseUserSubscription->getCourse()->getNumber().' '.$courseUserSubscription->getCourse()->getSeason().' a été acceptée.')
  845.                         ->html($emailContent)
  846.                     ;
  847.                     $this->mailer->send($email);
  848.                 }
  849.             }
  850.             return true;
  851.     }
  852.     public function sendMailInvitationRemovedCourse(CourseUserSubscription $courseUserSubscription){
  853.         $user $courseUserSubscription->getCreatedBy();
  854.             $emailContent2 $this->twig->render('emails/user/course_duo_removed.html.twig', [
  855.                 'subscription' => $courseUserSubscription,
  856.             ]);
  857.             if (null !== $user) {
  858.                 $email = (new TemplatedEmail())
  859.                     ->from(new Address('app@bikingman.com''BikingMan'))
  860.                     ->to((string) $user->getEmail())
  861.                     ->subject('BikingMan - L\'invitation à la course '.$courseUserSubscription->getCourse()->translate('fr')->getname().' #'.$courseUserSubscription->getCourse()->getNumber().' '.$courseUserSubscription->getCourse()->getSeason().' a été refusée.')
  862.                     ->html($emailContent2)
  863.                 ;
  864.                 $this->mailer->send($email);
  865.             }
  866.             
  867.             return true;
  868.     }
  869.     /**
  870.      * @Route("/document/subscription/{documentModel}", name="document_form_from_course",
  871.      *     methods={"GET", "POST"},
  872.      * )
  873.      */
  874.     public function documentFormFromCourse(Request $requestDocumentModel $documentModel): Response
  875.     {
  876.         $user $this->currentUserGetterService->getUser();
  877.         if ($request->get('subId')) {
  878.             $subId $request->get('subId');
  879.             $subscription $this->entityManager->getRepository(CourseUserSubscription::class)->find($subId);
  880.             $document $this->entityManager->getRepository(Document::class)->findOneBy([
  881.                 'participant' => $user->getId(), 
  882.                 'model' => $documentModel,
  883.                 'courseUserSubscription' => $subscription
  884.             ]);
  885.     
  886.       
  887.             $document = new Document();
  888.             $document->setModel($documentModel);
  889.             $document->setParticipant($user);
  890.             $document->setType($documentModel->getType());
  891.             $document->setLastDoc(true);
  892.             
  893.             $document->setCourseUserSubscription($subscription);
  894.         } else {
  895.             $subId null;
  896.         }
  897.         
  898.         /** @var DocumentModelTranslation $documentModelTranslation */
  899.         $documentModelTranslation $documentModel->translate();
  900.         
  901.         $form $this->formFactory->create(DocumentType::class, $document, [
  902.             'label' => $documentModelTranslation->getName(),
  903.             'action' => $this->urlGenerator->generate('front.course.document_form_from_course', ['documentModel' => (string) $documentModel->getId()]),
  904.         ]);
  905.         
  906.         $form->handleRequest($request);
  907.         //var_dump($documentModelTranslation->getName());
  908.         //var_dump($documentModel->getId());exit();
  909.         if ($form->isSubmitted() && $form->isValid()) {
  910.             $documents $this->entityManager->getRepository(Document::class)->findOneBy(['participant' => $user->getId(), 'model' => $documentModel]);
  911.             if($documentModel->getType() == or $documentModel->getType() == 4){
  912.                 $docsUser $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  913.                 ->where('d.createdBy = :user and d.model = :type')
  914.                 ->setParameter('user'$user->getId())
  915.                 ->setParameter('type'$documentModel->getId())
  916.                 ->getQuery()
  917.                 ->getResult();
  918.                 $nbrDocModel $this->DocumentRepository->getGlobalandUserDocument();
  919.             
  920.                 $user $this->ParticipantRepository->calculPourcDocUser($user,$nbrDocModel);
  921.                 $this->entityManager->persist($user);
  922.             }else{
  923.                 $docsUser $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  924.                 ->where('d.createdBy = :user and d.model = :type and d.courseUserSubscription = :sub')
  925.                 ->setParameter('user'$user->getId())
  926.                 ->setParameter('type'$documentModel->getId())
  927.                 ->setParameter('sub'$subscription->getId())
  928.                 ->getQuery()
  929.                 ->getResult();
  930.             }
  931.             
  932.             foreach ($docsUser as $docUser) {
  933.                 $docUser->setLastDoc(false);
  934.                 $docUser->setStatus(DocumentStatusEnum::EXPIRED);
  935.                 $this->entityManager->persist($docUser);
  936.             }
  937.             $document->setStatus(DocumentStatusEnum::PENDING);
  938.             $document->setLastDoc(true);
  939.             $this->entityManager->persist($document);
  940.           
  941.             foreach ($user->getDocuments() as $userDocument) {
  942.                 if (=== $userDocument->getFiles()->count()) {
  943.                     $this->entityManager->remove($userDocument);
  944.                 }
  945.             }
  946.             $this->entityManager->flush();
  947.             $docsUser $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  948.             ->where('d.createdBy = :user and d.LastDoc = true and d.courseUserSubscription = :sub')
  949.             ->setParameter('user'$subscription->getCreatedBy())
  950.             ->setParameter('sub'$subscription)
  951.             ->getQuery()
  952.             ->getResult();
  953.             
  954.             //$nbrDocModel = $this->DocumentRepository->getNbrDocument($subscription);
  955.             
  956.             
  957.             $pourcentageDocCourse $this->courseUserSubscriptionRepository->calculPourcDocCourse($subscription,$docsUser);
  958.             $subscription->setProgressiveStatus($pourcentageDocCourse);
  959.             $this->entityManager->persist($subscription);
  960.             $this->entityManager->flush();
  961.             if (!$request->isXmlHttpRequest()) {
  962.                 $this->flashBag->add('success''Les documents ont été téléchargés avec succès!');
  963.                 return new RedirectResponse($this->urlGenerator->generate('front.course.singleSubscriptionsUser',[
  964.                     'id' => $subscription->getCourse()->getId(),
  965.                 ]));
  966.                 /*return new Response($this->twig->render('front/course/singleSubscriptionsUser.html.twig', [
  967.                     'sub' => $subscription,
  968.                     'documentModelsEvent' => $documentModel,
  969.                 ]));*/ 
  970.             }
  971.         }
  972.         return new Response($this->twig->render('front/course/_document-form.html.twig', [
  973.             'form' => $form->createView(),
  974.             'subId' => $subId,
  975.         ]));
  976.     }
  977.      /**
  978.      * @Route("/verify_code_promo",
  979.      *     name="verify_code_promo",
  980.      *     options={ "expose": true },
  981.      * methods={"GET"})
  982.      */
  983.     public function verifyCodePromo(Request $request): JsonResponse
  984.     {
  985.         $courseUserSubscriptions $this->CodeRepository->findOneBy([
  986.             'code' => $request->get('codePromo'),
  987.         ]);
  988.         if($courseUserSubscriptions != null){
  989.             return new JsonResponse([
  990.                 'status' => 'success'
  991.                 'message' => 'Code promo valide'
  992.                 'reduc' => $courseUserSubscriptions->getReduction(),
  993.                 'code' => $courseUserSubscriptions,
  994.                 'codePromo'=>$courseUserSubscriptions->getCode(),
  995.                 'type'=>$courseUserSubscriptions->getType(),
  996.                 ]);
  997.         }else{
  998.             return new JsonResponse([
  999.                 'status' => 'error'
  1000.                 'message' => 'Code promo non-valide',
  1001.                 'reduc' => 0,
  1002.                 'code' => null,
  1003.                 'codePromo'=>null,
  1004.                 'type' => null
  1005.                 ]);
  1006.         }
  1007.         
  1008.     }
  1009.       /**
  1010.      * @Route("/edit-document-modele-user", name="get_document_modele_user",
  1011.      *     methods={"GET", "POST"},
  1012.      * )
  1013.      */
  1014.     public function getDocumentModeleUser(Request $request): Response
  1015.     {
  1016.         //if($request->get('type') != '8'){
  1017.             $docUser $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  1018.             ->where('d.createdBy = :user and d.model = :type and d.LastDoc = true')
  1019.             ->setParameter('user'$request->get('createdBy'))
  1020.             ->setParameter('type'$request->get('type'))
  1021.             ->getQuery()
  1022.             ->getResult();
  1023.         /*}else{
  1024.             $docUser = $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  1025.             ->where('d.createdBy = :user and d.model = :type and d.LastDoc = true and d.courseUserSubscription = :sub')
  1026.             ->setParameter('user', $request->get('createdBy'))
  1027.             ->setParameter('type', $request->get('type'))
  1028.             ->setParameter('sub', $request->get('subscription'))
  1029.             ->getQuery()
  1030.             ->getResult();
  1031.         }*/
  1032.         
  1033.         return new Response($this->twig->render('front/course/line_doc_user.html.twig', [
  1034.             'documents' => $docUser,
  1035.             'subId' => $request->get('subscription')
  1036.         ]));
  1037.     }
  1038.     /**
  1039.      * @Route("/get-other-document-modele-user", name="get_document_modele_user",
  1040.      *     methods={"GET", "POST"},
  1041.      * )
  1042.      */
  1043.     public function getOtherDocumentModeleUser(Request $request): Response
  1044.     {
  1045.         $otherDocs = [];
  1046.         $subscription $this->entityManager->getRepository(CourseUserSubscription::class)->find($request->get('subscription'));
  1047.         if ($subscription->getCourse() != null) {
  1048.             $docUser $this->entityManager->getRepository(Document::class)->createQueryBuilder('d')
  1049.                 ->where('d.createdBy = :user and d.LastDoc = true')
  1050.                 ->setParameter('user'$subscription->getCreatedBy())
  1051.                 ->getQuery()
  1052.                 ->getResult();
  1053.             foreach ($subscription->getCourse()->getDocumentModels() as $modeleCourse) {
  1054.                 $docFound false;
  1055.                 foreach ($docUser as $doc) {
  1056.                     if ($modeleCourse->translate('fr')->getname() === $doc->getModel()->translate('fr')->getname()) {
  1057.                         if($doc->getType() != 8){
  1058.                             $docFound true;
  1059.                         }else{
  1060.                             if($doc->getCourseUserSubscription()->getId() == $subscription->getId()){
  1061.                                 $docFound true;
  1062.                             }
  1063.                         }
  1064.                         
  1065.                     }
  1066.                 }
  1067.                 if (false === $docFound) {
  1068.                     $otherDocs[] = $modeleCourse;
  1069.                 }
  1070.             }
  1071.         }
  1072.         return new Response($this->twig->render('front/course/line_other_doc_user.html.twig', [
  1073.             'otherDocs' => $otherDocs,
  1074.         ]));
  1075.     }
  1076.     /**
  1077.      * @Route("/majfactures", name="majfactures",
  1078.      *     methods={"GET"},
  1079.      * )
  1080.      */
  1081.     public function majfactures(Request $request): Response
  1082.     {
  1083.         $found 0;
  1084.         $courseUserSubscriptions $this->courseUserSubscriptionRepository->findAll();
  1085.         foreach ($courseUserSubscriptions as $sub) {
  1086.                 $facture $this->FactureRepository->findOneBy([
  1087.                     'subsciption' => $sub,
  1088.                 ]);
  1089.                 if($facture != null){
  1090.                     $found ++;
  1091.                     $sub->setFacture($facture);
  1092.                     $this->courseUserSubscriptionRepository->save($sub);
  1093.                 }
  1094.             }
  1095.             echo $found;
  1096.             exit();
  1097.     }
  1098.     /**
  1099.      * @IsGranted("IS_AUTHENTICATED_REMEMBERED")
  1100.      * @Route("/{id}/transfert", name="transfert",
  1101.      *     methods={"GET", "POST"},
  1102.      * )
  1103.      */
  1104.     public function transfert(Request $requestCourse $course): Response
  1105.     {
  1106.         $courseUserSubscription $this->courseUserSubscriptionRepository->findOneBy([
  1107.             'course' => $course->getId(),
  1108.             'createdBy' => $this->currentUserGetterService->getUser(),
  1109.         ]);
  1110.         if (null === $courseUserSubscription) {
  1111.             $flashBagMessage 'L\'inscription a été transférée avec succès!';
  1112.             $courseUserSubscription = new CourseUserSubscription();
  1113.             $courseUserSubscription->setCourse($course);
  1114.         }
  1115.         
  1116.         $form $this->formFactory->create(CourseUserTransfertType::class, $courseUserSubscription, [
  1117.             'action' => $this->urlGenerator->generate('front.course.transfert', [
  1118.                 'id' => $course->getId(),
  1119.             ]),
  1120.         ]);
  1121.         $form->handleRequest($request);
  1122.         if ($form->isSubmitted() && $form->isValid()) {
  1123.             $ancienneCourse $request->get('ancienneCourse');
  1124.             $oldCourse $this->repository->findOneBy([
  1125.                 'id' => $request->get('ancienneCourse'),
  1126.             ]);
  1127.             $nouvelleCourse $this->repository->findOneBy([
  1128.                 'id' => $request->get('courseSelect'),
  1129.             ]);
  1130.             $price $request->get('price-value-totalInput');
  1131.             $newCourseSub = new CourseUserSubscription();
  1132.             $newCourseSub->setCourse($nouvelleCourse);
  1133.             $newCourseSub->setPrice($price);
  1134.             $newCourseSub->setReference(uniqid(''false));
  1135.             $newCourseSub->setBrandStripe($request->get('stripeIntentPaymentMethod'));
  1136.             $newCourseSub->setIdChargeStripe($request->get('stripeIntentId'));
  1137.             $newCourseSub->setLast4Stripe($request->get('stripeSubscription'));
  1138.             $newCourseSub->setStatusStripe($request->get('stripeIntentStatus'));
  1139.             //$this->courseUserSubscriptionRepository->save($newCourseSub);
  1140.             $this->entityManager->persist($newCourseSub);
  1141.             $this->entityManager->flush();
  1142.             /** Insertion dans la nouvelle table transfert */
  1143.             $CourseUserTransfert = new CourseUserTransfert();
  1144.             $CourseUserTransfert->setOldCourse($oldCourse);
  1145.             $CourseUserTransfert->setNewCourse($nouvelleCourse);
  1146.             $CourseUserTransfert->setCourseSubscription($newCourseSub);
  1147.             $CourseUserTransfert->setPrice($price);
  1148.             $CourseUserTransfert->setParticipant($this->currentUserGetterService->getUser());
  1149.             $this->entityManager->persist($CourseUserTransfert);
  1150.             $this->entityManager->flush();
  1151.             $newCourseSub->setCourseTransfert($CourseUserTransfert);
  1152.             //CourseUserTransfertRepository
  1153.             /** Delete ancienne en prenant en consideration si duo **/
  1154.             $subscriptionTodelete $this->courseUserSubscriptionRepository->findOneBy([
  1155.                 'course' => $oldCourse,
  1156.                 'createdBy' => $this->currentUserGetterService->getUser()
  1157.             ]);
  1158.             
  1159.             if($subscriptionTodelete != null){
  1160.                 $documentsCourse $this->DocumentRepository->findBy([
  1161.                     'courseUserSubscription' => $subscriptionTodelete->getId(),
  1162.                 ]);
  1163.                 
  1164.                 if($documentsCourse != null){
  1165.                     foreach ($documentsCourse as $document){
  1166.                         $this->entityManager->remove($document);
  1167.                     }
  1168.                 }
  1169.                 
  1170.                 $subscriptionParent $this->courseUserSubscriptionRepository->findOneBy([
  1171.                     'parent' => $subscriptionTodelete->getId(),
  1172.                 ]);
  1173.                 $subscriptionChild $this->courseUserSubscriptionRepository->findOneBy([
  1174.                     'child' => $subscriptionTodelete->getId(),
  1175.                 ]);
  1176.                 if($subscriptionParent != null){
  1177.                     $subscriptionParent->setParent(null);
  1178.                     $subscriptionParent->setCategory(CourseUserSubscriptionCategoryEnum::SOLO);
  1179.                     $this->repository->save($subscriptionParent);
  1180.                     $this->entityManager->flush();
  1181.                 }
  1182.                 if($subscriptionChild != null){
  1183.                     $subscriptionChild->setChild(null);
  1184.                     $subscriptionChild->setCategory(CourseUserSubscriptionCategoryEnum::SOLO);
  1185.                     $this->repository->save($subscriptionChild);
  1186.                     $this->entityManager->flush();
  1187.                 }
  1188.                 if (CourseUserSubscriptionCategoryEnum::SOLO === $subscriptionTodelete->getCategory()) {
  1189.                     $subscriptionTodelete->setStatus(0);
  1190.                     $this->courseUserSubscriptionRepository->save($subscriptionTodelete);
  1191.                     $this->entityManager->flush();
  1192.                     //    $this->entityManager->remove($subscriptionTodelete);
  1193.                 }else{
  1194.                     $subscriptionTodelete->setStatus(0);
  1195.                     $this->courseUserSubscriptionRepository->save($subscriptionTodelete);
  1196.                     $this->entityManager->flush();
  1197.                     //$this->entityManager->remove($subscriptionTodelete);
  1198.                 }
  1199.                 
  1200.             }
  1201.             
  1202.             $this->entityManager->flush();
  1203.             /**  End Delete **/
  1204.           
  1205.             
  1206.            
  1207.             $oldUrl $this->urlGenerator->generate('front.course.singleSubscriptionsUser', [
  1208.                 'id' => $newCourseSub->getCourse()->getId(),
  1209.             ]);
  1210.             return new RedirectResponse($this->urlGenerator->generate('front.course.transfert_payment_success',[
  1211.                 'subscription_id' => (string) $newCourseSub->getId(),
  1212.                 'old_url' => $oldUrl
  1213.             ]));
  1214.         }
  1215.         //$intent = $this->stripeService->paymentIntent($course);
  1216.         $courses $this->repository->createQueryBuilder('d')
  1217.         ->where('d.bloqueCourse = false or d.bloqueCourse IS NULL')
  1218.         ->andWhere('d.openingDate <= :datenow')
  1219.         ->andWhere('d.closingDate > :datenow')
  1220.         ->setParameter('datenow', new \DateTIME('NOW'))
  1221.         ->addOrderBy('d.startDate''ASC'
  1222.         ->getQuery()
  1223.         ->getResult();
  1224.         foreach($courses as $key => $courseSelected){
  1225.             $sub $this->courseUserSubscriptionRepository->createQueryBuilder('d')
  1226.             ->where('d.course = :course')
  1227.             ->setParameter('course'$courseSelected->getId())
  1228.             ->getQuery()
  1229.             ->getResult();
  1230.             if(count($sub) >= $courseSelected->getNumberPlaces() + $courseSelected->getAvailableMargin()){
  1231.                 unset($courses[$key]);
  1232.             }else{
  1233.                 $subUser $this->courseUserSubscriptionRepository->createQueryBuilder('d')
  1234.                 ->where('d.course = :course and d.createdBy = :user')
  1235.                 ->setParameter('course'$courseSelected->getId())
  1236.                 ->setParameter('user'$this->currentUserGetterService->getUser())
  1237.                 ->getQuery()
  1238.                 ->getResult();
  1239.                 if($subUser != null){
  1240.                     unset($courses[$key]);
  1241.                 }
  1242.             }
  1243.         }
  1244.         
  1245.    
  1246.         return new Response($this->twig->render('front/course/_transfert-form.html.twig', [
  1247.             'course' => $course,
  1248.             'courses' => $courses,
  1249.             'form' => $form->createView(),
  1250.             'stripe_public_key_live' =>  $_ENV["STRIPE_PUBLIC_KEY_LIVE"],
  1251.             //'intentSecret' => $intent['client_secret'],
  1252.         ]));
  1253.     }
  1254.         /**
  1255.      * @Route("/transfert-payment-success", name="transfert_payment_success",
  1256.      *     methods={"GET"},
  1257.      * )
  1258.      */
  1259.     public function transfertPaymentSuccess(Request $request): Response
  1260.     {
  1261.         $subscriptionId $request->get('subscription_id');
  1262.         $oldUrl $request->get('old_url');
  1263.         
  1264.         /** @var CourseUserSubscription $subscription */
  1265.         $subscription $this->entityManager->find(CourseUserSubscription::class, $subscriptionId);
  1266.         $this->flashBag->add('success''Votre paiement a bien été enregistré et votre inscription est effectué. Vous avez jusqu\'à '$subscription->getCourse()->getClosingDate()->format('d-m-Y') .' pour compléter votre inscription et fournir les documents requis ');
  1267.         $subscription->setPaymentStatus(CourseUserSubscriptionPaymentStatusEnum::APPROVED);
  1268.         $subscription->setProgressiveStatus(0);
  1269.       
  1270.         $this->entityManager->flush();
  1271.         if($subscription->getIsChild() ==1){
  1272.             $this->sendMailInvitationCourse($subscription);
  1273.         }else{
  1274.             $this->sendMailSubscribeCourse($subscription);
  1275.         }
  1276.         // Creation de la facture
  1277.         $date = new \DateTime();
  1278.         $Laststatement_num $this->FactureRepository->findOneBy(array(),array('orderKey'=>'DESC'),1,0);
  1279.         if($Laststatement_num == null$numInscriment 1;
  1280.         else $numInscriment $Laststatement_num->getOrderKey() + 1;
  1281.         $numero $date->format("Ym").sprintf('%04d',$numInscriment);
  1282.         $facture = new Facture();
  1283.             
  1284.             $facture
  1285.                 ->setUser($subscription->getCreatedBy())
  1286.                 ->setSubsciption($subscription)
  1287.                 ->setCourse($subscription->getCourse())
  1288.                 ->setTotal($subscription->getPrice())
  1289.                 ->setStatut("1")
  1290.                 ->setOrderKey($numInscriment)
  1291.                 ->setNumero($numero);
  1292.             $this->FactureRepository->save($facture);
  1293.             $subscription->setFacture($facture);
  1294.             $this->entityManager->flush();
  1295.         return new RedirectResponse($oldUrl);
  1296.     }
  1297.     /**
  1298.      * @Route("/get_course_detail",
  1299.      *     name="get_course_detail",
  1300.      *     options={ "expose": true },
  1301.      * methods={"GET"})
  1302.      */
  1303.     public function getCourseDetail(Request $request): JsonResponse
  1304.     {
  1305.         $course $this->repository->findOneBy([
  1306.             'id' => $request->get('courseSelect'),
  1307.         ]);
  1308.         $ancienneCourse $this->repository->findOneBy([
  1309.             'id' => $request->get('ancienneCourse'),
  1310.         ]);
  1311.         if($course != null and $ancienneCourse != null){
  1312.             if($ancienneCourse->getPrice() >= $course->getPrice()){
  1313.                 $newPrice $course->getFraisTransfert();
  1314.             }else{
  1315.                 $newPrice $course->getPrice() + $course->getFraisTransfert();
  1316.             }
  1317.         }else{
  1318.             $newPrice 0;
  1319.         }
  1320.         
  1321.        
  1322.         if($course != null){
  1323.             return new JsonResponse([
  1324.                 'status' => 'success'
  1325.                 'course' => $course,
  1326.                 'price' => $newPrice
  1327.                 ]);
  1328.         }else{
  1329.             return new JsonResponse([
  1330.                 'status' => 'error'
  1331.                 'course' => null,
  1332.                 'price' => null
  1333.                 ]);
  1334.         }
  1335.         
  1336.     }
  1337.        
  1338.     
  1339.     
  1340. }