src/Controller/Front/MissionPurchaseController.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Educational\Discipline;
  4. use App\Entity\Event\RegisterEvent;
  5. use App\Entity\Event\Training\Pack;
  6. use App\Entity\Management\Subscription\Discount;
  7. use App\Entity\Management\Subscription\Mission;
  8. use App\Entity\Management\Subscription\Purchase\MissionExam;
  9. use App\Entity\Management\Subscription\Subscription;
  10. use App\Entity\Management\Subscription\TransactionMission;
  11. use App\Entity\Management\Subscription\TypeOffer;
  12. use App\Entity\Users\Child;
  13. use App\Entity\Users\Parents;
  14. use App\Entity\Users\StudentsParents;
  15. use App\Entity\Users\User;
  16. use App\Form\ParentsRegistrationSecondStepType;
  17. use App\Manager\Purchase\PurchaseTunnelManager;
  18. use App\Service\Mailer\SubscriptionMailer;
  19. use App\Service\StripeService;
  20. use App\Service\JWTService;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Stripe\Exception\ApiErrorException;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\EventDispatcher\EventDispatcher;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  29. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  30. class MissionPurchaseController extends AbstractController
  31. {
  32.     /**
  33.      * @Route("/mission-exam/choix-des-annales",name="choice-mission")
  34.      */
  35.     public function choiceOffer(Request  $request,EntityManagerInterface  $entityManager){
  36.         $getMission         $request->get('mission');
  37.         $getPrice           $request->get('price');
  38.         $popinChoiceMission false;
  39.         $missionsPrice $packs = [];
  40.         $productFb 'bac-francais';
  41.         $title              'Bac français';
  42.         $typeOffer null;
  43.         $user $this->getUser();
  44.         $listMissionCustomer = [];
  45.         if($user instanceof Child){
  46.             $last $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  47.             if($last){
  48.                 $guardiant $last->getGuardiant();
  49.                 if(!is_null($guardiant)){
  50.                     $paramerters array_merge($request->query->all(),['_switch_user'=>$guardiant->getEmail()]);
  51.                     return $this->redirectToRoute('choice-mission',$paramerters );
  52.                 }
  53.                 return $this->redirectToRoute('dashboard');
  54.             }
  55.         }
  56.         if(in_array($getMission,['bac','brevet','bac-francais','bac-francais-techno'])){
  57.             $popinChoiceMission true;
  58.             $slug 'bac-francais';
  59.             $productFb 'bac-francais';
  60.             if($getMission == 'bac'){
  61.                 $slug 'mission-bac';
  62.                 $title 'Bac';
  63.                 $productFb 'bac';
  64.             }
  65.             if($getMission == 'brevet'){
  66.                 $title 'Brevet';
  67.                 $slug 'mission-brevet';
  68.                 $productFb 'brevet';
  69.             }
  70.             if($getMission == 'bac-francais-techno'){
  71.                 $title 'Bac Français technologie';
  72.                 $slug 'bac-francais-techno';
  73.                 $productFb 'bac-francais-techno';
  74.             }
  75.             $missionsPrice $entityManager->getRepository(Mission::class)->getMissionsPrice($slug);
  76.             $typeOffer $entityManager->getRepository(TypeOffer::class)->findOneBySlug($slug);
  77.             if($typeOffer && $typeOffer->isDisplayPack()){
  78.                 $packs $typeOffer->getPacks();
  79.             }
  80.         }
  81.         if($user instanceof Parents){
  82.             $listMissionCustomer $entityManager->getRepository(MissionExam::class)->getAllListMissionByParent($user);
  83.             if(($getMission == 'brevet' || $getMission == 'bac-francais' || $getMission == 'bac-francais-techno') && $typeOffer){
  84.                 $checkIf $entityManager->getRepository(MissionExam::class)->checkIfPurchase($user->getId(),$typeOffer->getId());
  85.                 if(!empty($checkIf)){
  86.                     $this->addFlash('notice',"Vous avez déjà effectué cet achat");
  87.                     return $this->redirectToRoute('dashboard');
  88.                 }
  89.             }
  90.         }
  91.         $session $request->getSession();
  92.         $disciplines $entityManager->getRepository(Discipline::class)->findAll();
  93.         if($request->isMethod('post')){
  94.             $selectDis $request->request->get('dis');
  95.             $price     $request->request->get('price');
  96.             $priceE    $entityManager->getRepository(Mission::class)->find($price);
  97.             if($priceE && (is_array($selectDis) && $priceE->getNbrDis()==count($selectDis) || $getMission != 'bac')){
  98.                 $missionsBasket $session->get('missionExam');
  99.                 $missionsBasket['step_1'] = [
  100.                     'getMission' =>$getMission,
  101.                     'disciplines'=>$selectDis,
  102.                     'price'      =>$price,
  103.                     'discount'   =>$request->request->get('discount'),
  104.                     'titleExam'  =>$title,
  105.                     'productFb'  =>$productFb,
  106.                 ];
  107.                 $session->set('missionExam',$missionsBasket);
  108.                 return $this->redirectToRoute('register-mission',['mission'=>$getMission]);
  109.             }
  110.         }
  111.         return $this->render('front/purchase/mission/choice-offer.html.twig',[
  112.             'disciplines'        =>$disciplines,
  113.             'getMission'         =>$getMission,
  114.             'getPrice'           =>$getPrice,
  115.             'popinChoiceMission' =>$popinChoiceMission,
  116.             'missionsPrice'      =>$missionsPrice,
  117.             'titleExam'          =>$title,
  118.             'typeOffer'          =>$typeOffer,
  119.             'packs'              =>$packs,
  120.             'listMissionCustomer'=>$listMissionCustomer
  121.         ]);
  122.     }
  123.     /**
  124.      * @Route("/mission-exam/register",name="register-mission")
  125.      */
  126.     public function register(Request  $request,EntityManagerInterface  $entityManager){
  127.         $session $request->getSession();
  128.         $missionsBasket $session->get('missionExam');
  129.         $isValid true;
  130.         $parents = new Parents();
  131.         if(!$missionsBasket || !is_array($missionsBasket['step_1'])){
  132.             return $this->redirectToRoute('choice-mission');
  133.         }
  134.         $user $this->getUser();
  135.         $listChild = [];
  136.         $getMission  $missionsBasket['step_1']['getMission'];
  137.         $title       $missionsBasket['step_1']['titleExam'];
  138.         $price       $missionsBasket['step_1']['price'];
  139.         $formOptions = [];
  140.         $formOptions['profil_parent'] = User::PROFIL_PARENT;
  141.         if($user){
  142.             if($user instanceof Parents){
  143.                 $mission $entityManager->getRepository(Mission::class)->find($price);
  144.                 if($mission){
  145.                     if(($getMission == 'brevet' || $getMission == 'bac-francais' || $getMission == 'bac-francais-techno') && $mission->getTypeOffer()) {
  146.                         $checkIf $entityManager->getRepository(MissionExam::class)->checkIfPurchase($user->getId(), $mission->getTypeOffer()->getId());
  147.                         if (!empty($checkIf)) {
  148.                             $this->addFlash('notice'"Vous avez déjà effectué cet achat");
  149.                             return $this->redirectToRoute('dashboard');
  150.                         }
  151.                     }
  152.                 }
  153.                 $parents $user;
  154.                 $listChild $entityManager->getRepository(StudentsParents::class)->getByParent($user);
  155.                 $missionsBasket['step_2']['isCurrentUser'] = true;
  156.                 $session->set('missionExam',$missionsBasket);
  157.             }else{
  158.                 $last $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  159.                 if($last){
  160.                     $guardiant $last->getGuardiant();
  161.                     $paramerters array_merge($request->query->all(),['_switch_user'=>$guardiant->getEmail()]);
  162.                     return $this->redirectToRoute('register-mission',$paramerters);
  163.                 }
  164.                 return $this->redirectToRoute('dashboard');
  165.             }
  166.         }
  167.         $form $this->createForm(ParentsRegistrationSecondStepType::class, $parents$formOptions);
  168.         $form->handleRequest($request);
  169.         if ($form->isSubmitted()) {
  170.             if ($form->isValid()) {
  171.                 $data $request->request->all();
  172.                 $missionsBasket['step_2']['infos'] = $data;
  173.                 $session->set('missionExam',$missionsBasket);
  174.                 return $this->redirectToRoute('paiement-mission',['mission'=>$getMission]);
  175.             }else{
  176.                 $isValid false;
  177.             }
  178.         }
  179.         $priceE    $entityManager->getRepository(Mission::class)->find($price);
  180.         return $this->render("front/purchase/mission/register.html.twig",[
  181.             'getMission'        => $getMission,
  182.             'form'              => $form->createView(),
  183.             'profilEleveParent' => "parent",
  184.             'isValid'           => $isValid,
  185.             'titleExam'         => $title,
  186.             'listChild'         => $listChild,
  187.             'priceE'            => $priceE
  188.         ]);
  189.     }
  190.     /**
  191.      *
  192.      * @Route("/mission-exam/paiement",name="paiement-mission")
  193.      */
  194.     public function paiement(Request $request,EntityManagerInterface $entityManager,StripeService $stripeService)
  195.     {
  196.         $session $request->getSession();
  197.         $missionsBasket $session->get('missionExam');
  198.         if(!$missionsBasket || !is_array($missionsBasket['step_2'])){
  199.             return $this->redirectToRoute('register-mission');
  200.         }
  201.         $getMission $missionsBasket['step_1']['getMission'];
  202.         $title $missionsBasket['step_1']['titleExam'];
  203.         $productFb $missionsBasket['step_1']['productFb'];
  204.          $mission  $entityManager->getRepository(Mission::class)->find($missionsBasket['step_1']['price']);
  205.          $discount $entityManager->getRepository(Discount::class)->findOneByCodePromo($missionsBasket['step_1']['discount']);
  206.          if($mission){
  207.              $som $mission->getPrice();
  208.              if($discount){
  209.                  $som $mission->getPrice() - $mission->getPrice()*$discount->getPercent()/100;
  210.              }
  211.             $titleDis = [];
  212.              if($missionsBasket['step_1']['disciplines']){
  213.                  foreach ($missionsBasket['step_1']['disciplines'] as $disc){
  214.                      //$discipline = $entityManager->getRepository(Discipline::class)->find($disc);
  215.                      $discipline $entityManager->getRepository(Pack::class)->find($disc);
  216.                      $titleDis[] = $discipline->getTitle();
  217.                  }
  218.              }
  219.              $missionsBasket['step_1']['som'] = $som;
  220.              $session->set('missionExam',$missionsBasket);
  221.              return $this->render("front/purchase/mission/paiement.html.twig",[
  222.                  'SPK'        =>$stripeService->getPublishableKey(),
  223.                  'getMission' =>$getMission,
  224.                  'titleExam'  =>$title,
  225.                  'discount'   =>$discount,
  226.                  'mission'    =>$mission,
  227.                  'som'        =>$som,
  228.                  'titleDis'   =>$titleDis,
  229.                  'productFb'=> $productFb
  230.              ]);
  231.          }
  232.         return $this->redirectToRoute('choice-mission');
  233.     }
  234.     public function processPaiement(){
  235.     }
  236.     /**
  237.      * @return JsonResponse
  238.      * @Route("/setup/charge/paiement",name="setup-mission-paiement")
  239.      */
  240.     public function chargeIntentPayment(Request $requestStripeService $stripeService,EntityManagerInterface $entityManager)
  241.     {
  242.         $session $request->getSession();
  243.         $discountParameters = [];
  244.         $user $this->getUser();
  245.         if($request->isXmlHttpRequest()){
  246.             $paymentMethod  $request->request->get('pid');
  247.             if (!empty($paymentMethod)) {
  248.                 $missionsBasket $session->get('missionExam');
  249.                 if(is_array($missionsBasket['step_1'])){
  250.                     $priceId   $missionsBasket['step_1']['price'];
  251.                     $mission $entityManager->getRepository(Mission::class)->find($priceId);
  252.                     $findDiscount null;
  253.                     if($mission){
  254.                         $som $mission->getPrice();
  255.                         if($missionsBasket['step_1']['discount']){
  256.                             $findDiscount $entityManager->getRepository(Discount::class)->findOneByCodePromo($missionsBasket['step_1']['discount']);
  257.                             if($findDiscount){
  258.                                 $som $mission->getPrice() - $mission->getPrice()*$findDiscount->getPercent()/100;
  259.                             }
  260.                         }
  261.                         $user $this->getUser();
  262.                         if(!$user){
  263.                             $email $missionsBasket['step_2']['infos']['parents_registration_second_step']['email']['first'];
  264.                             $cus $stripeService->getStripeClient()->customers->create([
  265.                                 "email" => $email,
  266.                             ]);
  267.                             $cusId $cus->id;
  268.                         }else{
  269.                             $email $user->getEmail();
  270.                             $cusId $user->getStripeId();
  271.                             if(is_null($cusId)){
  272.                                 $cus $stripeService->getStripeClient()->customers->create([
  273.                                     "email" => $email,
  274.                                 ]);
  275.                                 $cusId $cus->id;
  276.                             }
  277.                         }
  278.                         $invoice $stripeService->getStripeClient()->invoices->create([
  279.                             "description"=>"Facture {$mission->getTypeOffer()->getTitle()} - {$email}",
  280.                             "customer"   =>$cusId
  281.                         ]);
  282.                         $data = [
  283.                             "amount"=>round(100*$mission->getPrice(),0),
  284.                             "description"=>"{$mission->getTypeOffer()->getTitle()} : {$mission->getTitle()}",
  285.                             'currency' => 'eur',
  286.                             'invoice'=>$invoice->id,
  287.                             'customer'=>$cusId
  288.                         ];
  289.                         if($findDiscount){
  290.                             $data['discounts']= [['coupon'=>strtoupper($findDiscount->getStripeId())]];
  291.                         }
  292.                         $stripeService->getStripeClient()->invoiceItems->create($data);
  293.                         $returnInvoice $stripeService->getStripeClient()->invoices->finalizeInvoice($invoice->id);
  294.                         $parameters = ['cus'=>$cusId,'invoice'=>$invoice->id,'paymentMethod'=>$paymentMethod];
  295.                         if($returnInvoice->amount_due!=0){
  296.                             $paymentIntent $stripeService->getStripeClient()->paymentIntents->retrieve($returnInvoice->payment_intent);
  297.                             $parameters array_merge($parameters,['free'=>false,'clientsecret'=>$paymentIntent->client_secret,'pId'=>$paymentIntent->id,]);
  298.                         }else{
  299.                             $parameters['free'] = true;
  300.                         }
  301.                         $missionsBasket['step_3']['paiement'] = ['pi'=>$returnInvoice->id];
  302.                         $session->set('missionExam',$missionsBasket);
  303.                         $infos = [
  304.                             "disciplines" => !empty($missionsBasket['step_1']['disciplines']) ?$missionsBasket['step_1']['disciplines']:null,
  305.                         ];
  306.                         $new = new TransactionMission();
  307.                         $new->setOffer($mission);
  308.                         $new->setEmailParents($email);
  309.                         $new->setDiscount($findDiscount);
  310.                         $new->setInvoice($invoice->id);
  311.                         $new->setCustomer($user);
  312.                         $new->setIsfinish(false);
  313.                         $new->setInfosMissions($infos);
  314.                         $new->setInfosChild(!empty($missionsBasket['step_2']['infos']['parents_registration_second_step']['childrenForm'])?$missionsBasket['step_2']['infos']['parents_registration_second_step']['childrenForm']:[]);
  315.                         $entityManager->persist($new);
  316.                         $entityManager->flush();
  317.                         $parameters['tm'] = $new->getId();
  318.                         return new JsonResponse(array_merge(['success'=>true],$parameters));
  319.                     }
  320.                 }
  321.             }
  322.             return new JsonResponse(['success' => false,]);
  323.         }
  324.         return $this->redirectToRoute('');
  325.     }
  326.     /**
  327.      * @return JsonResponse
  328.      * @Route("/proccess/paiement/mission-exam",name="process-mission-paiement")
  329.      */
  330.     public function proccess(Request $requestSubscriptionMailer $subscriptionMailer,StripeService $stripeService,EntityManagerInterface $entityManager,PurchaseTunnelManager $purchaseTunnelManager)
  331.     {
  332.         if($request->isMethod('post')){
  333.             $user    $this->getUser();
  334.             $session $request->getSession();
  335.             $missionsBasket $session->get('missionExam');
  336.             $childTab = [];
  337.             $newParent false;
  338.             $priceId    $missionsBasket['step_1']['price'];
  339.             $getMission $missionsBasket['step_1']['getMission'];
  340.             $mission   $entityManager->getRepository(Mission::class)->find($priceId);
  341.             if($mission){
  342.                 $som $mission->getPrice();
  343.                 $findDiscount null;
  344.                 if($missionsBasket['step_1']['discount']){
  345.                     $findDiscount $entityManager->getRepository(Discount::class)->findOneByCodePromo($missionsBasket['step_1']['discount']);
  346.                     if($findDiscount){
  347.                         $som $mission->getPrice() - $mission->getPrice()*$findDiscount->getPercent()/100;
  348.                     }
  349.                 }
  350.                 if(!$user){
  351.                     $parent $purchaseTunnelManager->createParentTunnel($missionsBasket['step_2']['infos']['parents_registration_second_step']);
  352.                     $parent->setStripeId($request->request->get('customer'));
  353.                     $entityManager->persist($parent);
  354.                     $entityManager->flush();
  355.                     $newParent true;
  356.                     $token = new UsernamePasswordToken($parent$parent->getPassword(), "main"$parent->getRoles());
  357.                     $this->get("security.token_storage")->setToken($token);
  358.                     $this->get('session')->set('_security_main'serialize($token));
  359.                     $event = new InteractiveLoginEvent($request$token);
  360.                     $dispatcher = new EventDispatcher();
  361.                     $dispatcher->dispatch($event"security.interactive_login");
  362.                 }else{
  363.                     $parent $user;
  364.                     $list $entityManager->getRepository(Parents::class)->findChildrenEntityByParent($parent);
  365.                     foreach ($list as $row){
  366.                         $row->addRoles("ROLE_EXAM");
  367.                         $entityManager->flush();
  368.                         $childTab[] = $row;
  369.                     }
  370.                 }
  371.                 if(!empty($missionsBasket['step_2']['infos']['parents_registration_second_step']['childrenForm'])){
  372.                     $now = new \DateTime('now');
  373.                     foreach ($missionsBasket['step_2']['infos']['parents_registration_second_step']['childrenForm'] as $childinfos){
  374.                         $child $purchaseTunnelManager->registrationStudent($childinfos);
  375.                         $child->addRoles("ROLE_EXAM");
  376.                         $entityManager->persist($child);
  377.                         $entityManager->flush();
  378.                         $stP = new StudentsParents();
  379.                         $stP->setStudent($child);
  380.                         $stP->setParents($parent);
  381.                         $stP->setEnabled(true);
  382.                         $entityManager->persist($stP);
  383.                         $entityManager->flush();
  384.                         $sub = new Subscription();
  385.                         $sub->setOffer($mission);
  386.                         $sub->setStudent($child);
  387.                         $sub->setGuardiant($parent);
  388.                         $sub->setPrice($som);
  389.                         $sub->setSubscripted($now);
  390.                         $sub->setDiscount($findDiscount);
  391.                         $sub->setUnSubscripted((clone $now)->modify('+2 second'));
  392.                         $entityManager->persist($sub);
  393.                         $entityManager->flush();
  394.                         $childTab[] = $child;
  395.                     }
  396.                 }
  397.                 $new = new MissionExam();
  398.                 $new->setMission($mission);
  399.                 $new->setPrice($som);
  400.                 $new->setCustomer($parent);
  401.                 $new->setDiscount($findDiscount);
  402.                 $new->setTitle($mission->getTitle());
  403.                 $new->setNbrDis($mission->getNbrDis());
  404.                 $new->setPaymentIntent($request->request->get('invoice'));
  405.                 $entityManager->persist($new);
  406.                 $entityManager->flush();
  407.                 if($missionsBasket['step_3']){
  408.                     $listPack = empty($missionsBasket['step_1']['disciplines'])?$mission->getTypeOffer()->getPacks():$missionsBasket['step_1']['disciplines'];
  409.                     foreach ($listPack as $disc){
  410.                         //$discipline = $entityManager->getRepository(Discipline::class)->find($disc);
  411.                         $discipline $entityManager->getRepository(Pack::class)->find($disc);
  412.                         if($discipline){
  413.                             //$new->addDisciplines($discipline);
  414.                             $new->addPacks($discipline);
  415.                             $entityManager->flush();
  416.                             foreach ($childTab as $child){
  417.                                 $register = new RegisterEvent($discipline,$child);
  418.                                 $entityManager->persist($register);
  419.                                 $entityManager->flush();
  420.                             }
  421.                         }
  422.                     }
  423.                 }
  424.                 $title $missionsBasket['step_1']['titleExam'];
  425.                 $subscriptionMailer->missionExam($parent$title,$this->getUser(),$newParent);
  426.                 $text="Nous vous remercions d’avoir choisi Les Bons Profs pour vos révisions du {$title}.<br/>Afin d'accéder à <b>{$mission->getTypeOffer()->getTitle()}</b> vérifiez que le profil de votre enfant est bien configuré au niveau de la classe";
  427.                 if(!$this->getUser()){
  428.                     $text .= "<br/>Connectez-vous à l’aide de vos identifiants";
  429.                 }
  430.                 $this->addFlash('notice',$text);
  431.                 $session->remove('missionExam');
  432.                 $stripeService->getStripeClient()->invoices->update($request->request->get('invoice'),[
  433.                     ['metadata' => ['purchase_id' => $new->getId()]]
  434.                 ]);
  435.                 $tmId $request->request->get('tm');
  436.                 $tm   $entityManager->getRepository(TransactionMission::class)->find($tmId);
  437.                 if($tm){
  438.                     $tm->setIsfinish(true);
  439.                     $tm->setCustomer($user);
  440.                     $entityManager->flush();
  441.                 }
  442.                 return $this->redirectToRoute('dashboard-mission-success',['mission'=>$getMission]);
  443.             }
  444.         }
  445.     }
  446.     /**
  447.      * @return JsonResponse
  448.      * @Route("/validation/paiement/mission",name="validation-mission-paiement")
  449.      */
  450.     public function validation()
  451.     {
  452.     }
  453. }