src/Controller/APIIctus/APIChopController.php line 65

Open in your IDE?
  1. <?php
  2. namespace App\Controller\APIIctus;
  3. use App\Entity\Product;
  4. use App\Entity\IctusPharmacie;
  5. use App\Repository\UserRepository;
  6. use App\Repository\ProductRepository;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use App\Repository\IctusHoraireRepository;
  9. use Symfony\Contracts\Cache\ItemInterface;
  10. use App\Services\ComparaisonProduitService;
  11. use Knp\Component\Pager\PaginatorInterface;
  12. use Symfony\Contracts\Cache\CacheInterface;
  13. use App\Repository\IctusPharmacieRepository;
  14. use App\Repository\StockpharmacieRepository;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  21. /**
  22.  * @Route("/api/ictus-shop", name="app_ictus_shop_")
  23.  */
  24. class APIChopController extends AbstractController
  25. {
  26.     private $session;
  27.     private $translator;
  28.     private $em;
  29.     private $ictusPcieRepo;
  30.     private $logitudePatient;
  31.     private $latitudePatient;
  32.     private $ville;
  33.     private $stockpharmacieRepository;
  34.     private $productRepository;
  35.     private $user null;
  36.     private $mots_cles;
  37.     public function __construct(RequestStack $requestStackEntityManagerInterface $emIctusPharmacieRepository $ictusPcieRepoStockpharmacieRepository $stockpharmacieRepositoryProductRepository $productRepository)
  38.     {
  39.         $this->session $requestStack->getSession();
  40.         $this->em                       $em;
  41.         $this->ictusPcieRepo            $ictusPcieRepo;
  42.         $this->logitudePatient          null;
  43.         $this->latitudePatient          null;
  44.         $this->ville                    null;
  45.         $this->stockpharmacieRepository $stockpharmacieRepository;
  46.         $this->productRepository        $productRepository;
  47.     }
  48.     
  49.     /**
  50.      * @Route("/accueil", name="accueil", methods={"POST"})
  51.      */
  52.     public function index(UserRepository $userRepoRequest $request): Response 
  53.     {
  54.         $response = [
  55.             "erreur"  => true,
  56.             "messagee"=> "Erreur lors de la recuperation des donnees"
  57.         ];
  58.         $id_user $request->get("id_user");
  59.         $patient null;
  60.         if(!is_null($id_user) || $id_user != ""){
  61.             $patient $userRepo->findOneById($id_user);
  62.         };
  63.         
  64.         
  65.        $villeId  "";
  66.         if (!is_null($patient)) {
  67.             if ($patient->getVille()) $villeId $patient->getVille()->getId();
  68.         }
  69.         //GET pcie
  70.         $pcies null;
  71.         if (!is_null($patient)) {
  72.             $this->latitudePatient $patient->getLatitude();
  73.             $this->logitudePatient $patient->getLogitude();
  74.             if ($patient->getVille()) $this->ville $patient->getVille()->getId();
  75.         } elseif (!is_null($request->get('logitute')) && !is_null($request->get('latitude'))) 
  76.         {
  77.             $this->latitudePatient $request->get('latitude');
  78.             $this->logitudePatient $request->get('logitute');
  79.         }
  80.         $pcies $this->ictusPcieRepo->findAllPcieByDistance($this->latitudePatient$this->logitudePatient$this->ville8);
  81.         
  82.         //Fin get Pcie
  83.         
  84.         
  85.         $bestSellers $this->stockpharmacieRepository->getBestSeller();
  86.         
  87.         /*$newProducts = $cache->get('newProducts' . $villeId, function (ItemInterface $item) {
  88.             $item->expiresAfter(86400);
  89.             return $this->productRepository->findNewProduct();
  90.         });*/
  91.         
  92.         $response = [
  93.             'pharmacies' => $pcies,
  94.             'bestSellers'=> $bestSellers
  95.         ];
  96.         
  97.         return new JsonResponse($response);
  98.     }
  99.     /**
  100.      * @Route("/pharmacies", name="pharmacies", methods={"POST"})
  101.      */
  102.     public function getAllPharmacies(UserRepository $userRepoRequest $request): Response 
  103.     {
  104.         $response = [
  105.             "erreur"  => true,
  106.             "messagee"=> "Erreur lors de la recuperation des donnees"
  107.         ];
  108.         $id_user $request->get("id_user");
  109.         $patient null;
  110.         if(!is_null($id_user) || $id_user != ""){
  111.             $patient $userRepo->findOneById($id_user);
  112.         };
  113.         
  114.         
  115.        $villeId  "";
  116.         if (!is_null($patient)) {
  117.             if ($patient->getVille()) $villeId $patient->getVille()->getId();
  118.         }
  119.         //GET pcie
  120.         $pcies null;
  121.         if (!is_null($patient)) {
  122.             $this->latitudePatient $patient->getLatitude();
  123.             $this->logitudePatient $patient->getLogitude();
  124.             if ($patient->getVille()) $this->ville $patient->getVille()->getId();
  125.             $pcies $this->ictusPcieRepo->findAllPcieByDistance($this->latitudePatient$this->logitudePatient$this->ville100);
  126.         } elseif (!is_null($request->get('logitute')) && !is_null($request->get('latitude'))) 
  127.         {
  128.             $this->latitudePatient $request->get('latitude');
  129.             $this->logitudePatient $request->get('logitute');
  130.             $pcies $this->ictusPcieRepo->findAllPcieByDistance($this->latitudePatient$this->logitudePatient$this->ville100);
  131.         }else{
  132.             $pcies $this->ictusPcieRepo->findAllPcies();
  133.         }
  134.         if (!is_null($pcies)) {
  135.             $response = ["pharmacies"=> $pcies];
  136.         }
  137.         //Fin get Pcie
  138.         return new JsonResponse($response);
  139.     }
  140.     /**
  141.      * @Route("/produit-pharmacie/{id}", name="poduit_pcie", methods={"GET"})
  142.      */
  143.     public function produitParPcie(
  144.         IctusPharmacie $ictusPharmacie,
  145.         StockpharmacieRepository $stockRepo,
  146.         Request $request,
  147.         IctusHoraireRepository $horaireRepo
  148.     ): Response {
  149.         $offset $request->get('offset'); // Offset par défaut à 0
  150.         $limit $request->get('limit'10); // Limit par défaut à 10
  151.         $response = [
  152.             'erreur' => true,
  153.             'message'=> "Erreur lors de la recuperation des donnees"
  154.         ];
  155.         if (!is_null($ictusPharmacie)) {
  156.             $keyword null;
  157.             if ($request->isMethod('POST')) {
  158.                 if ($request->get('keyword') != '') {
  159.                     $keyword $request->get('keyword');
  160.                 }
  161.             }
  162.             $produits $stockRepo->findAllProductKnp($ictusPharmacie->getId(), $keyword$limit$offset);
  163.     
  164.             if (count($produits)> 0) {
  165.                 $response = [
  166.                     'produit' => $produits
  167.                 ];
  168.             }
  169.         }
  170.         
  171.         return new JsonResponse($response);
  172.         
  173.         
  174.         /*return $this->render('shop/produit_pharmacie.html.twig', [
  175.             'keyword' => $keyword,
  176.             'pharmacie' => $ictusPharmacie,
  177.             'produits' => $produits,
  178.             'horaireCheck' => $this->verifHorairePharmacieByTimeNow($ictusPharmacie, $horaireRepo),
  179.             'dayList' => [1 => "Lundi", 2 => "Mardi", 3 => "Mercredi", 4 => "Jeudi", 5 => "Vendredi", 6 => "Samedi", 7 => "Dimanche"],
  180.         ]);*/
  181.     }
  182.     private function verifHorairePharmacieByTimeNow($ictusPharmacie$horaireRepo)
  183.     {
  184.         $dateSemaine = ['Monday' => 1'Tuesday' => 2'Wednesday' => 3'Thursday' => 4'Friday' => 5'Saturday' => 6'Sunday' => 7];
  185.         $result['classHoraire'] = "";
  186.         $result['textHoraire'] = "";
  187.         $result['descHoraire'] = "";
  188.         if (count($ictusPharmacie->getIctusHoraires()) > 0) {
  189.             $jour $dateSemaine[date("l"strtotime(date('Y-m-d')))];
  190.             $time date('H:i:s');
  191.             $horaireNow $horaireRepo->verifHoraireByTime($ictusPharmacie$jour$time);
  192.             if ($horaireNow) {
  193.                 $heureDebut = new \DateTime($time);
  194.                 $heureFin = new \DateTime($horaireNow[0]->getFin());
  195.                 $diff $heureDebut->diff($heureFin);
  196.                 $result['classHoraire'] = "bg-success text-white";
  197.                 $result['textHoraire'] = "Ouverte";
  198.                 $result['descHoraire'] = "ferme dans " $diff->format('%Hh %Imn');
  199.             } else {
  200.                 $result['classHoraire'] = "bg-danger text-white";
  201.                 $result['textHoraire'] = "Fermée";
  202.                 $horaireOtherOwnDay $horaireRepo->getOtherHoraireOwnDay($ictusPharmacie$jour$time);
  203.                 if ($horaireOtherOwnDay) {
  204.                     $heureDebut = new \DateTime($time);
  205.                     $heureFin = new \DateTime($horaireOtherOwnDay[0]->getDebut());
  206.                     $diff $heureDebut->diff($heureFin);
  207.                     $result['descHoraire'] = "ouvre dans " $diff->format('%Hh %Imn');
  208.                 } else {
  209.                     $horaireOtherDay $horaireRepo->getOtherHoraireNextDay($ictusPharmacie$jour$time);
  210.                     if ($horaireOtherDay) {
  211.                         $diffDay = (int)$horaireOtherDay[0]->getJour() - $jour;
  212.                         $dateDebut = new \DateTime(date('Y-m-d H:i:s'));
  213.                         $dateFin = new \DateTime(date('Y-m-d ' $horaireOtherDay[0]->getDebut(), strtotime(' + ' $diffDay ' days')));
  214.                         $diff $dateDebut->diff($dateFin);
  215.                         $delais "";
  216.                         if ((int)$diff->format('%d') == 0) {
  217.                             $delais $diff->format('%Hh %Imn');
  218.                         } else {
  219.                             $delais $diff->format('%dj');
  220.                         }
  221.                         $result['descHoraire'] = "ouvre dans " $delais;
  222.                     } else {
  223.                         $horaireDebusSemaine $horaireRepo->getFirstHoraire($ictusPharmacie$jour);
  224.                         if ($horaireDebusSemaine) {
  225.                             $diffDay = (int)$horaireDebusSemaine[0]->getJour() + ($jour);
  226.                             $dateDebut = new \DateTime(date('Y-m-d H:i:s'));
  227.                             $dateFin = new \DateTime(date('Y-m-d ' $horaireDebusSemaine[0]->getDebut(), strtotime(' + ' $diffDay ' days')));
  228.                             $diff $dateDebut->diff($dateFin);
  229.                             $delais "";
  230.                             if ((int)$diff->format('%d') == 0) {
  231.                                 $delais $diff->format('%Hh %Imn');
  232.                             } else {
  233.                                 $delais $diff->format('%dj');
  234.                             }
  235.                             $result['descHoraire'] = "ouvre dans " $delais;
  236.                         }
  237.                     }
  238.                 }
  239.             }
  240.         } else {
  241.             $result null;
  242.         }
  243.         return $result;
  244.     }
  245.     /**
  246.      * @Route("/search", name="serch_produit", methods={"POST"})
  247.      */
  248.     public function search(Request $requestComparaisonProduitService $compServiceCacheInterface $cache): Response
  249.     {
  250.         // Récupérer le filtre produit et l'offset depuis la requête
  251.         $filtreProduit $request->get('filtre_produit');
  252.         $offset $request->get('offset'); // Offset par défaut à 0
  253.         $limit $request->get('limit'10); // Limit par défaut à 10
  254.         // Vérifier si le filtre produit est valide
  255.         if (!$filtreProduit || !is_string($filtreProduit)) {
  256.             return new JsonResponse([
  257.                 "erreur" => true,
  258.                 "message" => "Le filtre du produit est invalide."
  259.             ], Response::HTTP_BAD_REQUEST);
  260.         }
  261.         $produits_filtre = [];
  262.         $response = [
  263.             "erreur" => true,
  264.             "message" => "Erreur lors de la recherche."
  265.         ];
  266.         try {
  267.             // Rechercher les produits si un filtre est présent
  268.             $this->mots_cles $compService->getProduitByDesignation($filtreProduit);
  269.             $keyCache str_replace(' ''_'$this->mots_cles);
  270.             $keyCache preg_replace('/[^A-Za-z0-9_]/'''$keyCache);
  271.             $produits_filtre $this->productRepository->findAllWithKeyWords(explode(" "$this->mots_cles), $limit$offset);   
  272.             $response = [
  273.                 "erreur" => false,
  274.                 "produits" => $produits_filtre
  275.             ];
  276.         } catch (\Exception $e) {
  277.             // Gérer les exceptions et retourner une réponse d'erreur
  278.             $response['message'] = $e->getMessage();
  279.         }
  280.         return new JsonResponse($response);
  281.     }
  282.     //Afficha pharmacie qui a dispo de produit cliquee
  283.     /**
  284.      * @Route("/produit-pcie-dispo/{id}", name="app_shop_produit_pcie_dispo", methods={"GET"})
  285.      */
  286.     public function detailProduitAvecPcieDispo(
  287.         Product $produit,
  288.         StockpharmacieRepository $stockPcieRepo,
  289.         Request $request,
  290.         UserRepository $userRepo
  291.     ) {
  292.         $logitudePatient null;
  293.         $latitudePatient null;
  294.         $ville           null;
  295.         $idUser          $request->query->get("id_user");
  296.         $latitudeUser    $request->query->get("latitude");
  297.         $longitudeUser   $request->query->get("longitude");
  298.         $patient         $userRepo->findOneById($idUser); // Patient connecté
  299.         if (!is_null($patient)) {
  300.             $latitudePatient $patient->getLatitude();
  301.             $logitudePatient $patient->getLogitude();
  302.             if ($patient->getVille()) {
  303.                 $ville $patient->getVille()->getId();
  304.             }
  305.         } elseif (!is_null($latitudeUser) && !is_null($longitudeUser)) {
  306.             $latitudePatient $latitudeUser;
  307.             $logitudePatient $longitudeUser;
  308.         }
  309.         $pcieSpecial null;
  310.         $pcies $stockPcieRepo->findAllPcieByDistance($produit->getId(), $latitudePatient$logitudePatient$ville);
  311.         if (count($pcies) == 0) {
  312.             $pcieSpecial $stockPcieRepo->findAllPcieSpecialByDistance($latitudePatient$logitudePatientnullnull);
  313.         }
  314.         if (!is_null($patient)) {
  315.             $pays $patient->getPays();
  316.             $pcies $stockPcieRepo->findAllPcieByDistance($produit->getId(), $latitudePatient$logitudePatientnull$pays);
  317.         }
  318.         $dispoGrossiste null;
  319.         $stockGrossiste $stockPcieRepo->findOneBy(["cip13" => $produit->getCip13()]);
  320.         if ($stockGrossiste) {
  321.             $dispoGrossiste 1;
  322.         }
  323.         // Préparation des données pour JSON
  324.         $responseData = [
  325.             'timeNow'           => date('H:i:s'),
  326.             'produit'           => $produit,
  327.             'pharmacies'        => $pcies,
  328.             'pharmaciesSpecial' => $pcieSpecial,
  329.             'dispoGrossiste'    => $dispoGrossiste,
  330.         ];
  331.         // Retourner une réponse JSON
  332.         return $this->json($responseData200, [], ['groups' => 'product:read']);
  333.     }
  334.     
  335. }