src/Controller/ClientController.php line 196

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Client;
  4. use App\Entity\Commande;
  5. use App\Entity\Transaction;
  6. use App\Entity\Tarif;
  7. use App\Entity\Facture;
  8. use App\Entity\PlanningReservation;
  9. use App\Form\ClientType;
  10. use App\Repository\PlanningReservationRepository;
  11. use App\Repository\PaysRepository;
  12. use App\Service\CreditService;
  13. use App\Service\EntitySaver;
  14. use App\Service\SogecommerceService;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Routing\RouterInterface;
  23. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  24. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  25. use Symfony\Component\Security\Core\Security;
  26. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  27. use IntlDateFormatter;
  28. class ClientController extends AbstractController
  29. {
  30.     private $sogecommerceService;
  31.     /**
  32.      * @var TokenStorageInterface
  33.      */
  34.     private $tokenStorage;
  35.     /**
  36.      * @var GuardAuthenticatorHandler
  37.      */
  38.     private $guardHandler;
  39.     /**
  40.      * @var RouterInterface
  41.      */
  42.     private $router;
  43.     private EntitySaver $entitySaver;
  44.     private $entityManager;
  45.     public function __construct(
  46.         SogecommerceService $sogecommerceService,
  47.         TokenStorageInterface $tokenStorage,
  48.         GuardAuthenticatorHandler $guardHandler,
  49.         RouterInterface $router,
  50.         Security $security,
  51.         EntitySaver $entitySaver,
  52.         EntityManagerInterface $entityManager
  53.     )
  54.     {
  55.         // dump($this->getUser());die;
  56.         $this->security $security;
  57.         $this->router $router;
  58.         $this->tokenStorage $tokenStorage;
  59.         $this->guardHandler $guardHandler;
  60.         $this->sogecommerceService $sogecommerceService;
  61.         $this->entitySaver $entitySaver;
  62.         $this->entityManager $entityManager;
  63.     }
  64.     #[Route('/register'name'client_register')]
  65.     public function register(
  66.         Request $request,
  67.         EntityManagerInterface $entityManager,
  68.         Security $security,
  69.         PaysRepository $paysRepository
  70.     ): Response
  71.     {
  72.         $client = new Client();
  73.         // Création du formulaire
  74.         $form $this->createForm(ClientType::class, $client);
  75.         $form->handleRequest($request);
  76.         // Initialiser uniquement si le formulaire n’est pas soumis
  77.         if (!$form->isSubmitted()) {
  78.             $client->setCiv('mr');
  79.         }
  80.         if ($form->isSubmitted() && $form->isValid()) {
  81.             
  82.             $recaptchaToken $form->get('recaptcha_token')->getData();
  83.             // Vérifier auprès de Google
  84.             $clientGoogle = new \Symfony\Component\HttpClient\HttpClient();
  85.             $response $clientGoogle::create()->request('POST''https://www.google.com/recaptcha/api/siteverify', [
  86.                 'body' => [
  87.                     'secret'   => $_ENV['GOOGLE_RECAPTCHA_SECRET'],
  88.                     'response' => $recaptchaToken,
  89.                     'remoteip' => $request->getClientIp(),
  90.                 ],
  91.             ]);
  92.             $data $response->toArray();
  93.             if ($data['success'] === true && $data['score'] >= 0.5 && $data['action'] === 'registration') {
  94.                 // ✅ Captcha validé → tu continues ton inscription
  95.             } else {
  96.                 // ❌ Captcha échoué → renvoyer une erreur
  97.                 $this->addFlash('error''Échec du reCAPTCHA, veuillez réessayer.');
  98.                 $pays $paysRepository->findList();
  99.                 return $this->render('client/register.html.twig', [
  100.                     'form' => $form->createView(),
  101.                     'path_name' => 'client_register',
  102.                 'pays' => $pays
  103.                 ]);
  104.             }
  105.             
  106.             // Hashage du mot de passe
  107.             $hashedPassword password_hash($client->getPassword(), PASSWORD_BCRYPT);
  108.             $client->setPassword($hashedPassword);
  109.             $client->setDeleted(false);
  110.             $client->setCreated();
  111.             $client->setChanged();
  112.             // dump($client);die;
  113.             // Enregistrement en base de données
  114.             $entityManager->persist($client);
  115.             $entityManager->flush();
  116.             // Créer un jeton d'authentification
  117.             $token = new UsernamePasswordToken($clientnull'main'$client->getRoles());
  118.             $this->tokenStorage->setToken($token);
  119.             // Démarrez la session pour cet utilisateur
  120.             $this->guardHandler->authenticateWithToken($token$request);
  121.             // Ajout d'une notification flash de bienvenue
  122.             $this->addFlash('success''Bienvenue dans votre espace client !');
  123.             $pm $request->query->get('pm');
  124.             // Rédirection vers le processus de paiement
  125.             if($pm != ""){
  126.                 // Enregistrement des informations de commande
  127.                 $commandes $this->entitySaver->getCommandesEncours();
  128.                 $tmp = [];
  129.                 $user $this->security->getUser();
  130.                 // Récupération du bon de commande
  131.                 $bon_commande_id $this->entitySaver->getBonCommandeEncours($user->getId(), $this->entityManager);
  132.                 // Enregistrement des informations de commandes + redirection de la liste des commandes en cours
  133.                 foreach($commandes as &$item){
  134.                     $item['client_id'] = $user->getId();
  135.                     $commande = new Commande();
  136.                     $commande->setTarifId($item['tarif_id']);
  137.                     $commande->setQte($item['qte']);
  138.                     $commande->setClientId($item['client_id']);
  139.                     $commande->setBonCommandeId($bon_commande_id);
  140.                     $commande->setDateCommande($item['date_commande']);
  141.                     $commande->setStatutId(1);
  142.                     $commande->setCreated();
  143.                     $commande->setChanged();
  144.                     $tmp[] = $commande;
  145.                 }
  146.                 $this->entitySaver->saveMany($tmp);
  147.                 $this->entitySaver->initCommandes();
  148.                 return new RedirectResponse($this->router->generate('front_reserve', [null'step' => 'recap']));
  149.             }
  150.             else
  151.                 return new RedirectResponse($this->router->generate('client_espace'));
  152.         } else if ($form->isSubmitted() && !$form->isValid()) {
  153.             // Formulaire non valide : obtenir les erreurs
  154.             $errors $form->getErrors(truefalse);
  155.             // Parcourir les erreurs une par une
  156.             foreach ($errors as $error) {
  157.                 if ($error instanceof \Symfony\Component\Form\FormError) {
  158.                     $origin $error->getOrigin(); // Récupère l'origine de l'erreur (champ)
  159.                     $fieldName $origin $origin->getName() : 'global'// Nom du champ ou "global"
  160.                     // Ajout du message d'erreur dans les flashs ou logs
  161.                     $this->addFlash('error'sprintf(
  162.                         'Erreur dans le champ "%s" : %s',
  163.                         $fieldName,
  164.                         $error->getMessage()
  165.                     ));
  166.                 }
  167.             }
  168.         }
  169.     
  170.     $pays $paysRepository->findList();
  171.         return $this->render('client/register.html.twig', [
  172.             'form' => $form->createView(),
  173.             'path_name' => 'client_register',
  174.         'pays' => $pays
  175.         ]);
  176.     }
  177.     #[Route('/espace-client'name'client_espace')]
  178.     public function espace(): Response
  179.     {
  180.         // Récupérez l'utilisateur connecté
  181.         $user $this->security->getUser();
  182.         $this->redirectToLogin($user);
  183.         return $this->render('client/espace_client.html.twig', [
  184.             'user' => $user,
  185.             'path_name' => 'client_espace',
  186.         ]);
  187.     }
  188.     #[Route('/espace-client/mes-coordonnees'name'client_coordonnees')]
  189.     public function coordonnees(): Response
  190.     {
  191.         // Récupérez l'utilisateur connecté
  192.         $user $this->getUser();
  193.         $this->redirectToLogin($user);
  194.         return $this->render('client/coordonnees.html.twig', [
  195.             'user' => $user,
  196.             'path_name' => 'client_coordonnees',
  197.         ]);
  198.     }
  199.     #[Route('/espace-client/mes-commandes'name'client_commande_encours')]
  200.     public function mes_commandes(Request $requestEntityManagerInterface $entityManager): Response
  201.     {
  202.         $user $this->getUser();
  203.         $this->redirectToLogin($user);
  204.         $bon_commande_id $this->entitySaver->getBonCommandeEncours($user->getId(), $entityManager);
  205.         $conditions = [
  206.             'client_id' => $user->getId(),
  207.             'statut_id' => 1,
  208.             'bon_commande_id' => $bon_commande_id
  209.         ];
  210.         $repository $entityManager->getRepository(Commande::class);
  211.         $commandes $repository->findByFilters($conditions);
  212.         $repositoryTrf $entityManager->getRepository(Tarif::class);
  213.         $tarifsDb $repositoryTrf->findAll();
  214.         $tarifs = [];
  215.         foreach($tarifsDb as $item){
  216.             $tarifs[$item->getId()] = $item;
  217.         }
  218.         $total 0;
  219.         $bon_commande_id 0;
  220.         foreach($commandes as $itemCmd){
  221.             $total += $itemCmd->qte $tarifs[$itemCmd->tarif_id]->pu;
  222.             $bon_commande_id $itemCmd->getBonCommandeId();
  223.         }
  224.         // 20% designe le TVA
  225.         $total $total $total 0.20;
  226.         // Convertir en chaîne pour s'assurer de la compatibilité
  227.         if (strlen((string)$bon_commande_id) < 6) {
  228.             $bon_commande_id str_pad($bon_commande_id6'0'STR_PAD_LEFT);
  229.         }
  230.         $form $this->sogecommerceService->generatePaymentForm([
  231.             'vads_amount' => $total 100// Amount in cents
  232.             'vads_failure_url' => 'https://preprod.panda-coworking.com'.$this->generateUrl('payment_failure', [], false),
  233.             'vads_cust_name' => $user->getPrenom() . ' ' $user->getNom(),
  234.             'vads_url_return' => 'https://preprod.panda-coworking.com'.$this->generateUrl('front_retour', [], false),
  235.             'vads_trans_id' => $bon_commande_id // Unique transaction ID
  236.         ]);
  237.         return $this->render('client/mes_commandes.html.twig', [
  238.             'commandes' => $commandes,
  239.             'tarifs' => $tarifs,
  240.             'path_name' => 'mes_commandes',
  241.             'paymentForm' => $form
  242.         ]);
  243.     }
  244.     #[Route('/espace-client/reserver-la-salle-de-reunion'name'client_reserver_salle_reunion')]
  245.     public function reserver_salle_reunion(Request $requestEntityManagerInterface $entityManager): Response
  246.     {
  247.         $connectedClient $this->getUser();
  248.         $this->redirectToLogin($connectedClient);
  249.         $connectedClientId $connectedClient $connectedClient->getId() : null;
  250.         // Liste des reservations pour cette semaine
  251.         // Date actuelle
  252.         $dateFiltre $request->query->get('d');
  253.         $date = new \DateTime();
  254.         if(!empty($dateFiltre)){
  255.             $date = new \DateTime($dateFiltre);
  256.         }
  257.         $formatter = new IntlDateFormatter(
  258.             'fr_FR'// Locale en français
  259.             IntlDateFormatter::LONG// Format long (ex. "février 2025")
  260.             IntlDateFormatter::NONE// Pas besoin de l'heure
  261.             null,
  262.             null,
  263.             'MMMM' // Format uniquement pour afficher le mois en toutes lettres
  264.         );
  265.         $date1 $date;
  266.         $mois_annee $formatter->format($date1->modify('this week sunday'));
  267.         // $mois_annee = $date->modify('this week sunday')->format('F Y');
  268.         $date_lundi $date->modify('this week monday')->format('Y-m-d');
  269.         $date_mardi $date->modify('this week tuesday')->format('Y-m-d');
  270.         $date_mercred $date->modify('this week wednesday')->format('Y-m-d');
  271.         $date_jeudi $date->modify('this week thursday')->format('Y-m-d');
  272.         $date_vendredi $date->modify('this week friday')->format('Y-m-d');
  273.         $date_samedi $date->modify('this week saturday')->format('Y-m-d');
  274.         $date_dimanche $date->modify('this week sunday')->format('Y-m-d');
  275.         $titre_tableau 'Semaine du '.$date->modify('this week monday')->format('d').' au '.$date->modify('this week sunday')->format('d').' '.$mois_annee;
  276.         $dateNext $date->modify('next week monday')->format('Y-m-d');
  277.         $dateLast $date->modify('-14 days')->format('Y-m-d');
  278.         $options = [
  279.             'statut_id' => 1
  280.         ];
  281.         $dates = [$date_lundi$date_dimanche];
  282.         $repository $entityManager->getRepository(PlanningReservation::class);
  283.         $plannings $repository->findByFilters($options$dates);
  284.         // Regroupement en PHP
  285.         $groupedByDate = [];
  286.         foreach ($plannings as $event) {
  287.             $dateKey $event->getDateReservation()->format('Y-m-d');
  288.             $client_id $event->getClientId();
  289.             // Chercher le client par son ID
  290.             $client $entityManager->getRepository(Client::class)->findOneBy(['id' => $client_id]);
  291.             // Si le client n'est pas trouvé ou ne correspond pas au client connecté, ignorer cet événement
  292.             $isMyAccount 1;
  293.             if (!$client || $client->getId() !== $connectedClientId) {
  294.                 $isMyAccount 0;
  295.             }
  296.             $timeValue $event->getHeureDebut();
  297.             // Préparer les informations client
  298.             $clientData = [
  299.                 'id' => $client->getId(),
  300.                 'nom' => $client->getNom(),
  301.                 'email' => $client->getEmail(),
  302.                 'isMyAccount' => $isMyAccount,
  303.                 // Ajouter d'autres champs si nécessaires
  304.             ];
  305.             // Initialiser la clé si elle n'existe pas
  306.             if (!isset($groupedByDate[$dateKey])) {
  307.                 $groupedByDate[$dateKey] = [];
  308.             }
  309.             // Ajouter les données de l'événement et du client
  310.             $groupedByDate[$dateKey][] = [
  311.                 'time' => $timeValue,
  312.                 'client' => $clientData,
  313.             ];
  314.         }
  315.         return $this->render('client/reserver_salle_reunion.html.twig', [
  316.             'path_name' => 'client_reserver_salle_reunion',
  317.             'reservations' => json_encode($groupedByDate),
  318.             'user'=>$connectedClient,
  319.             'titre_tableau' => $titre_tableau,
  320.             'date_next' => $dateNext,
  321.             'date_last' => $dateLast,
  322.             'dates' => json_encode([$date_lundi$date_mardi$date_mercred$date_jeudi$date_vendredi$date_samedi$date_dimanche])
  323.         ]);
  324.     }
  325.     #[Route('/espace-client/factures'name'client_factures')]
  326.     public function factures(Request $requestEntityManagerInterface $entityManager): Response
  327.     {
  328.         $user $this->getUser();
  329.         $this->redirectToLogin($user);
  330.         $conditions = [
  331.             'client_id' => $user->getId()
  332.         ];
  333.         $repository $entityManager->getRepository(Facture::class);
  334.         $factures $repository->findByFilters($conditions);
  335.         return $this->render('client/factures.html.twig', [
  336.             'path_name' => 'client_factures',
  337.             'factures' => $factures
  338.         ]);
  339.     }
  340.     #[Route('/success'name'client_success')]
  341.     public function success(): Response
  342.     {
  343.         return $this->render('client/success.html.twig');
  344.     }
  345.     // Suppression commande
  346.     #[Route('/api/ajax/remove-data'name'ajax_remove_data')]
  347.     public function remove_cmd(Request $requestEntityManagerInterface $entityManager): JsonResponse
  348.     {
  349.         $user $this->getUser();
  350.         $res = [
  351.             'success' => false
  352.         ];
  353.         if ($request->isMethod('POST')) {
  354.             $idCmd $request->request->get('idCmd');
  355.             $commande $entityManager->getRepository(Commande::class)->findOneBy([
  356.                 'id' => intval($idCmd),
  357.                 'client_id' => $user->getId()
  358.             ]);
  359.             if(!empty($commande)){
  360.                 $commande->setStatutId(3);
  361.                 $commande->setChanged();
  362.                 $entityManager->persist($commande);
  363.                 $entityManager->flush();
  364.                 $res = ['success' => true];
  365.                 // Vérification si on a aucune commande
  366.                 $commandeAll $entityManager->getRepository(Commande::class)->findByFilters([
  367.                     'client_id' => $user->getId(),
  368.                     'statut_id' => 1
  369.                 ]);
  370.                 if(empty($commandeAll)){
  371.                    $res['isEmpty'] = true
  372.                 }
  373.             }
  374.         }
  375.         return new JsonResponse($res);
  376.     }
  377.     #[Route('/api/ajax/reserver/sdr'name'ajax_reserver_sdr')]
  378.     public function reserver_sdr(Request $requestEntityManagerInterface $entityManager) :JsonResponse
  379.     {
  380.         $user $this->getUser();
  381.         $res = ['success' => false];
  382.         if ($request->isMethod('POST')) {
  383.             $date $request->request->get('date');
  384.             $heure_debut $request->request->get('heure');
  385.             $tarif $entityManager->getRepository(Tarif::class)->findOneBy([
  386.                 'titre' => 'SDR'
  387.             ]);
  388.             // Vérifier si le client a assez de crédit
  389.             if($user->cr_sdr 0){
  390.                 if(!empty($tarif)){
  391.                     // Vérifier si le créneau est disponible
  392.                     $reservation $entityManager->getRepository(PlanningReservation::class)->findOneBy([
  393.                         'date_reservation' => new \DateTime($date),
  394.                         'heure_debut' => $heure_debut,
  395.                         'tarif_id' => $tarif->getId()
  396.                     ]);
  397.                     if(empty($reservation)){
  398.                         $heure = new \DateTime($heure_debut);
  399.                         $heure $heure->modify('+1 hour');
  400.                         // TVA 0 car aucun tva n'est applicable à un crédit
  401.                         // $tva = $tarif->getPu() * 0.2;
  402.                         $tva $tarif->getPu() * 0;
  403.                         // Enregistrement d'une ligne pour debiter son crédit
  404.                         $unite 'sdr';
  405.                         $transaction = new Transaction();
  406.                         $transaction->setClientId($user->getId());
  407.                         $transaction->setType(-1);
  408.                         $transaction->setTarifId($tarif->getId());
  409.                         $transaction->setQte(1);
  410.                         $transaction->setPu($tarif->getPu());
  411.                         $transaction->setTotal($tarif->getPu());
  412.                         $transaction->setTva($tva);
  413.                         $transaction->setDateMouvement(date('Y-m-d H:i:s'));
  414.                         $transaction->setDateValeur(date('Y-m-d H:i:s'));
  415.                         $transaction->setStatutId(2);
  416.                         $transaction->setUnite($unite);
  417.                         $transaction->setCreated();
  418.                         $transaction->setChanged();
  419.                         // save
  420.                         $entityManager->persist($transaction);
  421.                         $entityManager->flush();
  422.                         // Enregistrement reservation_salle
  423.                         $reservation = new PlanningReservation();
  424.                         $reservation->setClientId($user->getId());
  425.                         $reservation->setTransactionId($transaction->getId());
  426.                         $reservation->setTarifId($tarif->getId());
  427.                         $reservation->setDateReservation($date);
  428.                         $reservation->setHeureDebut($heure_debut);
  429.                         $reservation->setHeureFin($heure->format('H:i'));
  430.                         $reservation->setStatutId(1);
  431.                         $reservation->setCreated();
  432.                         $reservation->setChanged();
  433.                         // save
  434.                         $entityManager->persist($reservation);
  435.                         // Garbage collector
  436.                         $entityManager->flush();
  437.                         $res = [
  438.                             'success' => true,
  439.                             'id_unite' => $unite
  440.                         ];
  441.                     }
  442.                 }
  443.             } else {
  444.                 $res['status'] = 403;
  445.             }
  446.         }
  447.         return new JsonResponse($res);
  448.     }
  449.     #[Route('/api/ajax/annuler/sdr'name'ajax_annuler_reservation'methods: ["POST"])]
  450.     public function annuler_reservation(Request $requestEntityManagerInterface $emPlanningReservationRepository $planningReservationRepositoryCreditService $creditService): JsonResponse
  451.     {
  452.         $date $request->request->get('date');
  453.         $heure_debut $request->request->get('heure');
  454.         $client $this->getUser(); // Récupère l'utilisateur connecté
  455.         // Trouve la réservation correspondante
  456.         $reservation $planningReservationRepository->findOneBy([
  457.             'date_reservation' => new \DateTime($date),
  458.             'heure_debut' => $heure_debut,
  459.             'client_id' => $client->getId()
  460.         ]);
  461.         if (!$reservation) {
  462.             return new JsonResponse(['success' => false'message' => 'Réservation non trouvée ou non autorisée.'], 403);
  463.         }
  464.         // Vérifiez si la réservation est passée
  465.         $now = new \DateTime();
  466.         $reservationDateTime = new \DateTime($date ' ' $heure_debut);
  467.         if ($reservationDateTime <= $now) {
  468.             return new JsonResponse([
  469.                 'success' => false,
  470.                 'message' => 'Impossible d\'annuler une réservation passée.'
  471.             ], 400);
  472.         }
  473.         // Supprime la réservation
  474.         $em->remove($reservation);
  475.         $em->flush();
  476.         // Récupère le crédit
  477.         $creditService->addCreditToUser($client,1);
  478.         return new JsonResponse(['success' => true'id_unite' => 'sdr']);
  479.     }
  480.     #[Route('/api/ajax/deverouille'name'ajax_deverouille')]
  481.     public function deverouille(Request $requestEntityManagerInterface $entityManager) {
  482.         // Si un crédit a été utilisé et qu'on est dans la tranche horaire qui a été utilisée :
  483.             // Un Appel ajax est fait à une url, ce qui dévérouille la porte physiquement
  484.         $date = new \Datetime();
  485.         $date1 $date;
  486.         $client $this->getUser();
  487.         // Il faut ajouter 10mn pour pouvoir déverouille la porte -10mn avant
  488.         $heure_actuel $date->modify('+10 minutes')->format('H:i');
  489.         $date_actuel $date->format('Y-m-d');
  490.         $options = [
  491.             'date_actuel' => $date_actuel,
  492.             'heure_actuel' => $heure_actuel,
  493.             'client_id' => $client->getId()
  494.         ];
  495.         $repository $entityManager->getRepository(PlanningReservation::class);
  496.         $plannings $repository->findByDeverouille($options);
  497.         // dump($plannings);die;
  498.         $formatter = new IntlDateFormatter(
  499.             'fr_FR'// Locale en français
  500.             IntlDateFormatter::LONG// Format long (ex. "février 2025")
  501.             IntlDateFormatter::NONE// Pas besoin de l'heure
  502.             null,
  503.             null,
  504.             'MMMM' // Format uniquement pour afficher le mois en toutes lettres
  505.         );
  506.         $mois_plus1 $formatter->format($date1->modify('now +1 months'));
  507.         
  508.         return $this->render('client/deverouille.html.twig', [
  509.             'plannings' => $plannings,
  510.             'mois_plus1' => $mois_plus1
  511.         ]);
  512.     }
  513.     #[Route('/api/ajax/deverouille/confirm'name'ajax_deverouille_step')]
  514.     public function deverouille_confirm(Request $requestEntityManagerInterface $entityManager): JsonResponse
  515.     {
  516.         $user $this->getUser();
  517.         $res = [
  518.             'success' => false
  519.         ];
  520.         if ($request->isMethod('POST')) {
  521.             $tp $request->request->get('tp');
  522.             $titre '';
  523.             $unite '';
  524.             $date = new \Datetime();
  525.             $heure_debut $date->format('H:i');
  526.             $heure_fin '19:00';
  527.             $date_debut $date->format('Y-m-d');
  528.             $date_fin $date->format('Y-m-d');
  529.             switch($tp){
  530.                 case 'd':
  531.                     $titre 'Demi-journée';
  532.                     $unite 'mijourne';
  533.                     $heure_fin $date->modify('+4 hours')->format('H:i');
  534.                 break;
  535.                 case 'j':
  536.                     $titre 'Journée';
  537.                     $unite 'journe';
  538.                 break;
  539.                 case 'm':
  540.                     $titre 'Mois';
  541.                     $unite 'mois';
  542.                     $date_fin $date->modify('+1 month')->format('Y-m-d');
  543.                 break;
  544.             }
  545.             $tarif $entityManager->getRepository(Tarif::class)->findOneBy([
  546.                 'titre' => $titre
  547.             ]);
  548.             if(!empty($tarif)){
  549.                 // TVA 0 car déduit depuis son crédit
  550.                 $tva $tarif->getPu() * 0;
  551.                 $transaction = new Transaction();
  552.                 $transaction->setClientId($user->getId());
  553.                 $transaction->setType(-1);
  554.                 $transaction->setTarifId($tarif->getId());
  555.                 $transaction->setQte(1);
  556.                 $transaction->setPu($tarif->getPu());
  557.                 $transaction->setTotal($tarif->getPu());
  558.                 $transaction->setTva($tva);
  559.                 $transaction->setDateMouvement($date->format('Y-m-d H:i:s'));
  560.                 $transaction->setDateValeur($date->format('Y-m-d H:i:s'));
  561.                 $transaction->setStatutId(2);
  562.                 $transaction->setUnite($unite);
  563.                 $transaction->setCreated();
  564.                 $transaction->setChanged();
  565.                 $entityManager->persist($transaction);
  566.                 $entityManager->flush();
  567.                 // Enregistrement reservation_salle
  568.                 $reservation = new PlanningReservation();
  569.                 $reservation->setClientId($user->getId());
  570.                 $reservation->setTransactionId($transaction->getId());
  571.                 $reservation->setTarifId($tarif->getId());
  572.                 $reservation->setDateReservation($date_debut);
  573.                 $reservation->setDateReservationFin($date_fin);
  574.                 $reservation->setHeureDebut($heure_debut);
  575.                 $reservation->setHeureFin($heure_fin);
  576.                 $reservation->setStatutId(1);
  577.                 $reservation->setCreated();
  578.                 $reservation->setChanged();
  579.                 // save
  580.                 $entityManager->persist($reservation);
  581.                 $entityManager->flush();
  582.                 $res = [
  583.                     'success' => true,
  584.                     'id_unite' => $unite
  585.                 ];
  586.             }
  587.         }
  588.         return new JsonResponse($res);
  589.     }
  590.     #[Route('/api/ajax/deverouille/open'name'ajax_open_step'methods: ['GET'])]
  591.     public function open(): JsonResponse {
  592.         header('Content-Type: application/json'); // Définir la réponse en JSON
  593.         //bon url : http://coworking.arobases.fr:1665/control?cmd=pulse,0,0,30
  594.         $url "http://coworking.arobases.fr:1665/control?cmd=pulse,0,0,30";
  595.         $ch curl_init(); // Initialiser cURL
  596.         curl_setopt($chCURLOPT_URL$url);
  597.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  598.         curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse); // Désactiver la vérification SSL si besoin
  599.         curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
  600.         curl_setopt($chCURLOPT_TIMEOUT10); // Timeout de 10 secondes
  601.         $response curl_exec($ch);
  602.         $httpCode curl_getinfo($chCURLINFO_HTTP_CODE); // Récupérer le code HTTP
  603.         if (curl_errno($ch)) {
  604.             $res json_encode(['error' => curl_error($ch)]);
  605.         } else {
  606.             http_response_code($httpCode);
  607.             $res $response;
  608.         }
  609.         curl_close($ch);
  610.         return new JsonResponse($res);
  611.     }
  612.     private function redirectToLogin($client) {
  613.         if(empty($client)){
  614.             return $this->redirectToRoute('login');
  615.             // die;
  616.         
  617.     }
  618. }