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.propositions''pr')
  106.                 ->leftJoin('pr.prospect''ps')
  107.                 ->leftJoin('ps.secteursGeographiques''sg')
  108.                 ->andWhere('sg.id IN (:secteurs)')
  109.                 ->setParameter('secteurs', (array) $params['secteur']);
  110.             $qb->distinct();
  111.         }
  112.         $sort  $params['sort']  ?? null;
  113.         $order = isset($params['order']) ? strtoupper($params['order']) : null;
  114.         $order in_array($order, ['ASC','DESC'], true) ? $order null;
  115.         $map = [
  116.             'reference'          => 'l.reference',
  117.             'etat_preparation'   => 'l.etatPreparation',
  118.             'statut'             => 'l.statut',
  119.             'programme'          => 'l.programme',
  120.             'ville'              => 'l.ville',
  121.             'type'               => 'l.type',
  122.             'etage'              => 'l.etage',
  123.             'orientation'        => 'l.orientation',
  124.             'superficie'         => 'l.superficie',
  125.             'surface_exterieure' => '(COALESCE(l.jardin,0)+COALESCE(l.terrasse,0)+COALESCE(l.terrasse2,0))',
  126.             'livraison'          => 'l.dateLivraison',
  127.             'prix'               => 'l.prix',
  128.         ];
  129.         if ($sort && isset($map[$sort]) && $order) {
  130.             $qb->resetDQLPart('orderBy');
  131.             $qb->addOrderBy($map[$sort], $order);
  132.         } else {
  133.             $qb->addOrderBy('CASE WHEN l.statut IS NULL OR l.statut = \'\' THEN 1 ELSE 0 END''ASC')
  134.                 ->addOrderBy('l.statut''ASC');
  135.         }
  136.         return $qb->getQuery()->getResult();
  137.     }
  138.     public function findOneByRefAndProg($ref$prog)
  139.     {
  140.         return $this->createQueryBuilder('l')
  141.             ->andWhere('l.reference like :ref')
  142.             ->andWhere('l.programme = :prog')
  143.             ->setParameter('ref'$ref)
  144.             ->setParameter('prog'$prog->getId())
  145.             ->getQuery()
  146.             ->getOneOrNullResult()
  147.         ;
  148.     }
  149.     /**
  150.      * @return Lot[] Returns an array of Lot objects
  151.      */
  152.     public function findNbLots($limit)
  153.     {
  154.         return $this->createQueryBuilder('l')
  155.             ->select('l'// Entity Lot
  156.             ->setMaxResults($limit)
  157.             ->orderBy('l.id''ASC')
  158.             ->getQuery()
  159.             ->getResult();
  160.     }
  161.     // /**
  162.     //  * @return Lot[] Returns an array of Lot objects
  163.     //  */
  164.     public function findByProgrammeRefTitreAndEntreprise($searchTerm$entreprise$user)
  165.     {
  166.         $qb $this->createQueryBuilder('l')
  167.             ->join('l.programmeParent''p')
  168.             ->join('p.entreprise''e')
  169.             ->where('e.id = :entrepriseId')
  170.             ->andWhere('(
  171.             l.reference LIKE :searchTerm
  172.             OR l.titre LIKE :searchTerm
  173.             OR p.nom LIKE :searchTerm
  174.             OR l.type LIKE :searchTerm
  175.             OR l.ville LIKE :searchTerm
  176.             OR CONCAT(l.prix, \'\') LIKE :searchTerm
  177.         )')
  178.             ->andWhere('p.demandeSuppression IS NULL')
  179.             ->setParameter('searchTerm''%' $searchTerm '%')
  180.             ->setParameter('entrepriseId'$entreprise->getId());
  181.         if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  182.             if (!$user->getallProgrammes()) {
  183.                 $programmes $user->getPrescripteurProgrammes();
  184.                 if ($programmes->count()) {
  185.                     $qb->andWhere('p.id IN (' implode(','array_map(function ($p) { return $p->getId(); }, $programmes->toArray())) . ')');
  186.                 } else {
  187.                     $qb->andWhere('p.id IN (0)');
  188.                 }
  189.             }
  190.         }
  191.         return $qb->getQuery()->getResult();
  192.     }
  193.     public function findAllTypes($entrepriseId$user)
  194.     {
  195.         $qb $this->createQueryBuilder('l');
  196.     
  197.         if ($entrepriseId !== null) {
  198.             $qb->join('l.programmeParent''p')
  199.                ->andWhere('p.entreprise = :entreprise_id')
  200.                ->setParameter('entreprise_id'$entrepriseId);
  201.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  202.                 if (!$user->getallProgrammes()) {
  203.                     $programmes $user->getPrescripteurProgrammes();
  204.                     if($programmes->count()) {
  205.                         $qb->andWhere('p.id IN (' implode(','array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
  206.                     } else {
  207.                         $qb->andWhere('p.id IN (0)');
  208.                     }
  209.                 }
  210.             }
  211.         }
  212.     
  213.         return $qb->select('DISTINCT l.typeMoteurRecherche')
  214.                   ->orderBy('l.typeMoteurRecherche''ASC')
  215.                   ->getQuery()
  216.                   ->getResult();
  217.     }
  218.     public function findAllEtages($entrepriseId$user)
  219.     {
  220.         $qb $this->createQueryBuilder('l');
  221.     
  222.         if ($entrepriseId !== null) {
  223.             $qb->join('l.programmeParent''p')
  224.                ->andWhere('p.entreprise = :entreprise_id')
  225.                ->setParameter('entreprise_id'$entrepriseId);
  226.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  227.                 if (!$user->getallProgrammes()) {
  228.                     $programmes $user->getPrescripteurProgrammes();
  229.                     if($programmes->count()) {
  230.                         $qb->andWhere('p.id IN (' implode(','array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
  231.                     } else {
  232.                         $qb->andWhere('p.id IN (0)');
  233.                     }
  234.                 }
  235.             }
  236.         }
  237.     
  238.         return $qb->select('DISTINCT l.etageMoteurRecherche as etage')
  239.                   ->orderBy('l.etageMoteurRecherche''ASC')
  240.                   ->getQuery()
  241.                   ->getResult();
  242.     }
  243.     public function findAllPromoteurs($entrepriseId$user)
  244.     {
  245.         $qb $this->createQueryBuilder('l')
  246.             ->select('DISTINCT l.promoteur as promoteur')
  247.             ->join('l.programmeParent''p')
  248.             ->andWhere('p.demandeSuppression IS NULL')
  249.             ->andWhere('l.promoteur IS NOT NULL')
  250.             ->orderBy('l.promoteur''ASC');
  251.     
  252.         if ($entrepriseId !== null) {
  253.             $qb->andWhere('p.entreprise = :entreprise_id')
  254.                ->setParameter('entreprise_id'$entrepriseId);
  255.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  256.                 if (!$user->getallProgrammes()) {
  257.                     $programmes $user->getPrescripteurProgrammes();
  258.                     if ($programmes->count()) {
  259.                         $programmeIds array_map(function($p){ return $p->getId(); }, $programmes->toArray());
  260.                         $qb->andWhere('p.id IN (:programmeIds)')
  261.                            ->setParameter('programmeIds'$programmeIds);
  262.                     } else {
  263.                         $qb->andWhere('p.id = 0');
  264.                     }
  265.                 }
  266.             }
  267.         }
  268.     
  269.         return $qb->getQuery()->getResult();
  270.     }
  271.     public function findAllNumerosLot($entrepriseId$user)
  272.     {
  273.         $qb $this->createQueryBuilder('l');
  274.     
  275.         if ($entrepriseId !== null) {
  276.             $qb->join('l.programmeParent''p')
  277.                ->andWhere('p.entreprise = :entreprise_id')
  278.                ->andWhere('p.demandeSuppression IS NULL')
  279.                ->setParameter('entreprise_id'$entrepriseId);
  280.             if (in_array('ROLE_PARTENAIRE'$user->getRoles())) {
  281.                 if (!$user->getallProgrammes()) {
  282.                     $programmes $user->getPrescripteurProgrammes();
  283.                     if($programmes->count()) {
  284.                         $qb->andWhere('p.id IN (' implode(','array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
  285.                     } else {
  286.                         $qb->andWhere('p.id IN (0)');
  287.                     }
  288.                 }
  289.             }
  290.         }
  291.     
  292.         return $qb->select('DISTINCT l.reference as numero_lot''l.ville''l.programme''l.type''l.prix')
  293.                   ->orderBy('l.reference''ASC')
  294.                   ->getQuery()
  295.                   ->getResult();
  296.     }
  297.     /*
  298.     public function findOneBySomeField($value): ?Lot
  299.     {
  300.         return $this->createQueryBuilder('l')
  301.             ->andWhere('l.exampleField = :val')
  302.             ->setParameter('val', $value)
  303.             ->getQuery()
  304.             ->getOneOrNullResult()
  305.         ;
  306.     }
  307.     */
  308. }