src/Controller/Marketplace/ReservationController.php line 209

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Marketplace;
  3. use App\Entity\Company;
  4. use App\Entity\Event;
  5. use App\Entity\MarketplaceCategory;
  6. use App\Entity\MarketplaceReservation;
  7. use App\Entity\User;
  8. use App\Entity\Workshop;
  9. use App\Form\Marketplace\MarketplaceReservationType;
  10. use App\Repository\WorkshopRepository;
  11. use App\Service\EmailService;
  12. use App\Service\StripeService;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\Form\FormError;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. class ReservationController extends AbstractController
  23. {
  24.     /**
  25.      * @var EmailService
  26.      */
  27.     private $emailService;
  28.     /**
  29.      * @var EntityManagerInterface
  30.      */
  31.     private $em;
  32.     public function __construct(EmailService $emailServiceEntityManagerInterface $em)
  33.     {
  34.         $this->emailService $emailService;
  35.         $this->em $em;
  36.     }
  37.     /**
  38.      * @Route("/reservation/paiement-valide", name="app_tunnel_co_stepfinal")
  39.      */
  40.     public function paiementOk(): Response
  41.     {
  42.         return $this->render('marketplace/reservation/tunnel_co_stepfinal.html.twig', [
  43.             'controller_name' => 'ReservationController',
  44.         ]);
  45.     }
  46.     /**
  47.      * @Route("/reservation/demandes-particulieres", name="app_reservation_free")
  48.      */
  49.     public function freeReservation(Request $request): Response
  50.     {
  51.         $company null;
  52.         $marketplaceReservation = new MarketplaceReservation;
  53.         if ($this->getUser() != null) {
  54.             $company $this->getUser()->getCompany();
  55.             $user $this->em->getRepository(User::class)->find($this->getUser()->getId());
  56.             $marketplaceReservation
  57.                 ->setUser($user)
  58.                 ->setFullName($user->getFirstName() ." "$user->getLastName())
  59.                 ->setPhone($user->getCompany()->getPhone())
  60.                 ->setEmail($user->getEmail())
  61.             ;
  62.         }
  63.         $form $this->createForm(MarketplaceReservationType::class, $marketplaceReservation, ['isFree' => true]);
  64.         $form->handleRequest($request);
  65.         if ($form->isSubmitted() && $form->isValid()) {
  66.             if ($marketplaceReservation->getDateStart() == null) {
  67.                 $form->get('dateStart')->addError(new FormError('Veuillez renseigner une date valide'));
  68.                 return $this->render('marketplace/reservation/free_reservation.html.twig', [
  69.                     'form' => $form->createView()
  70.                 ]);
  71.             }
  72.             if ($form->getData()->getWorkshop() == null) {
  73.                 $form->get('workshop')->addError(new FormError('Veuillez choisir un atelier valide'));
  74.                 return $this->render('marketplace/reservation/free_reservation.html.twig', [
  75.                     'form' => $form->createView()
  76.                 ]);
  77.             }
  78.             $marketplaceReservation->setFamily($marketplaceReservation->getCategory()->getFamily());
  79.             if(!empty($marketplaceReservation->getFullName())) { // Insertion du firstName et lastName
  80.                 $firstName $lastName null;
  81.                 $firstName $marketplaceReservation->getFullName();
  82.                 $marketplaceReservation
  83.                     ->setFirstName($firstName)
  84.                     // ->setLastName($lastName)
  85.                 ;
  86.             }
  87.             $marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_FREE);
  88.             $this->em->getRepository(MarketplaceReservation::class)->add($marketplaceReservation);
  89.             $this->emailService->sendSpecialRequestToULTEAMMail($company$marketplaceReservation);
  90.             if ($this->getUser() != null) {
  91.                 $this->addFlash('success''Votre demande a bien été envoyé');
  92.             }else{
  93.                 $this->addFlash('success''Votre demande a bien été envoyé. Pour faciliter les demandes à venir vous pouvez vous inscrire sur la plateforme.');
  94.             }
  95.             return $this->redirectToRoute('marketplace_app_user', ['nav' => 3]);
  96.         }
  97.         return $this->render('marketplace/reservation/free_reservation.html.twig', [
  98.             'form' => $form->createView()
  99.         ]);
  100.     }
  101.     /**
  102.      * @Route("/reservation/paiement/{marketplaceReservation}", name="app_reservation_payment")
  103.      */
  104.     public function payment(Request $requestMarketplaceReservation $marketplaceReservationStripeService $stripeService): Response
  105.     {
  106.         if($marketplaceReservation->getWorkshop()->isFreeSellingPrice()) { // Workshop gratuit
  107.             $marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_FREE);
  108.             $this->em->getRepository(MarketplaceReservation::class)->add($marketplaceReservation);
  109.         } else { // Workshop payant avec stripe
  110.             $paymentStatus = [
  111.                 MarketplaceReservation::PAYMENT_STATUS_PENDING,
  112.                 MarketplaceReservation::PAYMENT_STATUS_FAILED,
  113.                 MarketplaceReservation::PAYMENT_STATUS_CANCELED,
  114.             ];
  115.             $marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_PENDING);
  116.             // if (!empty($marketplaceReservation->getPayment()) && !in_array($marketplaceReservation->getPaymentStatus(), $paymentStatus)){
  117.             //     $this->addFlash('danger', 'Cette réservation est en attente de paiement, une autre requête ne peut être faite pour l\'instant');
  118.             //     return $this->redirectToRoute('admin_marketplace_reservation_show', ['id' => $marketplaceReservation->getId()]);
  119.             // }
  120.             
  121.             try { //the confirmation or the failure of the checkout will be managed via webhook to secure the process
  122.                 $session $stripeService->stripeCheckoutSessionMarketplaceReservation($marketplaceReservation);
  123.                 $marketplaceReservation->setPayment($session->payment_intent);
  124.                 $this->em->persist($marketplaceReservation);
  125.                 $this->em->flush();
  126.                 $request->getSession()->remove('RESERVATION_ID');
  127.                 
  128.                 // $this->addFlash('success', 'Votre réservation a bien été pris en compte');
  129.             } catch (\Throwable $th) {
  130.                 throw $th;
  131.                 $this->addFlash('danger''Un problème est survenue lors de la réservation');
  132.             }
  133.             return new RedirectResponse($session->url303);
  134.         }
  135.         return $this->redirectToRoute('admin_marketplace_reservation_index', [], Response::HTTP_SEE_OTHER);
  136.     }
  137.     /**
  138.      * @Route("/reservation/cancel/{marketplaceReservation}", name="app_reservation_cancel")
  139.      */
  140.     public function cancelReservation(Request $requestMarketplaceReservation $marketplaceReservation): Response
  141.     {
  142.         if (!$marketplaceReservation instanceof MarketplaceReservation) {
  143.             throw new NotFoundHttpException();
  144.         }
  145.         $marketplaceReservation->setStatus(MarketplaceReservation::STATUS_CANCELED);
  146.         $marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_CANCELED);
  147.         $this->em->persist($marketplaceReservation);
  148.         $this->em->flush();
  149.         $this->addFlash('success''Réservation supprimée avec succès');
  150.         $referer $request->headers->get('referer');
  151.         // return $this->redirect($referer);
  152.         return $this->redirectToRoute('marketplace_app_user', ['nav' => 2], Response::HTTP_SEE_OTHER);
  153.     }
  154.     /**
  155.      * @Route("/reservation/recapitulatif/{marketplaceReservationId}", name="app_reservation_recap")
  156.      */
  157.     public function paiement(Request $requestint $marketplaceReservationId null): Response
  158.     {
  159.         if (empty($marketplaceReservationId)) {
  160.             $marketplaceReservation $this->em->getRepository(MarketplaceReservation::class)->find($request->getSession()->get('RESERVATION_ID'));
  161.         }else {
  162.             $marketplaceReservation $this->em->getRepository(MarketplaceReservation::class)->find($marketplaceReservationId);
  163.         }
  164.         if($marketplaceReservation instanceof MarketplaceReservation && $marketplaceReservation->getPaymentStatus() === MarketplaceReservation::PAYMENT_STATUS_FREE) {
  165.             $request->getSession()->set('RESERVATION_ID'null);
  166.             return $this->redirectToRoute('marketplace_app_user', ['nav' => 2]);
  167.         }
  168.         if ($marketplaceReservation->getUser() == null) {
  169.             # code...
  170.             $user $this->em->getRepository(User::class)->find($this->getUser()->getId());
  171.             $marketplaceReservation
  172.                 ->setUser($user)
  173.                 ->setFullName($user->getFirstName() ." "$user->getLastName())
  174.                 ->setPhone($user->getCompany()->getPhone())
  175.                 ->setEmail($user->getEmail())
  176.             ;
  177.             $this->em->persist($marketplaceReservation);
  178.             $this->em->flush();
  179.         } 
  180.         // if ($marketplaceReservation->getPaymentStatus() == MarketplaceReservation::PAYMENT_STATUS_SUCCESS) {
  181.         
  182.         // }
  183.         return $this->render('marketplace/reservation/tunnel_co_step1.html.twig', [
  184.             'reservation' => $marketplaceReservation
  185.         ]);
  186.     }
  187.     /**
  188.      * @Route("/reservation/{workshopName}-{workshop}",
  189.      * name="app_reservation",
  190.      * requirements={
  191.      *          "workshopName"="[^\/]+", 
  192.      * })
  193.      */
  194.     public function index(Request $requestWorkshop $workshopStripeService $stripeService): Response
  195.     {
  196.         // Récuperation des workshop pour le slider
  197.         $workshopSlides $this->em->getRepository(Workshop::class)->findBy([
  198.             'tag' => $workshop->getTag(),
  199.             'marketplaceIsDisplay' => true
  200.         ]);
  201.         // Si j'ai un cookie avec une reservation
  202.         if (!empty($request->getSession()->get('RESERVATION_ID'))) {
  203.             // Je récup la resa avec l'id du cookie
  204.             $marketplaceReservation $this->em->getRepository(MarketplaceReservation::class)->find($request->getSession()->get('RESERVATION_ID'));
  205.             if ($marketplaceReservation instanceof MarketplaceReservation && $marketplaceReservation->getWorkshop() == $workshop && empty($request->query->get('editRes')) 
  206.             && empty($marketplaceReservation->getWorkshop()->getFixedSellingPrice())
  207.             ) {
  208.                 return $this->redirectToRoute('marketplace_app_reservation_recap', ['marketplaceReservationId' => $marketplaceReservation->getId()]);
  209.             }
  210.         }
  211.         if (isset($marketplaceReservation) && $marketplaceReservation->getWorkshop() == $workshop) {
  212.             $marketplaceReservation $marketplaceReservation;
  213.         } else {
  214.             // Sinon
  215.             // Je fais tout ça
  216.             $marketplaceReservation = new MarketplaceReservation();
  217.             $marketplaceReservation
  218.                 ->setWorkshop($workshop)
  219.                 ->setCategory($workshop->getMarketplaceCategory())
  220.                 ->setFamily($workshop->getMarketplaceFamily())
  221.                 ->setDescription($workshop->getDescription())
  222.                 ->setPaymentAmount($workshop->getFixedSellingPrice())
  223.             ;
  224.         }
  225.         if(!$marketplaceReservation->getWorkshop()->isFreeSellingPrice()) { // Workshop payant
  226.             $marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_PENDING);
  227.         } else {
  228.             $marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_FREE);
  229.         }
  230.         if ($this->getUser() != null) {
  231.             $user $this->em->getRepository(User::class)->find($this->getUser()->getId());
  232.             $marketplaceReservation
  233.                 ->setUser($user)
  234.                 ->setFullName($user->getFirstName() ." "$user->getLastName())
  235.                 ->setPhone($user->getCompany()->getPhone())
  236.                 ->setEmail($user->getEmail())
  237.             ;
  238.         }
  239.         
  240.         $form $this->createForm(MarketplaceReservationType::class, $marketplaceReservation);
  241.         $form->handleRequest($request);
  242.         $company = ($this->getUser() instanceof User) ? $this->em->getRepository(Company::class)->findOneBy(['user' => $this->getUser()]) : null;
  243.         if ($form->isSubmitted() && $form->isValid()) {
  244.             if ($marketplaceReservation->getDateStart() == null) {
  245.                 $form->get('dateStart')->addError(new FormError('Veuillez renseigner une date valide'));
  246.                 return $this->render('marketplace/reservation/index.html.twig', [
  247.                     'workshop' => $workshop,
  248.                     'form' => $form->createView(),
  249.                     'workshopSlides' => $workshopSlides
  250.                 ]);
  251.             }
  252.             // Si un utilisateur est connecté
  253.             if ($this->getUser() instanceof User && $this->isGranted('ROLE_COMPANY')) {
  254.                 if(!empty($marketplaceReservation->getFullName())) { // Insertion du firstName et lastName
  255.                     $firstName $lastName null;
  256.                     $firstName $marketplaceReservation->getFullName();
  257.                     $marketplaceReservation
  258.                         ->setFirstName($firstName)
  259.                         // ->setLastName($lastName)
  260.                     ;
  261.                 }
  262.                 if($marketplaceReservation->getWorkshop() instanceof Workshop && empty($marketplaceReservation->getWorkshop()->getFixedSellingPrice())) {
  263.                     $marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_FREE);
  264.                 }
  265.                 $this->em->getRepository(MarketplaceReservation::class)->add($marketplaceReservation);
  266.                 // $this->emailService->sendSpecialRequestToULTEAMMail($company, $marketplaceReservation);
  267.                 // Si la réservation est gratuite
  268.                 if($marketplaceReservation->getWorkshop() instanceof Workshop && empty($marketplaceReservation->getWorkshop()->getFixedSellingPrice())) {
  269.                     $this->emailService->sendSpecialRequestToULTEAMMail($company$marketplaceReservation);
  270.                     $message 'Votre demande a bien été envoyé.';
  271.                     if (!$this->getUser() instanceof User$message .= " Pour faciliter les demandes à venir vous pouvez vous inscrire sur la plateforme.";
  272.                     $this->addFlash('success'$message);
  273.                     return $this->redirectToRoute('marketplace_app_user', ['nav' => 3]);
  274.                 } else { // Si la réservation est payante
  275.                     // Tant que la reservation n'est pas payé je la stocke en session pour la retrouver facilement
  276.                     $request->getSession()->set('RESERVATION_ID',  $marketplaceReservation->getId());
  277.                     return $this->redirectToRoute('marketplace_app_reservation_recap', ['marketplaceReservationId' => $marketplaceReservation->getId()]);
  278.                 }
  279.             } else { // Si pas de User
  280.                 $this->em->persist($marketplaceReservation);
  281.                 $this->em->flush();
  282.                 // $this->emailService->sendSpecialRequestToULTEAMMail($company, $marketplaceReservation);
  283.                 
  284.                 // $message = 'Votre demande a bien été envoyé.';
  285.                 $message '';
  286.                 if($marketplaceReservation->getPaymentStatus() === MarketplaceReservation::PAYMENT_STATUS_FREE) {
  287.                     $message .= " Pour faciliter les demandes à venir vous pouvez vous inscrire sur la plateforme.";
  288.                 } else {
  289.                     $message 'Veuillez vous connecter pour finaliser votre réservation.';
  290.                     // Tant que la reservation n'est pas payé je la stocke en session pour la retrouver facilement
  291.                     $request->getSession()->set('RESERVATION_ID',  $marketplaceReservation->getId());
  292.                 }
  293.                 
  294.                 $this->addFlash('success'$message);
  295.                 return $this->redirectToRoute('app_login_marketplace');
  296.             }
  297.         }
  298.         return $this->render('marketplace/reservation/index.html.twig', [
  299.             'workshop' => $workshop,
  300.             'form' => $form->createView(),
  301.             'workshopSlides' => $workshopSlides
  302.         ]);
  303.     }
  304.     /**
  305.     * @Route("/reservation/get-workshop-from-categ/{marketplaceCategory}", name="get_workshop_from_categ")
  306.     */
  307.     public function getWokrshopFromCateg(Request $requestMarketplaceCategory $marketplaceCategoryWorkshopRepository $workshopRepository): Response
  308.     {
  309.         if ($marketplaceCategory instanceof MarketplaceCategory) {
  310.             $workshops $this->em->getRepository(Workshop::class)->findBy(
  311.                 [
  312.                     'marketplaceCategory' => $marketplaceCategory
  313.                 ]
  314.             );
  315.             $choices = [];
  316.             foreach ($workshops as $workshop) {
  317.                 if ($workshop->getIsvirtual() == true) {
  318.                     $choices[] = [
  319.                         'id' => $workshop->getId(),
  320.                         'name' => $workshop->getName()." - Atelier virtuel",
  321.                     ];
  322.                 }else{
  323.                     $choices[] = [
  324.                         'id' => $workshop->getId(),
  325.                         'name' => $workshop->getName()." - Atelier collectif",
  326.                     ];
  327.                 }
  328.             }
  329.             array_unshift($choices, ['id' => ""'name' => "Choisissez l'atelier ..."]);
  330.             return new JsonResponse($choices);
  331.         }else{
  332.             return new JsonResponse('Une erreur est survenue');
  333.         }
  334.     }
  335. }