src/Controller/ReservationController.php line 68

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\ComplementReservation;
  4. use App\Entity\Dons;
  5. use App\Entity\Forfait;
  6. use App\Entity\Reservation;
  7. use App\Entity\User;
  8. use App\Form\ReservationCommentaireType;
  9. use App\Form\ReservationType;
  10. use App\Net15\PaiementBundle\Entity\ModePaiement;
  11. use App\Repository\ComplementReservationRepository;
  12. use App\Repository\DonsRepository;
  13. use App\Repository\EditionRepository;
  14. use App\Repository\MentionsLegalesRepository;
  15. use App\Repository\RelationActiviteForfaitRepository;
  16. use App\Repository\RelationReservationActiviteForfaitRepository;
  17. use App\Repository\RelationReservationTshirtRepository;
  18. use App\Repository\ReservationRepository;
  19. use App\Repository\TeeShirtRepository;
  20. use App\Service\ReservationFilter;
  21. use Doctrine\DBAL\Exception;
  22. use JsonException;
  23. use Knp\Component\Pager\PaginatorInterface;
  24. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  25. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  26. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  27. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  28. use Symfony\Component\Form\Extension\Core\Type\TextType;
  29. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  30. use Symfony\Component\Mailer\MailerInterface;
  31. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  32. use Symfony\Component\HttpFoundation\Request;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Symfony\Component\Mime\Address;
  35. use Symfony\Component\Routing\Annotation\Route;
  36. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  37. #[Route('/reservation')]
  38. class ReservationController extends AbstractController
  39. {
  40.     /**
  41.      * @throws Exception
  42.      */
  43.     #[Route('/{page}'name'app_reservation_index'defaults: ['page' => 0], methods: ['GET'])]
  44.     public function index(ReservationRepository $reservationRepository,EditionRepository $editionRepositoryRequest $request): Response
  45.     {
  46.         /**
  47.          * @var User $user
  48.          */
  49.         $user $this->getUser();
  50.         $edition $editionRepository->getEditionEnCours();
  51.         $reservations $reservationRepository->findBy(['user' => $user'edition' => $edition]);
  52.         return $this->render('reservation/index.html.twig', [
  53.             'reservations' => $reservations,
  54.         ]);
  55.     }
  56.     /**
  57.      * @throws JsonException
  58.      */
  59.     #[Route('/nouveau/{forfait}'name'app_reservation_new'methods: ['GET''POST'])]
  60.     public function new(Forfait $forfaitRequest $requestReservationRepository $reservationRepositoryDonsRepository $donsRepository,
  61.                         TeeShirtRepository $teeShirtRepositoryMentionsLegalesRepository $mentionsLegalesRepository ): Response
  62.     {
  63.         $user $this->getUser();
  64.         $reservation = new Reservation($user$forfait);
  65.         $form $this->createForm(ReservationType::class, $reservation, ['reservation' => $reservation'forfait' => $forfait'stock_campingCar' => $forfait->getEdition()->getStockCampingcar()]);
  66.         $form->handleRequest($request);
  67.         if ($form->isSubmitted() && $form->isValid()) {
  68.             $recapitulatif = ['email' => $this->getUser()?->getEmail()];
  69.             if( null !== $reservation->getPassenger() )
  70.                 $prix_sans_option = ( $reservation->getForfait()->getPilotPrice() * $reservation->getPilot() ) + ( $reservation->getForfait()->getPassengerPrice() * $reservation->getPassenger() );
  71.             else
  72.                 $prix_sans_option = ( $reservation->getForfait()->getPilotPrice() * $reservation->getPilot() );
  73.             $reservation->setPriceWithoutOptionsround($prix_sans_option2PHP_ROUND_HALF_UP) );
  74.             // Info: S'il y a un don
  75.             if( null !== $reservation->getDonationAmount() ) {
  76.                 $don = new Dons($this->getUser(), $reservation$reservation->getDonationAmount());
  77.                 $don->setStatus(Dons::STATUT_EN_ATTENTE_PAIEMENT);
  78.                 $donsRepository->save($don);
  79.                 $reservation->setDon($don);
  80.                 $recap_don = [
  81.                     'type'      => 'don',
  82.                     'id'        => $don->getId(),
  83.                     'name'      => 'Don',
  84.                     'quantity'  => 1,
  85.                     'price'     => $don->getDonationAmount()
  86.                 ];
  87.             }
  88.             // Info: Décode et Insert le json des suppléments de la réservation
  89.             $liste_supplement $request->request->all()['reservation']['additional_reservation'] ? json_decode($request->request->all()['reservation']['additional_reservation'], true512JSON_THROW_ON_ERROR) : [];
  90.             $reservation->setAdditionalReservation($liste_supplement);
  91.             if( $reservationRepository->save($reservation) ) {
  92.                 $recapitulatif[] = [
  93.                     'type'              => 'reservation',
  94.                     'id'                => $reservation->getId(),
  95.                     'name'              => $reservation->getForfait()->getName(),
  96.                     'price'             => $reservation->getPriceWithoutOptions(),
  97.                     'pilot'             => $reservation->getPilot(),
  98.                     'pilot_price'       => $reservation->getForfait()->getPilotPrice(),
  99.                     'passenger'         => $reservation->getPassenger(),
  100.                     'passenger_price'   => $reservation->getForfait()->getPassengerPrice()
  101.                 ];
  102.                 if( isset($recap_don) ) $recapitulatif[] = $recap_don;
  103.                 $reservation->setStatus(Reservation::STATUT_EN_ATTENTE_PAIEMENT);
  104.                 foreach( $liste_supplement as $supplement $recapitulatif[] = $supplement;
  105.             }
  106.             // Info: Décode et Insert le json du contact additionnel
  107.             $additionnalContact $request->request->all()['reservation']['additional_contact'] ? json_decode($request->request->all()['reservation']['additional_contact'], true512JSON_THROW_ON_ERROR) : [];
  108.             $reservation->setAdditionalContact($additionnalContact);
  109.             $reservation->setTotalPriceWithComplement($reservation->getTotalPrice());
  110.             $reservationRepository->save($reservation);
  111.             return $this->redirectToRoute('paiement_payer', [
  112.                 'parent_entity_class' => null,
  113.                 'parent_entity_id'    => null,
  114.                 'entity_class'        => Reservation::class,
  115.                 'entity_id'           => $reservation->getId()->toRfc4122(),
  116.                 'libelle'             => 'Motards du viaduc - Réservation '.$reservation->getForfait()->getName(),
  117.                 'montant'             => $reservation->getTotalPrice(),
  118.                 'recapitulatif'       => $recapitulatif,
  119.                 'payement_method'     => in_array('ROLE_ADMIN'$this->getUser()->getRoles()) ? ModePaiement::AUTRE ModePaiement::PAYBOX,
  120.                 'back_path'           => 'app_reservation_index',
  121.                 'prenom'              => $reservation->getUser()->getFirstname(),
  122.                 'nom'                 => $reservation->getUser()->getLastname(),
  123.                 'adresse1'            => $reservation->getUser()->getAddress(),
  124.                 'adresse2'            => $reservation->getUser()->getAddressComplement(),
  125.                 'zipcode'             => $reservation->getUser()->getZipCode(),
  126.                 'city'                => $reservation->getUser()->getCity(),
  127.                 'country'             => $reservation->getUser()->getPays()->getId(),
  128.             ], Response::HTTP_SEE_OTHER);
  129.         }
  130.         return $this->render('reservation/new.html.twig', [
  131.             'reservation'               => $reservation,
  132.             'liste_tshirts'             => $teeShirtRepository->findBy(['deletedAt' => null'edition' => $forfait->getEdition()], ['gender' => 'DESC']),
  133.             'liste_mentions_a_signer'   => $mentionsLegalesRepository->findBy(['deletedAt' => null'signature' => true], ['ordre' => 'ASC']),
  134.             'val_sans_camping'          => Reservation::CAMPING_SANS,
  135.             'val_camping_tente'         => Reservation::CAMPING_TENTE,
  136.             'val_camping_campingcar'    => Reservation::CAMPING_CAMPINGCAR,
  137.             'form' => $form
  138.         ]);
  139.     }
  140.     #[Route('/commentaire/{id}'name'app_reservation_commentaire'methods: ['GET','POST'])]
  141.     public function app_reservation_commentaire(Reservation $reservationReservationRepository $reservationRepositoryRequest $request): Response
  142.     {
  143.         $form $this->createForm(ReservationCommentaireType::class, $reservation, ['action' => $this->generateUrl('app_reservation_commentaire', ['id' => $reservation->getId()] )]);
  144.         $form->handleRequest($request);
  145.         if( $form->isSubmitted() && $form->isValid() ) {
  146.             $reservationRepository->save($reservation);
  147.             return $this->redirectToRoute('app_reservation_show',  ['id' => $reservation->getId()]);
  148.         }
  149.         return $this->render('reservation/commentaire.html.twig', [
  150.             'reservation' => $reservation,
  151.             'form' => $form->createView(),
  152.         ]);
  153.     }
  154.     /**
  155.      * @throws Exception
  156.      */
  157.     #[Route('/voir/{id}'name'app_reservation_show'methods: ['GET'])]
  158.     public function show(Reservation $reservationReservationRepository $reservationRepositoryRequest $request): Response
  159.     {
  160.         if( $this->getUser()->getEmail() === $reservation->getUser()->getEmail() || in_array('ROLE_ADMIN'$this->getUser()->getRoles()) ) {
  161.             return $this->render('reservation/show.html.twig', [
  162.                 'activites' => $reservationRepository->getActiviteOptionnelles($reservation),
  163.                 'teeshirts' => $reservationRepository->getTeeshirts($reservation),
  164.                 'reservation' => $reservation
  165.             ]);
  166.         }
  167.         return $this->redirectToRoute('app_reservation_index', [
  168.             'render_include_modal_paiement_content' => false,
  169.         ], Response::HTTP_SEE_OTHER);
  170.     }
  171.     /**
  172.      * @throws JsonException
  173.      */
  174.     #[Route('/payer/{id}'name'app_reservation_payer'methods: ['GET'])]
  175.     public function payer(Reservation $reservationDonsRepository $donsRepositoryRequest $request): Response
  176.     {
  177.         $recapitulatif = ['email' => $this->getUser()?->getEmail()];
  178.         // Info: S'il y a un don
  179.         if( null !== $reservation->getDon() ) {
  180.             $don $donsRepository->find($reservation->getDon());
  181.             $recapitulatif[] = [
  182.                 'type'      => 'don',
  183.                 'id'        => $don->getId(),
  184.                 'name'      => 'Don',
  185.                 'quantity'  => 1,
  186.                 'price'     => $don->getDonationAmount()
  187.             ];
  188.         }
  189.         // Info: Décode le json des suppléments de la réservation
  190.         $recapitulatif[] = [
  191.             'type'              => 'reservation',
  192.             'id'                => $reservation->getId(),
  193.             'name'              => $reservation->getForfait()->getName(),
  194.             'price'             => $reservation->getPriceWithoutOptions(),
  195.             'pilot'             => $reservation->getPilot(),
  196.             'pilot_price'       => $reservation->getForfait()->getPilotPrice(),
  197.             'passenger'         => $reservation->getPassenger(),
  198.             'passenger_price'   => $reservation->getForfait()->getPassengerPrice()
  199.         ];
  200.         foreach( $reservation->getAdditionalReservation() as $supplement $recapitulatif[] = $supplement;
  201.         return $this->redirectToRoute('paiement_payer', [
  202.             'parent_entity_class' => null,
  203.             'parent_entity_id'    => null,
  204.             'entity_class'        => Reservation::class,
  205.             'entity_id'           => $reservation->getId()->toRfc4122(),
  206.             'libelle'             => 'Motards du viaduc - Réservation '.$reservation->getForfait()->getName(),
  207.             'montant'             => $reservation->getTotalPrice(),
  208.             'recapitulatif'       => $recapitulatif,
  209.             'payement_method'     => $reservation->getPayementMethod(),
  210.             'back_path'           => 'app_reservation_index',
  211.             'prenom'              => $reservation->getUser()->getFirstname(),
  212.             'nom'                 => $reservation->getUser()->getLastname(),
  213.             'adresse1'            => $reservation->getUser()->getAddress(),
  214.             'adresse2'            => $reservation->getUser()->getAddressComplement(),
  215.             'zipcode'             => $reservation->getUser()->getZipCode(),
  216.             'city'                => $reservation->getUser()->getCity(),
  217.             'country'             => $reservation->getUser()->getPays()->getId(),
  218.         ], Response::HTTP_SEE_OTHER);
  219.     }
  220.     #[Route('/admin/payer/{id}'name'app_reservation_admin_payer'methods: ['GET'])]
  221.     public function admin_payer(Reservation $reservationDonsRepository $donsRepositoryReservationRepository $reservationRepositoryRequest $request): Response
  222.     {
  223.         $recapitulatif = ['email' => $this->getUser()?->getEmail()];
  224.         // Info: S'il y a un don
  225.         if( null !== $reservation->getDon() ) {
  226.             $don $donsRepository->find($reservation->getDon());
  227.             $recapitulatif[] = [
  228.                 'type'      => 'don',
  229.                 'id'        => $don->getId(),
  230.                 'name'      => 'Don',
  231.                 'quantity'  => 1,
  232.                 'price'     => $don->getDonationAmount()
  233.             ];
  234.         }
  235.         $reservationRepository->save($reservation->setPayementMethod(ModePaiement::AUTRE));
  236.         // Info: Décode le json des suppléments de la réservation
  237.         $recapitulatif[] = [
  238.             'type'              => 'reservation',
  239.             'id'                => $reservation->getId(),
  240.             'name'              => $reservation->getForfait()->getName(),
  241.             'price'             => $reservation->getPriceWithoutOptions(),
  242.             'pilot'             => $reservation->getPilot(),
  243.             'pilot_price'       => $reservation->getForfait()->getPilotPrice(),
  244.             'passenger'         => $reservation->getPassenger(),
  245.             'passenger_price'   => $reservation->getForfait()->getPassengerPrice()
  246.         ];
  247.         foreach( $reservation->getAdditionalReservation() as $supplement $recapitulatif[] = $supplement;
  248.         return $this->redirectToRoute('paiement_payer', [
  249.             'parent_entity_class' => null,
  250.             'parent_entity_id'    => null,
  251.             'entity_class'        => Reservation::class,
  252.             'entity_id'           => $reservation->getId()->toRfc4122(),
  253.             'libelle'             => 'Motards du viaduc - Réservation '.$reservation->getForfait()->getName(),
  254.             'montant'             => $reservation->getTotalPrice(),
  255.             'recapitulatif'       => $recapitulatif,
  256.             'payement_method'     => ModePaiement::AUTRE,
  257.             'back_path'           => 'app_reservation_index'
  258.         ], Response::HTTP_SEE_OTHER);
  259.     }
  260.     /**
  261.      * @throws TransportExceptionInterface
  262.      */
  263.     #[Route('/admin/annuler/{id}'name'app_reservation_cancel'methods: ['GET'])]
  264.     public function cancel(Reservation $reservationReservationRepository $reservationRepositoryComplementReservationRepository $complementReservationRepositoryDonsRepository $donsRepository,
  265.         RelationReservationActiviteForfaitRepository $relationReservationActiviteForfaitRepositoryRelationReservationTshirtRepository $relationReservationTshirtRepository,
  266.         TeeShirtRepository $teeShirtRepositoryRelationActiviteForfaitRepository $relationActiviteForfaitRepositoryMailerInterface $mailer): Response
  267.     {
  268.         $reservation->setStatus(Reservation::STATUT_ANNULE);
  269.         if( $reservationRepository->save($reservation) ) {
  270.             //si le don existe il est supprimer
  271.             if( null !== $reservation->getDon() ) {
  272.                 $donsRepository->delete($reservation->getDon());
  273.             }
  274.             //on met le statut de suppression
  275.             foreach( $reservation->getListeRelationsActiviteForfait() as $activite ) {
  276.                 $relationReservationActiviteForfaitRepository->delete($activite);
  277.             }
  278.             //on met le statut de suppression
  279.             foreach( $reservation->getListeRelationsTshirt() as $relation_tshirt ) {
  280.                 $relationReservationTshirtRepository->delete($relation_tshirt);
  281.                 $tshirt $teeShirtRepository->find($relation_tshirt->getTeeshirt());
  282.                 //mise a jour du stock commander
  283.                 $tshirt->removeStockCommander($relation_tshirt->getQuantity());
  284.                 $teeShirtRepository->save($tshirt);
  285.             }
  286. //            foreach( $reservation->getAdditionalReservation() as $supplement ) {
  287. //                // Attention: Seul les repas sont incrémentables, si les activités le deviennent, modifier le type
  288. //                if( 'activity' === $supplement['type'] ) {
  289. //                    if( $repas = $relationActiviteForfaitRepository->find($supplement['id'])->getActivite() ) {
  290. //                        $liste_repas = $reservation->getStat()['repas'];
  291. //                        $liste_repas[$repas->getId()->toBase32()] -= $supplement['quantity'];
  292. //                        $reservation->setStat(['repas' => $liste_repas]);
  293. //                        $reservationRepository->save($reservation);
  294. //                    }
  295. //                }
  296. //            }
  297. //            foreach( $reservation->getListeComplement() as $complement ) {
  298. //
  299. //                $complement->setStatus(ComplementReservation::STATUT_ANNULE);
  300. //                $complementReservationRepository->save($complement);
  301. //
  302. //                if( null === $complement->getDeletedAt() && ComplementReservation::STATUT_ANNULE !== $complement->getStatut() ) {
  303. //                    foreach( $complement->getAdditionalReservation() as $supplement ) {
  304. //                        // Attention: Seul les repas sont incrémentables, si les activités le deviennent, modifier le type
  305. //                        if( 'activity' === $supplement['type'] ) {
  306. //                            if( $repas = $relationActiviteForfaitRepository->find($supplement['id'])->getActivite() ) {
  307. //                                $liste_repas = $reservation->getStat()['repas'];
  308. //                                $liste_repas[$repas->getId()->toBase32()] -= $supplement['quantity'];
  309. //                                $reservationRepository->save($reservation->setStat(['repas' => $liste_repas]));
  310. //
  311. //                            }
  312. //                        } elseif( 'tshirt' === $supplement['type'] ) {
  313. //                            $tshirt = $teeShirtRepository->find($supplement['id']);
  314. //                            $tshirt->removeStockCommander($supplement['quantity']);
  315. //                            $teeShirtRepository->save($tshirt);
  316. //                        }
  317. //                    }
  318. //                }
  319. //            }
  320.             $urlReservation $this->generateUrl('app_reservation_show', ['id' => $reservation->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
  321.             // Info: Envois au client de l'email d'annulation de réservation
  322.             $email = (new TemplatedEmail())
  323.                 ->from('mdviaduc@gmail.com')
  324.                 ->to(new Address($reservation->getUser()->getEmail()))
  325.                 ->subject("Les motards du viaduc - Annulation de votre réservation n° ".$reservation->getNumDossier().'.')
  326.                 ->htmlTemplate('emails/confirm_annulation_reservation_client.html.twig')
  327.                 ->context(['reservation' => $reservation'urlReservation' => $urlReservation])
  328.             ;
  329.             $mailer->send($email);
  330.         }
  331.         return $this->redirectToRoute('app_reservation_index', [], Response::HTTP_SEE_OTHER);
  332.     }
  333.     #[Route('/supprimer/{id}'name'app_reservation_delete'methods: ['POST'])]
  334.     public function delete(Request $requestReservation $reservationReservationRepository $reservationRepositoryComplementReservationRepository $complementReservationRepository,
  335.         RelationReservationActiviteForfaitRepository $relationReservationActiviteForfaitRepositoryRelationReservationTshirtRepository $relationReservationTshirtRepository): Response
  336.     {
  337.         /**
  338.          * @var User $user
  339.          */
  340.         $user $this->getUser();
  341.         if( $user->hasRole('ROLE_ADMIN') || $user->getId() === $reservation->getUser()->getId() ) {
  342.             if ($this->isCsrfTokenValid('delete'$reservation->getUlid(), $request->request->get('_token'))) {
  343.                 if( $reservationRepository->delete($reservation) ) {
  344.                     foreach( $reservation->getListeRelationsActiviteForfait() as $activite ) {
  345.                         $relationReservationActiviteForfaitRepository->delete($activite);
  346.                     }
  347.                     foreach( $reservation->getListeRelationsTshirt() as $tshirt ) {
  348.                         $relationReservationTshirtRepository->delete($tshirt);
  349.                     }
  350.                     foreach( $reservation->getListeComplement() as $complement ) {
  351.                         $complementReservationRepository->delete($complement);
  352.                     }
  353.                 }
  354.             }
  355.         }
  356.         return $this->redirectToRoute('app_reservation_index', [], Response::HTTP_SEE_OTHER);
  357.     }
  358. }