<?php
namespace App\Controller;
use App\Entity\Reservation;
use Endroid\QrCode\Builder\Builder;
use App\Entity\Service;
use App\Entity\CategoryServices;
use App\Form\ReservationType;
use App\Repository\ServiceRepository;
use App\Service\MailerManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class ReservationController extends AbstractController
{
/**
* @var EntityManagerInterface
*/
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* @Route("/reservation", name="new_reservation")
* @Route("/reservation/{slug}", name="new_reservation_service")
* @param Request $request
* @return Response
*/
public function add(Request $request, MailerManager $mailerManager, string $slug = null): Response
{
$reservation = new Reservation();
if ($slug){
$service = $this->entityManager->getRepository(Service::class)->findOneBy(['slug' => $slug]);
$reservation->setService($service);
}
$form = $this->createForm(ReservationType::class, $reservation);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//dd($form->getData());
$date = new \DateTime();
$dateString = $date->format('Ymd');
$uniqueId = uniqid();
$uniqueCode = $dateString . '-' . $uniqueId;
$reservation->setCode($uniqueCode);
$reservation->setMailSended(false);
$reservation->setCreatedAt(new \DateTimeImmutable());
$this->entityManager->persist($reservation);
$this->entityManager->flush();
$this->addFlash('success', 'Votre demande a été prise en compte');
return $this->redirectToRoute('confirmation', ['code' => $reservation->getCode()]);
}
return $this->render('reservation/index.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/confirmation/{code}", name="confirmation")
* @param Request $request
* @return Response
*/
public function confirm(Request $request, string $code, MailerManager $mailerManager): Response
{
$error = null;
$qrCodeDataUri = null;
if($reservation = $this->entityManager->getRepository(Reservation::class)->findOneBy(['code' => $code])){
if (!$reservation->isMailSended()){
$receiver1 = $reservation->getEmail();
$receiverRawStudio= 'levijo2311@gmail.com';
$template1 = '/includes/mail-reservation.html.twig';
$template2 = '/includes/mail-nouvelle-reservation.html.twig';
$data = [
'firstname' => $reservation->getFirstname(),
'lastname' => $reservation->getLastname(),
'telephone' => '+225'.$reservation->getTelephone(),
'date' => $reservation->getReservedAt()->format('Y-m-d H:i:s'),
'code' => $reservation->getCode(),
'prestation' => $reservation->getService()->getName()
];
$sendingMail = $mailerManager->sendEmail($receiver1, '', 'Confirmation de votre demande', $template1, $data);
$mailerManager->sendEmail($receiverRawStudio, 'contact@rawstudiocompany.com', 'Nouvelle demande reçue', $template2, $data);
//dd($sendingMail);
if ($sendingMail){
$reservation->setMailSended(true);
$this->entityManager->persist($reservation);
$this->entityManager->flush();
}
}
// $qrContent = 'https://rawstudiocompany.com/reservation/valid/'.$reservation->getCode();
// $result = Builder::create()
// ->data($qrContent)
// ->size(200)
// ->margin(10)
// ->build();
// $qrCodeBase64 = base64_encode($result->getString());
// $qrCodeDataUri = 'data:image/png;base64,' . $qrCodeBase64;
} else {
$error = "Votre demande n'existe pas";
}
return $this->render('reservation/confirmation.html.twig', [
'reservation' => $reservation,
'qrCode' => $qrCodeDataUri,
'error' => $error
]);
}
/**
* @Route("/reservation/valid/{code}", name="valid_reservation")
* @param Request $request
* @return Response
*/
public function valid(Reservation $reservation): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$confirmation = null;
return $this->render('reservation/valid.html.twig', [
'reservation' => $reservation,
'confirmation' => $confirmation
]);
}
/**
* @Route("/reservation/process/{code}/{status}", name="process_reservation")
* @param Request $request
* @return Response
*/
public function process(Request $request, int $status): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$reservation = $this->entityManager->getRepository(Reservation::class)->findOneBy(['code' => $request->get('code')]);
if (!$status) {
$confirmation = "Vous avez annulé la reservation du client.";
$reservation->setStatus(false);
}
else {
$confirmation = "La reservation du client a bien été validée. Vous pouvez proceder au shooting.";
$reservation->setStatus(true);
}
$this->entityManager->persist($reservation);
$this->entityManager->flush();
return $this->render('reservation/valid.html.twig', [
'reservation' => $reservation,
'confirmation' => $confirmation
]);
}
}