src/Controller/Front/PurchaseController.php line 169

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Educational\Course;
  4. use App\Entity\Management\Subscription\Discount;
  5. use App\Entity\Management\Subscription\Formule;
  6. use App\Entity\Management\Subscription\Offer;
  7. use App\Entity\Management\Subscription\PaymentFutur;
  8. use App\Entity\Management\Subscription\Subscription;
  9. use App\Entity\Management\Subscription\Transaction;
  10. use App\Entity\Management\Subscription\TransactionDashboard;
  11. use App\Entity\Management\Subscription\TransactionTunnel;
  12. use App\Entity\Management\Subscription\TypeOffer;
  13. use App\Entity\Users\Child;
  14. use App\Entity\Users\Parents;
  15. use App\Entity\Users\User;
  16. use App\Entity\Users\StudentsParents;
  17. use App\Form\ParentsRegistrationType;
  18. use App\Form\ParentsRegistrationSecondStepType;
  19. use App\Manager\Purchase\PurchaseTunnelManager;
  20. use App\Service\Brevo;
  21. use App\Service\DataAnalalysisChild;
  22. use App\Service\Mailer\SubscriptionMailer;
  23. use App\Service\StripeService;
  24. use App\Service\JWTService;
  25. use Doctrine\ORM\EntityManagerInterface;
  26. use Stripe\Exception\ApiErrorException;
  27. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  28. use Symfony\Component\HttpFoundation\JsonResponse;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use Symfony\Component\HttpFoundation\Response;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  33. use Symfony\Component\EventDispatcher\EventDispatcher;
  34. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  35. class PurchaseController extends AbstractController
  36. {
  37.      // Ne pas effacer
  38.     /**
  39.      * @return void
  40.      * @Route("creation-compte-etape-1")
  41.      */
  42.     public function redirectionOldPurchase(Request $request){
  43.         $offre $request->get('offre');
  44.         if($offre){
  45.             if($offre == "assistance-visio"){
  46.                 return $this->redirectToRoute('choix-formule-step',['offre'=>'assistance-visio'],301);
  47.             }
  48.         }
  49.         return $this->redirectToRoute('choix-formule-step',['offre'=>'autonomie'],301);
  50.     }
  51.     /**
  52.      * @Route("/choix-formule-etape-1", name="choix-formule-step")
  53.      */
  54.     public function stepOne(Request $requestEntityManagerInterface $entityManager){
  55.         $user    $this->getUser();
  56.         $session $request->getSession();
  57.         $session->set('mode_tunnel_free'true);
  58.         if($user){
  59.             if($user instanceof Parents || $user instanceof Child ){
  60.                 if($user instanceof Parents ){
  61.                     if(!$session->has('mode_tunnel_free')) {
  62.                         $this->addFlash('notice''Pour un nouveau abonnement ou renouveler un abonnement, veuillez cliquer sur "ajouter un autre enfant ou soucrire à une offre".');
  63.                         return $this->redirectToRoute('account', ['menu' => 'subscription']);
  64.                     }
  65.                     $nbr $entityManager->getRepository(Subscription::class)->listSubOffer($user);
  66.                     $session->set('mode_tunnel_free'$nbr == 0);
  67.                 }
  68.                 if($user instanceof Child){
  69.                     $last $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  70.                     if($last){
  71.                         if(!$last->isActif() && $last->getGuardiant()){
  72.                             $paramerters array_merge($request->query->all(),['_switch_user'=>$last->getGuardiant()->getEmail()]);
  73.                             return $this->redirectToRoute('choix-formule-step',$paramerters);
  74.                         }else{
  75.                             $this->addFlash('notice','Pour un nouveau abonnement, veuillez cliquer sur "ajouter un autre enfant ou soucrire à une offre".".');
  76.                             return $this->redirectToRoute('account',[
  77.                                 'menu'=>'subscription',
  78.                                 '_switch_user'=>$last->getGuardiant()->getEmail(),
  79.                             ]);
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.         $session  $request->getSession();
  86.         $get_Offer $request->get('offre')?(in_array($request->get('offre'),['autonomie','assistance-visio','bac-francais'])?$request->get('offre'):'autonomie'):'autonomie';
  87.         $session->set('choice-tunnel-offer',$get_Offer);
  88.         $listOffer  = [];
  89.         $typeOffer null;
  90.         if($get_Offer == "autonomie"){
  91.             $typeOffer $entityManager->getRepository(TypeOffer::class)->findOneBySlug('autonomie');
  92.             $priceMark 13.99;
  93.         }else{
  94.             $typeOffer $entityManager->getRepository(TypeOffer::class)->findOneBySlug('visio');
  95.             $priceMark 29.99;
  96.         }
  97.         if($typeOffer){
  98.             $CheepOffer   $entityManager->getRepository(Offer::class)->findOneBy(['typeOffer'=>$typeOffer->getId(),'online'=>1],['price'=>'asc']);
  99.             if($CheepOffer){
  100.                 $priceMark $CheepOffer->getPrice();
  101.             }
  102.             $listOffer    $entityManager->getRepository(Offer::class)->findBy(['online'=>1,'typeOffer'=>$typeOffer->getId()],['position'=>'desc']);
  103.         }
  104.         $offerAssitance $this->getDoctrine()->getManager()->getRepository(Offer::class)->findOneByslug("abonnement-assistance-22");
  105.         $offerMentorat  $this->getDoctrine()->getManager()->getRepository(Offer::class)->findOneByslug("visio-mois-3999");
  106.         $offerBacFrancais $this->getDoctrine()->getManager()->getRepository(Offer::class)->findOneByslug("bac-francais");;
  107.         if($request->isMethod('post')){
  108.             if($request->request->has('offer')){
  109.                 $slugOffer $request->request->get('offer');
  110.                 $child     $request->request->get('child');
  111.                 $child     $child??1;
  112.                 $session->set('child'$child);
  113.                 $session->set('slugOffer'$slugOffer);
  114.                 if($request->request->has('discount')){
  115.                     $slugDiscount $request->request->get('discount');
  116.                     $session->set('slugDiscount'$slugDiscount);
  117.                 }
  118.                 return $this->redirectToRoute('front-registration-purchase',['offre'=>$get_Offer]);
  119.             }
  120.         }
  121.         $childform = [];
  122.         if(!$session->has('mode_tunnel_free')){
  123.             $session->set('mode_tunnel_free',true);
  124.         }
  125.         return $this->render('front/tunnel/step1.html.twig',[
  126.             "getOffer" => $get_Offer,
  127.             "children" => $childform,
  128.             "offerAssitance"=> $offerAssitance,
  129.             "offerMentorat" => $offerMentorat,
  130.             "offerBacFrancais"=>$offerBacFrancais,
  131.             'listOffer'=>array_reverse($listOffer),
  132.             'typeOffer'=>$typeOffer,
  133.             'priceMark'=>$priceMark,
  134.             'getPrice'=>$request->get('price'),
  135.             'mode_tunnel'=>$session->has('mode_tunnel'),
  136.             'mode_free'=>$session->has('mode_tunnel_free')?$session->get('mode_tunnel_free'):true
  137.         ]);
  138.     }
  139.     /**
  140.      * @Route("/choix-formule-etape-2", name="front-registration-purchase")
  141.      *
  142.      */
  143.     public function parentInformationEssaiGratuit(Request $requestEntityManagerInterface $entityManager): Response
  144.     {
  145.         $session  $request->getSession();
  146.         $slugOffer $session->get('slugOffer');
  147.         if($session->has('mode_tunnel') && $session->get('mode_tunnel') == 'renew_sub'){
  148.             return $this->redirectToRoute('front_purchase_cb',['offre'=>$slugOffer]);
  149.         }
  150.         if(!$slugOffer){
  151.             return $this->redirectToRoute('choix-formule-step');
  152.         }
  153.         $nameParent "";
  154.         $profileParent "parent";
  155.         $isNewsletterParent false;
  156.         $isSubmit false;
  157.         $get_Offer $session->get('choice-tunnel-offer');
  158.         $nbr       $session->get('child');
  159.         $formOptions['prenom_parent'] = $nameParent;
  160.         $formOptions['profil_parent'] = $profileParent;
  161.         $formOptions['newsletter_parent'] = $isNewsletterParent;
  162.         $formOptions['offer'] = $get_Offer;
  163.         $specialiteError "";
  164.         $displaySpecialiteError false;
  165.         $parents $this->getUser();
  166.         $form $this->createForm(ParentsRegistrationSecondStepType::class, $parents$formOptions);
  167.         $form->handleRequest($request);
  168.         if ($form->isSubmitted()) {
  169.             if ($form->isValid()) {
  170.                 $data $request->request->all();
  171.                 $session->set('customInfosSecondStep',$data );
  172.                 $childNbr count($data["parents_registration_second_step"]["childrenForm"]);
  173.                 $session->set('child',$childNbr);
  174.                 return $this->redirectToRoute('front_purchase_cb',['offre'=>$get_Offer]);
  175.             }
  176.             $isSubmit true;
  177.         }
  178.         $slugOffer $session->get('slugOffer');
  179.         $offer         $entityManager->getRepository(Offer::class)->findOneBySlug($slugOffer);
  180.         return $this->render('front/tunnel/step2.html.twig', [
  181.             'form'                   => $form->createView(),
  182.             'isSubmit'               => $isSubmit,
  183.             'profilEleveParent'      => $profileParent,
  184.             'specialiteError'        => $specialiteError,
  185.             'displaySpecialiteError' => $displaySpecialiteError,
  186.             'get_offer'              => $get_Offer,
  187.             'nbr'                    => intval($nbr),
  188.             'offer'                  => $offer,
  189.             'mode_tunnel'=>$session->has('mode_tunnel')
  190.         ]);
  191.     }
  192.     /**
  193.      * @Route("/informations-paiement-etape-3", name="front_purchase_cb")
  194.      */
  195.     public function recapCB(Request $request,EntityManagerInterface $entityManagerStripeService $stripeService,PurchaseTunnelManager $purchaseTunnelManager){
  196.         $em        $this->getDoctrine()->getManager();
  197.         $session   $request->getSession();
  198.         $get_Offer $session->get('choice-tunnel-offer');
  199.         $customInfosSecondStep $session->get('customInfosSecondStep');
  200.         $discount  $session->get('slugDiscount');
  201.         $slugOffer $session->get('slugOffer');
  202.         $offer     $em->getRepository(Offer::class)->findOneBySlug($slugOffer);
  203.         $user      $this->getUser();
  204.        if($user){
  205.            $nbr $entityManager->getRepository(Subscription::class)->listSubOffer($user);
  206.            $session->set('mode_tunnel_free'$nbr == 0);
  207.        }
  208.         if($this->getUser() && $session->get('mode_tunnel')=='renew_sub'){
  209.                 $subId $session->get('sub_id');
  210.                 $find $em->getRepository(Subscription::class)->findOneBy(['id'=>$subId]);
  211.                 $children[] = $find->getStudent();
  212.         }else{
  213.             if (!$offer || empty($customInfosSecondStep)) {
  214.                 $this->addFlash('notice''Vous n\'êtes pas autorisé');
  215.                 return $this->redirectToRoute('front');
  216.             }
  217.             $children $customInfosSecondStep["parents_registration_second_step"]["childrenForm"];
  218.         }
  219.         $discount $em->getRepository(Discount::class)->findOneByCodePromo($discount);
  220.         $amount   $offer->getPrice();
  221.         $toto     0;
  222.         $i        0;
  223.         $applyDiscountMultiChild false;
  224.         if(!is_null($offer->getDiscount()) && !is_null($discount) ){
  225.             if($offer->getDiscount()->getId() == $discount->getId()){
  226.                 $applyDiscountMultiChild true;
  227.             }
  228.         }
  229.         foreach ($children as $child){
  230.             if($i==0){
  231.                 if($discount){
  232.                     if(!is_null($discount->getPercent())){
  233.                         $toto+=$amount - ($discount->getPercent()*$amount)/100;
  234.                     }else{
  235.                         $toto+=$amount $discount->getAmount();
  236.                     }
  237.                 }else{
  238.                     $toto=+$amount;
  239.                 }
  240.             }
  241.             if ($i == 1) {
  242.                 if(!$applyDiscountMultiChild){
  243.                     $toto+=$amount - (20*$amount)/100;
  244.                 }else{
  245.                     $toto+=$amount - (35*$amount)/100;
  246.                 }
  247.             }
  248.             if ($i1) {
  249.                 if(!$applyDiscountMultiChild){
  250.                     $toto+=$amount - (30*$amount)/100;
  251.                 }else{
  252.                     $toto+=$amount - (45*$amount)/100;
  253.                 }
  254.             }
  255.             $i++;
  256.         }
  257.         $amount round($toto,2);
  258.         return $this->render('front/tunnel/step3.html.twig',[
  259.             'SPK'      =>$stripeService->getPublishableKey(),
  260.             'get_Offer'=>$get_Offer,
  261.             'children' =>$children,
  262.             'offer'    =>$offer,
  263.             'discount' =>$discount,
  264.             'amount'   =>$amount,
  265.             'mode_tunnel'=>$session->has('mode_tunnel'),
  266.             'mode_free'=>$session->has('mode_tunnel_free')?$session->get('mode_tunnel_free'):true
  267.         ]);
  268.     }
  269.     /**
  270.      * @return JsonResponse
  271.      * @Route("/setup/subscription/paiement",name="setup-subscription-paiement")
  272.      */
  273.     public function setupSubscriptionIntentPayment_new(Request $request,PurchaseTunnelManager $purchaseTunnelManagerStripeService $stripeService,EntityManagerInterface $entityManager)
  274.     {
  275.         $session $request->getSession();
  276.         $newParents false;
  277.         if($request->isXmlHttpRequest()){
  278.             if (!empty($session->get('slugOffer'))) {
  279.                 $paymentMethod  $request->request->get('pmId');
  280.                 if($this->getUser()){
  281.                     $parents  $this->getUser();
  282.                 }else{
  283.                     $newParents true;
  284.                     $parents  $purchaseTunnelManager->registrationParentEssaiGratuit();
  285.                     $entityManager->persist($parents);
  286.                     $entityManager->flush();
  287.                 }
  288.                 $slugOffer     $session->get('slugOffer');
  289.                 $slugDiscount  $session->get('slugDiscount');
  290.                 $offer         $entityManager->getRepository(Offer::class)->findOneBySlug($slugOffer);
  291.                 $coupon        $slugDiscount?$entityManager->getRepository(Discount::class)->findOneByCodePromo($slugDiscount):null;
  292.                 if($offer){
  293.                       try {
  294.                         $parentsInfosData = ['firstname'=>$parents->getFirstname(),'lastname'=>$parents->getLastname(),'phone'=>$parents->getPhone()];
  295.                         if($session->has('mode_tunnel')){
  296.                             $tt = new TransactionDashboard();
  297.                             $tt->setSubscription("new");
  298.                             $tt->setPaymentIntent("new");
  299.                             if($session->get('mode_tunnel')=='renew_sub' ){
  300.                                 $subId $session->get('sub_id');
  301.                                 $tt->setSubscription("renew_sub");
  302.                                 $tt->setSubsStripeId($subId);
  303.                             }
  304.                         }else{
  305.                             $tt = new TransactionTunnel();
  306.                             $tt->setInfosParents([$parentsInfosData]);
  307.                         }
  308.                         if($session->get('mode_tunnel')!='renew_sub' ){
  309.                             $infosChild       $session->get('customInfosSecondStep')["parents_registration_second_step"]['childrenForm'];
  310.                             $tt->setInfosChild($infosChild);
  311.                         }
  312.                         $tt->setEmailParents($parents->getEmail());
  313.                         $tt->setCustomer($parents);
  314.                         $tt->setIsfinish(false);
  315.                         $tt->setOffer($offer);
  316.                         $tt->setDiscount($coupon);
  317.                         $entityManager->persist($tt);
  318.                         $entityManager->flush();
  319.                         $freeMode $session->get('mode_tunnel_free');
  320.                         $stripeService->createDefaultCardByPaymentMethod($parents,$paymentMethod);
  321.                         if(!$freeMode){
  322.                             $data = [
  323.                                 'offer'=>$slugOffer,
  324.                                 'coupon'=>$slugDiscount,
  325.                             ];
  326.                             $return $stripeService->createNewSubOnDash($parents,$data);
  327.                             $tt->setPaymentIntent($return['paymentIntentId']);
  328.                             $tt->setSubsStripeId($return['subId']);
  329.                             $entityManager->flush();
  330.                             return new JsonResponse(['tt'=>$tt->getId(),'success'=>true,'subId'=>$return['subId'],'clientSecret'=>$return['paymentSecretClient'],'payment_id'=>$return['paymentIntentId']]);
  331.                         }else{
  332.                             $parameters = [
  333.                                 'usage' => 'off_session',
  334.                                 'payment_method'=>$paymentMethod,
  335.                                 'automatic_payment_methods' => [
  336.                                     'enabled' => true,
  337.                                 ],
  338.                                 'payment_method_options' => ['card' => ['request_three_d_secure' => 'automatic']]
  339.                             ];
  340.                             if(!is_null($parents->getId()) && $parents->getStripeId()){
  341.                                 $parameters['customer'] = $parents->getStripeId();
  342.                             }
  343.                             $si $stripeService->getStripeClient()->setupIntents->create($parameters);
  344.                         }
  345.                         $tt->setSetupIntent($si->id);
  346.                         $entityManager->flush();
  347.                         return new JsonResponse(['tt'=>$tt->getId(),'success'=>true,'subId'=>null,'clientSecret'=>$si->client_secret,'setup_id'=> $si->id,'pending_id'=>null]);
  348.                     } catch (\Exception $e) {
  349.                           if(isset($tt)){
  350.                               $tt->setCustomer(null);
  351.                               $entityManager->flush();
  352.                           }
  353.                           if($newParents){
  354.                               $entityManager->remove($parents);
  355.                               $entityManager->flush();
  356.                               $stripeService->deleteCustomer($parents->getStripeId());;
  357.                           }
  358.                         return new JsonResponse(['success' => false'msg'=>$e->getMessage()]);
  359.                     }
  360.                 }
  361.             }
  362.             return new JsonResponse(['success' => false,'msg'=>"Offre n'a pas été sélectionnée"]);
  363.         }
  364.         return $this->redirectToRoute('');
  365.     }
  366.     /**
  367.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  368.      * @Route("/confirm/subscription/paiement/stripe",name="confirm-subscription-2")
  369.      */
  370.     public function confirmSubscriptionPayment2(Request $request,PurchaseTunnelManager $purchaseTunnelManagerStripeService $stripeService,EntityManagerInterface $entityManager,Brevo $brevo,SubscriptionMailer $subscriptionMailer)
  371.     {
  372.         $em        $this->getDoctrine()->getManager();
  373.         $now       = new \DateTime('now');
  374.         $td null;
  375.         $trialDate = clone $now;
  376.         $trialDate->modify('+7 days')->modify('-1 minutes');
  377.         if($request->query->has('tt_id')){
  378.             $tdId $request->get('tt_id');
  379.             $td   $em->getRepository(Transaction::class)->find($tdId);
  380.         }
  381.         if($request->query->has('setup_intent')){
  382.             $payment_intent  $request->get('setup_intent');
  383.             if(!$td){
  384.                 $td $em->getRepository(Transaction::class)->findOneBy(['setupIntent'=>$payment_intent]);
  385.             }
  386.             $findPayment     $stripeService->getStripeClient()->setupIntents->retrieve($payment_intent);
  387.         }else{
  388.             $payment_intent  $request->get('payment_intent');
  389.             $pi $stripeService->getStripeClient()->paymentIntents->retrieve($payment_intent);
  390.             if(!$td){
  391.                 $td $em->getRepository(Transaction::class)->findOneBy(['paymentIntent'=>$payment_intent]);
  392.                 if(!$td && $pi && $pi->invoice){
  393.                     $invoice $stripeService->getStripeClient()->invoices->retrieve($pi->invoice);
  394.                     if($invoice->status == 'paid'){
  395.                         $subscription $stripeService->getStripeClient()->subscriptions->retrieve($invoice->subscription);
  396.                         if($subscription){
  397.                             $td $em->getRepository(Transaction::class)->findOneBy(['subsStripeId'=>$subscription->id]);
  398.                         }
  399.                     }
  400.                 }
  401.             }
  402.             $findPayment     $stripeService->getStripeClient()->paymentIntents->retrieve($payment_intent);
  403.         }
  404.         if( $td && $findPayment->status == 'succeeded'){
  405.             $session $request->getSession();
  406.             $applyDiscountMultiChild false;
  407.             if(!is_null($td->getOffer()->getDiscount()) && !is_null($td->getDiscount()) ){
  408.                 if($td->getOffer()->getDiscount()->getId() == $td->getDiscount()->getId()){
  409.                     $applyDiscountMultiChild true;
  410.                 }
  411.             }
  412.             if(!$td->isIsfinish()) {
  413.                 $children $subscriptions =[];
  414.                 if ($session->has('mode_tunnel') && $this->getUser()) {
  415.                     $parents $this->getUser();
  416.                 }else{
  417.                     $parents $entityManager->getRepository(Parents::class)->findOneBy(['email'=>$td->getEmailParents()]);
  418.                 }
  419.                 $clientStripe $stripeService->createCustomer($parents$findPayment->payment_method);
  420.                 $parents->setStripeId($clientStripe->id);
  421.                 $entityManager->flush();
  422.                 $stripeService->createDefaultCardByPaymentMethod($parents,$findPayment->payment_method);
  423.                 if ($session->has('mode_tunnel')) {
  424.                     if($session->get('mode_tunnel')=='renew_sub'){
  425.                         $subId $session->get('sub_id');
  426.                         $find  $entityManager->getRepository(Subscription::class)->find($subId);
  427.                         $children[] = $find->getStudent();
  428.                     }
  429.                 }
  430.                 if(!empty($td->getInfosChild())){
  431.                     foreach ($td->getInfosChild() as $infosChild) {
  432.                         $child = new Child();
  433.                         $child->setFirstname($infosChild['firstname']);
  434.                         $child->setLastname('LBP');
  435.                         $course $entityManager->getRepository(Course::class)->find($infosChild['course']);
  436.                         $child->setCourse($course);
  437.                         $date = new \DateTime('now');
  438.                         $date $date->format('YmdHis');
  439.                         $uniq uniqid();
  440.                         $child->setUsername(uniqid() . '-' $date);
  441.                         $child->setEmail(sprintf('%[email protected]'$uniq));
  442.                         $child->setUsername(sprintf('%[email protected]'$uniq));
  443.                         $child->setPassword('test');
  444.                         $child->setEmailValidationToken(0);
  445.                         $child->setEmailValidationTokenRequestedAt(new \DateTime('now'));
  446.                         $child->setParentEmail($parents->getEmail());
  447.                         $child->setRoles(['ROLE_STUDENT']);
  448.                         if ($td->getOffer()->getTypeOffer() && $td->getOffer()->getTypeOffer()->getSlug() == 'visio') {
  449.                             $child->setRoles(['ROLE_STUDENT''ROLE_MENTORAT']);
  450.                         }
  451.                         $entityManager->persist($child);
  452.                         $entityManager->flush();
  453.                         $children[] = $child;
  454.                     }
  455.                 }
  456.                 $freeMode $session->has('mode_tunnel_free')?$session->get('mode_tunnel_free'):true;
  457.                 $i $amount 0;
  458.                 foreach ($children as $child) {
  459.                     if($session->get('mode_tunnel')!='renew_sub'){
  460.                         $studentParents = new StudentsParents();
  461.                         $studentParents->setStudent($child);
  462.                         $studentParents->setParents($parents);
  463.                         $studentParents->setEnabled(true);
  464.                         $entityManager->persist($studentParents);
  465.                         $entityManager->flush();
  466.                     }
  467.                     $sub = new Subscription();
  468.                     $sub->setDiscount($td->getDiscount());
  469.                     $sub->setSubscripted($now);
  470.                     $sub->setGuardiant($parents);
  471.                     $sub->setStudent($child);
  472.                     $sub->setOffer($td->getOffer());
  473.                     $sub->setBankStripe(true);
  474.                     $sub->setByChecked(false);
  475.                     $sub->setIsMobile(false);
  476.                     if($freeMode){
  477.                         $sub->setTrialDate($trialDate);
  478.                     }
  479.                     $coupon null;
  480.                     if($i == 0){
  481.                         $coupon $td->getDiscount();
  482.                     }
  483.                     if ($i == 1) {
  484.                         if(!$applyDiscountMultiChild){
  485.                             $coupon $entityManager->getRepository(Discount::class)->findOneByStripeId('lbp-rf-2');
  486.                         }else{
  487.                             $coupon $entityManager->getRepository(Discount::class)->findOneByStripeId('LBPCHILD2PROMO');
  488.                         }
  489.                     }
  490.                     if ($i1) {
  491.                         if(!$applyDiscountMultiChild) {
  492.                             $coupon $entityManager->getRepository(Discount::class)->findOneByStripeId('lbp-rf-3');
  493.                         }else{
  494.                             $coupon $entityManager->getRepository(Discount::class)->findOneByStripeId('LBPCHILD3PROMO');
  495.                         }
  496.                     }
  497.                     $sub->setDiscount($coupon);
  498.                     $sub->setPrice($sub->getAmount());
  499.                     $amount+=$sub->getAmount();
  500.                     $entityManager->persist($sub);
  501.                     $entityManager->flush();
  502.                     if(!$td->getOffer()->isCharge()){
  503.                         $coupon $sub->getDiscount();
  504.                         $items[0]=['price'=>$td->getOffer()->getStripeId()];
  505.                         if(!is_null($coupon)){
  506.                             $items[0]['discounts']=[['coupon'=>strtoupper($coupon->getStripeId())]];
  507.                         }
  508.                         $data = [
  509.                             'customer' => $clientStripe->id,
  510.                             'currency' =>'EUR',
  511.                             'items'    =>$items,
  512.                             'default_payment_method'=>$findPayment->payment_method,
  513.                         ];
  514.                         if($freeMode){
  515.                             $data['off_session'] = true;
  516.                             $data['trial_end']=$trialDate->getTimestamp();
  517.                             $subStripe $stripeService->getStripeClient()->subscriptions->create($data);
  518.                             $sub->setStripeId($subStripe->id);
  519.                         }else{
  520.                             $sub->setStripeId($td->getSubsStripeId());
  521.                         }
  522.                         $entityManager->flush();
  523.                     }
  524.                     $subscriptions[] = $sub;
  525.                     $i++;
  526.                 }
  527.                 if($td->getOffer()->isCharge() && $freeMode){
  528.                     $pp = new PaymentFutur();
  529.                     $pp->setParents($parents);
  530.                     $pp->setDatePayment($trialDate);
  531.                     $pp->setPrice($amount);
  532.                     $entityManager->persist($pp);
  533.                     $entityManager->flush();
  534.                     foreach ($subscriptions as $sub) {
  535.                         $sub->setPaymentFutur($pp);
  536.                         $entityManager->flush();
  537.                     }
  538.                 }
  539.                 if(!$this->getUser()){
  540.                     $token = new UsernamePasswordToken($parents$parents->getPassword(), "main"$parents->getRoles());
  541.                     $this->get("security.token_storage")->setToken($token);
  542.                     $this->get('session')->set('_security_main'serialize($token));
  543.                     $event = new InteractiveLoginEvent($request$token);
  544.                     $dispatcher = new EventDispatcher();
  545.                     $dispatcher->dispatch($event"security.interactive_login");
  546.                 }
  547.                 if(!is_null($td->getOffer()) && $freeMode){
  548.                     try{
  549.                         $typeOffer $td->getOffer()->getTypeOffer();
  550.                         if($typeOffer->getSlug() == 'visio'){
  551.                             $brevo->sendCampaignEmail($parents,[685]);
  552.                         }
  553.                         if($typeOffer->getSlug() == 'autonomie'){
  554.                             $brevo->sendCampaignEmail($parents,[684]);
  555.                         }
  556.                     }catch (\Exception $exception){
  557.                     }
  558.                 }
  559.                 $td->setIsfinish(true);
  560.                 $entityManager->flush();
  561.                 $paramerters = ["validation"=>$td->getOffer()->getTypeOffer()->getSlug()=='visio'?'assistance-visio':'autonomie'];
  562.                 if(!$session->has('mode_tunnel')){
  563.                     $subscriptionMailer->essaiGratuitConfirmationMail($parents,$td->getOffer());
  564.                 }else{
  565.                     $paramerters['hasModeDashboard']=1;
  566.                 }
  567.                 $isFree $session->has('mode_tunnel_free')?$session->get('mode_tunnel_free'):true;
  568.                 $session->clear();
  569.                 $session->set('confirmationEssaiGratuit'true);
  570.                 $session->set('toto',$amount);
  571.                 $session->set('mode_tunnel_free',$isFree);
  572.                 return $this->redirectToRoute('purchase-success',$paramerters);
  573.                 //return $this->redirectToRo
  574.             }
  575.         }
  576.     }
  577.     /**
  578.      * @Route("/process/paiement/subscription",name="front_purchase_parent_checkout",methods={"post"})
  579.      */
  580.     public function process(Request $requestStripeService $stripeServicePurchaseTunnelManager $purchaseTunnelManagerSubscriptionMailer $subscriptionMailer,Brevo $brevo)
  581.     {
  582.         $em $this->getDoctrine()->getManager();
  583.         $offer null;
  584.         if ($request->request->has('token') || $request->request->has('paymentIntent')) {
  585.             $session $request->getSession();
  586.             $parents   $purchaseTunnelManager->registrationParentEssaiGratuit();
  587.             $em->persist($parents);
  588.             $em->flush();
  589.             $customerStripeId $request->request->get('customer');
  590.             //$clientStripe   = $stripeService->createCustomer($parents);
  591.             try{
  592.                 if ($request->request->has('token')) {
  593.                     $token $request->request->get('token');
  594.                     $stripeService->createDefaultCard($customerStripeId$token);
  595.                     $purchaseTunnelManager->processCheckout($parentsnull);
  596.                 }
  597.                 if ($request->request->has('paymentIntent')) {
  598.                     $paymentIntent $request->request->get('paymentIntent');
  599.                     $paymentMethod $request->request->get('paymentMethod');
  600.                     $parents->setStripeId($customerStripeId);
  601.                     $stripeService->setupFuturPayment2($parents$paymentMethod);
  602.                     $purchaseTunnelManager->processCheckout2($parents$paymentMethod,$paymentIntent);
  603.                     $slugOffer $session->get('slugOffer');
  604.                     $offer     $em->getRepository(Offer::class)->findOneBySlug($slugOffer);
  605.                     if($offer->getSlug()!='bac-francais'){
  606.                         $subscriptionMailer->essaiGratuitConfirmationMail($parents,$offer);
  607.                     }
  608.                 }
  609.             }
  610.             catch (ApiErrorException $apiErrorException) {
  611.                 $link $em->getRepository(StudentsParents::class)->findByParents($parents->getId());
  612.                 if(!empty($link)){
  613.                     foreach ($link as $item){
  614.                         $em->remove($item);
  615.                         $em->flush();
  616.                     }
  617.                 }
  618.                 $em->remove($parents);
  619.                 $em->flush();
  620.                // $stripeService->deleteCustomer($customerStripeId);
  621.                 $this->addFlash('notice','Une erreur est survenue lors de la procédure de paiement.'.$apiErrorException->getMessage());
  622.                 return $this->redirectToRoute('front_purchase_checkout');
  623.             }catch (\ErrorException $exception){
  624.                 $link $em->getRepository(StudentsParents::class)->findByParents($parents->getId());
  625.                 if(!empty($link)){
  626.                     foreach ($link as $item){
  627.                         $em->remove($item);
  628.                         $em->flush();
  629.                     }
  630.                 }
  631.                // $em->remove($parents);
  632.                 //$em->flush();
  633.                 //$stripeService->deleteCustomer($clientStripe["id"]);
  634.                 $this->addFlash('notice','Une erreur est survenue lors de la procédure de paiement.'.$exception->getMessage());
  635.                 return $this->redirectToRoute('front_purchase_checkout');
  636.             }
  637.           //  $childInfos = $session->get('customInfos')["parents_registration"]['childrenForm'];
  638.            // $subscriptionMailer->firstTrialMail($parents, count($childInfos),  $session->get('customOffer') );
  639.             // login user
  640.             $get_Offer $session->get('choice-tunnel-offer');
  641.             $session->clear();
  642.             if(!$this->getUser()){
  643.                 $token = new UsernamePasswordToken($parents$parents->getPassword(), "main"$parents->getRoles());
  644.                 $this->get("security.token_storage")->setToken($token);
  645.                 $this->get('session')->set('_security_main'serialize($token));
  646.                 $event = new InteractiveLoginEvent($request$token);
  647.                 $dispatcher = new EventDispatcher();
  648.                 $dispatcher->dispatch($event"security.interactive_login");
  649.                 if(!is_null($offer)){
  650.                     try{
  651.                         $typeOffer $offer->getTypeOffer();
  652.                         if($typeOffer->getSlug() == 'visio'){
  653.                             $brevo->sendCampaignEmail($parents,[685]);
  654.                         }
  655.                         if($typeOffer->getSlug() == 'autonomie'){
  656.                             $brevo->sendCampaignEmail($parents,[684]);
  657.                         }
  658.                     }catch (\Exception $exception){
  659.                     }
  660.                 }
  661.             }
  662.             $session->set('choice-tunnel-offer',$get_Offer);
  663.             $session->set('confirmationEssaiGratuit'true);
  664.             return $this->redirectToRoute('purchase-success',["validation"=>$get_Offer]);
  665.         }
  666.     }
  667.     /**
  668.      * @param Request $request
  669.      * @return JsonResponse
  670.      * @Route("/valide-coupon",name="valid_coupon")
  671.      */
  672.     public function validCoupon(Request $requestPurchaseTunnelManager $purchaseTunnelManager)
  673.     {
  674.         if ($request->isXmlHttpRequest()) {
  675.             $coupon $request->get('coupon');
  676.             $elem $purchaseTunnelManager->checkCouponForFirstSubscription($coupon);
  677.             if (is_array($elem)) {
  678.                 return new JsonResponse(['success' => true'data' => $elem]);
  679.             }
  680.             return new JsonResponse(['success' => false]);
  681.         }
  682.     }
  683. }