src/Repository/LotRepository.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\Lot;
  4. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  5. use Doctrine\Persistence\ManagerRegistry;
  6. /**
  7.  * @method Lot|null find($id, $lockMode = null, $lockVersion = null)
  8.  * @method Lot|null findOneBy(array $criteria, array $orderBy = null)
  9.  * @method Lot[]    findAll()
  10.  * @method Lot[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  11.  */
  12. class LotRepository extends ServiceEntityRepository
  13. {
  14.     public function __construct(ManagerRegistry $registry)
  15.     {
  16.         parent::__construct($registryLot::class);
  17.     }
  18.     public function processSearch($params$entrepriseId null$user)
  19.     {
  20.         $qb $this->createQueryBuilder('l');
  21.         if ($entrepriseId !== null) {
  22.             $qb->join('l.programmeParent''p')
  23.                 ->andWhere('p.entreprise = :entreprise_id')
  24.                 ->andWhere('p.demandeSuppression IS NULL')
  25.                 ->setParameter('entreprise_id'$entrepriseId);
  26.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  27.                 if (!$user->getallProgrammes()) {
  28.                     $programmes $user->getPrescripteurProgrammes();
  29.                     if($programmes->count()) {
  30.                         $qb->andWhere('p.id IN (' implode(','array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
  31.                     } else {
  32.                         $qb->andWhere('p.id IN (0)');
  33.                     }
  34.                 }
  35.             }
  36.         }
  37.         if (!empty($params['numero_lot'])) {
  38.             $qb->andWhere('l.reference IN (:numero_lot)')
  39.                 ->setParameter('numero_lot'$params['numero_lot']);
  40.         }
  41.         if (!empty($params['programme'])) {
  42.             $qb->andWhere('l.programme IN (:programmes)')
  43.                 ->setParameter('programmes'$params['programme']);
  44.         }
  45.         if (!empty($params['promoteur'])) {
  46.             $qb->andWhere('l.promoteur IN (:promoteurs)')
  47.                 ->setParameter('promoteurs'$params['promoteur']);
  48.         }
  49.         if(!empty($params['typologie'])) {
  50.             $qb->andWhere('l.typeMoteurRecherche IN (:types)')
  51.                 ->setParameter('types'$params['typologie']);
  52.         }
  53.         if(!empty($params['etage'])) {
  54.             $qb->andWhere('l.etageMoteurRecherche IN (:etages)')
  55.                 ->setParameter('etages'$params['etage']);
  56.         }
  57.         if(!empty($params['statut'])) {
  58.             $qb->andWhere('l.statut IN (:statuts)')
  59.                 ->setParameter('statuts'$params['statut']);
  60.         }
  61.         if(!empty($params['type-bien'])) {
  62.             $qb->andWhere('l.nature IN (:natures)')
  63.                 ->setParameter('natures'$params['type-bien']);
  64.         }
  65.         if(!empty($params['ville'])) {
  66.             $st '(';
  67.             foreach($params['ville'] as $v) {
  68.                 if(strpos($v'||') !== false) {
  69.                     list($nom$nomComplet) = explode('||'$v);
  70.                 } else {
  71.                     $nom $v;
  72.                 }
  73.                 $nom str_replace('\'''\'\''$nom);
  74.                 if($st != '(') {
  75.                     $st .= ' OR l.ville LIKE \'%'.$nom.'%\'';
  76.                 } else {
  77.                     $st .= 'l.ville LIKE \'%'.$nom.'%\'';
  78.                 }
  79.             }
  80.             $st .= ')';
  81.             $qb->andWhere($st);
  82.         }
  83.         if (!empty($params['code_postal'])) {
  84.             $qb->andWhere('l.codePostal IN (:code_postal)')
  85.                 ->setParameter('code_postal'$params['code_postal']);
  86.         }
  87.         if(!empty($params['superficie'])) {
  88.             list($minSuperficie$maxSuperficie) = explode(','$params['superficie']);
  89.             $qb->andWhere("(l.superficie IS NULL OR l.superficie >= $minSuperficie) AND (l.superficie IS NULL OR l.superficie <= $maxSuperficie)");
  90.         }
  91.         if(!empty($params['budget'])) {
  92.             list($minBudget$maxBudget) = explode(','$params['budget']);
  93.             $minBudget *= 1000;
  94.             $maxBudget *= 1000;
  95.             $qb->andWhere("COALESCE(l.prix, 0) BETWEEN $minBudget AND $maxBudget");
  96.         }
  97.         if(!empty($params['date']) && $params['date'] != 'toutes') {
  98.             if($params['date'] == 'immediate') {
  99.                 $qb->andWhere("l.dateLivraison <= ".'\''.date('Y-m-d').'\'');
  100.             } else {
  101.                 $qb->andWhere('l.dateLivraison <= \''.(int)$params['date'].'-12-31\'');
  102.             }
  103.         }
  104.         if (!empty($params['secteur'])) {
  105.             $qb->leftJoin('l.programmeParent''pg')
  106.                 ->leftJoin('pg.secteurGeographique''sg')
  107.                 ->andWhere('sg.id IN (:secteurs)')
  108.                 ->setParameter('secteurs', (array) $params['secteur']);
  109.             $qb->distinct();
  110.         }
  111.         $sort  $params['sort']  ?? null;
  112.         $order = isset($params['order']) ? strtoupper($params['order']) : null;
  113.         $order in_array($order, ['ASC','DESC'], true) ? $order null;
  114.         $map = [
  115.             'reference'          => 'l.reference',
  116.             'etat_preparation'   => 'l.etatPreparation',
  117.             'statut'             => 'l.statut',
  118.             'programme'          => 'l.programme',
  119.             'ville'              => 'l.ville',
  120.             'type'               => 'l.type',
  121.             'etage'              => 'l.etage',
  122.             'orientation'        => 'l.orientation',
  123.             'superficie'         => 'l.superficie',
  124.             'surface_exterieure' => '(COALESCE(l.jardin,0)+COALESCE(l.terrasse,0)+COALESCE(l.terrasse2,0))',
  125.             'livraison'          => 'l.dateLivraison',
  126.             'prix'               => 'l.prix',
  127.         ];
  128.         if ($sort && isset($map[$sort]) && $order) {
  129.             $qb->resetDQLPart('orderBy');
  130.             $qb->addOrderBy($map[$sort], $order);
  131.         } else {
  132.             $qb->addOrderBy('CASE WHEN l.statut IS NULL OR l.statut = \'\' THEN 1 ELSE 0 END''ASC')
  133.                 ->addOrderBy('l.statut''ASC');
  134.         }
  135.         return $qb->getQuery()->getResult();
  136.     }
  137.     public function findOneByRefAndProg($ref$prog)
  138.     {
  139.         return $this->createQueryBuilder('l')
  140.             ->andWhere('l.reference like :ref')
  141.             ->andWhere('l.programme = :prog')
  142.             ->setParameter('ref'$ref)
  143.             ->setParameter('prog'$prog->getId())
  144.             ->getQuery()
  145.             ->getOneOrNullResult()
  146.         ;
  147.     }
  148.     /**
  149.      * @return Lot[] Returns an array of Lot objects
  150.      */
  151.     public function findNbLots($limit)
  152.     {
  153.         return $this->createQueryBuilder('l')
  154.             ->select('l'// Entity Lot
  155.             ->setMaxResults($limit)
  156.             ->orderBy('l.id''ASC')
  157.             ->getQuery()
  158.             ->getResult();
  159.     }
  160.     // /**
  161.     //  * @return Lot[] Returns an array of Lot objects
  162.     //  */
  163.     public function findByProgrammeRefTitreAndEntreprise($searchTerm$entreprise$user)
  164.     {
  165.         $qb $this->createQueryBuilder('l')
  166.             ->join('l.programmeParent''p')
  167.             ->join('p.entreprise''e')
  168.             ->where('e.id = :entrepriseId')
  169.             ->andWhere('(
  170.             l.reference LIKE :searchTerm
  171.             OR l.titre LIKE :searchTerm
  172.             OR p.nom LIKE :searchTerm
  173.             OR l.type LIKE :searchTerm
  174.             OR l.ville LIKE :searchTerm
  175.             OR CONCAT(l.prix, \'\') LIKE :searchTerm
  176.         )')
  177.             ->andWhere('p.demandeSuppression IS NULL')
  178.             ->setParameter('searchTerm''%' $searchTerm '%')
  179.             ->setParameter('entrepriseId'$entreprise->getId());
  180.         if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  181.             if (!$user->getallProgrammes()) {
  182.                 $programmes $user->getPrescripteurProgrammes();
  183.                 if ($programmes->count()) {
  184.                     $qb->andWhere('p.id IN (' implode(','array_map(function ($p) { return $p->getId(); }, $programmes->toArray())) . ')');
  185.                 } else {
  186.                     $qb->andWhere('p.id IN (0)');
  187.                 }
  188.             }
  189.         }
  190.         return $qb->getQuery()->getResult();
  191.     }
  192.     public function findAllTypes($entrepriseId$user)
  193.     {
  194.         $qb $this->createQueryBuilder('l');
  195.     
  196.         if ($entrepriseId !== null) {
  197.             $qb->join('l.programmeParent''p')
  198.                ->andWhere('p.entreprise = :entreprise_id')
  199.                ->setParameter('entreprise_id'$entrepriseId);
  200.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  201.                 if (!$user->getallProgrammes()) {
  202.                     $programmes $user->getPrescripteurProgrammes();
  203.                     if($programmes->count()) {
  204.                         $qb->andWhere('p.id IN (' implode(','array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
  205.                     } else {
  206.                         $qb->andWhere('p.id IN (0)');
  207.                     }
  208.                 }
  209.             }
  210.         }
  211.     
  212.         return $qb->select('DISTINCT l.typeMoteurRecherche')
  213.                   ->orderBy('l.typeMoteurRecherche''ASC')
  214.                   ->getQuery()
  215.                   ->getResult();
  216.     }
  217.     public function findAllEtages($entrepriseId$user)
  218.     {
  219.         $qb $this->createQueryBuilder('l');
  220.     
  221.         if ($entrepriseId !== null) {
  222.             $qb->join('l.programmeParent''p')
  223.                ->andWhere('p.entreprise = :entreprise_id')
  224.                ->setParameter('entreprise_id'$entrepriseId);
  225.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  226.                 if (!$user->getallProgrammes()) {
  227.                     $programmes $user->getPrescripteurProgrammes();
  228.                     if($programmes->count()) {
  229.                         $qb->andWhere('p.id IN (' implode(','array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
  230.                     } else {
  231.                         $qb->andWhere('p.id IN (0)');
  232.                     }
  233.                 }
  234.             }
  235.         }
  236.     
  237.         return $qb->select('DISTINCT l.etageMoteurRecherche as etage')
  238.                   ->orderBy('l.etageMoteurRecherche''ASC')
  239.                   ->getQuery()
  240.                   ->getResult();
  241.     }
  242.     public function findAllPromoteurs($entrepriseId$user)
  243.     {
  244.         $qb $this->createQueryBuilder('l')
  245.             ->select('DISTINCT l.promoteur as promoteur')
  246.             ->join('l.programmeParent''p')
  247.             ->andWhere('p.demandeSuppression IS NULL')
  248.             ->andWhere('l.promoteur IS NOT NULL')
  249.             ->orderBy('l.promoteur''ASC');
  250.     
  251.         if ($entrepriseId !== null) {
  252.             $qb->andWhere('p.entreprise = :entreprise_id')
  253.                ->setParameter('entreprise_id'$entrepriseId);
  254.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  255.                 if (!$user->getallProgrammes()) {
  256.                     $programmes $user->getPrescripteurProgrammes();
  257.                     if ($programmes->count()) {
  258.                         $programmeIds array_map(function($p){ return $p->getId(); }, $programmes->toArray());
  259.                         $qb->andWhere('p.id IN (:programmeIds)')
  260.                            ->setParameter('programmeIds'$programmeIds);
  261.                     } else {
  262.                         $qb->andWhere('p.id = 0');
  263.                     }
  264.                 }
  265.             }
  266.         }
  267.     
  268.         return $qb->getQuery()->getResult();
  269.     }
  270.     public function findAllNumerosLot($entrepriseId$user)
  271.     {
  272.         $qb $this->createQueryBuilder('l');
  273.     
  274.         if ($entrepriseId !== null) {
  275.             $qb->join('l.programmeParent''p')
  276.                ->andWhere('p.entreprise = :entreprise_id')
  277.                ->andWhere('p.demandeSuppression IS NULL')
  278.                ->setParameter('entreprise_id'$entrepriseId);
  279.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  280.                 if (!$user->getallProgrammes()) {
  281.                     $programmes $user->getPrescripteurProgrammes();
  282.                     if($programmes->count()) {
  283.                         $qb->andWhere('p.id IN (' implode(','array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
  284.                     } else {
  285.                         $qb->andWhere('p.id IN (0)');
  286.                     }
  287.                 }
  288.             }
  289.         }
  290.     
  291.         return $qb->select('DISTINCT l.reference as numero_lot''l.ville''l.programme''l.type''l.prix')
  292.                   ->orderBy('l.reference''ASC')
  293.                   ->getQuery()
  294.                   ->getResult();
  295.     }
  296.     /*
  297.     public function findOneBySomeField($value): ?Lot
  298.     {
  299.         return $this->createQueryBuilder('l')
  300.             ->andWhere('l.exampleField = :val')
  301.             ->setParameter('val', $value)
  302.             ->getQuery()
  303.             ->getOneOrNullResult()
  304.         ;
  305.     }
  306.     */
  307. }