src/Repository/StockpharmacieRepository.php line 143

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use Doctrine\DBAL\Connection;
  4. use App\Entity\Stockpharmacie;
  5. use Doctrine\ORM\Exception\ORMException;
  6. use Doctrine\ORM\OptimisticLockException;
  7. use Doctrine\Persistence\ManagerRegistry;
  8. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  9. /**
  10.  * @extends ServiceEntityRepository<Stockpharmacie>
  11.  *
  12.  * @method Stockpharmacie|null find($id, $lockMode = null, $lockVersion = null)
  13.  * @method Stockpharmacie|null findOneBy(array $criteria, array $orderBy = null)
  14.  * @method Stockpharmacie[]    findAll()
  15.  * @method Stockpharmacie[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  16.  */
  17. class StockpharmacieRepository extends ServiceEntityRepository
  18. {
  19.     public function __construct(ManagerRegistry $registry)
  20.     {
  21.         parent::__construct($registryStockpharmacie::class);
  22.     }
  23.     /**
  24.      * @throws ORMException
  25.      * @throws OptimisticLockException
  26.      */
  27.     public function add(Stockpharmacie $entitybool $flush false): void
  28.     {
  29.         $this->_em->persist($entity);
  30.         if ($flush) {
  31.             $this->_em->flush();
  32.         }
  33.     }
  34.     /**
  35.      * @throws ORMException
  36.      * @throws OptimisticLockException
  37.      */
  38.     public function remove(Stockpharmacie $entitybool $flush false): void
  39.     {
  40.         $this->_em->remove($entity);
  41.         if ($flush) {
  42.             $this->_em->flush();
  43.         }
  44.     }
  45.     /**
  46.      * @return Stockpharmacie[] Returns an array of Stockpharmacie objects
  47.      */
  48.     public function findAllProductInOrder($produit)
  49.     {
  50.         $qb =  $this->createQueryBuilder('s')
  51.             ->select('s')
  52.             ->where('s.produit = :produit')
  53.             ->orderBy('s.id''DESC')
  54.             ->setParameter('produit'$produit);
  55.         return $qb->getQuery()->getResult();
  56.     }
  57.     /**
  58.      * @return Stockpharmacie[] Returns an array of Stockpharmacie objects
  59.      */
  60.     public function listProduitStockGrossiste($pays$roles '["ROLE_GROSSISTE"]')
  61.     {
  62.         $qb =  $this->createQueryBuilder('s')
  63.             ->select('s')
  64.             ->join('s.user''user')
  65.             ->andWhere('user.roles = :roles')
  66.             ->andWhere('user.pays  = :pays')
  67.             ->setParameters([
  68.                 'roles' => $roles,
  69.                 'pays'  => $pays
  70.             ]);
  71.         return $qb->getQuery()->getResult();
  72.     }
  73.     public function reinitDisponibility($pharmacieid)
  74.     {
  75.         $qb $this->createQueryBuilder('stock')
  76.             ->update('App\Entity\Stockpharmacie''stock')
  77.             ->set('stock.isDisponible'':nullValue')
  78.             ->where('stock.ictuspharmacie = :pharmacieid')
  79.             ->setParameter('nullValue'null)
  80.             ->setParameter('pharmacieid'$pharmacieid);
  81.         $query $qb->getQuery();
  82.         $affectedRows $query->execute();
  83.         return $affectedRows;
  84.     }
  85.     public function removeOldStock($pharmacieid$dateOld)
  86.     {
  87.         $qb $this->createQueryBuilder('stock')
  88.             ->delete('App\Entity\Stockpharmacie''stock')
  89.             ->where('stock.ictuspharmacie = :pharmacieid')
  90.             ->andWhere('stock.modified_at <= :dateold')
  91.             ->andWhere('stock.isDisponible IS NULL')
  92.             ->setParameter('pharmacieid'$pharmacieid)
  93.             ->setParameter('dateold'$dateOld);
  94.         $query $qb->getQuery();
  95.         $affectedRows $query->execute();
  96.         return $affectedRows;
  97.     }
  98.     public function getBestSeller($limit 10)
  99.     {
  100.         $entityManager $this->getEntityManager();
  101.         $query $entityManager->createQuery('
  102.             SELECT 
  103.                 DISTINCT(stock.id) as stockid, 
  104.                 stock.isOrdonnance, 
  105.                 stock.nomproduit, 
  106.                 stock.isDisponible, 
  107.                 stock.isDisponible, 
  108.                 stock.prixunitforme, 
  109.                 stock.tva, 
  110.                 pharmacie.designation as proprietaire, 
  111.                 forme.designation as formeproduit, 
  112.                 produit.id as idproduit, 
  113.                 (SELECT COUNT(commande.id) FROM App\Entity\IctusCommandeLine commande WHERE commande.designation LIKE stock.nomproduit) as nbCommande, 
  114.                 (SELECT MIN(photo.lien) FROM App\Entity\Photo photo WHERE photo.produit = produit) as photoproduit 
  115.             FROM App\Entity\Stockpharmacie stock 
  116.             JOIN stock.ictuspharmacie pharmacie 
  117.             LEFT JOIN stock.ictusforme forme 
  118.             JOIN stock.produit produit 
  119.             ORDER BY nbCommande DESC 
  120.         ')->setMaxResults($limit);
  121.         return $query->execute();
  122.     }
  123.     public function findAllProductKnp($ictusPcie$keyword null$limit 10$offset 0)
  124.     {
  125.         $entityManager  $this->getEntityManager();
  126.         $like           'stock.id is not null';
  127.         $caseWhen       '';
  128.         $case           '';
  129.         $or             '';
  130.         $orderRequette  ' stock.nomproduit ASC';
  131.         $arrNomProduit  explode(' '$keyword);
  132.         if ($keyword != null && $keyword != '') {
  133.             if (isset($arrNomProduit[0])) {
  134.                 $like "";
  135.                 foreach ($arrNomProduit as $key => $nomP) {
  136.                     $then = ($key == 0) ? 1;
  137.                     if (str_contains($nomP"'")) {
  138.                         $nomP str_replace("'""''"$nomP);
  139.                     }
  140.                     $like     .= $or "stock.nomproduit LIKE '%" $nomP "%'";
  141.                     $caseWhen .= "CASE WHEN stock.nomproduit LIKE '%" $nomP "%' THEN " $then " ELSE 0 END + ";
  142.                     $or ' OR ';
  143.                 }
  144.                 $orderRequette ' keyword_count DESC ';
  145.                 $case ', (' $caseWhen ' 0 ) AS keyword_count ';
  146.             }
  147.         }
  148.         $query  $entityManager->createQuery("
  149.             SELECT 
  150.                 stock.id AS stockid, stock.nomproduit, stock.isOrdonnance, stock.isDisponible, stock.prixunitforme, 
  151.                 forme.designation, produit.id as idproduit,
  152.                 (SELECT MIN(photo.lien) FROM App\Entity\Photo photo WHERE photo.produit = stock.produit) as photoproduit  
  153.                 " $case "
  154.             FROM 
  155.                 App\Entity\Stockpharmacie stock 
  156.             LEFT JOIN
  157.                 stock.ictusforme forme
  158.             JOIN 
  159.                 stock.produit produit
  160.             WHERE 
  161.                 stock.ictuspharmacie = :ictusPcie 
  162.                 AND (" $like ")
  163.             ORDER BY 
  164.                 " $orderRequette "
  165.         ")
  166.         ->setParameter('ictusPcie'$ictusPcie)
  167.         ->setMaxResults($limit)
  168.         ->setFirstResult($offset);
  169.         return $query->getResult();
  170.     }
  171.     //Utiliser pour API Mobile
  172.     public function findAllPcieByDistance($product$patientLatitude$patientLongitude$ville null$pays null)
  173.     {
  174.         $connection     $this->_em->getConnection("default");
  175.         $dateSemaine = ['Monday' => 1'Tuesday' => 2'Wednesday' => 3'Thursday' => 4'Friday' => 5'Saturday' => 6'Sunday' => 7];
  176.         $jourNow $dateSemaine[date("l"strtotime(date('Y-m-d')))];
  177.         $timeNow date('H:i:s');
  178.         $rayonDeLaTerre 6371071.03;
  179.         $whereLocalisation     "";
  180.         $calculDistance "";
  181.         $orderDistance "";
  182.         if ($ville) {
  183.             $whereLocalisation " AND quartier.ville_id = $ville";
  184.         } else {
  185.             if ($pays != null) {
  186.                 $whereLocalisation " AND ville.pays_id = $pays";
  187.             }
  188.         }
  189.         if ($patientLatitude != null && $patientLongitude != null) {
  190.             $calculDistance "
  191.             COALESCE(
  192.                 (2 * $rayonDeLaTerre * asin(
  193.                         sqrt(
  194.                             sin((RADIANS($patientLatitude) - RADIANS(pcie.latitude)) / 2) * 
  195.                             sin((RADIANS($patientLatitude) - RADIANS(pcie.latitude)) / 2) + 
  196.                             cos(RADIANS($patientLatitude)) * 
  197.                             cos(RADIANS(pcie.latitude)) * 
  198.                             sin((RADIANS(pcie.logitude) - RADIANS($patientLongitude)) / 2) * 
  199.                             sin((RADIANS(pcie.logitude) - RADIANS($patientLongitude)) / 2)
  200.                         )
  201.                     )
  202.                 )
  203.             , null) as distance, 
  204.             ";
  205.             $orderDistance " ORDER BY distance IS NULL, distance ASC ";
  206.         }
  207.         $sqlQuery "SELECT stock.id, pcie.id as idpharmacie, stock.is_disponible, stock.is_ordonnance, pcie.designation, pcie.logo, pcie.adresse, ville.name as ville, quartier.name as quartier, stock.nomproduit, stock.prixunitforme, stock.tva, forme.designation as formedesignation, 
  208.             $calculDistance 
  209.             (SELECT ictus_horaire.fin FROM ictus_horaire WHERE ictus_horaire.ictus_pharmacie_id = pcie.id AND ictus_horaire.jour LIKE '$jourNow' AND ictus_horaire.debut <= '$timeNow' AND ictus_horaire.fin > '$timeNow') as isopen 
  210.             FROM stockpharmacie AS stock
  211.             JOIN ictus_pharmacie AS pcie ON stock.ictuspharmacie_id = pcie.id 
  212.             LEFT JOIN ictus_forme AS forme ON forme.id = stock.ictusforme_id
  213.             LEFT JOIN quartier ON quartier.id = pcie.quartier_id 
  214.             LEFT JOIN ville ON ville.id = quartier.ville_id 
  215.             WHERE pcie.is_valid = 1 AND stock.produit_id = $product 
  216.             $whereLocalisation 
  217.             $orderDistance
  218.         ";
  219.         $results $connection->prepare($sqlQuery)->executeQuery()->fetchAllAssociative();
  220.         return $results;
  221.     }
  222.     public function findAllPcieSpecialByDistance($patientLatitude$patientLongitude$ville null$pays null)
  223.     {
  224.         $connection     $this->_em->getConnection("default");
  225.         $rayonDeLaTerre 6371071.03;
  226.         $whereLocalisation     "";
  227.         $calculDistance "";
  228.         $orderDistance "";
  229.         if ($ville) {
  230.             $whereLocalisation " AND quartier.ville_id = $ville";
  231.         } else {
  232.             if ($pays != null) {
  233.                 $whereLocalisation " AND ville.pays_id = $pays";
  234.             }
  235.         }
  236.         if ($patientLatitude != null && $patientLongitude != null) {
  237.             $calculDistance "
  238.             , COALESCE(
  239.                 (2 * $rayonDeLaTerre * asin(
  240.                         sqrt(
  241.                             sin((RADIANS($patientLatitude) - RADIANS(ictus_pharmacie.latitude)) / 2) * 
  242.                             sin((RADIANS($patientLatitude) - RADIANS(ictus_pharmacie.latitude)) / 2) + 
  243.                             cos(RADIANS($patientLatitude)) * 
  244.                             cos(RADIANS(ictus_pharmacie.latitude)) * 
  245.                             sin((RADIANS(ictus_pharmacie.logitude) - RADIANS($patientLongitude)) / 2) * 
  246.                             sin((RADIANS(ictus_pharmacie.logitude) - RADIANS($patientLongitude)) / 2)
  247.                         )
  248.                     )
  249.                 )
  250.             , null) as distance  
  251.             ";
  252.             $orderDistance " ORDER BY distance IS NULL, distance ASC ";
  253.         }
  254.         $sqlQuery "SELECT ictus_pharmacie.id as idpharmacie, ictus_pharmacie.designation, ictus_pharmacie.logo, ictus_pharmacie.adresse, ville.name as ville, quartier.name as quartier   
  255.             $calculDistance 
  256.             FROM ictus_pharmacie
  257.             LEFT JOIN quartier ON quartier.id = ictus_pharmacie.quartier_id 
  258.             LEFT JOIN ville ON ville.id = quartier.ville_id 
  259.             WHERE ictus_pharmacie.is_valid = 1 AND ictus_pharmacie.is_commande_special = 1 
  260.             $whereLocalisation 
  261.             $orderDistance
  262.         ";
  263.         $results $connection->prepare($sqlQuery)->executeQuery()->fetchAllAssociative();
  264.         return $results;
  265.     }
  266.     //FIN
  267.     //pour l'utilisateur connectee
  268.     public function findProductInCart($id_stock_pcie$id_user)
  269.     {
  270.         $entityManager $this->getEntityManager();
  271.         $query $entityManager->createQuery("
  272.             SELECT sp.id AS id_stock, 
  273.                 sp.nomproduit,
  274.                 sp.description AS pcie_description,
  275.                 sp.isDisponible,
  276.                 sp.prixunitforme,
  277.                 sp.isOrdonnance,
  278.                 pcie.id AS id_pcie,
  279.                 pcie.designation AS nom_pcie,
  280.                 pcie.logo,
  281.                 pcie.adresse,
  282.                 quartier.id AS quartier_id,
  283.                 quartier.name AS nom_quartier,
  284.                 ville.id AS ville_id,
  285.                 ville.name AS nom_ville,
  286.                 produit.id AS produit_id,
  287.                 produit.description AS desc_produit,
  288.                 photos.id AS id_photo, 
  289.                 photos.lien AS lien,
  290.                 ordonnance.id AS ordonnance_id
  291.             FROM App\Entity\Stockpharmacie sp 
  292.             LEFT JOIN sp.ictuspharmacie pcie
  293.             LEFT JOIN sp.produit produit 
  294.             LEFT JOIN pcie.quartier quartier
  295.             LEFT JOIN quartier.ville ville
  296.             LEFT JOIN produit.photos photos
  297.             INNER JOIN sp.ictusPanierPatients panier WITH panier.user = :id_user
  298.             LEFT JOIN panier.ordonnance ordonnance
  299.             WHERE sp.id = :id_stock_pcie
  300.             ORDER BY pcie.designation DESC
  301.         ")
  302.         ->setParameter("id_stock_pcie"$id_stock_pcie)
  303.         ->setParameter("id_user"$id_user)
  304.         ->setMaxResults(1);
  305.         return $query->execute();
  306.     }
  307.     //pour l'utlisateur non connectee
  308.     public function findProductInCartUserNonAuth($id_stock_pcie)
  309.     {
  310.         $entityManager $this->getEntityManager();
  311.         $query $entityManager->createQuery("
  312.             SELECT sp.id AS id_stock, 
  313.                 sp.nomproduit,
  314.                 sp.description AS pcie_description,
  315.                 sp.isDisponible,
  316.                 sp.prixunitforme,
  317.                 sp.isOrdonnance,
  318.                 pcie.id AS id_pcie,
  319.                 pcie.designation AS nom_pcie,
  320.                 pcie.logo,
  321.                 pcie.adresse,
  322.                 quartier.id AS quartier_id,
  323.                 quartier.name AS nom_quartier,
  324.                 ville.id AS ville_id,
  325.                 ville.name AS nom_ville,
  326.                 produit.id AS produit_id,
  327.                 produit.description AS desc_produit,
  328.                 photos.id AS id_photo, 
  329.                 photos.lien AS lien
  330.             FROM App\Entity\Stockpharmacie sp 
  331.             LEFT JOIN sp.ictuspharmacie pcie
  332.             LEFT JOIN sp.produit produit 
  333.             LEFT JOIN pcie.quartier quartier
  334.             LEFT JOIN quartier.ville ville
  335.             LEFT JOIN produit.photos photos
  336.             WHERE sp.id = :id_stock_pcie
  337.             ORDER BY pcie.designation DESC
  338.         ")
  339.         ->setParameter("id_stock_pcie"$id_stock_pcie)
  340.         ->setMaxResults(1);
  341.         return $query->execute();
  342.     }
  343.     
  344.     //    /**
  345.     //     * @return Stockpharmacie[] Returns an array of Stockpharmacie objects
  346.     //     */
  347.     //    public function findByExampleField($value): array
  348.     //    {
  349.     //        return $this->createQueryBuilder('s')
  350.     //            ->andWhere('s.exampleField = :val')
  351.     //            ->setParameter('val', $value)
  352.     //            ->orderBy('s.id', 'ASC')
  353.     //            ->setMaxResults(10)
  354.     //            ->getQuery()
  355.     //            ->getResult()
  356.     //        ;
  357.     //    }
  358.     //    public function findOneBySomeField($value): ?Stockpharmacie
  359.     //    {
  360.     //        return $this->createQueryBuilder('s')
  361.     //            ->andWhere('s.exampleField = :val')
  362.     //            ->setParameter('val', $value)
  363.     //            ->getQuery()
  364.     //            ->getOneOrNullResult()
  365.     //        ;
  366.     //    }
  367. }