<?php
namespace App\Controller\Marketplace;
use App\Entity\Company;
use App\Entity\Event;
use App\Entity\MarketplaceCategory;
use App\Entity\MarketplaceReservation;
use App\Entity\User;
use App\Entity\Workshop;
use App\Form\Marketplace\MarketplaceReservationType;
use App\Repository\WorkshopRepository;
use App\Service\EmailService;
use App\Service\StripeService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
class ReservationController extends AbstractController
{
/**
* @var EmailService
*/
private $emailService;
/**
* @var EntityManagerInterface
*/
private $em;
public function __construct(EmailService $emailService, EntityManagerInterface $em)
{
$this->emailService = $emailService;
$this->em = $em;
}
/**
* @Route("/reservation/paiement-valide", name="app_tunnel_co_stepfinal")
*/
public function paiementOk(): Response
{
return $this->render('marketplace/reservation/tunnel_co_stepfinal.html.twig', [
'controller_name' => 'ReservationController',
]);
}
/**
* @Route("/reservation/demandes-particulieres", name="app_reservation_free")
*/
public function freeReservation(Request $request): Response
{
$company = null;
$marketplaceReservation = new MarketplaceReservation;
if ($this->getUser() != null) {
$company = $this->getUser()->getCompany();
$user = $this->em->getRepository(User::class)->find($this->getUser()->getId());
$marketplaceReservation
->setUser($user)
->setFullName($user->getFirstName() ." ". $user->getLastName())
->setPhone($user->getCompany()->getPhone())
->setEmail($user->getEmail())
;
}
$form = $this->createForm(MarketplaceReservationType::class, $marketplaceReservation, ['isFree' => true]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($marketplaceReservation->getDateStart() == null) {
$form->get('dateStart')->addError(new FormError('Veuillez renseigner une date valide'));
return $this->render('marketplace/reservation/free_reservation.html.twig', [
'form' => $form->createView()
]);
}
if ($form->getData()->getWorkshop() == null) {
$form->get('workshop')->addError(new FormError('Veuillez choisir un atelier valide'));
return $this->render('marketplace/reservation/free_reservation.html.twig', [
'form' => $form->createView()
]);
}
$marketplaceReservation->setFamily($marketplaceReservation->getCategory()->getFamily());
if(!empty($marketplaceReservation->getFullName())) { // Insertion du firstName et lastName
$firstName = $lastName = null;
$firstName = $marketplaceReservation->getFullName();
$marketplaceReservation
->setFirstName($firstName)
// ->setLastName($lastName)
;
}
$marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_FREE);
$this->em->getRepository(MarketplaceReservation::class)->add($marketplaceReservation);
$this->emailService->sendSpecialRequestToULTEAMMail($company, $marketplaceReservation);
if ($this->getUser() != null) {
$this->addFlash('success', 'Votre demande a bien été envoyé');
}else{
$this->addFlash('success', 'Votre demande a bien été envoyé. Pour faciliter les demandes à venir vous pouvez vous inscrire sur la plateforme.');
}
return $this->redirectToRoute('marketplace_app_user', ['nav' => 3]);
}
return $this->render('marketplace/reservation/free_reservation.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/reservation/paiement/{marketplaceReservation}", name="app_reservation_payment")
*/
public function payment(Request $request, MarketplaceReservation $marketplaceReservation, StripeService $stripeService): Response
{
if($marketplaceReservation->getWorkshop()->isFreeSellingPrice()) { // Workshop gratuit
$marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_FREE);
$this->em->getRepository(MarketplaceReservation::class)->add($marketplaceReservation);
} else { // Workshop payant avec stripe
$paymentStatus = [
MarketplaceReservation::PAYMENT_STATUS_PENDING,
MarketplaceReservation::PAYMENT_STATUS_FAILED,
MarketplaceReservation::PAYMENT_STATUS_CANCELED,
];
$marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_PENDING);
// if (!empty($marketplaceReservation->getPayment()) && !in_array($marketplaceReservation->getPaymentStatus(), $paymentStatus)){
// $this->addFlash('danger', 'Cette réservation est en attente de paiement, une autre requête ne peut être faite pour l\'instant');
// return $this->redirectToRoute('admin_marketplace_reservation_show', ['id' => $marketplaceReservation->getId()]);
// }
try { //the confirmation or the failure of the checkout will be managed via webhook to secure the process
$session = $stripeService->stripeCheckoutSessionMarketplaceReservation($marketplaceReservation);
$marketplaceReservation->setPayment($session->payment_intent);
$this->em->persist($marketplaceReservation);
$this->em->flush();
$request->getSession()->remove('RESERVATION_ID');
// $this->addFlash('success', 'Votre réservation a bien été pris en compte');
} catch (\Throwable $th) {
throw $th;
$this->addFlash('danger', 'Un problème est survenue lors de la réservation');
}
return new RedirectResponse($session->url, 303);
}
return $this->redirectToRoute('admin_marketplace_reservation_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/reservation/cancel/{marketplaceReservation}", name="app_reservation_cancel")
*/
public function cancelReservation(Request $request, MarketplaceReservation $marketplaceReservation): Response
{
if (!$marketplaceReservation instanceof MarketplaceReservation) {
throw new NotFoundHttpException();
}
$marketplaceReservation->setStatus(MarketplaceReservation::STATUS_CANCELED);
$marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_CANCELED);
$this->em->persist($marketplaceReservation);
$this->em->flush();
$this->addFlash('success', 'Réservation supprimée avec succès');
$referer = $request->headers->get('referer');
// return $this->redirect($referer);
return $this->redirectToRoute('marketplace_app_user', ['nav' => 2], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/reservation/recapitulatif/{marketplaceReservationId}", name="app_reservation_recap")
*/
public function paiement(Request $request, int $marketplaceReservationId = null): Response
{
if (empty($marketplaceReservationId)) {
$marketplaceReservation = $this->em->getRepository(MarketplaceReservation::class)->find($request->getSession()->get('RESERVATION_ID'));
}else {
$marketplaceReservation = $this->em->getRepository(MarketplaceReservation::class)->find($marketplaceReservationId);
}
if($marketplaceReservation instanceof MarketplaceReservation && $marketplaceReservation->getPaymentStatus() === MarketplaceReservation::PAYMENT_STATUS_FREE) {
$request->getSession()->set('RESERVATION_ID', null);
return $this->redirectToRoute('marketplace_app_user', ['nav' => 2]);
}
if ($marketplaceReservation->getUser() == null) {
# code...
$user = $this->em->getRepository(User::class)->find($this->getUser()->getId());
$marketplaceReservation
->setUser($user)
->setFullName($user->getFirstName() ." ". $user->getLastName())
->setPhone($user->getCompany()->getPhone())
->setEmail($user->getEmail())
;
$this->em->persist($marketplaceReservation);
$this->em->flush();
}
// if ($marketplaceReservation->getPaymentStatus() == MarketplaceReservation::PAYMENT_STATUS_SUCCESS) {
// }
return $this->render('marketplace/reservation/tunnel_co_step1.html.twig', [
'reservation' => $marketplaceReservation
]);
}
/**
* @Route("/reservation/{workshopName}-{workshop}",
* name="app_reservation",
* requirements={
* "workshopName"="[^\/]+",
* })
*/
public function index(Request $request, Workshop $workshop, StripeService $stripeService): Response
{
// Récuperation des workshop pour le slider
$workshopSlides = $this->em->getRepository(Workshop::class)->findBy([
'tag' => $workshop->getTag(),
'marketplaceIsDisplay' => true
]);
// Si j'ai un cookie avec une reservation
if (!empty($request->getSession()->get('RESERVATION_ID'))) {
// Je récup la resa avec l'id du cookie
$marketplaceReservation = $this->em->getRepository(MarketplaceReservation::class)->find($request->getSession()->get('RESERVATION_ID'));
if ($marketplaceReservation instanceof MarketplaceReservation && $marketplaceReservation->getWorkshop() == $workshop && empty($request->query->get('editRes'))
&& empty($marketplaceReservation->getWorkshop()->getFixedSellingPrice())
) {
return $this->redirectToRoute('marketplace_app_reservation_recap', ['marketplaceReservationId' => $marketplaceReservation->getId()]);
}
}
if (isset($marketplaceReservation) && $marketplaceReservation->getWorkshop() == $workshop) {
$marketplaceReservation = $marketplaceReservation;
} else {
// Sinon
// Je fais tout ça
$marketplaceReservation = new MarketplaceReservation();
$marketplaceReservation
->setWorkshop($workshop)
->setCategory($workshop->getMarketplaceCategory())
->setFamily($workshop->getMarketplaceFamily())
->setDescription($workshop->getDescription())
->setPaymentAmount($workshop->getFixedSellingPrice())
;
}
if(!$marketplaceReservation->getWorkshop()->isFreeSellingPrice()) { // Workshop payant
$marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_PENDING);
} else {
$marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_FREE);
}
if ($this->getUser() != null) {
$user = $this->em->getRepository(User::class)->find($this->getUser()->getId());
$marketplaceReservation
->setUser($user)
->setFullName($user->getFirstName() ." ". $user->getLastName())
->setPhone($user->getCompany()->getPhone())
->setEmail($user->getEmail())
;
}
$form = $this->createForm(MarketplaceReservationType::class, $marketplaceReservation);
$form->handleRequest($request);
$company = ($this->getUser() instanceof User) ? $this->em->getRepository(Company::class)->findOneBy(['user' => $this->getUser()]) : null;
if ($form->isSubmitted() && $form->isValid()) {
if ($marketplaceReservation->getDateStart() == null) {
$form->get('dateStart')->addError(new FormError('Veuillez renseigner une date valide'));
return $this->render('marketplace/reservation/index.html.twig', [
'workshop' => $workshop,
'form' => $form->createView(),
'workshopSlides' => $workshopSlides
]);
}
// Si un utilisateur est connecté
if ($this->getUser() instanceof User && $this->isGranted('ROLE_COMPANY')) {
if(!empty($marketplaceReservation->getFullName())) { // Insertion du firstName et lastName
$firstName = $lastName = null;
$firstName = $marketplaceReservation->getFullName();
$marketplaceReservation
->setFirstName($firstName)
// ->setLastName($lastName)
;
}
if($marketplaceReservation->getWorkshop() instanceof Workshop && empty($marketplaceReservation->getWorkshop()->getFixedSellingPrice())) {
$marketplaceReservation->setPaymentStatus(MarketplaceReservation::PAYMENT_STATUS_FREE);
}
$this->em->getRepository(MarketplaceReservation::class)->add($marketplaceReservation);
// $this->emailService->sendSpecialRequestToULTEAMMail($company, $marketplaceReservation);
// Si la réservation est gratuite
if($marketplaceReservation->getWorkshop() instanceof Workshop && empty($marketplaceReservation->getWorkshop()->getFixedSellingPrice())) {
$this->emailService->sendSpecialRequestToULTEAMMail($company, $marketplaceReservation);
$message = 'Votre demande a bien été envoyé.';
if (!$this->getUser() instanceof User) $message .= " Pour faciliter les demandes à venir vous pouvez vous inscrire sur la plateforme.";
$this->addFlash('success', $message);
return $this->redirectToRoute('marketplace_app_user', ['nav' => 3]);
} else { // Si la réservation est payante
// Tant que la reservation n'est pas payé je la stocke en session pour la retrouver facilement
$request->getSession()->set('RESERVATION_ID', $marketplaceReservation->getId());
return $this->redirectToRoute('marketplace_app_reservation_recap', ['marketplaceReservationId' => $marketplaceReservation->getId()]);
}
} else { // Si pas de User
$this->em->persist($marketplaceReservation);
$this->em->flush();
// $this->emailService->sendSpecialRequestToULTEAMMail($company, $marketplaceReservation);
// $message = 'Votre demande a bien été envoyé.';
$message = '';
if($marketplaceReservation->getPaymentStatus() === MarketplaceReservation::PAYMENT_STATUS_FREE) {
$message .= " Pour faciliter les demandes à venir vous pouvez vous inscrire sur la plateforme.";
} else {
$message = 'Veuillez vous connecter pour finaliser votre réservation.';
// Tant que la reservation n'est pas payé je la stocke en session pour la retrouver facilement
$request->getSession()->set('RESERVATION_ID', $marketplaceReservation->getId());
}
$this->addFlash('success', $message);
return $this->redirectToRoute('app_login_marketplace');
}
}
return $this->render('marketplace/reservation/index.html.twig', [
'workshop' => $workshop,
'form' => $form->createView(),
'workshopSlides' => $workshopSlides
]);
}
/**
* @Route("/reservation/get-workshop-from-categ/{marketplaceCategory}", name="get_workshop_from_categ")
*/
public function getWokrshopFromCateg(Request $request, MarketplaceCategory $marketplaceCategory, WorkshopRepository $workshopRepository): Response
{
if ($marketplaceCategory instanceof MarketplaceCategory) {
$workshops = $this->em->getRepository(Workshop::class)->findBy(
[
'marketplaceCategory' => $marketplaceCategory
]
);
$choices = [];
foreach ($workshops as $workshop) {
if ($workshop->getIsvirtual() == true) {
$choices[] = [
'id' => $workshop->getId(),
'name' => $workshop->getName()." - Atelier virtuel",
];
}else{
$choices[] = [
'id' => $workshop->getId(),
'name' => $workshop->getName()." - Atelier collectif",
];
}
}
array_unshift($choices, ['id' => "", 'name' => "Choisissez l'atelier ..."]);
return new JsonResponse($choices);
}else{
return new JsonResponse('Une erreur est survenue');
}
}
}