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.             $cureName $request->get('curePName');
  167.             $plageHoraire $request->get('plageHoraire');
  168.             $date1 \DateTime::createFromFormat('d-m-Y'$dateDebut);
  169.             // Modifier $date1 en reculant de 6 jours
  170.             $date1->modify('-6 days');
  171.             $date2 \DateTime::createFromFormat('d-m-Y'$dateDebut);
  172.             date_add($date2date_interval_create_from_date_string("6 days"));
  173.             $difference $date1->diff($date2);
  174.             $etablissements $api->listerEtabResaCure();
  175.             $allDispos = [];
  176.             foreach ($etablissements as $etablissement) {
  177.                 $dispos $api->quotaResaCure(
  178.                     cureP$cureP,
  179.                     cureS$cureS,
  180.                     dateDebut$date1->format('Y-m-d') . "T00:00:00",
  181.                     dateFin$date2->format('Y-m-d') . "T00:00:00",
  182.                     etab$etablissement->Code_Etablissement
  183.                 );
  184.                 if (!isset($dispos->status)) {
  185.                     $allDispos[$etablissement->Code_Etablissement] = $dispos;
  186.                 }
  187.             }
  188. //            $dispos = $api->quotaResaCure(
  189. //                cureP: $cureP,
  190. //                cureS: $cureS,
  191. //                dateDebut: $date1->format('Y-m-d') . "T00:00:00",
  192. //                dateFin: $date2->format('Y-m-d') . "T00:00:00"
  193. //            );
  194.             $error false;
  195.             $status true;
  196.             if (empty($allDispos)) {
  197.                 $status false;
  198.                 $error 'Aucune disponibilité entre le ' $date1->format('d/m/Y') . ' et le ' $date2->format('d/m/Y') . '.';
  199.             }
  200. //            if (!is_string($dispos) && isset($dispos->status)) {
  201. //                switch ($dispos->status) {
  202. //                    case 404:
  203. //                        $dispos = null;
  204. //                        $status = false;
  205. //                        $error = 'Aucune disponibilité entre le ' . $date1->format('d/m/Y') . ' et le ' . $date2->format('d/m/Y') . '.';
  206. //                        break;
  207. //                    case 500:
  208. //                    case 502:
  209. //                    case 503:
  210. //                        $dispos = null;
  211. //                        $status = false;
  212. //                        $error = 'Une erreur est survenue, veuillez réessayer.';
  213. //                        break;
  214. //                }
  215. //            }
  216.             $creneau $request->request->get('creneau');
  217.             $render $this->renderView('front/front_cure/step/stepOne.html.twig', [
  218.                 'difference' => !$difference ?: $difference->days,
  219.                 'dispos' => $allDispos,
  220.                 'creneau' => $creneau,
  221. //                'cureUrl' => $cureUrl,
  222.                 'cureName' => $cureName,
  223.                 'plageHoraire' => $plageHoraire
  224.             ]);
  225.             return new JsonResponse(
  226.                 [
  227.                     'status' => $status,
  228.                     'dispo' => $dispos,
  229.                     'stepOne' => html_entity_decode($render),
  230.                     'errorApi' => $error
  231.                 ]
  232.             );
  233.         }
  234.         return new JsonResponse(
  235.             [
  236.                 'status' => false
  237.             ]
  238.         );
  239.     }
  240.     /**
  241.      * @throws Throwable
  242.      */
  243.     #[Route(path'/axAddCureStepTwo'name'front_cures_axAddCureStepTwo'options: ['expose' => true])]
  244.     public function axAddCureStepTwo(Request $requestApiService $api): JsonResponse
  245.     {
  246.         if ($request->isXmlHttpRequest()) {
  247.             $cureUrl null;
  248.             $cureName null;
  249.             // 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
  250.             if ($this->apiSettings->isCureQuota() == 0) {
  251.                 $cureP $request->get('cureP');
  252.                 $cureS $request->get('cureS');
  253. //                $cureUrl = $this->em->getRepository(Cure::class)->findOneBy(['odysseeReference' => $cureP])->getUrl();
  254. //                $cureName = $this->em->getRepository(Cure::class)->findOneBy(['odysseeReference' => $cureP])->getTitle();
  255.             }
  256.             $dateSelect $request->get('dateSelect');
  257.             $etablissement $request->get('etablissement');
  258.             if ($dateSelect) {
  259.                 $medsTherm $api->listerMedTh();
  260.                 usort($medsTherm, function ($a$b) {
  261.                     // On détecte NEANT (avec ou sans espaces)
  262.                     $isAneant trim($a->Nom_Medecin_Thermal) === 'NEANT';
  263.                     $isBneant trim($b->Nom_Medecin_Thermal) === 'NEANT';
  264.                     // Si A est NEANT et pas B -> A en premier
  265.                     if ($isAneant && !$isBneant) return -1;
  266.                     // Si B est NEANT et pas A -> B en premier
  267.                     if ($isBneant && !$isAneant) return 1;
  268.                     // Sinon tri alpha normal
  269.                     return strcmp($a->Nom_Medecin_Thermal$b->Nom_Medecin_Thermal);
  270.                 });
  271.                 $resultSearchMedPresc null;
  272.                 $searchMedPresc null;
  273.                 $selectMedPresc null;
  274.                 $selectMedTherm $request->request->get('selectMedTherm');
  275.                 $render $this->renderView('front/front_cure/step/stepTwo.html.twig', [
  276.                     'medsTherm' => $medsTherm,
  277.                     'selectMedTherm' => $selectMedTherm,
  278.                     'searchMedPresc' => $searchMedPresc,
  279.                     'selectMedPresc' => $selectMedPresc,
  280.                     'etablissement' => $etablissement,
  281.                     'resultSearchMedPresc' => json_decode($resultSearchMedPresc),
  282. //                    'cureUrl' => $cureUrl,
  283. //                    'cureName' => $cureName
  284.                 ]);
  285.                 return new JsonResponse(
  286.                     [
  287.                         'status' => true,
  288.                         'medsTherm' => $medsTherm,
  289.                         'stepTwo' => html_entity_decode($render),
  290.                     ]
  291.                 );
  292.             }
  293.         }
  294.         return new JsonResponse(
  295.             [
  296.                 'status' => false,
  297.                 'test2' => 'test2'
  298.             ]
  299.         );
  300.     }
  301.     #[Route(path'/axAddCureStepThree'name'front_cures_axAddCureStepThree'options: ['expose' => true])]
  302.     public function axAddCureStepThree(Request $requestApiService $api): JsonResponse
  303.     {
  304.         if ($request->isXmlHttpRequest()) {
  305.             $selectMedPresc $request->get('selectMedPresc');
  306.             $render $this->renderView('front/front_cure/step/stepThree.html.twig', [
  307.                 'selectMedPresc' => $selectMedPresc,
  308.             ]);
  309.             return new JsonResponse(
  310.                 [
  311.                     'status' => true,
  312.                     'stepThree' => html_entity_decode($render),
  313.                 ]
  314.             );
  315.         }
  316.         return new JsonResponse(
  317.             [
  318.                 'status' => false,
  319.                 'test2' => 'test2'
  320.             ]
  321.         );
  322.     }
  323.     /**
  324.      * Permet l'ajout d'une cure au panier
  325.      */
  326.     #[Route(path'/addCureToBasket'name'front_cures_addCureToBasket')]
  327.     public function addCureToBasket(Request $request): RedirectResponse
  328.     {
  329.         if ($this->basketService->addCure($request->request) == 'ok') {
  330.             $this->addFlash('success''Votre réservation a été ajouté au panier');
  331.         } elseif ($this->basketService->addCure($request->request) == 'nok') {
  332.             $this->addFlash('danger',
  333.                 'Ce curiste a déjà une Cure en cours de validitée ou de réservation sur cette période');
  334.         } else {
  335.             $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  336.         }
  337.         return $this->redirectToRoute('front_cures');
  338.     }
  339. }