src/Controller/ReservationController.php line 68
<?phpnamespace App\Controller;use App\Entity\ComplementReservation;use App\Entity\Dons;use App\Entity\Forfait;use App\Entity\Reservation;use App\Entity\User;use App\Form\ReservationCommentaireType;use App\Form\ReservationType;use App\Net15\PaiementBundle\Entity\ModePaiement;use App\Repository\ComplementReservationRepository;use App\Repository\DonsRepository;use App\Repository\EditionRepository;use App\Repository\MentionsLegalesRepository;use App\Repository\RelationActiviteForfaitRepository;use App\Repository\RelationReservationActiviteForfaitRepository;use App\Repository\RelationReservationTshirtRepository;use App\Repository\ReservationRepository;use App\Repository\TeeShirtRepository;use App\Service\ReservationFilter;use Doctrine\DBAL\Exception;use JsonException;use Knp\Component\Pager\PaginatorInterface;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\Form\Extension\Core\Type\ChoiceType;use Symfony\Component\Form\Extension\Core\Type\SubmitType;use Symfony\Component\Form\Extension\Core\Type\TextType;use Symfony\Component\Mailer\Exception\TransportExceptionInterface;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mime\Address;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Security\Core\Exception\AccessDeniedException;#[Route('/reservation')]class ReservationController extends AbstractController{/*** @throws Exception*/#[Route('/{page}', name: 'app_reservation_index', defaults: ['page' => 0], methods: ['GET'])]public function index(ReservationRepository $reservationRepository,EditionRepository $editionRepository, Request $request): Response{/*** @var User $user*/$user = $this->getUser();$edition = $editionRepository->getEditionEnCours();$reservations = $reservationRepository->findBy(['user' => $user, 'edition' => $edition]);return $this->render('reservation/index.html.twig', ['reservations' => $reservations,]);}/*** @throws JsonException*/#[Route('/nouveau/{forfait}', name: 'app_reservation_new', methods: ['GET', 'POST'])]public function new(Forfait $forfait, Request $request, ReservationRepository $reservationRepository, DonsRepository $donsRepository,TeeShirtRepository $teeShirtRepository, MentionsLegalesRepository $mentionsLegalesRepository ): Response{$user = $this->getUser();$reservation = new Reservation($user, $forfait);$form = $this->createForm(ReservationType::class, $reservation, ['reservation' => $reservation, 'forfait' => $forfait, 'stock_campingCar' => $forfait->getEdition()->getStockCampingcar()]);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {$recapitulatif = ['email' => $this->getUser()?->getEmail()];if( null !== $reservation->getPassenger() )$prix_sans_option = ( $reservation->getForfait()->getPilotPrice() * $reservation->getPilot() ) + ( $reservation->getForfait()->getPassengerPrice() * $reservation->getPassenger() );else$prix_sans_option = ( $reservation->getForfait()->getPilotPrice() * $reservation->getPilot() );$reservation->setPriceWithoutOptions( round($prix_sans_option, 2, PHP_ROUND_HALF_UP) );// Info: S'il y a un donif( null !== $reservation->getDonationAmount() ) {$don = new Dons($this->getUser(), $reservation, $reservation->getDonationAmount());$don->setStatus(Dons::STATUT_EN_ATTENTE_PAIEMENT);$donsRepository->save($don);$reservation->setDon($don);$recap_don = ['type' => 'don','id' => $don->getId(),'name' => 'Don','quantity' => 1,'price' => $don->getDonationAmount()];}// Info: Décode et Insert le json des suppléments de la réservation$liste_supplement = $request->request->all()['reservation']['additional_reservation'] ? json_decode($request->request->all()['reservation']['additional_reservation'], true, 512, JSON_THROW_ON_ERROR) : [];$reservation->setAdditionalReservation($liste_supplement);if( $reservationRepository->save($reservation) ) {$recapitulatif[] = ['type' => 'reservation','id' => $reservation->getId(),'name' => $reservation->getForfait()->getName(),'price' => $reservation->getPriceWithoutOptions(),'pilot' => $reservation->getPilot(),'pilot_price' => $reservation->getForfait()->getPilotPrice(),'passenger' => $reservation->getPassenger(),'passenger_price' => $reservation->getForfait()->getPassengerPrice()];if( isset($recap_don) ) $recapitulatif[] = $recap_don;$reservation->setStatus(Reservation::STATUT_EN_ATTENTE_PAIEMENT);foreach( $liste_supplement as $supplement ) $recapitulatif[] = $supplement;}// Info: Décode et Insert le json du contact additionnel$additionnalContact = $request->request->all()['reservation']['additional_contact'] ? json_decode($request->request->all()['reservation']['additional_contact'], true, 512, JSON_THROW_ON_ERROR) : [];$reservation->setAdditionalContact($additionnalContact);$reservation->setTotalPriceWithComplement($reservation->getTotalPrice());$reservationRepository->save($reservation);return $this->redirectToRoute('paiement_payer', ['parent_entity_class' => null,'parent_entity_id' => null,'entity_class' => Reservation::class,'entity_id' => $reservation->getId()->toRfc4122(),'libelle' => 'Motards du viaduc - Réservation '.$reservation->getForfait()->getName(),'montant' => $reservation->getTotalPrice(),'recapitulatif' => $recapitulatif,'payement_method' => in_array('ROLE_ADMIN', $this->getUser()->getRoles()) ? ModePaiement::AUTRE : ModePaiement::PAYBOX,'back_path' => 'app_reservation_index','prenom' => $reservation->getUser()->getFirstname(),'nom' => $reservation->getUser()->getLastname(),'adresse1' => $reservation->getUser()->getAddress(),'adresse2' => $reservation->getUser()->getAddressComplement(),'zipcode' => $reservation->getUser()->getZipCode(),'city' => $reservation->getUser()->getCity(),'country' => $reservation->getUser()->getPays()->getId(),], Response::HTTP_SEE_OTHER);}return $this->render('reservation/new.html.twig', ['reservation' => $reservation,'liste_tshirts' => $teeShirtRepository->findBy(['deletedAt' => null, 'edition' => $forfait->getEdition()], ['gender' => 'DESC']),'liste_mentions_a_signer' => $mentionsLegalesRepository->findBy(['deletedAt' => null, 'signature' => true], ['ordre' => 'ASC']),'val_sans_camping' => Reservation::CAMPING_SANS,'val_camping_tente' => Reservation::CAMPING_TENTE,'val_camping_campingcar' => Reservation::CAMPING_CAMPINGCAR,'form' => $form]);}#[Route('/commentaire/{id}', name: 'app_reservation_commentaire', methods: ['GET','POST'])]public function app_reservation_commentaire(Reservation $reservation, ReservationRepository $reservationRepository, Request $request): Response{$form = $this->createForm(ReservationCommentaireType::class, $reservation, ['action' => $this->generateUrl('app_reservation_commentaire', ['id' => $reservation->getId()] )]);$form->handleRequest($request);if( $form->isSubmitted() && $form->isValid() ) {$reservationRepository->save($reservation);return $this->redirectToRoute('app_reservation_show', ['id' => $reservation->getId()]);}return $this->render('reservation/commentaire.html.twig', ['reservation' => $reservation,'form' => $form->createView(),]);}/*** @throws Exception*/#[Route('/voir/{id}', name: 'app_reservation_show', methods: ['GET'])]public function show(Reservation $reservation, ReservationRepository $reservationRepository, Request $request): Response{if( $this->getUser()->getEmail() === $reservation->getUser()->getEmail() || in_array('ROLE_ADMIN', $this->getUser()->getRoles()) ) {return $this->render('reservation/show.html.twig', ['activites' => $reservationRepository->getActiviteOptionnelles($reservation),'teeshirts' => $reservationRepository->getTeeshirts($reservation),'reservation' => $reservation]);}return $this->redirectToRoute('app_reservation_index', ['render_include_modal_paiement_content' => false,], Response::HTTP_SEE_OTHER);}/*** @throws JsonException*/#[Route('/payer/{id}', name: 'app_reservation_payer', methods: ['GET'])]public function payer(Reservation $reservation, DonsRepository $donsRepository, Request $request): Response{$recapitulatif = ['email' => $this->getUser()?->getEmail()];// Info: S'il y a un donif( null !== $reservation->getDon() ) {$don = $donsRepository->find($reservation->getDon());$recapitulatif[] = ['type' => 'don','id' => $don->getId(),'name' => 'Don','quantity' => 1,'price' => $don->getDonationAmount()];}// Info: Décode le json des suppléments de la réservation$recapitulatif[] = ['type' => 'reservation','id' => $reservation->getId(),'name' => $reservation->getForfait()->getName(),'price' => $reservation->getPriceWithoutOptions(),'pilot' => $reservation->getPilot(),'pilot_price' => $reservation->getForfait()->getPilotPrice(),'passenger' => $reservation->getPassenger(),'passenger_price' => $reservation->getForfait()->getPassengerPrice()];foreach( $reservation->getAdditionalReservation() as $supplement ) $recapitulatif[] = $supplement;return $this->redirectToRoute('paiement_payer', ['parent_entity_class' => null,'parent_entity_id' => null,'entity_class' => Reservation::class,'entity_id' => $reservation->getId()->toRfc4122(),'libelle' => 'Motards du viaduc - Réservation '.$reservation->getForfait()->getName(),'montant' => $reservation->getTotalPrice(),'recapitulatif' => $recapitulatif,'payement_method' => $reservation->getPayementMethod(),'back_path' => 'app_reservation_index','prenom' => $reservation->getUser()->getFirstname(),'nom' => $reservation->getUser()->getLastname(),'adresse1' => $reservation->getUser()->getAddress(),'adresse2' => $reservation->getUser()->getAddressComplement(),'zipcode' => $reservation->getUser()->getZipCode(),'city' => $reservation->getUser()->getCity(),'country' => $reservation->getUser()->getPays()->getId(),], Response::HTTP_SEE_OTHER);}#[Route('/admin/payer/{id}', name: 'app_reservation_admin_payer', methods: ['GET'])]public function admin_payer(Reservation $reservation, DonsRepository $donsRepository, ReservationRepository $reservationRepository, Request $request): Response{$recapitulatif = ['email' => $this->getUser()?->getEmail()];// Info: S'il y a un donif( null !== $reservation->getDon() ) {$don = $donsRepository->find($reservation->getDon());$recapitulatif[] = ['type' => 'don','id' => $don->getId(),'name' => 'Don','quantity' => 1,'price' => $don->getDonationAmount()];}$reservationRepository->save($reservation->setPayementMethod(ModePaiement::AUTRE));// Info: Décode le json des suppléments de la réservation$recapitulatif[] = ['type' => 'reservation','id' => $reservation->getId(),'name' => $reservation->getForfait()->getName(),'price' => $reservation->getPriceWithoutOptions(),'pilot' => $reservation->getPilot(),'pilot_price' => $reservation->getForfait()->getPilotPrice(),'passenger' => $reservation->getPassenger(),'passenger_price' => $reservation->getForfait()->getPassengerPrice()];foreach( $reservation->getAdditionalReservation() as $supplement ) $recapitulatif[] = $supplement;return $this->redirectToRoute('paiement_payer', ['parent_entity_class' => null,'parent_entity_id' => null,'entity_class' => Reservation::class,'entity_id' => $reservation->getId()->toRfc4122(),'libelle' => 'Motards du viaduc - Réservation '.$reservation->getForfait()->getName(),'montant' => $reservation->getTotalPrice(),'recapitulatif' => $recapitulatif,'payement_method' => ModePaiement::AUTRE,'back_path' => 'app_reservation_index'], Response::HTTP_SEE_OTHER);}/*** @throws TransportExceptionInterface*/#[Route('/admin/annuler/{id}', name: 'app_reservation_cancel', methods: ['GET'])]public function cancel(Reservation $reservation, ReservationRepository $reservationRepository, ComplementReservationRepository $complementReservationRepository, DonsRepository $donsRepository,RelationReservationActiviteForfaitRepository $relationReservationActiviteForfaitRepository, RelationReservationTshirtRepository $relationReservationTshirtRepository,TeeShirtRepository $teeShirtRepository, RelationActiviteForfaitRepository $relationActiviteForfaitRepository, MailerInterface $mailer): Response{$reservation->setStatus(Reservation::STATUT_ANNULE);if( $reservationRepository->save($reservation) ) {//si le don existe il est supprimerif( null !== $reservation->getDon() ) {$donsRepository->delete($reservation->getDon());}//on met le statut de suppressionforeach( $reservation->getListeRelationsActiviteForfait() as $activite ) {$relationReservationActiviteForfaitRepository->delete($activite);}//on met le statut de suppressionforeach( $reservation->getListeRelationsTshirt() as $relation_tshirt ) {$relationReservationTshirtRepository->delete($relation_tshirt);$tshirt = $teeShirtRepository->find($relation_tshirt->getTeeshirt());//mise a jour du stock commander$tshirt->removeStockCommander($relation_tshirt->getQuantity());$teeShirtRepository->save($tshirt);}// foreach( $reservation->getAdditionalReservation() as $supplement ) {// // Attention: Seul les repas sont incrémentables, si les activités le deviennent, modifier le type// if( 'activity' === $supplement['type'] ) {// if( $repas = $relationActiviteForfaitRepository->find($supplement['id'])->getActivite() ) {// $liste_repas = $reservation->getStat()['repas'];// $liste_repas[$repas->getId()->toBase32()] -= $supplement['quantity'];// $reservation->setStat(['repas' => $liste_repas]);// $reservationRepository->save($reservation);// }// }// }// foreach( $reservation->getListeComplement() as $complement ) {//// $complement->setStatus(ComplementReservation::STATUT_ANNULE);// $complementReservationRepository->save($complement);//// if( null === $complement->getDeletedAt() && ComplementReservation::STATUT_ANNULE !== $complement->getStatut() ) {// foreach( $complement->getAdditionalReservation() as $supplement ) {// // Attention: Seul les repas sont incrémentables, si les activités le deviennent, modifier le type// if( 'activity' === $supplement['type'] ) {// if( $repas = $relationActiviteForfaitRepository->find($supplement['id'])->getActivite() ) {// $liste_repas = $reservation->getStat()['repas'];// $liste_repas[$repas->getId()->toBase32()] -= $supplement['quantity'];// $reservationRepository->save($reservation->setStat(['repas' => $liste_repas]));//// }// } elseif( 'tshirt' === $supplement['type'] ) {// $tshirt = $teeShirtRepository->find($supplement['id']);// $tshirt->removeStockCommander($supplement['quantity']);// $teeShirtRepository->save($tshirt);// }// }// }// }$urlReservation = $this->generateUrl('app_reservation_show', ['id' => $reservation->getId()], UrlGeneratorInterface::ABSOLUTE_URL);// Info: Envois au client de l'email d'annulation de réservation$email = (new TemplatedEmail())->from('mdviaduc@gmail.com')->to(new Address($reservation->getUser()->getEmail()))->subject("Les motards du viaduc - Annulation de votre réservation n° ".$reservation->getNumDossier().'.')->htmlTemplate('emails/confirm_annulation_reservation_client.html.twig')->context(['reservation' => $reservation, 'urlReservation' => $urlReservation]);$mailer->send($email);}return $this->redirectToRoute('app_reservation_index', [], Response::HTTP_SEE_OTHER);}#[Route('/supprimer/{id}', name: 'app_reservation_delete', methods: ['POST'])]public function delete(Request $request, Reservation $reservation, ReservationRepository $reservationRepository, ComplementReservationRepository $complementReservationRepository,RelationReservationActiviteForfaitRepository $relationReservationActiviteForfaitRepository, RelationReservationTshirtRepository $relationReservationTshirtRepository): Response{/*** @var User $user*/$user = $this->getUser();if( $user->hasRole('ROLE_ADMIN') || $user->getId() === $reservation->getUser()->getId() ) {if ($this->isCsrfTokenValid('delete'. $reservation->getUlid(), $request->request->get('_token'))) {if( $reservationRepository->delete($reservation) ) {foreach( $reservation->getListeRelationsActiviteForfait() as $activite ) {$relationReservationActiviteForfaitRepository->delete($activite);}foreach( $reservation->getListeRelationsTshirt() as $tshirt ) {$relationReservationTshirtRepository->delete($tshirt);}foreach( $reservation->getListeComplement() as $complement ) {$complementReservationRepository->delete($complement);}}}}return $this->redirectToRoute('app_reservation_index', [], Response::HTTP_SEE_OTHER);}}