src/Controller/APIIctus/APIChopController.php line 69

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