<?php
namespace App\Controller;
use DateInterval;
use App\Entity\Service;
use App\Entity\Commande;
use App\Form\RetraitType;
use App\Entity\Retrait;
use App\Service\EmailService;
use App\Service\PanierServices;
use App\Service\CommandeService;
use App\Repository\MenuRepository;
use App\Repository\ServiceRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\PreparationRepository;
use Dom\Entity;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
#[Route('/panier', name:'panier_')]
class PanierController extends AbstractController
{
public function __construct(
private SessionInterface $session,
private PreparationRepository $preparationRepository,
private MenuRepository $menuRepository,
private EntityManagerInterface $entityManager
) {}
#[Route('/', name: 'index')]
public function index(SessionInterface $session, PreparationRepository $preparationRepository, ServiceRepository $serviceRepository, MenuRepository $menuRepository): Response
{
$paniers = $session->get("panier", []);
$dataPanier = [];
$total = [];
foreach ($paniers as $service_id => $panier) {
$service = $serviceRepository->find($service_id);
$total[$service_id] = 0;
foreach ($panier as $id => $quantite) {
$preparation = $preparationRepository->find($id);
$preparationDuJour = $menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
$dataPanier[$service_id][] = [
"service" => $service,
"preparation" => $preparation,
"quantite" => $quantite,
"prix" => $preparationDuJour->getPrix(),
"quantite_restante" => $preparationDuJour->getQuantite()
];
$total[$service_id] += $quantite * $preparationDuJour->getPrix();
}
}
return $this->render('panier/index.html.twig', [
'dataPanier' => $dataPanier,
'total' => $total,
]);
}
#[Route('/add/{serviceId}/{prepaId}', name: 'add')]
public function add(int $serviceId, int $prepaId, ServiceRepository $serviceRepository,PreparationRepository $preparationRepository, PanierServices $panierServices)
{
$service = $serviceRepository->find($serviceId);
$preparation = $preparationRepository->find($prepaId);
$panierServices->panier_add($preparation,$service);
return $this->redirectToRoute('panier_index');
}
#[Route('/remove/{serviceId}/{prepaId}', name: 'remove')]
public function remove(int $serviceId, int $prepaId, ServiceRepository $serviceRepository,PreparationRepository $preparationRepository, PanierServices $panierServices)
{
$service = $serviceRepository->find($serviceId);
$preparation = $preparationRepository->find($prepaId);
$panierServices->panier_remove($preparation,$service);
return $this->redirectToRoute('panier_index');
}
#[Route('/delete/{serviceId}/{prepaId}', name: 'delete')]
public function delete(int $serviceId, int $prepaId, ServiceRepository $serviceRepository,PreparationRepository $preparationRepository, PanierServices $panierServices)
{
$service = $serviceRepository->find($serviceId);
$preparation = $preparationRepository->find($prepaId);
$panierServices->panier_delete($preparation,$service);
return $this->redirectToRoute('panier_index');
}
#[Route('/delete/{id}', name: 'delete_service')]
public function deleteService(Service $service, PanierServices $panierServices)
{
$panierServices->panier_delete_service($service);
return $this->redirectToRoute('panier_index');
}
#[Route('/_api/preparation/add', name: 'api_post_preparation_add', methods: ['GET'])]
public function apiPostPreparationAdd(Request $request, ServiceRepository $serviceRepository, PreparationRepository $preparationRepository, PanierServices $panierServices, SerializerInterface $serializerInterface)
{
if($request->isXmlHttpRequest()){
$data = 0;
$nb_preparation = 0;
$quantite = [
'quantite' => 0,
'quantite_restante' => 0
];
// if(is_int($request->query->get("serviceId"))){
$serviceId = $request->query->get("serviceId");
// } else {
// $this->addFlash('error', 'Type de variable de service incorrecte !');
// return new RedirectResponse($this->urlGenerator->generate('home'));
// }
// if(is_int($request->query->get("preparationId"))){
$preparationId = $request->query->get("preparationId");
// } else {
// $this->addFlash('error', 'Type de variable de preparation incorrecte !');
// return new RedirectResponse($this->urlGenerator->generate('client_service_show',['id' => $serviceId]));
// }
$service = $serviceRepository->find($serviceId);
$preparation = $preparationRepository->find($preparationId);
$preparationDuJour = $this->menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
$quantite['quantite_restante'] = $preparationDuJour->getQuantite();
$nb_preparation = $panierServices->panier_add($preparation,$service);
$quantite['quantite'] = $nb_preparation;
if($nb_preparation > $preparationDuJour->getQuantite()){
$nb_preparation = -1;
$quantite['quantite'] = -1;
}
$data = $serializerInterface->serialize($quantite,"json");
return $this->json($data);
} else {
$this->addFlash('error', 'Vous n\'êtes pas autorisé à accéder à cette partie du site !');
// return new RedirectResponse($this->urlGenerator->generate('home'));
return $this->redirectToRoute('home',[]);
}
}
/**
* Function d'appel de l'api de suppression d'une quantité de 1 de la préparation choisie
*
* @param Request $request
* @param ServiceRepository $serviceRepository
* @param PreparationRepository $preparationRepository
* @param PanierServices $panierServices
* @param SerializerInterface $serializerInterface
*/
#[Route('/_api/preparation/remove', name: 'api_post_preparation_remove', methods: ['GET'])]
public function apiPostPreparationRemove(Request $request, ServiceRepository $serviceRepository, PreparationRepository $preparationRepository, PanierServices $panierServices, SerializerInterface $serializerInterface)
{
if($request->isXmlHttpRequest()){
$serviceId = $request->query->get("serviceId");
$preparationId = $request->query->get("preparationId");
$data = 0;
$nb_preparation = 0;
$quantite = [
'quantite' => 0,
'quantite_restante' => 0
];
$service = $serviceRepository->find($serviceId);
$preparation = $preparationRepository->find($preparationId);
$preparationDuJour = $this->menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
$quantite['quantite_restante'] = $preparationDuJour->getQuantite();
$nb_preparation = $panierServices->panier_remove($preparation,$service);
$quantite['quantite'] = $nb_preparation;
if($nb_preparation > $preparationDuJour->getQuantite()){
$nb_preparation = -1;
$quantite['quantite'] = -1;
}
$data = $serializerInterface->serialize($quantite,"json");
return $this->json($data);
} else {
$this->addFlash('error', 'Vous n\'êtes pas autorisé à accéder à cette partie du site !');
return $this->redirectToRoute('home',[]);
}
}
#[Route('/_api/preparation/epuise', name: 'api_post_preparation_epuise', methods: ['GET'])]
public function apiPostPreparationEpuise(Request $request, ServiceRepository $serviceRepository, PreparationRepository $preparationRepository, PanierServices $panierServices, SerializerInterface $serializerInterface)
{
if($request->isXmlHttpRequest()){
$serviceId = $request->query->get("serviceId");
$preparationId = $request->query->get("preparationId");
$data = 0;
$nb_preparation = 0;
$quantite = [
'quantite' => 0,
'quantite_restante' => 0
];
$service = $serviceRepository->find($serviceId);
$preparation = $preparationRepository->find($preparationId);
$preparationDuJour = $this->menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
if($preparationDuJour->getQuantite() > 0){
$preparationDuJour->setQuantite(0);
}
$this->entityManager->flush();
// $nb_preparation = $panierServices->panier_epuise($preparation,$service);
$data = $serializerInterface->serialize($quantite,"json");
return $this->json($data);
} else {
$this->addFlash('error', 'Vous n\'êtes pas autorisé à accéder à cette partie du site !');
return $this->redirectToRoute('home',[]);
}
}
#[Route('/majquantitesservice/{id}', name: 'maj_quantite_service', methods:['GET'])]
public function majQuantitesService(Commande $commande, CommandeService $commandeService)
{
$commandeService->majQuantitesService($commande);
return $this->redirectToRoute('commande_show',['id' => $commande->getId()]);
}
#[Route('/confirm/{id}', name: 'confirm_commande', methods:['GET','POST'])]
public function confirmCommande(Service $service, EntityManagerInterface $entityManager, PanierServices $panierServices, Request $request, CommandeService $commandeService, EmailService $emailService, MailerInterface $mailer)
{
$now = new \DateTime('now', new \DateTimeZone('Europe/Paris'));
$debut = $now->add(new DateInterval('PT10M'));
// dump($now->format('Y-m-d H:i:s'));
// dump($service->getFinService()->format('Y-m-d H:i:s'));
if($debut->format('Y-m-d H:i:s') > $service->getFinService()->format('Y-m-d H:i:s')){
// dd('OK');
$this->addFlash('error', 'Désolé mais nous ne prenons plus de commande pour ce service. Nous serons ravis de prendre une nouvelle commande sur un prochain service.');
$panierServices->panier_delete_service($service);
return $this->redirectToRoute('panier_index');
}
$commande = $commandeService->new($service,$this->getUser());
$commandeService->ajoutLignesCommande($commande);
$form = $this->createForm(RetraitType::class,$commande,['service' => $service,'debut' => $debut]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//Validation de la commande
$entityManager->flush();
//Initialisation du workflow
$commandeService->workflowCommande($commande,'demander');
//Suppression du panier
$panierServices->panier_delete_service($service);
//Envoi d'un courriel de confirmation de la commande au client
$email = $emailService->EmailConfirmationCommande($commande);
try {
$mailer->send($email);
$this->addFlash('email_ok', 'Un accusé de réception a été envoyé sur votre messagerie');
$commandeService->messageSent($commande,'EmailConfirmationCommande');
} catch (TransportExceptionInterface $e) {
// $this->addFlash('verify_email_error', $e->getMessage());
$commandeService->messageError($commande,'EmailConfirmationCommande',$e);
//Envoi d'un courriel à l'admin pour informer qu'il y a un problème avec l'envoi de courriel vers le client
}
$this->addFlash('success', 'Merci pour votre commande');
return $this->redirectToRoute('panier_maj_quantite_service',['id' => $commande->getId()]);
}
return $this->render('commande/retrait.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/delete', name: 'delete_all')]
public function deleteAll(PanierServices $panierServices)
{
$panierServices->panier_delete_all();
return $this->redirectToRoute('panier_index');
}
/**
* Fonction d'impression d'un panier
*/
#[Route('/{id}/print/{retrait}/{note?}', name: 'print', methods: ['GET'])]
public function print(Service $service, Retrait $retrait, ?string $note): Response
{
$paniers = $this->session->get("panier", []);
$lignesCommande = [];
$commande = [
'id' => null,
'lignesCommande' => $lignesCommande,
'retrait' => $retrait,
'note' => $note,
'user' => $this->getUser(),
];
foreach ($paniers[$service->getId()] as $id => $quantite) {
$preparation = $this->preparationRepository->find($id);
$preparationDuJour = $this->menuRepository->findOneBy(['preparation' => $preparation,'service' => $service]);
$ligneCommande['preparation'] = $preparation;
$ligneCommande['quantite'] = $quantite;
$ligneCommande['prix'] = $preparationDuJour->getPrix();
$lignesCommande[] = $ligneCommande;
};
$commande['lignesCommande'] = $lignesCommande;
return $this->render('commande/print.html.twig',[
'commande' => $commande,
]);
}
}