src/Controller/Website/FrontController.php line 35

Open in your IDE?
  1. <?php 
  2. namespace App\Controller\Website;
  3. use App\Entity\Client;
  4. use Psr\Log\LoggerInterface;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use App\Entity\Tarif;
  12. use App\Entity\Transaction;
  13. use App\Entity\Commande;
  14. use App\Entity\BonCommande;
  15. use App\Service\EntitySaver;
  16. use App\Service\SogecommerceService;
  17. use IntlDateFormatter;
  18. use App\Entity\PlanningReservation;
  19. class FrontController extends AbstractController
  20. {
  21.     private $requestStack;
  22.     private EntitySaver $entitySaver;
  23.     private $sogecommerceService;
  24.     public function __construct(RequestStack $requestStackEntitySaver $entitySaverSogecommerceService $sogecommerceService)
  25.     {
  26.         $this->requestStack $requestStack;
  27.         $this->entitySaver $entitySaver;
  28.         $this->sogecommerceService $sogecommerceService;
  29.     }
  30.     #[Route('/reservation'name'front_reserve')]
  31.     public function reserver(Request $requestEntityManagerInterface $entityManager): Response
  32.     {
  33.         $urlPrecedente $request->headers->get('referer');
  34.         $user $this->getUser();
  35.         $content = [
  36.             'title' => 'Choisissez vos réservations'
  37.         ];
  38.         $step $request->query->get('step');
  39.         $datas = [];
  40.         $repositoryTrf $entityManager->getRepository(Tarif::class);
  41.         $tarifsDb $repositoryTrf->findAll();
  42.         $tarifs = [];
  43.         foreach($tarifsDb as $item){
  44.             $tarifs[$item->getId()] = $item;
  45.         }
  46.         if($step == 'recap' && !empty($user)){
  47.             $bon_commande_id $this->entitySaver->getBonCommandeEncours($user->getId(), $entityManager);
  48.             $conditions = [
  49.                 'client_id' => $user->getId(),
  50.                 'statut_id' => 1,
  51.                 'bon_commande_id' => $bon_commande_id
  52.             ];
  53.             $repositoryDb $entityManager->getRepository(Commande::class);
  54.             $cmd $repositoryDb->findByFilters($conditions);
  55.             $datas['commandes'] = $cmd;
  56.             $content['title'] = 'Récapitulatif';
  57.             $bon_commande_id 0;
  58.             // On boucle la commande pour avoir la totalité
  59.             if(!empty($cmd)){
  60.                 $total 0;
  61.                 foreach($cmd as $itemCmd){
  62.                     $total += $itemCmd->qte $tarifs[$itemCmd->tarif_id]->pu;
  63.                     $bon_commande_id $itemCmd->getBonCommandeId();
  64.                 }
  65.                 // Convertir en chaîne pour s'assurer de la compatibilité
  66.                 if (strlen((string)$bon_commande_id) < 6) {
  67.                     $bon_commande_id str_pad($bon_commande_id6'0'STR_PAD_LEFT);
  68.                 }
  69.                 // 20% designe le TVA
  70.                 $total $total $total 0.20;
  71.                 $form $this->sogecommerceService->generatePaymentForm([
  72.                     'vads_amount' => $total 100// Amount in cents
  73.                     'vads_failure_url' => 'https://preprod.panda-coworking.com'.$this->generateUrl('payment_failure', [], true),
  74.                     'vads_cust_name' => $user->getPrenom() . ' ' $user->getNom(),
  75.                     'vads_url_return' => 'https://preprod.panda-coworking.com'.$this->generateUrl('front_retour', [], true),
  76.                     'vads_trans_id' => $bon_commande_id// Unique transaction ID
  77.                 ]);
  78.                 $datas['paymentForm'] = $form;
  79.             }
  80.         }
  81.         if ($request->isMethod('POST')) {
  82.             $commandes $this->entitySaver->getCommandesEncours();
  83.             $cmd $request->request->get('data');
  84.             foreach($cmd as $tarifId => $nb){
  85.                 if($nb){
  86.                     $commandes[] = [
  87.                         'tarif_id' => $tarifId,
  88.                         'qte' => $nb,
  89.                         'date_commande' => date('Y-m-d H:i:s')
  90.                     ];
  91.                 }
  92.             }
  93.             if(!empty($commandes)){
  94.                 // si le client n'est pas connecté on stocke dans une variable de session on force à logguer ou créer un compte
  95.                 if(empty($user)){
  96.                     $commandes $this->entitySaver->setCommandes($commandes);
  97.                     return $this->redirectToRoute('login', [null'pm' => base64_encode(serialize(['datetime' => strtotime(Date('Y-m-d H:i:s'))]))]);
  98.                     die;
  99.                 }
  100.                 // Sinon on affiche le récapitulatif et on procède au processus de paiement ...
  101.                 else {
  102.                     // Récupération du bon de commande
  103.                     $bon_commande_id $this->entitySaver->getBonCommandeEncours($user->getId(), $entityManager);
  104.                     // Enregistrement des informations de commandes + redirection de la liste des commandes en cours
  105.                     foreach($commandes as &$item){
  106.                         $item['client_id'] = $user->getId();
  107.                         $commande = new Commande();
  108.                         $commande->setTarifId($item['tarif_id']);
  109.                         $commande->setQte($item['qte']);
  110.                         $commande->setClientId($item['client_id']);
  111.                         $commande->setBonCommandeId($bon_commande_id);
  112.                         $commande->setDateCommande($item['date_commande']);
  113.                         $commande->setStatutId(1);
  114.                         $commande->setCreated();
  115.                         $commande->setChanged();
  116.                         $tmp[] = $commande;
  117.                     }
  118.                     $this->entitySaver->saveMany($tmp);
  119.                     $this->entitySaver->initCommandes();
  120.                     // Rédirection vers le recapitulatif
  121.                     return $this->redirectToRoute('front_reserve', [null'step' => 'recap']);
  122.                     die;
  123.                 }
  124.             }
  125.         }
  126.         // Rah ohatra ka m'post anle commande izy eto
  127.         // Si le client est déjà connecté => on redirige vers le paiement + enregistrement des commandes
  128.         // Sinon on affiche la page pour la Création d'un compte et login + enregistrement dans une variable de Session
  129.         // PROCESSUS DANS L'AUTRE FONCTION
  130.         // Si le client à déjà un compte => après avoir logguer on enregistre les commandes et on supprime la variable de Session et on le redirige vers l'interface de paiement
  131.         // Sinon il crée son propre compte puis on le force à se logguer + enregistrement des commandes + suppression variable de session >> redirection ver l'interface de paiment
  132.         // Liste des reservations pour cette semaine
  133.         // Date actuelle
  134.         $dateFiltre $request->query->get('d');
  135.         $date = new \DateTime();
  136.         if(!empty($dateFiltre)){
  137.             $date = new \DateTime($dateFiltre);
  138.         }
  139.         $formatter = new IntlDateFormatter(
  140.             'fr_FR'// Locale en français
  141.             IntlDateFormatter::LONG// Format long (ex. "février 2025")
  142.             IntlDateFormatter::NONE// Pas besoin de l'heure
  143.             null,
  144.             null,
  145.             'MMMM' // Format uniquement pour afficher le mois en toutes lettres
  146.         );
  147.         $date1 $date;
  148.         $mois_annee $formatter->format($date1->modify('this week sunday'));
  149.         $date_lundi $date->modify('this week monday')->format('Y-m-d');
  150.         $date_mardi $date->modify('this week tuesday')->format('Y-m-d');
  151.         $date_mercred $date->modify('this week wednesday')->format('Y-m-d');
  152.         $date_jeudi $date->modify('this week thursday')->format('Y-m-d');
  153.         $date_vendredi $date->modify('this week friday')->format('Y-m-d');
  154.         $date_samedi $date->modify('this week saturday')->format('Y-m-d');
  155.         $date_dimanche $date->modify('this week sunday')->format('Y-m-d');
  156.         $titre_tableau 'Semaine du '.$date->modify('this week monday')->format('d').' au '.$date->modify('this week sunday')->format('d').' '.$mois_annee;
  157.         $dateNext $date->modify('next week monday')->format('Y-m-d');
  158.         $dateLast $date->modify('-14 days')->format('Y-m-d');
  159.         $options = [
  160.             'statut_id' => 1
  161.         ];
  162.         $dates = [$date_lundi$date_dimanche];
  163.         $repository $entityManager->getRepository(PlanningReservation::class);
  164.         $plannings $repository->findByFilters($options$dates);
  165.         // Regroupement en PHP
  166.         $groupedByDate = [];
  167.         foreach ($plannings as $event) {
  168.             $dateKey $event->getDateReservation()->format('Y-m-d');
  169.             $timeValue $event->getHeureDebut();
  170.             // Initialiser la clé si elle n'existe pas
  171.             if (!isset($groupedByDate[$dateKey])) {
  172.                 $groupedByDate[$dateKey] = [];
  173.             }
  174.             // Ajouter les données de l'événement et du client
  175.             $groupedByDate[$dateKey][] = [
  176.                 'time' => $timeValue,
  177.                 'client_id' => $event->getClientId(),
  178.                 'id' => $event->getId()
  179.             ];
  180.         }
  181.         $modal $request->query->get('modal');
  182.         // récupère les données comme $titre, $reservations, etc.
  183.         $template $modal 'front/disponibilites_fragment.html.twig' 'front/reserver.html.twig';
  184.         return $this->render($template, [
  185.             'tarifs' => $tarifs,
  186.             'content' => $content,
  187.             'step' => $step,
  188.             'datas' => $datas,
  189.             'referer' => $urlPrecedente,
  190.             'titre' => 'Disponibilité de la salle de réunion',
  191.             'reservations' => $groupedByDate// pas de json_encode
  192.             'titre_tableau' => $titre_tableau,
  193.             'date_next' => $dateNext,
  194.             'date_last' => $dateLast,
  195.             'dates' => [$date_lundi$date_mardi$date_mercred$date_jeudi$date_vendredi$date_samedi$date_dimanche]
  196.         ]);
  197.     }
  198.     #[Route('/retour-commande'name'front_retour'methods: ['GET''POST'])]
  199.     public function returnCommande(Request $requestEntityManagerInterface $entityManagerLoggerInterface $logger): Response
  200.     {
  201.         $user $this->getUser();
  202.         $step "";
  203.         $transStatus $request->get('vads_trans_status');
  204.         $resultCode $request->get('vads_result');
  205.         $authResult $request->get('vads_auth_result');
  206.         $logger->info('Retour de paiement Sogecommerce :'$request->query->all());
  207.         if (!empty($user)) {
  208.             // --- Cas commande annulée ---
  209.             if ($transStatus === 'ABANDONED' || $resultCode === '17') {
  210.                 $step "annulation";
  211.                 $bon_commande $entityManager->getRepository(BonCommande::class)->findOneBy([
  212.                     'statut_id' => 1,
  213.                     'client_id' => $user->getId()
  214.                 ]);
  215.                 if (!empty($bon_commande)) {
  216.                     $bon_commande->setStatutId(3);
  217.                     $bon_commande->setChanged();
  218.                     $entityManager->persist($bon_commande);
  219.                     $conditions = [
  220.                         'statut_id' => 1,
  221.                         'bon_commande_id' => $bon_commande->getId()
  222.                     ];
  223.                     $repository $entityManager->getRepository(Commande::class);
  224.                     $commandes $repository->findByFilters($conditions);
  225.                     foreach ($commandes as $commande) {
  226.                         $commande->setStatutId(3);
  227.                         $commande->setChanged();
  228.                         $entityManager->persist($commande);
  229.                     }
  230.                     $entityManager->flush();
  231.                     $this->entitySaver->initCommandes();
  232.                 }
  233.             }
  234.             // --- Cas paiement accepté ---
  235.             elseif ($resultCode === '00' && $transStatus === 'AUTHORISED' && $authResult === '00') {
  236.                 // Vérifie si le bon de commande est bien passé au statut "payé" (= 2)
  237.                 $bon_commande $entityManager->getRepository(BonCommande::class)->findOneBy([
  238.                     'statut_id' => 2,
  239.                     'client_id' => $user->getId()
  240.                 ]);
  241.                 if ($bon_commande) {
  242.                     $step "confirmation";
  243.                 } else {
  244.                     $step "erreur"// ou "attente de traitement"
  245.                 }
  246.             }
  247.         }
  248.         return $this->render('front/retour.html.twig', [
  249.             'step' => $step,
  250.         ]);
  251.     }
  252.     #[Route('/reservation/disponibilite-salle-reunion'name'app_disponibilite_salle')]
  253.     public function voirDisponibilitesSalleReunion(Request $requestEntityManagerInterface $entityManager): Response
  254.     {
  255.         // Liste des reservations pour cette semaine
  256.         // Date actuelle
  257.         $dateFiltre $request->query->get('d');
  258.         $date = new \DateTime();
  259.         if(!empty($dateFiltre)){
  260.             $date = new \DateTime($dateFiltre);
  261.         }
  262.         $formatter = new IntlDateFormatter(
  263.             'fr_FR'// Locale en français
  264.             IntlDateFormatter::LONG// Format long (ex. "février 2025")
  265.             IntlDateFormatter::NONE// Pas besoin de l'heure
  266.             null,
  267.             null,
  268.             'MMMM' // Format uniquement pour afficher le mois en toutes lettres
  269.         );
  270.         $date1 $date;
  271.         $mois_annee $formatter->format($date1->modify('this week sunday'));
  272.         $date_lundi $date->modify('this week monday')->format('Y-m-d');
  273.         $date_mardi $date->modify('this week tuesday')->format('Y-m-d');
  274.         $date_mercred $date->modify('this week wednesday')->format('Y-m-d');
  275.         $date_jeudi $date->modify('this week thursday')->format('Y-m-d');
  276.         $date_vendredi $date->modify('this week friday')->format('Y-m-d');
  277.         $date_samedi $date->modify('this week saturday')->format('Y-m-d');
  278.         $date_dimanche $date->modify('this week sunday')->format('Y-m-d');
  279.         // $titre_tableau = 'Semaine du '.$date->modify('this week monday')->format('d').' au '.$date->modify('this week sunday')->format('d').' '.$date->modify('this week sunday')->format('F Y');
  280.         $titre_tableau 'Semaine du '.$date->modify('this week monday')->format('d').' au '.$date->modify('this week sunday')->format('d').' '.$mois_annee;
  281.         $dateNext $date->modify('next week monday')->format('Y-m-d');
  282.         $dateLast $date->modify('-14 days')->format('Y-m-d');
  283.         $options = [
  284.             'statut_id' => 1
  285.         ];
  286.         $dates = [$date_lundi$date_dimanche];
  287.         $repository $entityManager->getRepository(PlanningReservation::class);
  288.         $plannings $repository->findByFilters($options$dates);
  289.         // Regroupement en PHP
  290.         $groupedByDate = [];
  291.         foreach ($plannings as $event) {
  292.             $dateKey $event->getDateReservation()->format('Y-m-d');
  293.             $timeValue $event->getHeureDebut();
  294.             // Initialiser la clé si elle n'existe pas
  295.             if (!isset($groupedByDate[$dateKey])) {
  296.                 $groupedByDate[$dateKey] = [];
  297.             }
  298.             // Ajouter les données de l'événement et du client
  299.             $groupedByDate[$dateKey][] = [
  300.                 'time' => $timeValue,
  301.                 'client_id' => $event->getClientId(),
  302.                 'id' => $event->getId()
  303.             ];
  304.         }
  305.         return $this->render('front/disponibilites.html.twig', [
  306.             'titre'=>'Disponibilité de la salle de réunion',
  307.             'reservations' => json_encode($groupedByDate),
  308.             'titre_tableau' => $titre_tableau,
  309.             'date_next' => $dateNext,
  310.             'date_last' => $dateLast,
  311.             'dates' => json_encode([$date_lundi$date_mardi$date_mercred$date_jeudi$date_vendredi$date_samedi$date_dimanche])
  312.         ]);
  313.     }
  314. }