src/Controller/Front/FrontCureController.php line 49

Open in your IDE?
  1. <?php
  2. namespace Acme\SudcmsBundle\Controller\Front;
  3. use Acme\SudcmsBundle\Entity\ApiSettings;
  4. use Acme\SudcmsBundle\Entity\Cure;
  5. use Acme\SudcmsBundle\Repository\CureRepository;
  6. use Acme\SudcmsBundle\Service\ApiService;
  7. use Acme\SudcmsBundle\Service\Ecommerce\BasketService;
  8. use DateTime;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\Session\Session;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Throwable;
  18. class FrontCureController extends AbstractController
  19. {
  20.     private $session;
  21.     private BasketService $basketService;
  22.     private EntityManagerInterface $em;
  23.     private ApiService $apiService;
  24.     private ?ApiSettings $apiSettings;
  25.     public function __construct(BasketService          $basketService,
  26.                                 EntityManagerInterface $em,
  27.                                 ApiService             $apiService)
  28.     {
  29.         $this->session = new Session();
  30.         $this->basketService $basketService;
  31.         $this->em $em;
  32.         $this->apiService $apiService;
  33.         $this->apiSettings $this->em->getRepository(ApiSettings::class)->findOneBy([]);
  34.     }
  35.     /**
  36.      * @throws Throwable
  37.      */
  38.     #[Route(path: ['/cures'], name'front_cures'defaults: ['categorie' => null])]
  39.     public function index(CureRepository $cureRepository): Response
  40.     {
  41.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED');
  42.         if (!$this->apiService->testConnexion()) {
  43.             $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  44.             return $this->redirectToRoute('front_home');
  45.         }
  46.         // Retrait de la récupération des CURES en BDD au profit de l'API (Steeven : 16/11/23)
  47.         //        $cures = $cureRepository->findBy([], ['title' => 'ASC']);
  48.         try {
  49.             $curesP $this->apiService->listerItp();
  50.             $curesS $this->apiService->listerIts();
  51.         } catch (\Throwable $e) {
  52.             $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  53.             return $this->redirectToRoute('front_home');
  54.         }
  55.         $patient $this->getUser()->getCustomer()[0]->getOdysseeReference();
  56.         $dateDebut $this->apiSettings->isCureQuota() ? null : (new \DateTime())->modify('+1 day')->format('Y-m-d');
  57.         $dateFin null;
  58.         $cureP null;
  59.         $cureS null;
  60.         $cureUrl null;
  61.         $cureName 'Cure';
  62.         $datasComplete 1;
  63.         $plageHoraire null;
  64.         $allOdysseeCustomers $this->apiService->rechercherClient(adrCourriel$this->getUser()->getEmail());
  65.         // Vérifie si il y a des produits dans le panier qui ne sont pas des cures
  66.         $basketAsProduct false;
  67.         foreach ($this->session->get('basket') as $items) {
  68.             if (!is_string($items['referenceObject'])) {
  69.                 $basketAsProduct true;
  70.             }
  71.         }
  72.         $currentSaisonStart $this->apiSettings->getCurrentYearStartDate();
  73.         $currentSaisonEnd $this->apiSettings->getCurrentYearEndDate();
  74.         $nextSaisonStart $this->apiSettings->getNextYearStartDate();
  75.         $nextSaisonEnd $this->apiSettings->getNextYearEndDate();
  76.         $startYear $currentSaisonStart->format('Y');
  77.         $endYear $nextSaisonEnd->format('Y');
  78.         $datesExcluded = [];
  79.         // Parcourir toutes les dates de l'année en cours
  80.         for ($year $startYear$year <= $endYear$year++) {
  81.             for ($month 1$month <= 12$month++) {
  82.                 $daysInMonth cal_days_in_month(CAL_GREGORIAN$month$year);
  83.                 for ($day 1$day <= $daysInMonth$day++) {
  84.                     // Date du jour testé
  85.                     $dateActuelle = new DateTime("$year-$month-$day");
  86.                     // Si la date est en dehors des saisons en cours et à venir
  87.                     if (($dateActuelle $currentSaisonStart || $dateActuelle $currentSaisonEnd) &&
  88.                         ($dateActuelle $nextSaisonStart || $dateActuelle $nextSaisonEnd)) {
  89.                         $datesExcluded[] = $dateActuelle->format('Y-m-d');
  90.                     }
  91.                 }
  92.             }
  93.         }
  94.         $plagesHoraires null;
  95.         if (!$this->apiSettings->isCureQuota()) {
  96.             try {
  97.                 $plagesHoraires $this->apiService->listerPlageHoraire();
  98.             } catch (\Throwable $e) {
  99.                 $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  100.                 return $this->redirectToRoute('front_home');
  101.             }
  102.         }
  103.         return $this->render('front/front_cure/index.html.twig', [
  104.             'patient' => $patient,
  105.             'cureP' => $cureP,
  106.             'cureS' => $cureS,
  107.             'cureUrl' => $cureUrl,
  108.             'cureName' => $cureName,
  109.             'dateDebut' => $dateDebut,
  110.             'dateFin' => $dateFin,
  111.             //            'cures'               => $cures,
  112.             'curesP' => $curesP,
  113.             'curesS' => $curesS,
  114.             'allOdysseeCustomers' => $allOdysseeCustomers,
  115.             'datasComplete' => $datasComplete,
  116.             'apiSettings' => $this->apiSettings,
  117.             'basketAsProduct' => $basketAsProduct,
  118.             'datesExcluded' => $datesExcluded,
  119.             'startYear' => $startYear,
  120.             'endYear' => $endYear,
  121.             'plagesHoraires' => $plagesHoraires,
  122.             'plageHoraire' => $plageHoraire
  123.         ]);
  124.     }
  125.     /**
  126.      * @throws Throwable
  127.      */
  128.     #[Route(path'/axSearchMedPresc'name'front_cures_axSearchMedPresc'options: ['expose' => true])]
  129.     public function axSearchMedPresc(Request $requestApiService $api): JsonResponse
  130.     {
  131.         if ($request->isXmlHttpRequest()) {
  132.             $curesForThisPatient $api->rechercherResaCure(idOdysseeClient: (int)$request->get('idCuriste'));
  133.             // Récupère les médecins en fonction du nom saisi
  134.             $name $request->get('name');
  135.             $resultSearchMedPresc $api->rechercherMedPr(nom$name);
  136.             if (isset($curesForThisPatient->status)) {
  137.                 $curesForThisPatient null;
  138.             }
  139.             return new JsonResponse(
  140.                 [
  141.                     'status' => true,
  142.                     'resultSearchMedPresc' => $resultSearchMedPresc,
  143.                     'selectMedPresc' => $curesForThisPatient && count($curesForThisPatient) > end($curesForThisPatient)->{'Medecin_Prescripteur'} : null
  144.                 ]
  145.             );
  146.         }
  147.         return new JsonResponse(
  148.             [
  149.                 'status' => false,
  150.                 'test2' => 'test2'
  151.             ]
  152.         );
  153.     }
  154.     /**
  155.      * @throws Throwable
  156.      */
  157.     #[Route(path'/axAddCureStepOne'name'front_cures_axAddCureStepOne'options: ['expose' => true])]
  158.     public function axAddCureStepOne(Request $requestApiService $api): JsonResponse
  159.     {
  160.         if ($request->isXmlHttpRequest()) {
  161.             $cureP $request->get('cureP');
  162.             $cureS $request->get('cureS');
  163.             $dateDebut $request->get('datesDebut');
  164.             $cureUrl $this->em->getRepository(Cure::class)->findOneBy(['odysseeReference' => $cureP])->getUrl();
  165.             $cureName $this->em->getRepository(Cure::class)->findOneBy(['odysseeReference' => $cureP])->getTitle();
  166.             $plageHoraire $request->get('plageHoraire');
  167.             $date1 \DateTime::createFromFormat('d-m-Y'$dateDebut);
  168.             $date2 \DateTime::createFromFormat('d-m-Y'$dateDebut);
  169.             date_add($date2date_interval_create_from_date_string("6 days"));
  170.             $difference $date1->diff($date2);
  171.             $dispos $api->quotaResaCure(
  172.                 cureP$cureP,
  173.                 cureS$cureS,
  174.                 dateDebut$date1->format('Y-m-d') . "T00:00:00",
  175.                 dateFin$date2->format('Y-m-d') . "T00:00:00"
  176.             );
  177.             $error false;
  178.             $status true;
  179.             if (!is_string($dispos) && isset($dispos->status)) {
  180.                 switch ($dispos->status) {
  181.                     case 404:
  182.                         $dispos null;
  183.                         $status false;
  184.                         $error 'Aucunes disponibilités entre le ' $date1->format('d/m/Y') . ' et le ' $date2->format('d/m/Y') . '.';
  185.                         break;
  186.                     case 500:
  187.                     case 502:
  188.                     case 503:
  189.                         $dispos null;
  190.                         $status false;
  191.                         $error 'Une erreur est survenue, veuillez réessayer.';
  192.                         break;
  193.                 }
  194.             }
  195.             $creneau $request->request->get('creneau');
  196.             $render $this->renderView('front/front_cure/step/stepOne.html.twig', [
  197.                 'difference' => !$difference ?: $difference->days,
  198.                 'dispos' => $dispos,
  199.                 'creneau' => $creneau,
  200.                 'cureUrl' => $cureUrl,
  201.                 'cureName' => $cureName,
  202.                 'plageHoraire' => $plageHoraire
  203.             ]);
  204.             return new JsonResponse(
  205.                 [
  206.                     'status' => $status,
  207.                     'dispo' => $dispos,
  208.                     'stepOne' => html_entity_decode($render),
  209.                     'errorApi' => $error
  210.                 ]
  211.             );
  212.         }
  213.         return new JsonResponse(
  214.             [
  215.                 'status' => false
  216.             ]
  217.         );
  218.     }
  219.     /**
  220.      * @throws Throwable
  221.      */
  222.     #[Route(path'/axAddCureStepTwo'name'front_cures_axAddCureStepTwo'options: ['expose' => true])]
  223.     public function axAddCureStepTwo(Request $requestApiService $api): JsonResponse
  224.     {
  225.         if ($request->isXmlHttpRequest()) {
  226.             $cureUrl null;
  227.             $cureName null;
  228.             // Si les quotas ne sont pas activés, on récupère les données de la cure car on ne passe pas par le stepOne
  229.             if ($this->apiSettings->isCureQuota() == 0) {
  230.                 $cureP $request->get('cureP');
  231.                 $cureS $request->get('cureS');
  232.                 $cureUrl $this->em->getRepository(Cure::class)->findOneBy(['odysseeReference' => $cureP])->getUrl();
  233.                 $cureName $this->em->getRepository(Cure::class)->findOneBy(['odysseeReference' => $cureP])->getTitle();
  234.             }
  235.             $dateSelect $request->get('dateSelect');
  236.             if ($dateSelect) {
  237.                 $medsTherm $api->listerMedTh();
  238.                 $resultSearchMedPresc null;
  239.                 $searchMedPresc null;
  240.                 $selectMedPresc null;
  241.                 $selectMedTherm $request->request->get('selectMedTherm');
  242.                 $render $this->renderView('front/front_cure/step/stepTwo.html.twig', [
  243.                     'medsTherm' => $medsTherm,
  244.                     'selectMedTherm' => $selectMedTherm,
  245.                     'searchMedPresc' => $searchMedPresc,
  246.                     'selectMedPresc' => $selectMedPresc,
  247.                     'resultSearchMedPresc' => json_decode($resultSearchMedPresc),
  248.                     'cureUrl' => $cureUrl,
  249.                     'cureName' => $cureName
  250.                 ]);
  251.                 return new JsonResponse(
  252.                     [
  253.                         'status' => true,
  254.                         'medsTherm' => $medsTherm,
  255.                         'stepTwo' => html_entity_decode($render),
  256.                     ]
  257.                 );
  258.             }
  259.         }
  260.         return new JsonResponse(
  261.             [
  262.                 'status' => false,
  263.                 'test2' => 'test2'
  264.             ]
  265.         );
  266.     }
  267.     #[Route(path'/axAddCureStepThree'name'front_cures_axAddCureStepThree'options: ['expose' => true])]
  268.     public function axAddCureStepThree(Request $requestApiService $api): JsonResponse
  269.     {
  270.         if ($request->isXmlHttpRequest()) {
  271.             $selectMedPresc $request->get('selectMedPresc');
  272.             $render $this->renderView('front/front_cure/step/stepThree.html.twig', [
  273.                 'selectMedPresc' => $selectMedPresc,
  274.             ]);
  275.             return new JsonResponse(
  276.                 [
  277.                     'status' => true,
  278.                     'stepThree' => html_entity_decode($render),
  279.                 ]
  280.             );
  281.         }
  282.         return new JsonResponse(
  283.             [
  284.                 'status' => false,
  285.                 'test2' => 'test2'
  286.             ]
  287.         );
  288.     }
  289.     /**
  290.      * Permet l'ajout d'une cure au panier
  291.      */
  292.     #[Route(path'/addCureToBasket'name'front_cures_addCureToBasket')]
  293.     public function addCureToBasket(Request $request): RedirectResponse
  294.     {
  295.         if ($this->basketService->addCure($request->request) == 'ok') {
  296.             $this->addFlash('success''Votre réservation a été ajouté au panier');
  297.         } elseif ($this->basketService->addCure($request->request) == 'nok') {
  298.             $this->addFlash('danger',
  299.                 'Ce curiste a déjà une Cure en cours de validitée ou de réservation sur cette période');
  300.         } else {
  301.             $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  302.         }
  303.         return $this->redirectToRoute('front_basket_index');
  304.     }
  305. }