src/Repository/ProjectRepository.php line 364

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\DocUpload;
  4. use App\Entity\Etap14;
  5. use App\Entity\Etap15;
  6. use App\Entity\Etap160;
  7. use App\Entity\Etap17;
  8. use App\Entity\Etap21;
  9. use App\Entity\Etap24;
  10. use App\Entity\Etap5;
  11. use App\Entity\Etap6;
  12. use App\Entity\Etap8;
  13. use App\Entity\Etap1;
  14. use App\Entity\Etap2;
  15. use App\Entity\Etap3;
  16. use App\Entity\Etap4;
  17. use App\Entity\Etap7;
  18. use App\Entity\Etap9;
  19. use App\Entity\Etap10;
  20. use App\Entity\Etap11;
  21. use App\Entity\Etap12;
  22. use App\Entity\Etap13;
  23. use App\Entity\Etaps;
  24. use App\Entity\NumeroCardi;
  25. use App\Entity\ParametrageLoyer;
  26. use App\Entity\Project;
  27. use App\Entity\SolargisProject;
  28. use App\Entity\SolecoProject;
  29. use App\Entity\StatusFoncier;
  30. use App\Entity\StatusUrbanisme;
  31. use App\Entity\User;
  32. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  33. use Doctrine\Persistence\ManagerRegistry;
  34. use Symfony\Component\Security\Core\Security;
  35. /**
  36.  * @method Project|null find($id, $lockMode = null, $lockVersion = null)
  37.  * @method Project|null findOneBy(array $criteria, array $orderBy = null)
  38.  * @method Project[]    findAll()
  39.  * @method Project[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  40.  */
  41. class ProjectRepository extends ServiceEntityRepository
  42. {
  43.     public function __construct(ManagerRegistry $registry,Security $security)
  44.     {
  45.         $this->security = $security;
  46.         parent::__construct($registry, Project::class);
  47.     }
  48.     // ─── GESTION DES ENGAGEMENTS : pagination basée sur les projets ───────────
  49.     private function buildEngagementPaginationQb(array $filters)
  50.     {
  51.         $qb = $this->createQueryBuilder('p')
  52.             ->leftJoin('p.spv', 's')
  53.             ->addSelect('s')
  54.             ->andWhere('p.isArchived = 0 or p.isArchived is null')
  55.             ->andWhere('p.isEnabled = 1')
  56.             ->orderBy('p.name', 'ASC');
  57.         if (!empty($filters['search'])) {
  58.             $qb->andWhere('p.name LIKE :search OR p.codeProject LIKE :search')
  59.                ->setParameter('search', '%' . $filters['search'] . '%');
  60.         }
  61.         if (!empty($filters['spvId'])) {
  62.             $spv = $filters['spvId'];
  63.             if (is_array($spv)) {
  64.                 $qb->andWhere('s.id IN (:spv)')->setParameter('spv', $spv);
  65.             } else {
  66.                 $qb->andWhere('s.id = :spv')->setParameter('spv', $spv);
  67.             }
  68.         }
  69.         if (!empty($filters['statutAdministratif'])) {
  70.             $statut = $filters['statutAdministratif'];
  71.             if (is_array($statut)) {
  72.                 $qb->andWhere('p.statusAdministratif IN (:statut)')->setParameter('statut', $statut);
  73.             } else {
  74.                 $qb->andWhere('p.statusAdministratif = :statut')->setParameter('statut', $statut);
  75.             }
  76.         }
  77.         return $qb;
  78.     }
  79.     /**
  80.      * @return Project[]
  81.      */
  82.     public function findForEngagementPagination(array $filters, int $start, int $length): array
  83.     {
  84.         return $this->buildEngagementPaginationQb($filters)
  85.             ->setFirstResult($start)
  86.             ->setMaxResults($length)
  87.             ->getQuery()
  88.             ->getResult();
  89.     }
  90.     public function countForEngagementPagination(array $filters): int
  91.     {
  92.         return (int) $this->buildEngagementPaginationQb($filters)
  93.             ->select('COUNT(p.id)')
  94.             ->getQuery()
  95.             ->getSingleScalarResult();
  96.     }
  97.     public function search($isArchive = false ,$status,$user,$data, $page = 0, $max = NULL, $getResult = true, $columnOrder = NULL, $dirOrder = NULL,$count=false) {
  98.         $qb =  $this->createQueryBuilder('c');
  99.         $query = isset($data['query']) && $data['query'] ? $data['query'] : null;
  100.         $spvProject = isset($data['spvProject']) && $data['spvProject'] ? $data['spvProject'] : null;
  101.         $statusAdministratifProject = isset($data['statusAdministratifProject']) && $data['statusAdministratifProject'] ? $data['statusAdministratifProject'] : null;
  102.         $statusTrackerProject = isset($data['statusTrackerProject']) && $data['statusTrackerProject'] ? $data['statusTrackerProject'] : null;
  103.         $achatLocation = isset($data['achatLocation']) && $data['achatLocation'] ? $data['achatLocation'] : null;
  104.         $stadeConstruction = isset($data['stadeConstruction']) && $data['stadeConstruction'] ? $data['stadeConstruction'] : null;
  105.         $typologieProject = isset($data['typologieProject']) && $data['typologieProject'] ? $data['typologieProject'] : null;
  106.         $statusUrbanisme = isset($data['statusUrbanisme']) && $data['statusUrbanisme'] ? $data['statusUrbanisme'] : null;
  107.         $statusFoncier1 = isset($data['statusFoncier1']) && $data['statusFoncier1'] ? $data['statusFoncier1'] : null;
  108.         $statusFoncier2 = isset($data['statusFoncier2']) && $data['statusFoncier2'] ? $data['statusFoncier2'] : null;
  109.         $statusFoncier3 = isset($data['statusFoncier3']) && $data['statusFoncier3'] ? $data['statusFoncier3'] : null;
  110.         $responsableProject = isset($data['responsableProject']) && $data['responsableProject'] ? $data['responsableProject'] : null;
  111.         $responsableFoncierProject = isset($data['responsableFoncierProject']) && $data['responsableFoncierProject'] ? $data['responsableFoncierProject'] : null;
  112.         $responsableDevProject = isset($data['responsableDevProject']) && $data['responsableDevProject'] ? $data['responsableDevProject'] : null;
  113.         $constructeurProject = isset($data['constructeurProject']) && $data['constructeurProject'] ? $data['constructeurProject'] : null;
  114.         $intervenantProject = isset($data['intervenantProject']) && $data['intervenantProject'] ? $data['intervenantProject'] : null;
  115.         $qb->leftJoin('c.familleProject','familleProject');
  116.         $qb->leftJoin('c.typologieProject','typologieProject');
  117.         $qb->leftJoin('c.typeBatimentProject','typeBatimentProject');
  118.         $qb->leftJoin(Etap5::class, 'etap5', 'WITH', 'etap5.project = c.id');
  119.         $qb->leftJoin(Etap6::class, 'etap6', 'WITH', 'etap6.project = c.id');
  120.         $qb->leftJoin(Etap8::class, 'etap8', 'WITH', 'etap8.project = c.id');
  121.         $qb->leftJoin(Etap10::class, 'etap10', 'WITH', 'etap10.project = c.id');
  122.         $qb->leftJoin(Etap14::class, 'etap14', 'WITH', 'etap14.project = c.id');
  123.         $qb->leftJoin(Etap15::class, 'etap15', 'WITH', 'etap15.project = c.id');
  124.         $qb->leftJoin(Etap12::class, 'etap12', 'WITH', 'etap12.project = c.id');
  125.         $qb->leftJoin('etap12.numeroCardiMultiple','numeroCardi');
  126.         $qb->leftJoin('etap15.informationMultiple','informationEtap15');
  127.         $qb->leftJoin(Etap24::class, 'etap24', 'WITH', 'etap24.project = c.id');
  128.         $qb->leftJoin('etap24.etap24Champs','etap24Champs');
  129.         $qb->leftJoin('etap24Champs.etap26Champs','etap26Champs');
  130.         $qb->leftJoin('c.fournisseurProject', 'fournisseurProject');
  131.         $constructeurEpcProject = isset($data['constructeurEpcProject']) && $data['constructeurEpcProject'] ? $data['constructeurEpcProject'] : null;
  132.         $constructeurInstallateurProject = isset($data['constructeurInstallateurProject']) && $data['constructeurInstallateurProject'] ? $data['constructeurInstallateurProject'] : null;
  133.         $constructeurCharpentierProject = isset($data['constructeurCharpentierProject']) && $data['constructeurCharpentierProject'] ? $data['constructeurCharpentierProject'] : null;
  134.         $constructeurNotaireProject = isset($data['constructeurNotaireProject']) && $data['constructeurNotaireProject'] ? $data['constructeurNotaireProject'] : null;
  135.         $entrepriseProject = isset($data['entrepriseProject']) && $data['entrepriseProject'] ? $data['entrepriseProject'] : null;
  136.         if($achatLocation && $achatLocation != 0){
  137.             if($achatLocation == Project::ACHAT){
  138.                 $qb->andWhere('c.achatLocation = :achatLocation')
  139.                     ->setParameter('achatLocation',$achatLocation);
  140.             }else{
  141.                 $qb->andWhere('(c.achatLocation = :achatLocation) or (c.achatLocation is null)')
  142.                     ->setParameter('achatLocation',Project::LOCATION);
  143.             }
  144.         }
  145.         if($entrepriseProject){
  146.             $qb->leftJoin('c.developpeur','developpeurEntity');
  147.             $qb->andWhere('(c.entreprise in (:entreprise)) or (developpeurEntity.entreprise in (:entreprise))')
  148.                 ->setParameter('entreprise',$entrepriseProject);
  149.         }
  150.         if($constructeurEpcProject){
  151.             $qb->andWhere('c.fournisseur in (:constructeurEpcProject)')
  152.                 ->setParameter('constructeurEpcProject',$constructeurEpcProject);
  153.         }
  154.         if($constructeurInstallateurProject){
  155.             $qb->andWhere('fournisseurProject.fournisseur in (:constructeurInstallateurProject)')
  156.                 ->setParameter('constructeurInstallateurProject',$constructeurInstallateurProject);
  157.         }
  158.         if($constructeurCharpentierProject){
  159.             $qb->andWhere('fournisseurProject.fournisseur in (:constructeurCharpentierProject)')
  160.                 ->setParameter('constructeurCharpentierProject',$constructeurCharpentierProject);
  161.         }
  162.         if($constructeurNotaireProject){
  163.             $qb->andWhere('fournisseurProject.fournisseur in (:constructeurNotaireProject)')
  164.                 ->setParameter('constructeurNotaireProject',$constructeurNotaireProject);
  165.         }
  166.         $qb->andWhere('c.name like :query or c.codeProject like :query or familleProject.name like :query or typologieProject.name like :query or typeBatimentProject.name like :query
  167.          or c.adresse like :query or c.city like :query  or c.codePostal like :query  or c.numParcelle like :query  or etap5.typeBail like :query  or etap6.nomNotaire like :query 
  168.          or etap8.siretEts like :query or etap14.adresseMiseEnService like :query or etap14.codePostalMiseEnService like :query or etap14.cityMiseEnService like :query 
  169.          or etap14.firstnameProprietaire like :query or etap14.lastnameProprietaire like :query or etap14.phoneProprietaire like :query or etap14.emailProprietaire like :query
  170.          or etap15.numeroContratAchat like :query or numeroCardi.numeroCardi like :query or numeroCardi.identifiantEnedis like :query 
  171.          or informationEtap15.numeroContratAchat like :query or informationEtap15.tarifContratAchat like :query or etap10.referenceEnedis like :query
  172.         or etap26Champs.numeroContratAchat1 like :query or etap26Champs.numeroContratAchat2 like :query
  173.         ')
  174.             ->setParameter('query', "%" . $query . "%")
  175.         ;
  176.         if($isArchive){
  177.             $qb->andWhere('c.isArchived = 1');
  178.         }else{
  179.             if($query){
  180.             }else{
  181.                 $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  182.             }
  183.         }
  184.         if($status){
  185.             $qb->andWhere('c.status in (:status)')
  186.                 ->setParameter('status',$status);
  187.         }
  188.         if($statusAdministratifProject){
  189.             $qb->andWhere('c.statusAdministratif in (:statusAdministratif)')
  190.                 ->setParameter('statusAdministratif',$statusAdministratifProject);
  191.         }
  192.         if($statusTrackerProject){
  193.             $qb->andWhere('c.statusTrackerActuel in (:statusTracker)')
  194.                 ->setParameter('statusTracker',$statusTrackerProject);
  195.         }
  196.         if($stadeConstruction){
  197.             $qb->andWhere('c.statusTrackerActuelConstruction in (:stadeConstruction)')
  198.                 ->setParameter('stadeConstruction',$stadeConstruction);
  199.         }
  200.         if($statusUrbanisme){
  201.             $qb->leftJoin(StatusUrbanisme::class, 'statusUrbanisme', 'WITH', 'statusUrbanisme.project = c.id');
  202.             $str = '';
  203.             foreach ($statusUrbanisme as $key => $item){
  204.                 if($key == 0){
  205.                     $str .=  '(statusUrbanisme.statusStr like :statusUrbanisme'.$key .')' ;
  206.                 }else{
  207.                     $str .=  ' OR (statusUrbanisme.statusStr like :statusUrbanisme'.$key.')' ;
  208.                 }
  209.             }
  210.             if($str != ''){
  211.                 $qb->andWhere($str);
  212.                 foreach ($statusUrbanisme as $key => $item) {
  213.                     $qb->setParameter('statusUrbanisme'.$key, '%'.$item.'%');
  214.                 }
  215.             }
  216.         }
  217.         if($statusFoncier1 || $statusFoncier2 || $statusFoncier3){
  218.             $qb->leftJoin(StatusFoncier::class, 'statusFoncier', 'WITH', 'statusFoncier.project = c.id');
  219.             if($statusFoncier1){
  220.                 $qb->andWhere('statusFoncier.statusStr1 like :statusStr1');
  221.                 $qb->setParameter('statusStr1', '%'.$statusFoncier1.'%');
  222.             }
  223.             if($statusFoncier2){
  224.                 $qb->andWhere('statusFoncier.statusStr2 like :statusStr2');
  225.                 $qb->setParameter('statusStr2', '%'.$statusFoncier2.'%');
  226.             }
  227.             if($statusFoncier3){
  228.                 $qb->andWhere('statusFoncier.statusStr3 like :statusStr3');
  229.                 $qb->setParameter('statusStr3', '%'.$statusFoncier3.'%');
  230.             }
  231.         }
  232.         if($typologieProject){
  233.             $qb->andWhere('c.typologieProject in (:typologieProject)')
  234.                 ->setParameter('typologieProject',$typologieProject);
  235.         }
  236.         if(in_array('ROLE_DEV',$user->getRoles())){
  237.             if($user->getEntreprise()){
  238.                 $qb->andWhere('(c.developpeur = :user) or (c.entreprise = :userEntreprise)')
  239.                     ->setParameter('user',$user->getId())
  240.                     ->setParameter('userEntreprise',$user->getEntreprise()->getId());
  241.             }else{
  242.                 $qb->andWhere('c.developpeur = :user')
  243.                     ->setParameter('user',$user->getId());
  244.             }
  245.         }elseif (in_array('ROLE_EPC',$user->getRoles())){
  246.             $qb->andWhere('c.epc = :user or c.developpeur = :user')
  247.                 ->setParameter('user',$user->getId());
  248.         }elseif (in_array('ROLE_CONSTRUCTEUR',$user->getRoles())){
  249.             $qb->innerJoin('c.constructeurUser','constructeur');
  250.             $qb->andWhere('constructeur.constructeur = :user')
  251.                 ->setParameter('user',$user->getId());
  252.         }elseif (in_array('ROLE_ADMIN',$user->getRoles()) || in_array('ROLE_SUPER_ADMINISTRATOR',$user->getRoles())){
  253.         }
  254.         if($user && in_array($user->getTypeAcces(),[User::ACCES_intervenant,User::ACCES_visiteur,User::ACCES_comptable])){
  255.             $spvsTab = isset($data['spvsTab']) && $data['spvsTab'] ? $data['spvsTab'] : null;
  256.             if($user && $spvsTab ){
  257.                 $qb->andWhere('c.spv in (:spvsTab)')
  258.                     ->setParameter('spvsTab',$spvsTab);
  259.             }else{
  260.                 if (in_array('ROLE_COMPTABLE',$user->getRoles())||in_array('ROLE_AUDITEUR',$user->getRoles())) {
  261.                     $qb->andWhere('fournisseurProject.user = :userCourant')
  262.                         ->setParameter('userCourant', $user->getId());
  263.                 }elseif (in_array('ROLE_FOURNISSEUR',$user->getRoles())){
  264.                     $qb->innerJoin('fournisseurProject.fournisseur', 'fournisseur');
  265.                     $qb->leftJoin('c.fournisseur', 'fournisseurUser');
  266.                     $qb->leftJoin('fournisseur.user', 'fournisseurProjectUser');
  267.                     $qb->leftJoin('fournisseurUser.user', 'fournisseurUserUser');
  268.                     $qb->andWhere('fournisseurProjectUser.id = :userFournisseur or fournisseurUserUser.id = :userFournisseur')
  269.                         ->setParameter('userFournisseur', $user->getId());
  270.                 }
  271.             }
  272.         }
  273.         if($spvProject){
  274.             $qb->andWhere('c.spv in (:spv)')
  275.                 ->setParameter('spv',$spvProject);
  276.         }
  277.         if($responsableProject){
  278.             $qb->innerJoin('c.responsableUser', 'responsable');
  279.             $qb->andWhere('responsable.responsable in (:responsable)')
  280.                 ->setParameter('responsable',$responsableProject);
  281.         }
  282.         if($responsableFoncierProject){
  283.             $qb->innerJoin('c.responsableFoncierUser', 'responsable');
  284.             $qb->andWhere('responsable.responsable in (:responsable)')
  285.                 ->setParameter('responsable',$responsableFoncierProject);
  286.         }
  287.         if($responsableDevProject){
  288.             $qb->innerJoin('c.responsableDeveloppement', 'responsableDev');
  289.             $qb->andWhere('responsableDev.responsable in (:responsableDevStr)')
  290.                 ->setParameter('responsableDevStr',$responsableDevProject);
  291.         }
  292.         if($constructeurProject){
  293.             $qb->innerJoin('c.constructeurUser', 'constructeur');
  294.             $qb->andWhere('constructeur.constructeur in (:constructeur)')
  295.                 ->setParameter('constructeur',$constructeurProject);
  296.         }
  297.         if($intervenantProject){
  298.             $qb->innerJoin('c.intervenantUser', 'intervenantUser');
  299.             $qb->andWhere('intervenantUser.intervenant in (:intervenantUser)')
  300.                 ->setParameter('intervenantUser',$intervenantProject);
  301.         }
  302.         if($count){
  303.             $qb->select('count(DISTINCT c.id) as result');
  304.             return $qb->getQuery()->getOneOrNullResult();
  305.         }else{
  306.             $qb->select('DISTINCT c');
  307.             if ($columnOrder) {
  308.                 if($columnOrder == 'name'){
  309.                     $qb->orderBy("c.$columnOrder", $dirOrder);
  310.                 }
  311.                 elseif($columnOrder == 'status'){
  312.                     $qb->orderBy("c.status", $dirOrder);
  313.                 }
  314.                 elseif($columnOrder == 'createdAt'){
  315.                     $qb->orderBy("c.createdAt", $dirOrder);
  316.                 }
  317.                 elseif($columnOrder == 'archiveAt'){
  318.                     $qb->orderBy("c.archiveAt", $dirOrder);
  319.                 }
  320.                 elseif($columnOrder == 'commentArchive'){
  321.                     $qb->orderBy("c.commentArchive", $dirOrder);
  322.                 }
  323.                 elseif($columnOrder == 'statusAdministratif'){
  324.                     $qb->orderBy("c.statusAdministratif", $dirOrder);
  325.                 }
  326.                 elseif($columnOrder == 'statusTrackerActuel'){
  327.                     $qb->orderBy("c.statusTrackerActuel", $dirOrder);
  328.                 }else{
  329.                     $qb->orderBy("c.createdAt", 'desc');
  330.                 }
  331.             }
  332.             if ($max) {
  333.                 $preparedQuery = $qb->getQuery()
  334.                     ->setMaxResults($max)
  335.                     ->setFirstResult($page * $max)
  336.                 ;
  337.             } else {
  338.                 $preparedQuery = $qb->getQuery();
  339.             }
  340.             return $getResult ? $preparedQuery->getResult() : $preparedQuery;
  341.         }
  342.     }
  343.     public function searchAdmin($isArchive = false,$status,$statusCustom=null,$spv,$data, $page = 0, $max = NULL, $getResult = true, $columnOrder = NULL, $dirOrder = NULL,$count=false) {
  344.         $qb =  $this->createQueryBuilder('c');
  345.         $query = isset($data['query']) && $data['query'] ? $data['query'] : null;
  346.         $statusAdministratifProject = isset($data['statusAdministratifProject']) && $data['statusAdministratifProject'] ? $data['statusAdministratifProject'] : null;
  347.         $statusTrackerProject = isset($data['statusTrackerProject']) && $data['statusTrackerProject'] ? $data['statusTrackerProject'] : null;
  348.         $stadeConstruction = isset($data['stadeConstruction']) && $data['stadeConstruction'] ? $data['stadeConstruction'] : null;
  349.         $statusUrbanisme = isset($data['statusUrbanisme']) && $data['statusUrbanisme'] ? $data['statusUrbanisme'] : null;
  350.         $statusFoncier1 = isset($data['statusFoncier1']) && $data['statusFoncier1'] ? $data['statusFoncier1'] : null;
  351.         $statusFoncier2 = isset($data['statusFoncier2']) && $data['statusFoncier2'] ? $data['statusFoncier2'] : null;
  352.         $statusFoncier3 = isset($data['statusFoncier3']) && $data['statusFoncier3'] ? $data['statusFoncier3'] : null;
  353.         $typologieProject = isset($data['typologieProject']) && $data['typologieProject'] ? $data['typologieProject'] : null;
  354.         $devProject = isset($data['devProject']) && $data['devProject'] ? $data['devProject'] : null;
  355.         $entrepriseProject = isset($data['entrepriseProject']) && $data['entrepriseProject'] ? $data['entrepriseProject'] : null;
  356.         $responsableProject = isset($data['responsableProject']) && $data['responsableProject'] ? $data['responsableProject'] : null;
  357.         $responsableFoncierProject = isset($data['responsableFoncierProject']) && $data['responsableFoncierProject'] ? $data['responsableFoncierProject'] : null;
  358.         $responsableDevProject = isset($data['responsableDevProject']) && $data['responsableDevProject'] ? $data['responsableDevProject'] : null;
  359.         $constructeurProject = isset($data['constructeurProject']) && $data['constructeurProject'] ? $data['constructeurProject'] : null;
  360.         $intervenantProject = isset($data['intervenantProject']) && $data['intervenantProject'] ? $data['intervenantProject'] : null;
  361.         $achatLocation = isset($data['achatLocation']) && $data['achatLocation'] ? $data['achatLocation'] : null;
  362.         if($achatLocation && $achatLocation != 0){
  363.             if($achatLocation == Project::ACHAT){
  364.                 $qb->andWhere('c.achatLocation = :achatLocation')
  365.                     ->setParameter('achatLocation',$achatLocation);
  366.             }else{
  367.                 $qb->andWhere('(c.achatLocation = :achatLocation) or (c.achatLocation is null)')
  368.                     ->setParameter('achatLocation',Project::LOCATION);
  369.             }
  370.         }
  371.         $qb->leftJoin('c.familleProject','familleProject');
  372.         $qb->leftJoin('c.typologieProject','typologieProject');
  373.         $qb->leftJoin('c.typeBatimentProject','typeBatimentProject');
  374.         $qb->leftJoin(Etap5::class, 'etap5', 'WITH', 'etap5.project = c.id');
  375.         $qb->leftJoin(Etap6::class, 'etap6', 'WITH', 'etap6.project = c.id');
  376.         $qb->leftJoin(Etap8::class, 'etap8', 'WITH', 'etap8.project = c.id');
  377.         $qb->leftJoin(Etap14::class, 'etap14', 'WITH', 'etap14.project = c.id');
  378.         $qb->leftJoin(Etap15::class, 'etap15', 'WITH', 'etap15.project = c.id');
  379.         $qb->leftJoin(Etap12::class, 'etap12', 'WITH', 'etap12.project = c.id');
  380.         $qb->leftJoin(Etap10::class, 'etap10', 'WITH', 'etap10.project = c.id');
  381.         $qb->leftJoin('etap12.numeroCardiMultiple','numeroCardiEntity');
  382.         $qb->leftJoin('etap15.informationMultiple','informationEtap15');
  383.         $qb->leftJoin(Etap24::class, 'etap24', 'WITH', 'etap24.project = c.id');
  384.         $qb->leftJoin('etap24.etap24Champs','etap24Champs');
  385.         $qb->leftJoin('etap24Champs.etap26Champs','etap26Champs');
  386.         $qb->leftJoin('c.fournisseurProject', 'fournisseurProject');
  387.         $constructeurEpcProject = isset($data['constructeurEpcProject']) && $data['constructeurEpcProject'] ? $data['constructeurEpcProject'] : null;
  388.         $constructeurInstallateurProject = isset($data['constructeurInstallateurProject']) && $data['constructeurInstallateurProject'] ? $data['constructeurInstallateurProject'] : null;
  389.         $constructeurCharpentierProject = isset($data['constructeurCharpentierProject']) && $data['constructeurCharpentierProject'] ? $data['constructeurCharpentierProject'] : null;
  390.         $constructeurNotaireProject = isset($data['constructeurNotaireProject']) && $data['constructeurNotaireProject'] ? $data['constructeurNotaireProject'] : null;
  391.         if($constructeurEpcProject){
  392.             $qb->andWhere('c.fournisseur in (:constructeurEpcProject)')
  393.                 ->setParameter('constructeurEpcProject',$constructeurEpcProject);
  394.         }
  395.         if($constructeurInstallateurProject){
  396.             $qb->andWhere('fournisseurProject.fournisseur in (:constructeurInstallateurProject)')
  397.                 ->setParameter('constructeurInstallateurProject',$constructeurInstallateurProject);
  398.         }
  399.         if($constructeurCharpentierProject){
  400.             $qb->andWhere('fournisseurProject.fournisseur in (:constructeurCharpentierProject)')
  401.                 ->setParameter('constructeurCharpentierProject',$constructeurCharpentierProject);
  402.         }
  403.         if($constructeurNotaireProject){
  404.             $qb->andWhere('fournisseurProject.fournisseur in (:constructeurNotaireProject)')
  405.                 ->setParameter('constructeurNotaireProject',$constructeurNotaireProject);
  406.         }
  407.         $qb->andWhere('c.name like :query or c.codeProject like :query or familleProject.name like :query or typologieProject.name like :query or typeBatimentProject.name like :query
  408.          or c.adresse like :query or c.city like :query  or c.codePostal like :query  or c.numParcelle like :query  or etap5.typeBail like :query  or etap6.nomNotaire like :query 
  409.          or etap8.siretEts like :query or etap14.adresseMiseEnService like :query or etap14.codePostalMiseEnService like :query or etap14.cityMiseEnService like :query 
  410.          or etap14.firstnameProprietaire like :query or etap14.lastnameProprietaire like :query or etap14.phoneProprietaire like :query or etap14.emailProprietaire like :query
  411.          or etap15.numeroContratAchat like :query  or numeroCardiEntity.numeroCardi like :query  or numeroCardiEntity.identifiantEnedis like :query
  412.         or informationEtap15.numeroContratAchat like :query or informationEtap15.tarifContratAchat like :query or etap10.referenceEnedis like :query
  413.         or etap26Champs.numeroContratAchat1 like :query or etap26Champs.numeroContratAchat2 like :query
  414.         ')
  415.             ->setParameter('query', "%" . $query . "%")
  416.         ;
  417.         $user = isset($data['user']) && $data['user'] ? $data['user'] : null;
  418.         if($isArchive){
  419.             $qb->andWhere('c.isArchived = 1');
  420.         }else{
  421.             if($query){
  422.             }else{
  423.                 $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  424.             }
  425.         }
  426.         if($statusAdministratifProject){
  427.             $qb->andWhere('c.statusAdministratif in (:statusAdministratif)')
  428.                 ->setParameter('statusAdministratif',$statusAdministratifProject);
  429.         }
  430.         if($statusTrackerProject){
  431.             $qb->andWhere('c.statusTrackerActuel in (:statusTracker)')
  432.                 ->setParameter('statusTracker',$statusTrackerProject);
  433.         }
  434.         if($stadeConstruction){
  435.             $qb->andWhere('c.statusTrackerActuelConstruction in (:stadeConstruction)')
  436.                 ->setParameter('stadeConstruction',$stadeConstruction);
  437.         }
  438.         if($statusUrbanisme){
  439.             $qb->leftJoin(StatusUrbanisme::class, 'statusUrbanisme', 'WITH', 'statusUrbanisme.project = c.id');
  440.             $str = '';
  441.             foreach ($statusUrbanisme as $key => $item){
  442.                 if($key == 0){
  443.                     $str .=  '(statusUrbanisme.statusStr like :statusUrbanisme'.$key .')' ;
  444.                 }else{
  445.                     $str .=  ' OR (statusUrbanisme.statusStr like :statusUrbanisme'.$key.')' ;
  446.                 }
  447.             }
  448.             if($str != ''){
  449.                 $qb->andWhere($str);
  450.                 foreach ($statusUrbanisme as $key => $item) {
  451.                     $qb->setParameter('statusUrbanisme'.$key, '%'.$item.'%');
  452.                 }
  453.             }
  454.         }
  455.         if($statusFoncier1 || $statusFoncier2 || $statusFoncier3){
  456.             $qb->leftJoin(StatusFoncier::class, 'statusFoncier', 'WITH', 'statusFoncier.project = c.id');
  457.             if($statusFoncier1){
  458.                 $qb->andWhere('statusFoncier.statusStr1 like :statusStr1');
  459.                 $qb->setParameter('statusStr1', '%'.$statusFoncier1.'%');
  460.             }
  461.             if($statusFoncier2){
  462.                 $qb->andWhere('statusFoncier.statusStr2 like :statusStr2');
  463.                 $qb->setParameter('statusStr2', '%'.$statusFoncier2.'%');
  464.             }
  465.             if($statusFoncier3){
  466.                 $qb->andWhere('statusFoncier.statusStr3 like :statusStr3');
  467.                 $qb->setParameter('statusStr3', '%'.$statusFoncier3.'%');
  468.             }
  469.         }
  470.         if($typologieProject){
  471.             $qb->andWhere('c.typologieProject in (:typologieProject)')
  472.                 ->setParameter('typologieProject',$typologieProject);
  473.         }
  474.         if($status){
  475.             $qb->andWhere('c.status in (:status)')
  476.                 ->setParameter('status',$status);
  477.         }
  478.         if($statusCustom == Project::STATUS_CUSTOM_EN_ATTENT){
  479.             $qb->andWhere('c.status in (:status)')
  480.                 ->setParameter('status',[Project::STATUS_DEMANDE,Project::STATUS_EN_ATTENT,Project::STATUS_DEMANDE_REPONDU]);
  481.         }elseif ($statusCustom == Project::STATUS_CUSTOM_EXPLOITATION){
  482.             $qb->innerJoin(Etap21::class, 'etap21', 'WITH', 'etap21.project = c.id')
  483.                 ->andWhere('etap21.status = :statusValide')
  484.                 ->setParameter('statusValide',Etaps::STATUS_VALIDE);
  485.         }elseif ($statusCustom == Project::STATUS_CUSTOM_CONSTRUCTION){
  486.             $qb->innerJoin(Etap17::class, 'etap17', 'WITH', 'etap17.project = c.id')
  487.                 ->andWhere('etap17.status = :statusValide')
  488.                 ->setParameter('statusValide',Etaps::STATUS_VALIDE);
  489.             $qb->innerJoin(Etap21::class, 'etap21', 'WITH', 'etap21.project = c.id')
  490.                 ->andWhere('etap21.status <> :statusValide')
  491.                 ->setParameter('statusValide',Etaps::STATUS_VALIDE);
  492.         }elseif ($statusCustom == Project::STATUS_CUSTOM_DEVELOPPEMENT){
  493.             $qb->andWhere('c.status in (:status)')
  494.                 ->setParameter('status',[Project::STATUS_EN_COURS]);
  495.         }
  496.         if($spv){
  497.             $qb->andWhere('c.spv in (:spv)')
  498.                 ->setParameter('spv',$spv);
  499.         }
  500.         if($devProject){
  501.             $qb->andWhere('c.developpeur in (:dev)')
  502.                 ->setParameter('dev',$devProject);
  503.         }
  504.         if($entrepriseProject){
  505.             $qb->leftJoin('c.developpeur','developpeurEntity');
  506.             $qb->andWhere('(c.entreprise in (:entreprise)) or (developpeurEntity.entreprise in (:entreprise))')
  507.                 ->setParameter('entreprise',$entrepriseProject);
  508.         }
  509.         if($responsableProject){
  510.             $qb->innerJoin('c.responsableUser', 'responsable');
  511.             $qb->andWhere('responsable.responsable in (:responsable)')
  512.                 ->setParameter('responsable',$responsableProject);
  513.         }
  514.         if($responsableFoncierProject){
  515.             $qb->innerJoin('c.responsableFoncierUser', 'responsable');
  516.             $qb->andWhere('responsable.responsable in (:responsable)')
  517.                 ->setParameter('responsable',$responsableFoncierProject);
  518.         }
  519.         if($responsableDevProject){
  520.             $qb->innerJoin('c.responsableDeveloppement', 'responsableDev');
  521.             $qb->andWhere('responsableDev.responsable in (:responsableDevStr)')
  522.                 ->setParameter('responsableDevStr',$responsableDevProject);
  523.         }
  524.         if($constructeurProject){
  525.             $qb->innerJoin('c.constructeurUser', 'constructeur');
  526.             $qb->andWhere('constructeur.constructeur in (:constructeur)')
  527.                 ->setParameter('constructeur',$constructeurProject);
  528.         }
  529.         if($intervenantProject){
  530.             $qb->innerJoin('c.intervenantUser', 'intervenantUser');
  531.             $qb->andWhere('intervenantUser.intervenant in (:intervenantUser)')
  532.                 ->setParameter('intervenantUser',$intervenantProject);
  533.         }
  534.         if($user && $user->getIntervenantNum() && $user->getIntervenantNum() != '0'){
  535.             $qb->innerJoin('c.intervenantUser','intervenantUser');
  536.             $qb->andWhere('intervenantUser.intervenant = :user')
  537.                 ->setParameter('user',$user->getId());
  538.         }
  539.         if($user && in_array($user->getTypeAcces(),[User::ACCES_intervenant,User::ACCES_visiteur,User::ACCES_comptable])){
  540.             $spvsTab = isset($data['spvsTab']) && $data['spvsTab'] ? $data['spvsTab'] : null;
  541.             if($user && $spvsTab ){
  542.                 $qb->andWhere('c.spv in (:spvsTab)')
  543.                     ->setParameter('spvsTab',$spvsTab);
  544.             }else{
  545.                 if (in_array('ROLE_COMPTABLE',$user->getRoles())||in_array('ROLE_AUDITEUR',$user->getRoles())) {
  546.                     $qb->andWhere('fournisseurProject.user = :userCourant')
  547.                         ->setParameter('userCourant', $user->getId());
  548.                 }elseif (in_array('ROLE_FOURNISSEUR',$user->getRoles())){
  549.                     $qb->innerJoin('fournisseurProject.fournisseur', 'fournisseur');
  550.                     $qb->leftJoin('c.fournisseur', 'fournisseurUser');
  551.                     $qb->leftJoin('fournisseur.user', 'fournisseurProjectUser');
  552.                     $qb->leftJoin('fournisseurUser.user', 'fournisseurUserUser');
  553.                     $qb->andWhere('fournisseurProjectUser.id = :userFournisseur or fournisseurUserUser.id = :userFournisseur')
  554.                         ->setParameter('userFournisseur', $user->getId());
  555.                 }
  556.             }
  557.         }
  558.         if($count){
  559.             $qb->select('count(DISTINCT c.id) as result');
  560.             return $qb->getQuery()->getOneOrNullResult();
  561.         }else{
  562.             $qb->select('DISTINCT c');
  563.             if ($columnOrder) {
  564.                 if($columnOrder == 'name'){
  565.                     $qb->orderBy("c.$columnOrder", $dirOrder);
  566.                 }
  567.                 elseif($columnOrder == 'status'){
  568.                     $qb->orderBy("c.status", $dirOrder);
  569.                 }
  570.                 elseif($columnOrder == 'spv'){
  571.                     $qb->orderBy("c.spv", $dirOrder);
  572.                 }
  573.                 elseif($columnOrder == 'developpeur'){
  574.                     $qb->orderBy("c.developpeur", $dirOrder);
  575.                 }
  576.                 elseif($columnOrder == 'entreprise'){
  577.                     $qb->leftJoin('c.developpeur','dev');
  578.                     $qb->orderBy("dev.entreprise", $dirOrder);
  579.                 }
  580.                 elseif($columnOrder == 'createdAt'){
  581.                     $qb->orderBy("c.createdAt", $dirOrder);
  582.                 }
  583.                 elseif($columnOrder == 'archiveAt'){
  584.                     $qb->orderBy("c.archiveAt", $dirOrder);
  585.                 }
  586.                 elseif($columnOrder == 'commentArchive'){
  587.                     $qb->orderBy("c.commentArchive", $dirOrder);
  588.                 }
  589.                 elseif($columnOrder == 'statusAdministratif'){
  590.                     $qb->orderBy("c.statusAdministratif", $dirOrder);
  591.                 }
  592.                 elseif($columnOrder == 'statusTrackerActuel'){
  593.                     $qb->orderBy("c.statusTrackerActuel", $dirOrder);
  594.                 }else{
  595.                     $qb->orderBy("c.createdAt", 'desc');
  596.                 }
  597.             }
  598.             if ($max) {
  599.                 $preparedQuery = $qb->getQuery()
  600.                     ->setMaxResults($max)
  601.                     ->setFirstResult($page * $max)
  602.                 ;
  603.             } else {
  604.                 $preparedQuery = $qb->getQuery();
  605.             }
  606.             return $getResult ? $preparedQuery->getResult() : $preparedQuery;
  607.         }
  608.     }
  609.     public function searchByCustomStatus($project,$statusCustom){
  610.         $qb =  $this->createQueryBuilder('c');
  611.         $qb->andWhere('c.id = :id')
  612.             ->setParameter('id',$project->getId());
  613.         if($statusCustom == Project::STATUS_CUSTOM_EN_ATTENT){
  614.             $qb->andWhere('c.status in (:status)')
  615.                 ->setParameter('status',[Project::STATUS_DEMANDE,Project::STATUS_EN_ATTENT,Project::STATUS_DEMANDE_REPONDU]);
  616.         }elseif ($statusCustom == Project::STATUS_CUSTOM_EXPLOITATION){
  617.             $qb->innerJoin(Etap21::class, 'etap21', 'WITH', 'etap21.project = c.id')
  618.                 ->andWhere('etap21.status = :statusValide')
  619.                 ->setParameter('statusValide',Etaps::STATUS_VALIDE);
  620.         }elseif ($statusCustom == Project::STATUS_CUSTOM_CONSTRUCTION){
  621.             $qb->innerJoin(Etap17::class, 'etap17', 'WITH', 'etap17.project = c.id')
  622.                 ->andWhere('etap17.status = :statusValide')
  623.                 ->setParameter('statusValide',Etaps::STATUS_VALIDE);
  624.         }elseif ($statusCustom == Project::STATUS_CUSTOM_DEVELOPPEMENT){
  625.             $qb->andWhere('c.status in (:status)')
  626.                 ->setParameter('status',[Project::STATUS_EN_COURS]);
  627.         }
  628.        return  $qb->getQuery()->getResult();
  629.     }
  630.     public function findAllProjectBySPV($id){
  631.         $qb =  $this->createQueryBuilder('c');
  632.         $qb->andWhere('c.spv = :id')
  633.             ->setParameter('id',$id);
  634.             $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  635.         return  $qb->getQuery()->getResult();
  636.     }
  637.     public function findAllProjectByDev($id){
  638.         $qb =  $this->createQueryBuilder('c');
  639.         $qb->andWhere('c.developpeur = :id')
  640.             ->setParameter('id',$id);
  641.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  642.         return  $qb->getQuery()->getResult();
  643.     }
  644.     public function findAllProjectByTokens($tokens){
  645.         $qb =  $this->createQueryBuilder('c');
  646.         $qb->andWhere('c.token in (:tokens)')
  647.             ->setParameter('tokens',$tokens);
  648.         return  $qb->getQuery()->getResult();
  649.     }
  650.     public function getProjectsBySpvs($spvIds){
  651.         $qb =  $this->createQueryBuilder('c');
  652.         $qb->andWhere('c.spv in (:ids)')
  653.             ->setParameter('ids', $spvIds) ;
  654.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  655.         return  $qb->getQuery()->getResult();
  656.     }
  657.     public function kpiProjectBySpv($spvIds=null){
  658.         $qb =  $this->createQueryBuilder('p');
  659.         $qb->select('s.id as id ,s.name as name, count(p.id) as nbrProject, sum(p.tarifRevente)/count(p.id) as moyenTarif, sum(p.capacite) as sommeCapacite ')
  660.             ->innerJoin('p.spv','s');
  661.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null')
  662.             ->andWhere('s.isEnabled = 1');
  663.         if($spvIds){
  664.             if(in_array('tous',$spvIds)){
  665.             }else{
  666.                 $qb->andWhere('s.id in (:spvIds)')
  667.                     ->setParameter('spvIds',$spvIds);
  668.             }
  669.         }else{
  670.             $qb->setMaxResults(5);
  671.         }
  672.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  673.             $spvs = $this->security->getUser()->getSpv();
  674.             $spvsTab = [];
  675.             foreach($spvs as $item){
  676.                 $spvsTab[] = $item->getId();
  677.             }
  678.             $qb->andWhere('p.spv in (:spvsTab)')
  679.                 ->setParameter('spvsTab',$spvsTab);
  680.         }
  681.         $qb->groupBy('s.id');
  682.         $qb->orderBy('s.id','ASC');
  683.         return  $qb->getQuery()->getResult();
  684.     }
  685.     public function kpiProjectBySpvTotal($spvIds=null){
  686.         $qb =  $this->createQueryBuilder('p');
  687.         $qb->select('s.id as id ,s.name as name, count(p.id) as nbrProject, sum(p.tarifRevente)/count(p.id) as moyenTarif, sum(p.capacite) as sommeCapacite ')
  688.             ->innerJoin('p.spv','s');
  689.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null')
  690.             ->andWhere('s.isEnabled = 1');
  691.         if($spvIds){
  692.             if(in_array('tous',$spvIds)){
  693.             }else{
  694.                 $qb->andWhere('s.id in (:spvIds)')
  695.                     ->setParameter('spvIds',$spvIds);
  696.             }
  697.         }else{
  698.             $qb->setMaxResults(5);
  699.         }
  700.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  701.             $spvs = $this->security->getUser()->getSpv();
  702.             $spvsTab = [];
  703.             foreach($spvs as $item){
  704.                 $spvsTab[] = $item->getId();
  705.             }
  706.             $qb->andWhere('p.spv in (:spvsTab)')
  707.                 ->setParameter('spvsTab',$spvsTab);
  708.         }
  709.         $qb->groupBy('s.id');
  710.         $qb->orderBy('s.id','ASC');
  711.         return  $qb->getQuery()->getResult();
  712.     }
  713.     public function kpiProjectBySpvAndStatus($spv,$status){
  714.         $qb =  $this->createQueryBuilder('p');
  715.         $qb->select('count(p.id) as nbrProjectBySpv, sum(p.capacite) as sommeCapaciteBySpv ')
  716.             ->innerJoin('p.spv','s');
  717.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null')
  718.            ->andWhere('s.id = :spvId')
  719.            ->andWhere('p.statusAdministratif = :status')
  720.             ->setParameter('spvId',$spv)
  721.             ->setParameter('status',$status);
  722.         return  $qb->getQuery()->getOneOrNullResult();
  723.     }
  724.     public function kpiProjectByDev($devIds=null){
  725.         $qb =  $this->createQueryBuilder('p');
  726.         $qb->select('s.id as id ,CONCAT(s.firstname,  \' \' , s.lastname) as name, count(p.id) as nbrProject, sum(p.tarifRevente)/count(p.id) as moyenTarif, sum(p.capacite) as sommeCapacite ')
  727.             ->innerJoin('p.developpeur','s');
  728.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null');
  729.         if($devIds){
  730.             $qb->andWhere('s.id in (:devIds)')
  731.                 ->setParameter('devIds',$devIds);
  732.         }else{
  733.             $qb->setMaxResults(5);
  734.         }
  735.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  736.             $spvs = $this->security->getUser()->getSpv();
  737.             $spvsTab = [];
  738.             foreach($spvs as $item){
  739.                 $spvsTab[] = $item->getId();
  740.             }
  741.             $qb->andWhere('p.spv in (:spvsTab)')
  742.                 ->setParameter('spvsTab',$spvsTab);
  743.         }
  744.         $qb->groupBy('s.id');
  745.         $qb->orderBy('s.id','ASC');
  746.         return  $qb->getQuery()->getResult();
  747.     }
  748.     public function kpiProjectByDevTotal($devIds=null){
  749.         $qb =  $this->createQueryBuilder('p');
  750.         $qb->select('s.id as id ,CONCAT(s.firstname,  \' \' , s.lastname) as name, count(p.id) as nbrProject, sum(p.tarifRevente)/count(p.id) as moyenTarif, sum(p.capacite) as sommeCapacite ')
  751.             ->innerJoin('p.developpeur','s');
  752.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null');
  753.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  754.             $spvs = $this->security->getUser()->getSpv();
  755.             $spvsTab = [];
  756.             foreach($spvs as $item){
  757.                 $spvsTab[] = $item->getId();
  758.             }
  759.             $qb->andWhere('p.spv in (:spvsTab)')
  760.                 ->setParameter('spvsTab',$spvsTab);
  761.         }
  762.         $qb->groupBy('s.id');
  763.         $qb->orderBy('s.id','ASC');
  764.         return  $qb->getQuery()->getResult();
  765.     }
  766.     public function kpiProjectByDevAndStatus($dev,$status){
  767.         $qb =  $this->createQueryBuilder('p');
  768.         $qb->select('count(p.id) as nbrProjectByDev, sum(p.capacite) as sommeCapaciteByDev ')
  769.             ->innerJoin('p.developpeur','s');
  770.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null')
  771.             ->andWhere('s.id = :devId')
  772.             ->andWhere('p.statusAdministratif = :status')
  773.             ->setParameter('devId',$dev)
  774.             ->setParameter('status',$status);
  775.         return  $qb->getQuery()->getOneOrNullResult();
  776.     }
  777.     public function kpiProjectByTypologieProject($typologieProjectIds=null){
  778.         $qb =  $this->createQueryBuilder('p');
  779.         $qb->select('s.id as id ,s.name as name, count(p.id) as nbrProject, sum(p.tarifRevente)/count(p.id) as moyenTarif, sum(p.capacite) as sommeCapacite ')
  780.             ->innerJoin('p.typologieProject','s');
  781.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null');
  782.         if($typologieProjectIds){
  783.             $qb->andWhere('s.id in (:typologieProjectIds)')
  784.                 ->setParameter('typologieProjectIds',$typologieProjectIds);
  785.         }else{
  786.             $qb->setMaxResults(5);
  787.         }
  788.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  789.             $spvs = $this->security->getUser()->getSpv();
  790.             $spvsTab = [];
  791.             foreach($spvs as $item){
  792.                 $spvsTab[] = $item->getId();
  793.             }
  794.             $qb->andWhere('p.spv in (:spvsTab)')
  795.                 ->setParameter('spvsTab',$spvsTab);
  796.         }
  797.         $qb->groupBy('s.id');
  798.         $qb->orderBy('s.id','ASC');
  799.         return  $qb->getQuery()->getResult();
  800.     }
  801.     public function kpiProjectByTypologieProjectTotal($typologieProjectIds=null){
  802.         $qb =  $this->createQueryBuilder('p');
  803.         $qb->select('s.id as id ,s.name as name, count(p.id) as nbrProject, sum(p.tarifRevente)/count(p.id) as moyenTarif, sum(p.capacite) as sommeCapacite ')
  804.             ->innerJoin('p.typologieProject','s');
  805.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null');
  806.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  807.             $spvs = $this->security->getUser()->getSpv();
  808.             $spvsTab = [];
  809.             foreach($spvs as $item){
  810.                 $spvsTab[] = $item->getId();
  811.             }
  812.             $qb->andWhere('p.spv in (:spvsTab)')
  813.                 ->setParameter('spvsTab',$spvsTab);
  814.         }
  815.         $qb->groupBy('s.id');
  816.         $qb->orderBy('s.id','ASC');
  817.         return  $qb->getQuery()->getResult();
  818.     }
  819.     public function kpiProjectByTypologieProjectAndStatus($typologieProject,$status){
  820.         $qb =  $this->createQueryBuilder('p');
  821.         $qb->select('count(p.id) as nbrProjectByTypologieProject, sum(p.capacite) as sommeCapaciteByTypologieProject ')
  822.             ->innerJoin('p.typologieProject','s');
  823.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null')
  824.             ->andWhere('s.id = :typologieProject')
  825.             ->andWhere('p.statusAdministratif = :status')
  826.             ->setParameter('typologieProject',$typologieProject)
  827.             ->setParameter('status',$status);
  828.         return  $qb->getQuery()->getOneOrNullResult();
  829.     }
  830.     public function kpiProjectByFamilleProject($familleProjectIds=null){
  831.         $qb =  $this->createQueryBuilder('p');
  832.         $qb->select('s.id as id ,s.name as name, count(p.id) as nbrProject, sum(p.tarifRevente)/count(p.id) as moyenTarif, sum(p.capacite) as sommeCapacite ')
  833.             ->innerJoin('p.familleProject','s');
  834.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null');
  835.         if($familleProjectIds){
  836.             $qb->andWhere('s.id in (:familleProjectIds)')
  837.                 ->setParameter('familleProjectIds',$familleProjectIds);
  838.         }else{
  839.             $qb->setMaxResults(5);
  840.         }
  841.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  842.             $spvs = $this->security->getUser()->getSpv();
  843.             $spvsTab = [];
  844.             foreach($spvs as $item){
  845.                 $spvsTab[] = $item->getId();
  846.             }
  847.             $qb->andWhere('p.spv in (:spvsTab)')
  848.                 ->setParameter('spvsTab',$spvsTab);
  849.         }
  850.         $qb->groupBy('s.id');
  851.         $qb->orderBy('s.id','ASC');
  852.         return  $qb->getQuery()->getResult();
  853.     }
  854.     public function kpiProjectByFamilleProjectTotal($familleProjectIds=null){
  855.         $qb =  $this->createQueryBuilder('p');
  856.         $qb->select('s.id as id ,s.name as name, count(p.id) as nbrProject, sum(p.tarifRevente)/count(p.id) as moyenTarif, sum(p.capacite) as sommeCapacite ')
  857.             ->innerJoin('p.familleProject','s');
  858.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null');
  859.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  860.             $spvs = $this->security->getUser()->getSpv();
  861.             $spvsTab = [];
  862.             foreach($spvs as $item){
  863.                 $spvsTab[] = $item->getId();
  864.             }
  865.             $qb->andWhere('p.spv in (:spvsTab)')
  866.                 ->setParameter('spvsTab',$spvsTab);
  867.         }
  868.         $qb->groupBy('s.id');
  869.         $qb->orderBy('s.id','ASC');
  870.         return  $qb->getQuery()->getResult();
  871.     }
  872.     public function kpiProjectByFamilleProjectAndStatus($familleProject,$status){
  873.         $qb =  $this->createQueryBuilder('p');
  874.         $qb->select('count(p.id) as nbrProjectByFamilleProject, sum(p.capacite) as sommeCapaciteByFamilleProject ')
  875.             ->innerJoin('p.familleProject','s');
  876.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null')
  877.             ->andWhere('s.id = :familleProject')
  878.             ->andWhere('p.statusAdministratif = :status')
  879.             ->setParameter('familleProject',$familleProject)
  880.             ->setParameter('status',$status);
  881.         return  $qb->getQuery()->getOneOrNullResult();
  882.     }
  883.     public function kpiProjectByStatus($status){
  884.         $qb =  $this->createQueryBuilder('p');
  885.         $qb->select('count(p.id) as nbrProjectByStatus, sum(p.capacite) as sommeCapaciteByStatus ');
  886.         $qb->andWhere('p.isArchived = 0 or p.isArchived is null')
  887.             ->andWhere('p.statusAdministratif = :status')
  888.             ->setParameter('status',$status);
  889.         if($this->security->getUser() and   (in_array("ROLE_AUDITEUR", $this->security->getUser()->getRoles()) or in_array("ROLE_COMPTABLE", $this->security->getUser() ->getRoles()))){
  890.             $spvs = $this->security->getUser()->getSpv();
  891.             $spvsTab = [];
  892.             foreach($spvs as $item){
  893.                 $spvsTab[] = $item->getId();
  894.             }
  895.             $qb->andWhere('p.spv in (:spvsTab)')
  896.                 ->setParameter('spvsTab',$spvsTab);
  897.         }
  898.         return  $qb->getQuery()->getOneOrNullResult();
  899.     }
  900.     public function getProjectsGlobal($isArchive=false,$spv=null,$search=null,$dev=null,$epc=null,$status = null,$user = null) {
  901.         $qb =  $this->createQueryBuilder('c');
  902.         if($isArchive){
  903.             $qb->andWhere('c.isArchived = 1');
  904.         }else {
  905.             $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  906.         }
  907.         if($search){
  908.             $qb->andWhere('c.name like :search')
  909.                 ->setParameter('search', "%" . $search . "%");
  910.         }
  911.         if($spv){
  912.             $qb->andWhere('c.spv = :spv')
  913.                 ->setParameter('spv',$spv);
  914.         }
  915.         if($user and   (in_array("ROLE_AUDITEUR", $user->getRoles()) or in_array("ROLE_COMPTABLE", $user ->getRoles()))){
  916.             $spvs = $user->getSpv();
  917.             $spvsTab = [];
  918.             foreach($spvs as $item){
  919.                 $spvsTab[] = $item->getId();
  920.             }
  921.             $qb->andWhere('c.spv in (:spvsTab)')
  922.                 ->setParameter('spvsTab',$spvsTab);
  923.         }
  924.         if($user && $user->getIntervenantNum() && $user->getIntervenantNum() != '0'){
  925.             $qb->innerJoin('c.intervenantUser','intervenantUser');
  926.             $qb->andWhere('intervenantUser.intervenant = :user')
  927.                 ->setParameter('user',$user->getId());
  928.         }
  929.         if($user && in_array('ROLE_FOURNISSEUR',$user->getRoles())){
  930.             $qb->innerJoin('c.fournisseurProject','fournisseurProject');
  931.             $qb->innerJoin('fournisseurProject.fournisseur', 'fournisseur');
  932.             $qb->leftJoin('c.fournisseur', 'fournisseurUser');
  933.             $qb->leftJoin('fournisseur.user', 'fournisseurProjectUser');
  934.             $qb->leftJoin('fournisseurUser.user', 'fournisseurUserUser');
  935.             $qb->andWhere('fournisseurProjectUser.id = :userFournisseur or fournisseurUserUser.id = :userFournisseur')
  936.                 ->setParameter('userFournisseur', $user->getId());
  937.         }
  938.         if($dev){
  939.             $qb->andWhere('c.developpeur = :dev')
  940.                 ->setParameter('dev',$dev);
  941.         }
  942.         if($epc){
  943.             $qb->andWhere('c.epc = :epc')
  944.                 ->setParameter('epc',$epc);
  945.         }
  946.         return  $qb->getQuery()->getResult() ;
  947.     }
  948.     public function searchByDoc($docsProject,$spv,$data, $page = 0, $max = NULL, $getResult = true, $columnOrder = NULL, $dirOrder = NULL,$count=false) {
  949.         $qb =  $this->createQueryBuilder('c');
  950.         $query = isset($data['query']) && $data['query'] ? $data['query'] : null;
  951.         $devProject = isset($data['devProject']) && $data['devProject'] ? $data['devProject'] : null;
  952.         $responsableProject = isset($data['responsableProject']) && $data['responsableProject'] ? $data['responsableProject'] : null;
  953.         $responsableFoncierProject = isset($data['responsableFoncierProject']) && $data['responsableFoncierProject'] ? $data['responsableFoncierProject'] : null;
  954.         $responsableDevProject = isset($data['responsableDevProject']) && $data['responsableDevProject'] ? $data['responsableDevProject'] : null;
  955.         $constructeurProject = isset($data['constructeurProject']) && $data['constructeurProject'] ? $data['constructeurProject'] : null;
  956.         if($docsProject){
  957.             $arrayExiste = [];
  958.             $arrayExisteManyToMany = [];
  959.             $strWhere = '';
  960.             $i = 0;
  961.             foreach ($docsProject as $docs){
  962.                 $str = explode("__", $docs);
  963.                 $etapNum = $str[0];
  964.                 $fileName = $str[1];
  965.                 $nameChampManyToMany = isset($str[2])?$str[2]:null;
  966.                 $etapClass = 'App\\Entity\\Etap'.$etapNum;
  967.                 if(in_array($etapClass,$arrayExiste)){
  968.                 }else{
  969.                     $arrayExiste[] = $etapClass;
  970.                     $qb->leftJoin($etapClass, 'etap'.$etapNum, 'WITH', 'etap'.$etapNum.'.project = c.id');
  971.                 }
  972.                 $classMetadata = $this->_em->getClassMetadata($etapClass);
  973.                 if($nameChampManyToMany){
  974.                     $associationMappings = $classMetadata->getAssociationMapping($nameChampManyToMany);
  975.                     if ($associationMappings['type'] === \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_MANY){
  976.                         $etapClassManyToMany = 'etap'.$etapNum.'.'.$nameChampManyToMany ;
  977.                         if(in_array($etapClassManyToMany,$arrayExisteManyToMany)){
  978.                         }else{
  979.                             $qb->leftJoin('etap'.$etapNum.'.'.$nameChampManyToMany, $nameChampManyToMany);
  980.                         }
  981.                         $qb->leftJoin($nameChampManyToMany.'.'.$fileName,  'file_'.$fileName);
  982.                         $strWhereIN = "(file_$fileName.name is not null and (file_$fileName.isArchived is null or file_$fileName.isArchived = 0))";
  983.                         if($i == 0){
  984.                             $strWhere = $strWhereIN ;
  985.                         }else{
  986.                             $strWhere .= ' OR '.$strWhereIN ;
  987.                         }
  988.                     }
  989.                 }else{
  990.                     $associationMappings = $classMetadata->getAssociationMapping($fileName);
  991.                     if ($associationMappings['type'] === \Doctrine\ORM\Mapping\ClassMetadata::MANY_TO_MANY){
  992.                         $qb->leftJoin('etap'.$etapNum.'.'.$fileName, 'file_'.$fileName);
  993.                         $strWhereIN = "(file_$fileName.name is not null and (file_$fileName.isArchived is null or file_$fileName.isArchived = 0))";
  994.                         if($i == 0){
  995.                             $strWhere = $strWhereIN ;
  996.                         }else{
  997.                             $strWhere .= ' OR '.$strWhereIN ;
  998.                         }
  999.                     }else{
  1000.                         $strWhereIN = "(etap$etapNum.$fileName is not null)";
  1001.                         if($i == 0){
  1002.                             $strWhere = $strWhereIN ;
  1003.                         }else{
  1004.                             $strWhere .= ' OR '.$strWhereIN ;
  1005.                         }
  1006.                     }
  1007.                 }
  1008.                 if($fileName == 'filePromessebailMultiple'){
  1009.                     $strWhereIN = "(c.filePromessebail is  not null)";
  1010.                     if($strWhere != ''){
  1011.                         $strWhere .= ' OR '.$strWhereIN ;
  1012.                     }else{
  1013.                         $strWhere .= $strWhereIN ;
  1014.                     }
  1015.                 }
  1016.                 $i++;
  1017.             }
  1018.             if($strWhere != ''){
  1019.                 $qb->andWhere($strWhere);
  1020.             }
  1021.         }
  1022.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1023.         if($spv){
  1024.             $qb->andWhere('c.spv in (:spv)')
  1025.                 ->setParameter('spv',$spv);
  1026.         }
  1027.         $spvsTab = isset($data['spvsTab']) && $data['spvsTab'] ? $data['spvsTab'] : null;
  1028.         $user = isset($data['user']) && $data['user'] ? $data['user'] : null;
  1029.         if($user and   (in_array("ROLE_AUDITEUR", $user->getRoles()) or in_array("ROLE_COMPTABLE", $user ->getRoles()))){
  1030.             $qb->andWhere('c.spv in (:spvsTab)')
  1031.                 ->setParameter('spvsTab',$spvsTab);
  1032.         }
  1033.         if($devProject){
  1034.             $qb->andWhere('c.developpeur in (:dev)')
  1035.                 ->setParameter('dev',$devProject);
  1036.         }
  1037.         if($responsableProject){
  1038.             $qb->innerJoin('c.responsableUser', 'responsable');
  1039.             $qb->andWhere('responsable.responsable in (:responsable)')
  1040.                 ->setParameter('responsable',$responsableProject);
  1041.         }
  1042.         if($responsableFoncierProject){
  1043.             $qb->innerJoin('c.responsableFoncierUser', 'responsable');
  1044.             $qb->andWhere('responsable.responsable in (:responsable)')
  1045.                 ->setParameter('responsable',$responsableFoncierProject);
  1046.         }
  1047.         if($responsableDevProject){
  1048.             $qb->innerJoin('c.responsableDeveloppement', 'responsableDev');
  1049.             $qb->andWhere('responsableDev.responsable in (:responsableDevStr)')
  1050.                 ->setParameter('responsableDevStr',$responsableDevProject);
  1051.         }
  1052.         if($constructeurProject){
  1053.             $qb->innerJoin('c.constructeurUser', 'constructeur');
  1054.             $qb->andWhere('constructeur.constructeur in (:constructeur)')
  1055.                 ->setParameter('constructeur',$constructeurProject);
  1056.         }
  1057.         if($count){
  1058.             $qb->select('count(DISTINCT c.id) as result');
  1059.             return $qb->getQuery()->getOneOrNullResult();
  1060.         }
  1061.         else{
  1062.             $qb->select('DISTINCT c');
  1063.             if ($columnOrder) {
  1064.                 if($columnOrder == 'name'){
  1065.                     $qb->orderBy("c.$columnOrder", $dirOrder);
  1066.                 }
  1067.                 if($columnOrder == 'status'){
  1068.                     $qb->orderBy("c.status", $dirOrder);
  1069.                 }
  1070.                 if($columnOrder == 'spv'){
  1071.                     $qb->orderBy("c.spv", $dirOrder);
  1072.                 }
  1073.                 if($columnOrder == 'developpeur'){
  1074.                     $qb->orderBy("c.developpeur", $dirOrder);
  1075.                 }
  1076.                 if($columnOrder == 'entreprise'){
  1077.                     $qb->leftJoin('c.developpeur','dev');
  1078.                     $qb->orderBy("dev.entreprise", $dirOrder);
  1079.                 }
  1080.                 if($columnOrder == 'createdAt'){
  1081.                     $qb->orderBy("c.createdAt", $dirOrder);
  1082.                 }
  1083.                 if($columnOrder == 'archiveAt'){
  1084.                     $qb->orderBy("c.archiveAt", $dirOrder);
  1085.                 }
  1086.                 if($columnOrder == 'commentArchive'){
  1087.                     $qb->orderBy("c.commentArchive", $dirOrder);
  1088.                 }
  1089.                 if($columnOrder == 'statusTrackerActuel'){
  1090.                     $qb->orderBy("c.statusTrackerActuel", $dirOrder);
  1091.                 }
  1092.             }
  1093.             if ($max) {
  1094.                 $preparedQuery = $qb->getQuery()
  1095.                     ->setMaxResults($max)
  1096.                     ->setFirstResult($page * $max)
  1097.                 ;
  1098.             } else {
  1099.                 $preparedQuery = $qb->getQuery();
  1100.             }
  1101.             return $getResult ? $preparedQuery->getResult() : $preparedQuery;
  1102.         }
  1103.     }
  1104.     public function searchByDocPreFilter($spv,$data) {
  1105.         $qb =  $this->createQueryBuilder('c');
  1106.         $query = isset($data['query']) && $data['query'] ? $data['query'] : null;
  1107.         $devProject = isset($data['devProject']) && $data['devProject'] ? $data['devProject'] : null;
  1108.         $responsableProject = isset($data['responsableProject']) && $data['responsableProject'] ? $data['responsableProject'] : null;
  1109.         $responsableFoncierProject = isset($data['responsableFoncierProject']) && $data['responsableFoncierProject'] ? $data['responsableFoncierProject'] : null;
  1110.         $responsableDevProject = isset($data['responsableDevProject']) && $data['responsableDevProject'] ? $data['responsableDevProject'] : null;
  1111.         $constructeurProject = isset($data['constructeurProject']) && $data['constructeurProject'] ? $data['constructeurProject'] : null;
  1112.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1113.         if($spv){
  1114.             $qb->andWhere('c.spv = :spv')
  1115.                 ->setParameter('spv',$spv);
  1116.         }
  1117.         $spvsTab = isset($data['spvsTab']) && $data['spvsTab'] ? $data['spvsTab'] : null;
  1118.         $user = isset($data['user']) && $data['user'] ? $data['user'] : null;
  1119.         if($user and   (in_array("ROLE_AUDITEUR", $user->getRoles()) or in_array("ROLE_COMPTABLE", $user ->getRoles()))){
  1120.             $qb->andWhere('c.spv in (:spvsTab)')
  1121.                 ->setParameter('spvsTab',$spvsTab);
  1122.         }
  1123.         if($devProject){
  1124.             $qb->andWhere('c.developpeur = :dev')
  1125.                 ->setParameter('dev',$devProject);
  1126.         }
  1127.         if($responsableProject){
  1128.             $qb->innerJoin('c.responsableUser', 'responsable');
  1129.             $qb->andWhere('responsable.responsable in (:responsable)')
  1130.                 ->setParameter('responsable',$responsableProject);
  1131.         }
  1132.         if($responsableFoncierProject){
  1133.             $qb->innerJoin('c.responsableFoncierUser', 'responsable');
  1134.             $qb->andWhere('responsable.responsable in (:responsable)')
  1135.                 ->setParameter('responsable',$responsableFoncierProject);
  1136.         }
  1137.         if($responsableDevProject){
  1138.             $qb->innerJoin('c.responsableDeveloppement', 'responsableDev');
  1139.             $qb->andWhere('responsableDev.responsable in (:responsableDevStr)')
  1140.                 ->setParameter('responsableDevStr',$responsableDevProject);
  1141.         }
  1142.         if($constructeurProject){
  1143.             $qb->innerJoin('c.constructeurUser', 'constructeur');
  1144.             $qb->andWhere('constructeur.constructeur in (:constructeur)')
  1145.                 ->setParameter('constructeur',$constructeurProject);
  1146.         }
  1147.         return  $qb->getQuery()->getResult();
  1148.     }
  1149.     public function searchByIds($data, $page = 0, $max = NULL, $getResult = true, $columnOrder = NULL, $dirOrder = NULL,$count=false) {
  1150.         $qb =  $this->createQueryBuilder('c');
  1151.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1152.         if($data and count($data) > 0){
  1153.             $qb->andWhere('c.id in (:projectIds)')
  1154.                 ->setParameter('projectIds',$data);
  1155.         }else{
  1156.             $qb->andWhere('c.id = 0') ;
  1157.         }
  1158.         if($count){
  1159.             $qb->select('count(DISTINCT c.id) as result');
  1160.             return $qb->getQuery()->getOneOrNullResult();
  1161.         }
  1162.         else{
  1163.             $qb->select('DISTINCT c');
  1164.             if ($columnOrder) {
  1165.                 if($columnOrder == 'name'){
  1166.                     $qb->orderBy("c.$columnOrder", $dirOrder);
  1167.                 }
  1168.                 if($columnOrder == 'status'){
  1169.                     $qb->orderBy("c.status", $dirOrder);
  1170.                 }
  1171.                 if($columnOrder == 'spv'){
  1172.                     $qb->orderBy("c.spv", $dirOrder);
  1173.                 }
  1174.                 if($columnOrder == 'developpeur'){
  1175.                     $qb->orderBy("c.developpeur", $dirOrder);
  1176.                 }
  1177.                 if($columnOrder == 'entreprise'){
  1178.                     $qb->leftJoin('c.developpeur','dev');
  1179.                     $qb->orderBy("dev.entreprise", $dirOrder);
  1180.                 }
  1181.                 if($columnOrder == 'createdAt'){
  1182.                     $qb->orderBy("c.createdAt", $dirOrder);
  1183.                 }
  1184.                 if($columnOrder == 'archiveAt'){
  1185.                     $qb->orderBy("c.archiveAt", $dirOrder);
  1186.                 }
  1187.                 if($columnOrder == 'commentArchive'){
  1188.                     $qb->orderBy("c.commentArchive", $dirOrder);
  1189.                 }
  1190.                 if($columnOrder == 'statusTrackerActuel'){
  1191.                     $qb->orderBy("c.statusTrackerActuel", $dirOrder);
  1192.                 }
  1193.             }
  1194.             if ($max) {
  1195.                 $preparedQuery = $qb->getQuery()
  1196.                     ->setMaxResults($max)
  1197.                     ->setFirstResult($page * $max)
  1198.                 ;
  1199.             } else {
  1200.                 $preparedQuery = $qb->getQuery();
  1201.             }
  1202.             return $getResult ? $preparedQuery->getResult() : $preparedQuery;
  1203.         }
  1204.     }
  1205.     public function getProjectDocs($docsProject,$spv,$projectIds,$devProject=null) {
  1206.         $qb =  $this->createQueryBuilder('c');
  1207. //        if($docsProject){
  1208. //            $arrayExiste = [];
  1209. //            $arrayExisteManyToMany = [];
  1210. //            $strWhere = '';
  1211. //            $i = 0;
  1212. //            foreach ($docsProject as $docs){
  1213. //                $str = explode("__", $docs);
  1214. //                $etapNum = $str[0];
  1215. //                $fileName = $str[1];
  1216. //                $nameChampManyToMany = isset($str[2])?$str[2]:null;
  1217. //                $etapClass = 'App\\Entity\\Etap'.$etapNum;
  1218. //                if(in_array($etapClass,$arrayExiste)){
  1219. //
  1220. //                }else{
  1221. //                    $arrayExiste[] = $etapClass;
  1222. //                    $qb->leftJoin($etapClass, 'etap'.$etapNum, 'WITH', 'etap'.$etapNum.'.project = c.id');
  1223. //                }
  1224. //                $classMetadata = $this->_em->getClassMetadata($etapClass);
  1225. //                if($nameChampManyToMany){
  1226. //                    $associationMappings = $classMetadata->getAssociationMapping($nameChampManyToMany);
  1227. //                    if ($associationMappings['type'] === \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_MANY){
  1228. //                        $etapClassManyToMany = 'etap'.$etapNum.'.'.$nameChampManyToMany ;
  1229. //                        if(in_array($etapClassManyToMany,$arrayExisteManyToMany)){
  1230. //
  1231. //                        }else{
  1232. //                            $qb->leftJoin('etap'.$etapNum.'.'.$nameChampManyToMany, $nameChampManyToMany);
  1233. //                        }
  1234. //                        $qb->leftJoin($nameChampManyToMany.'.'.$fileName,  'file_'.$fileName);
  1235. //                        $strWhereIN = "(file_$fileName.name is not null and (file_$fileName.isArchived is null or file_$fileName.isArchived = 0))";
  1236. //                        if($i == 0){
  1237. //                            $strWhere = $strWhereIN ;
  1238. //                        }else{
  1239. //                            $strWhere .= ' OR '.$strWhereIN ;
  1240. //                        }
  1241. //                    }
  1242. //                }else {
  1243. //                    $associationMappings = $classMetadata->getAssociationMapping($fileName);
  1244. //                    if ($associationMappings['type'] === \Doctrine\ORM\Mapping\ClassMetadata::MANY_TO_MANY) {
  1245. //                        $qb->leftJoin('etap' . $etapNum . '.' . $fileName, 'file_' . $fileName);
  1246. //                        $strWhereIN = "(file_$fileName.name is not null and (file_$fileName.isArchived is null or file_$fileName.isArchived = 0))";
  1247. //                        if ($i == 0) {
  1248. //                            $strWhere = $strWhereIN;
  1249. //                        } else {
  1250. //                            $strWhere .= ' OR ' . $strWhereIN;
  1251. //                        }
  1252. //                    } else {
  1253. //                        $strWhereIN = "(etap$etapNum.$fileName is not null)";
  1254. //                        if ($i == 0) {
  1255. //                            $strWhere = $strWhereIN;
  1256. //                        } else {
  1257. //                            $strWhere .= ' OR ' . $strWhereIN;
  1258. //                        }
  1259. //                    }
  1260. //                }
  1261. //                if($fileName == 'filePromessebailMultiple'){
  1262. //                    $strWhereIN = "(c.filePromessebail is  not null)";
  1263. //                    if($strWhere != ''){
  1264. //                        $strWhere .= ' OR '.$strWhereIN ;
  1265. //                    }else{
  1266. //                        $strWhere .= $strWhereIN ;
  1267. //                    }
  1268. //                }
  1269. //                $i++;
  1270. //            }
  1271. //            if($strWhere != ''){
  1272. //                $qb->andWhere($strWhere);
  1273. //            }
  1274. //        }
  1275.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1276.         if($projectIds and count($projectIds) > 0){
  1277.             $qb->andWhere('c.token in (:projectIds)')
  1278.                 ->setParameter('projectIds',$projectIds);
  1279.         }
  1280.         if($spv){
  1281.             $qb->andWhere('c.spv = :spv')
  1282.                 ->setParameter('spv',$spv);
  1283.         }
  1284.         if($devProject){
  1285.             $qb->andWhere('c.developpeur = :dev')
  1286.                 ->setParameter('dev',$devProject);
  1287.         }
  1288.         $qb->select('DISTINCT c');
  1289.         return  $qb->getQuery()->getResult() ;
  1290.     }
  1291.     public function findAllProjectActive(){
  1292.         $qb =  $this->createQueryBuilder('c');
  1293.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1294.         return  $qb->getQuery()->getResult();
  1295.     }
  1296.     public function findAllProjectActiveMiseEnService($date1,$date2,$developpeur=null,$responsableConstruction=null,$spvId=null,$schemaConstruction=null,$constructeurRapport=null){
  1297.         $qb =  $this->createQueryBuilder('c');
  1298.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1299.         $qb->leftJoin(Etap14::class, 'etap14', 'WITH', 'etap14.project = c.id');
  1300.         $qb->andWhere('etap14.dateMiseEnService is not null  or c.dateMiseEnService is not null');
  1301.         $qb->andWhere('c.dateMiseEnService  BETWEEN :date1 AND :date2' )
  1302.             ->setParameter('date1', $date1->format('Y-m-d').' 00:00:00')
  1303.             ->setParameter('date2', $date2->format('Y-m-d').' 23:59:59');
  1304.         if($developpeur){
  1305.             $qb->andWhere('c.developpeur = :developpeur')
  1306.                 ->setParameter('developpeur',$developpeur->getId());
  1307.         }
  1308.         if($responsableConstruction){
  1309.             $qb->innerJoin('c.responsableUser', 'responsable');
  1310.             $qb->andWhere('responsable.responsable in (:responsable)')
  1311.                 ->setParameter('responsable',$responsableConstruction);
  1312.         }
  1313.         if($spvId){
  1314.             $qb->andWhere('c.spv in (:spv)')
  1315.                 ->setParameter('spv',$spvId);
  1316.         }
  1317.         if($schemaConstruction){
  1318.             $qb->andWhere('c.schemaConstruction = :schemaConstruction')
  1319.                 ->setParameter('schemaConstruction',$schemaConstruction);
  1320.         }
  1321.         if($constructeurRapport){
  1322.             $qb->innerJoin('c.fournisseurProject','fournisseurProject');
  1323.             $qb->andWhere('((fournisseurProject.titre = :charpentier or fournisseurProject.titre = :installateur ) and fournisseurProject.fournisseur = :fournisseur) or (c.fournisseur = :fournisseur)')
  1324.                 ->setParameter('charpentier','Charpentier')
  1325.                 ->setParameter('installateur','Installateur')
  1326.                 ->setParameter('fournisseur',$constructeurRapport);
  1327.         }
  1328.         return  $qb->getQuery()->getResult();
  1329.     }
  1330.     public function findAllProjectExploitation(){
  1331.         $qb =  $this->createQueryBuilder('c');
  1332.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1333.         $qb->andWhere('c.statusAdministratif = :status')
  1334.             ->setParameter('status', Project::STATUS_CUSTOM_EXPLOITATION);
  1335.         return  $qb->getQuery()->getResult();
  1336.     }
  1337.     public function searchCentrale($data, $page = 0, $max = NULL, $getResult = true, $columnOrder = NULL, $dirOrder = NULL,$count=false) {
  1338.         $qb =  $this->createQueryBuilder('c');
  1339.         $query = isset($data['query']) && $data['query'] ? $data['query'] : null;
  1340.         $isParametrer = isset($data['isParametrer']) ? $data['isParametrer'] : null;
  1341.         $tabDate = isset($data['dateTab']) && $data['dateTab'] ? new \DateTime($data['dateTab']) : null;
  1342.         $qb->leftJoin('c.spv','spv');
  1343.         $qb->andWhere('c.name like :query or spv.name like :query  ')
  1344.             ->setParameter('query', "%" . $query . "%")
  1345.         ;
  1346.         if($tabDate){
  1347.             $qb->andWhere('c.dateMiseEnService  LIKE :searchTabDate')
  1348.                 ->setParameter('searchTabDate','%'.$tabDate->format('Y-m-d').'%');
  1349.         }
  1350.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1351.         $qb->andWhere('c.statusAdministratif = :status')
  1352.             ->setParameter('status', Project::STATUS_CUSTOM_EXPLOITATION);
  1353.         if($isParametrer === '1' || $isParametrer === '0'){
  1354.             if($isParametrer === '1'){
  1355.                 $qb->innerJoin(ParametrageLoyer::class, 'parametrage', 'WITH', 'parametrage.centrale = c.id');
  1356.             }else{
  1357.                 $subquery = $this->_em->createQueryBuilder();
  1358.                 $subquery->select("centrale.id");
  1359.                 $subquery->from(ParametrageLoyer::class,"p");
  1360.                 $subquery->innerJoin('p.centrale','centrale');
  1361.                 $subqueryResult = $subquery->getQuery()->getResult();
  1362.                 $qb->andWhere('c.id not in (:sub)')
  1363.                    ->setParameter('sub', array_values($subqueryResult));
  1364.             }
  1365.         }
  1366.         $spvsTab = isset($data['spvsTab']) && $data['spvsTab'] ? $data['spvsTab'] : null;
  1367.         $user = isset($data['user']) && $data['user'] ? $data['user'] : null;
  1368.         if($user and   (in_array("ROLE_AUDITEUR", $user->getRoles()) or in_array("ROLE_COMPTABLE", $user ->getRoles()))){
  1369.             $qb->andWhere('c.spv in (:spvsTab)')
  1370.                 ->setParameter('spvsTab',$spvsTab);
  1371.         }
  1372.         if($spvsTab && !empty(array_filter($spvsTab))) {
  1373.             $qb->andWhere('c.spv IN (:spv)')
  1374.                 ->setParameter('spv', $spvsTab);
  1375.         }
  1376.         if($count){
  1377.             $qb->select('count(DISTINCT c.id) as result');
  1378.             return $qb->getQuery()->getOneOrNullResult();
  1379.         }else{
  1380.             $qb->select('DISTINCT c');
  1381.             if ($columnOrder) {
  1382.                 if($columnOrder == 'name'){
  1383.                     $qb->orderBy("c.$columnOrder", $dirOrder);
  1384.                 }
  1385.                 if($columnOrder == 'spv'){
  1386.                     $qb->orderBy("c.spv", $dirOrder);
  1387.                 }
  1388.                 if($columnOrder == 'dateMiseEnService'){
  1389.                     $qb->orderBy("c.dateMiseEnService", $dirOrder);
  1390.                 }
  1391.                 if($columnOrder == 'entreprise'){
  1392.                     $qb->leftJoin('c.developpeur','dev');
  1393.                     $qb->orderBy("dev.entreprise", $dirOrder);
  1394.                 }
  1395.                 if($columnOrder == 'capacite'){
  1396.                     $qb->orderBy("c.capacite", $dirOrder);
  1397.                 }
  1398.             }
  1399.             if ($max) {
  1400.                 $preparedQuery = $qb->getQuery()
  1401.                     ->setMaxResults($max)
  1402.                     ->setFirstResult($page * $max)
  1403.                 ;
  1404.             } else {
  1405.                 $preparedQuery = $qb->getQuery();
  1406.             }
  1407.             return $getResult ? $preparedQuery->getResult() : $preparedQuery;
  1408.         }
  1409.     }
  1410.     public function findAllProjectActiveBailSigne($date1,$date2,$developpeur=null,$responsableConstruction=null,$spvId=null,$schemaConstruction=null,$constructeurRapport=null){
  1411.         $qb =  $this->createQueryBuilder('c');
  1412.         $qb->addSelect('fileBailSigneMultiple.createdAt as createdAtBailSigne,c.capacite');
  1413.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1414.         $qb->leftJoin(Etap7::class, 'etap7', 'WITH', 'etap7.project = c.id');
  1415.         $qb->leftJoin('etap7.fileBailSigneMultiple','fileBailSigneMultiple');
  1416.         $qb->andWhere('(fileBailSigneMultiple.isArchived = 0 or fileBailSigneMultiple.isArchived is null) and fileBailSigneMultiple.createdAt  BETWEEN :date1 AND :date2' )
  1417.             ->setParameter('date1', $date1->format('Y-m-d').' 00:00:00')
  1418.             ->setParameter('date2', $date2->format('Y-m-d').' 23:59:59');
  1419.         if($developpeur){
  1420.             $qb->andWhere('c.developpeur = :developpeur')
  1421.                 ->setParameter('developpeur',$developpeur->getId());
  1422.         }
  1423.         if($responsableConstruction){
  1424.             $qb->innerJoin('c.responsableUser', 'responsable');
  1425.             $qb->andWhere('responsable.responsable in (:responsable)')
  1426.                 ->setParameter('responsable',$responsableConstruction);
  1427.         }
  1428.         if($spvId){
  1429.             $qb->andWhere('c.spv in (:spv)')
  1430.                 ->setParameter('spv',$spvId);
  1431.         }
  1432.         if($schemaConstruction){
  1433.             $qb->andWhere('c.schemaConstruction = :schemaConstruction')
  1434.                 ->setParameter('schemaConstruction',$schemaConstruction);
  1435.         }
  1436.         if($constructeurRapport){
  1437.             $qb->innerJoin('c.fournisseurProject','fournisseurProject');
  1438.             $qb->andWhere('((fournisseurProject.titre = :charpentier or fournisseurProject.titre = :installateur ) and fournisseurProject.fournisseur = :fournisseur) or (c.fournisseur = :fournisseur)')
  1439.                 ->setParameter('charpentier','Charpentier')
  1440.                 ->setParameter('installateur','Installateur')
  1441.                 ->setParameter('fournisseur',$constructeurRapport);
  1442.         }
  1443.         return  $qb->getQuery()->getResult();
  1444.     }
  1445.     public function findAllArchives($date1,$date2,$developpeur=null,$responsableConstruction=null,$spvId=null,$schemaConstruction=null,$constructeurRapport=null){
  1446.         $qb =  $this->createQueryBuilder('c');
  1447.         $qb->andWhere('c.isArchived = 1');
  1448.         $qb->andWhere('c.archiveAt  BETWEEN :date1 AND :date2' )
  1449.             ->setParameter('date1', $date1->format('Y-m-d').' 00:00:00')
  1450.             ->setParameter('date2', $date2->format('Y-m-d').' 23:59:59');
  1451.         if($developpeur){
  1452.             $qb->andWhere('c.developpeur = :developpeur')
  1453.                 ->setParameter('developpeur',$developpeur->getId());
  1454.         }
  1455.         if($responsableConstruction){
  1456.             $qb->innerJoin('c.responsableUser', 'responsable');
  1457.             $qb->andWhere('responsable.responsable in (:responsable)')
  1458.                 ->setParameter('responsable',$responsableConstruction);
  1459.         }
  1460.         if($spvId){
  1461.             $qb->andWhere('c.spv in (:spv)')
  1462.                 ->setParameter('spv',$spvId);
  1463.         }
  1464.         if($schemaConstruction){
  1465.             $qb->andWhere('c.schemaConstruction = :schemaConstruction')
  1466.                 ->setParameter('schemaConstruction',$schemaConstruction);
  1467.         }
  1468.         if($constructeurRapport){
  1469.             $qb->innerJoin('c.fournisseurProject','fournisseurProject');
  1470.             $qb->andWhere('((fournisseurProject.titre = :charpentier or fournisseurProject.titre = :installateur ) and fournisseurProject.fournisseur = :fournisseur) or (c.fournisseur = :fournisseur)')
  1471.                 ->setParameter('charpentier','Charpentier')
  1472.                 ->setParameter('installateur','Installateur')
  1473.                 ->setParameter('fournisseur',$constructeurRapport);
  1474.         }
  1475.         return  $qb->getQuery()->getResult();
  1476.     }
  1477.     public function findAllAnnules($date1,$date2,$developpeur=null,$responsableConstruction=null,$spvId=null,$schemaConstruction=null,$constructeurRapport=null){
  1478.         $qb =  $this->createQueryBuilder('c');
  1479.         $qb->andWhere('c.status in (:statusRefuse)');
  1480.         $qb->andWhere('c.refuseAt  BETWEEN :date1 AND :date2' )
  1481.             ->setParameter('statusRefuse', [Project::STATUS_REFUSE])
  1482.             ->setParameter('date1', $date1->format('Y-m-d').' 00:00:00')
  1483.             ->setParameter('date2', $date2->format('Y-m-d').' 23:59:59');
  1484.         if($developpeur){
  1485.             $qb->andWhere('c.developpeur = :developpeur')
  1486.                 ->setParameter('developpeur',$developpeur->getId());
  1487.         }
  1488.         if($responsableConstruction){
  1489.             $qb->innerJoin('c.responsableUser', 'responsable');
  1490.             $qb->andWhere('responsable.responsable in (:responsable)')
  1491.                 ->setParameter('responsable',$responsableConstruction);
  1492.         }
  1493.         if($spvId){
  1494.             $qb->andWhere('c.spv in (:spv)')
  1495.                 ->setParameter('spv',$spvId);
  1496.         }
  1497.         if($schemaConstruction){
  1498.             $qb->andWhere('c.schemaConstruction = :schemaConstruction')
  1499.                 ->setParameter('schemaConstruction',$schemaConstruction);
  1500.         }
  1501.         if($constructeurRapport){
  1502.             $qb->innerJoin('c.fournisseurProject','fournisseurProject');
  1503.             $qb->andWhere('((fournisseurProject.titre = :charpentier or fournisseurProject.titre = :installateur ) and fournisseurProject.fournisseur = :fournisseur) or (c.fournisseur = :fournisseur)')
  1504.                 ->setParameter('charpentier','Charpentier')
  1505.                 ->setParameter('installateur','Installateur')
  1506.                 ->setParameter('fournisseur',$constructeurRapport);
  1507.         }
  1508.         return  $qb->getQuery()->getResult();
  1509.     }
  1510.     public function findAllProjectByStadeConstruction($stadeConstruction,$date1,$date2,$developpeur=null){
  1511.         $qb =  $this->createQueryBuilder('c');
  1512.         $qb->andWhere('c.stadeConstruction in (:stadeConstruction)')
  1513.             ->setParameter('stadeConstruction',$stadeConstruction);
  1514.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1515.         $qb->andWhere('c.stadeConstructionDate  BETWEEN :date1 AND :date2' )
  1516.             ->setParameter('date1', $date1->format('Y-m-d').' 00:00:00')
  1517.             ->setParameter('date2', $date2->format('Y-m-d').' 23:59:59');
  1518.         if($developpeur){
  1519.             $qb->andWhere('c.developpeur = :developpeur')
  1520.                 ->setParameter('developpeur',$developpeur->getId());
  1521.         }
  1522.         return  $qb->getQuery()->getResult();
  1523.     }
  1524.     public function findCodeProjectByYearAndDev($year,$dev){
  1525.         $qb =  $this->createQueryBuilder('c');
  1526.         $qb->where('c.compteurErpiAnnee = :year')
  1527.             ->setParameter('year',$year);
  1528.         $qb->innerJoin('c.developpeur','dev');
  1529.         $qb->andWhere('dev.id = :developpeur')
  1530.             ->setParameter('developpeur',$dev);
  1531.         $qb->andWhere('c.codeProject is not null');
  1532.         $qb->setMaxResults(1);
  1533.         $qb->orderBy('c.compteurErpiNbr','desc');
  1534.         return  $qb->getQuery()->getOneOrNullResult();
  1535.     }
  1536.     public function findAllProjectActiveNew($date1,$date2,$developpeur=null,$responsableConstruction=null,$spvId=null,$schemaConstruction=null,$constructeurRapport=null){
  1537.         $qb =  $this->createQueryBuilder('c');
  1538.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1539.         $qb->andWhere('c.createdAt  BETWEEN :date1 AND :date2' )
  1540.             ->setParameter('date1', $date1->format('Y-m-d').' 00:00:00')
  1541.             ->setParameter('date2', $date2->format('Y-m-d').' 23:59:59');
  1542.         if($developpeur){
  1543.             $qb->andWhere('c.developpeur = :developpeur')
  1544.                 ->setParameter('developpeur',$developpeur->getId());
  1545.         }
  1546.         if($responsableConstruction){
  1547.             $qb->innerJoin('c.responsableUser', 'responsable');
  1548.             $qb->andWhere('responsable.responsable in (:responsable)')
  1549.                 ->setParameter('responsable',$responsableConstruction);
  1550.         }
  1551.         if($spvId){
  1552.             $qb->andWhere('c.spv in (:spv)')
  1553.                 ->setParameter('spv',$spvId);
  1554.         }
  1555.         if($schemaConstruction){
  1556.             $qb->andWhere('c.schemaConstruction = :schemaConstruction')
  1557.                 ->setParameter('schemaConstruction',$schemaConstruction);
  1558.         }
  1559.         if($constructeurRapport){
  1560.             $qb->innerJoin('c.fournisseurProject','fournisseurProject');
  1561.             $qb->andWhere('((fournisseurProject.titre = :charpentier or fournisseurProject.titre = :installateur ) and fournisseurProject.fournisseur = :fournisseur) or (c.fournisseur = :fournisseur)')
  1562.                 ->setParameter('charpentier','Charpentier')
  1563.                 ->setParameter('installateur','Installateur')
  1564.                 ->setParameter('fournisseur',$constructeurRapport);
  1565.         }
  1566.         return  $qb->getQuery()->getResult();
  1567.     }
  1568.     public function getCentrales($data) {
  1569.         $qb =  $this->createQueryBuilder('c');
  1570.         $query = isset($data['query']) && $data['query'] ? $data['query'] : null;
  1571.         $qb->leftJoin('c.spv','spv');
  1572.         $qb->andWhere('c.name like :query  ')
  1573.             ->setParameter('query', "%" . $query . "%")
  1574.         ;
  1575.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1576.         $qb->andWhere('c.statusAdministratif = :status')
  1577.             ->setParameter('status', Project::STATUS_CUSTOM_EXPLOITATION);
  1578.         $spvsTab = isset($data['spvsTab']) && $data['spvsTab'] ? $data['spvsTab'] : null;
  1579.         $user = isset($data['user']) && $data['user'] ? $data['user'] : null;
  1580.         $centraleRapportSuivi = isset($data['centraleRapportSuivi']) && $data['centraleRapportSuivi'] ? $data['centraleRapportSuivi'] : null;
  1581.         if($user and   (in_array("ROLE_AUDITEUR", $user->getRoles()) or in_array("ROLE_COMPTABLE", $user ->getRoles()))){
  1582.             $qb->andWhere('c.spv in (:spvsTab)')
  1583.                 ->setParameter('spvsTab',$spvsTab);
  1584.         }
  1585.         if($centraleRapportSuivi){
  1586.             $qb->andWhere('c.token in (:centraleRapportSuivi)')
  1587.                 ->setParameter('centraleRapportSuivi',$centraleRapportSuivi);
  1588.         }
  1589.         return $qb->getQuery()->getResult();
  1590.     }
  1591.     public function searchCentraleRapportById($data, $page = 0, $max = NULL, $getResult = true, $columnOrder = NULL, $dirOrder = NULL,$count=false) {
  1592.         $qb =  $this->createQueryBuilder('c');
  1593.         $qb->andWhere('c.id in (:ids)')
  1594.             ->setParameter('ids',$data);
  1595.         if($count){
  1596.             $qb->select('count(DISTINCT c.id) as result');
  1597.             return $qb->getQuery()->getOneOrNullResult();
  1598.         }else{
  1599.             $qb->select('DISTINCT c');
  1600.             if ($columnOrder) {
  1601.                 if($columnOrder == 'name'){
  1602.                     $qb->orderBy("c.$columnOrder", $dirOrder);
  1603.                 }
  1604.                 if($columnOrder == 'dateMiseEnService'){
  1605.                     $qb->orderBy("c.dateMiseEnService", $dirOrder);
  1606.                 }
  1607.             }
  1608.             if ($max) {
  1609.                 $preparedQuery = $qb->getQuery()
  1610.                     ->setMaxResults($max)
  1611.                     ->setFirstResult($page * $max)
  1612.                 ;
  1613.             } else {
  1614.                 $preparedQuery = $qb->getQuery();
  1615.             }
  1616.             return $getResult ? $preparedQuery->getResult() : $preparedQuery;
  1617.         }
  1618.     }
  1619.     public function getCentraleRapportById($data) {
  1620.         $qb =  $this->createQueryBuilder('c');
  1621.         $qb->andWhere('c.id in (:ids)')
  1622.             ->setParameter('ids',$data);
  1623.         return  $qb->getQuery()->getResult();
  1624.     }
  1625.     public function searchForCarte($isArchive = false,$status,$statusCustom=null,$spv,$data) {
  1626.         $qb =  $this->createQueryBuilder('c');
  1627.         $query = isset($data['query']) && $data['query'] ? $data['query'] : null;
  1628.         $statusAdministratifProject = isset($data['statusAdministratifProject']) && $data['statusAdministratifProject'] ? $data['statusAdministratifProject'] : null;
  1629.         $statusTrackerProject = isset($data['statusTrackerProject']) && $data['statusTrackerProject'] ? $data['statusTrackerProject'] : null;
  1630.         $stadeConstruction = isset($data['stadeConstruction']) && $data['stadeConstruction'] ? $data['stadeConstruction'] : null;
  1631.         $statusUrbanisme = isset($data['statusUrbanisme']) && $data['statusUrbanisme'] ? $data['statusUrbanisme'] : null;
  1632.         $statusFoncier1 = isset($data['statusFoncier1']) && $data['statusFoncier1'] ? $data['statusFoncier1'] : null;
  1633.         $statusFoncier2 = isset($data['statusFoncier2']) && $data['statusFoncier2'] ? $data['statusFoncier2'] : null;
  1634.         $statusFoncier3 = isset($data['statusFoncier3']) && $data['statusFoncier3'] ? $data['statusFoncier3'] : null;
  1635.         $typologieProject = isset($data['typologieProject']) && $data['typologieProject'] ? $data['typologieProject'] : null;
  1636.         $devProject = isset($data['devProject']) && $data['devProject'] ? $data['devProject'] : null;
  1637.         $entrepriseProject = isset($data['entrepriseProject']) && $data['entrepriseProject'] ? $data['entrepriseProject'] : null;
  1638.         $responsableProject = isset($data['responsableProject']) && $data['responsableProject'] ? $data['responsableProject'] : null;
  1639.         $responsableFoncierProject = isset($data['responsableFoncierProject']) && $data['responsableFoncierProject'] ? $data['responsableFoncierProject'] : null;
  1640.         $responsableDevProject = isset($data['responsableDevProject']) && $data['responsableDevProject'] ? $data['responsableDevProject'] : null;
  1641.         $constructeurProject = isset($data['constructeurProject']) && $data['constructeurProject'] ? $data['constructeurProject'] : null;
  1642.         $intervenantProject = isset($data['intervenantProject']) && $data['intervenantProject'] ? $data['intervenantProject'] : null;
  1643.         $achatLocation = isset($data['achatLocation']) && $data['achatLocation'] ? $data['achatLocation'] : null;
  1644.         if($achatLocation && $achatLocation != 0){
  1645.             if($achatLocation == Project::ACHAT){
  1646.                 $qb->andWhere('c.achatLocation = :achatLocation')
  1647.                     ->setParameter('achatLocation',$achatLocation);
  1648.             }else{
  1649.                 $qb->andWhere('(c.achatLocation = :achatLocation) or (c.achatLocation is null)')
  1650.                     ->setParameter('achatLocation',Project::LOCATION);
  1651.             }
  1652.         }
  1653.         $qb->leftJoin('c.familleProject','familleProject');
  1654.         $qb->leftJoin('c.typologieProject','typologieProject');
  1655.         $qb->leftJoin('c.typeBatimentProject','typeBatimentProject');
  1656.         $qb->leftJoin(Etap5::class, 'etap5', 'WITH', 'etap5.project = c.id');
  1657.         $qb->leftJoin(Etap6::class, 'etap6', 'WITH', 'etap6.project = c.id');
  1658.         $qb->leftJoin(Etap8::class, 'etap8', 'WITH', 'etap8.project = c.id');
  1659.         $qb->leftJoin(Etap14::class, 'etap14', 'WITH', 'etap14.project = c.id');
  1660.         $qb->leftJoin(Etap15::class, 'etap15', 'WITH', 'etap15.project = c.id');
  1661.         $qb->leftJoin(Etap12::class, 'etap12', 'WITH', 'etap12.project = c.id');
  1662.         $qb->leftJoin(Etap160::class, 'etap160', 'WITH', 'etap160.project = c.id');
  1663.         $qb->leftJoin(Etap10::class, 'etap10', 'WITH', 'etap10.project = c.id');
  1664.         $qb->leftJoin('etap12.numeroCardiMultiple','numeroCardiEntity');
  1665.         $qb->leftJoin('etap15.informationMultiple','informationEtap15');
  1666.         $qb->leftJoin(Etap24::class, 'etap24', 'WITH', 'etap24.project = c.id');
  1667.         $qb->leftJoin('etap24.etap24Champs','etap24Champs');
  1668.         $qb->leftJoin('etap24Champs.etap26Champs','etap26Champs');
  1669.         $qb->andWhere('c.name like :query or familleProject.name like :query or typologieProject.name like :query or typeBatimentProject.name like :query
  1670.          or c.adresse like :query or c.city like :query  or c.codePostal like :query  or c.numParcelle like :query  or etap5.typeBail like :query  or etap6.nomNotaire like :query 
  1671.          or etap8.siretEts like :query or etap14.adresseMiseEnService like :query or etap14.codePostalMiseEnService like :query or etap14.cityMiseEnService like :query 
  1672.          or etap14.firstnameProprietaire like :query or etap14.lastnameProprietaire like :query or etap14.phoneProprietaire like :query or etap14.emailProprietaire like :query
  1673.          or etap15.numeroContratAchat like :query  or numeroCardiEntity.numeroCardi like :query  or numeroCardiEntity.identifiantEnedis like :query
  1674.         or informationEtap15.numeroContratAchat like :query or informationEtap15.tarifContratAchat like :query or etap10.referenceEnedis like :query
  1675.         or etap26Champs.numeroContratAchat1 like :query or etap26Champs.numeroContratAchat2 like :query           
  1676.         ')
  1677.             ->setParameter('query', "%" . $query . "%")
  1678.         ;
  1679.         if($isArchive){
  1680.             $qb->andWhere('c.isArchived = 1');
  1681.         }else{
  1682. //            if($query){
  1683. //
  1684. //            }else{
  1685.                 $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1686. //            }
  1687.         }
  1688.         if($statusAdministratifProject){
  1689.             $qb->andWhere('c.statusAdministratif in (:statusAdministratif)')
  1690.                 ->setParameter('statusAdministratif',$statusAdministratifProject);
  1691.         }
  1692.         if($statusTrackerProject){
  1693.             $qb->andWhere('c.statusTrackerActuel in (:statusTracker)')
  1694.                 ->setParameter('statusTracker',$statusTrackerProject);
  1695.         }
  1696.         if($stadeConstruction){
  1697.             $qb->andWhere('c.statusTrackerActuelConstruction in (:stadeConstruction)')
  1698.                 ->setParameter('stadeConstruction',$stadeConstruction);
  1699.         }
  1700.         if($statusUrbanisme){
  1701.             $qb->leftJoin(StatusUrbanisme::class, 'statusUrbanisme', 'WITH', 'statusUrbanisme.project = c.id');
  1702.             $str = '';
  1703.             foreach ($statusUrbanisme as $key => $item){
  1704.                 if($key == 0){
  1705.                     $str .=  '(statusUrbanisme.statusStr like :statusUrbanisme'.$key .')' ;
  1706.                 }else{
  1707.                     $str .=  ' OR (statusUrbanisme.statusStr like :statusUrbanisme'.$key.')' ;
  1708.                 }
  1709.             }
  1710.             if($str != ''){
  1711.                 $qb->andWhere($str);
  1712.                 foreach ($statusUrbanisme as $key => $item) {
  1713.                     $qb->setParameter('statusUrbanisme'.$key, '%'.$item.'%');
  1714.                 }
  1715.             }
  1716.         }
  1717.         if($statusFoncier1 || $statusFoncier2 || $statusFoncier3){
  1718.             $qb->leftJoin(StatusFoncier::class, 'statusFoncier', 'WITH', 'statusFoncier.project = c.id');
  1719.             if($statusFoncier1){
  1720.                 $qb->andWhere('statusFoncier.statusStr1 like :statusStr1');
  1721.                 $qb->setParameter('statusStr1', '%'.$statusFoncier1.'%');
  1722.             }
  1723.             if($statusFoncier2){
  1724.                 $qb->andWhere('statusFoncier.statusStr2 like :statusStr2');
  1725.                 $qb->setParameter('statusStr2', '%'.$statusFoncier2.'%');
  1726.             }
  1727.             if($statusFoncier3){
  1728.                 $qb->andWhere('statusFoncier.statusStr3 like :statusStr3');
  1729.                 $qb->setParameter('statusStr3', '%'.$statusFoncier3.'%');
  1730.             }
  1731.         }
  1732.         if($typologieProject){
  1733.             $qb->andWhere('c.typologieProject in (:typologieProject)')
  1734.                 ->setParameter('typologieProject',$typologieProject);
  1735.         }
  1736.         if($status){
  1737.             $qb->andWhere('c.status in (:status)')
  1738.                 ->setParameter('status',$status);
  1739.         }
  1740.         if($statusCustom == Project::STATUS_CUSTOM_EN_ATTENT){
  1741.             $qb->andWhere('c.status in (:status)')
  1742.                 ->setParameter('status',[Project::STATUS_DEMANDE,Project::STATUS_EN_ATTENT,Project::STATUS_DEMANDE_REPONDU]);
  1743.         }elseif ($statusCustom == Project::STATUS_CUSTOM_EXPLOITATION){
  1744.             $qb->innerJoin(Etap21::class, 'etap21', 'WITH', 'etap21.project = c.id')
  1745.                 ->andWhere('etap21.status = :statusValide')
  1746.                 ->setParameter('statusValide',Etaps::STATUS_VALIDE);
  1747.         }elseif ($statusCustom == Project::STATUS_CUSTOM_CONSTRUCTION){
  1748.             $qb->innerJoin(Etap17::class, 'etap17', 'WITH', 'etap17.project = c.id')
  1749.                 ->andWhere('etap17.status = :statusValide')
  1750.                 ->setParameter('statusValide',Etaps::STATUS_VALIDE);
  1751.             $qb->innerJoin(Etap21::class, 'etap21', 'WITH', 'etap21.project = c.id')
  1752.                 ->andWhere('etap21.status <> :statusValide')
  1753.                 ->setParameter('statusValide',Etaps::STATUS_VALIDE);
  1754.         }elseif ($statusCustom == Project::STATUS_CUSTOM_DEVELOPPEMENT){
  1755.             $qb->andWhere('c.status in (:status)')
  1756.                 ->setParameter('status',[Project::STATUS_EN_COURS]);
  1757.         }
  1758.         if($spv){
  1759.             $qb->andWhere('c.spv in (:spv)')
  1760.                 ->setParameter('spv',$spv);
  1761.         }
  1762.         $spvsTab = isset($data['spvsTab']) && $data['spvsTab'] ? $data['spvsTab'] : null;
  1763.         $user = isset($data['user']) && $data['user'] ? $data['user'] : null;
  1764.         if(in_array('ROLE_DEV',$user->getRoles())){
  1765.             if($user->getEntreprise()){
  1766.                 $qb->andWhere('(c.developpeur = :user) or (c.entreprise = :userEntreprise)')
  1767.                     ->setParameter('user',$user->getId())
  1768.                     ->setParameter('userEntreprise',$user->getEntreprise()->getId());
  1769.             }else{
  1770.                 $qb->andWhere('c.developpeur = :user')
  1771.                     ->setParameter('user',$user->getId());
  1772.             }
  1773.         }elseif (in_array('ROLE_EPC',$user->getRoles())){
  1774.             $qb->andWhere('c.epc = :user or c.developpeur = :user')
  1775.                 ->setParameter('user',$user->getId());
  1776.         }elseif (in_array('ROLE_RESPONSABLE',$user->getRoles())){
  1777.             $qb->innerJoin('c.responsableUser','responsable');
  1778.             $qb->andWhere('responsable.responsable = :user')
  1779.                 ->setParameter('user',$user->getId());
  1780.         }elseif (in_array('ROLE_RESPONSABLE_DEVELOPPEMENT',$user->getRoles())){
  1781.             $qb->innerJoin('c.responsableDeveloppement','responsableDev');
  1782.             $qb->andWhere('responsableDev.responsable = :user')
  1783.                 ->setParameter('user',$user->getId());
  1784.         }elseif (in_array('ROLE_CONSTRUCTEUR',$user->getRoles())){
  1785.             $qb->innerJoin('c.constructeurUser','constructeur');
  1786.             $qb->andWhere('constructeur.constructeur = :user')
  1787.                 ->setParameter('user',$user->getId());
  1788.         }elseif (in_array('ROLE_ADMIN',$user->getRoles()) || in_array('ROLE_SUPER_ADMINISTRATOR',$user->getRoles())){
  1789.         }
  1790.         if($user && $user->getIntervenantNum() && $user->getIntervenantNum() != '0'){
  1791.             $qb->innerJoin('c.intervenantUser','intervenantUser');
  1792.             $qb->andWhere('intervenantUser.intervenant = :user')
  1793.                 ->setParameter('user',$user->getId());
  1794.         }
  1795.         if($user && in_array('ROLE_FOURNISSEUR',$user->getRoles())){
  1796.             $qb->innerJoin('c.fournisseurProject','fournisseurProject');
  1797.             $qb->innerJoin('fournisseurProject.fournisseur', 'fournisseur');
  1798.             $qb->leftJoin('c.fournisseur', 'fournisseurUser');
  1799.             $qb->leftJoin('fournisseur.user', 'fournisseurProjectUser');
  1800.             $qb->leftJoin('fournisseurUser.user', 'fournisseurUserUser');
  1801.             $qb->andWhere('fournisseurProjectUser.id = :userFournisseur or fournisseurUserUser.id = :userFournisseur')
  1802.                 ->setParameter('userFournisseur', $user->getId());
  1803.         }
  1804.         if($user and   (in_array("ROLE_AUDITEUR", $user->getRoles()) or in_array("ROLE_COMPTABLE", $user ->getRoles()))){
  1805.             $qb->andWhere('c.spv in (:spvsTab)')
  1806.                 ->setParameter('spvsTab',$spvsTab);
  1807.         }
  1808.         if($devProject){
  1809.             $qb->andWhere('c.developpeur in (:dev)')
  1810.                 ->setParameter('dev',$devProject);
  1811.         }
  1812.         if($entrepriseProject){
  1813.             $qb->leftJoin('c.developpeur','developpeurEntity');
  1814.             $qb->andWhere('(c.entreprise in (:entreprise)) or (developpeurEntity.entreprise in (:entreprise))')
  1815.                 ->setParameter('entreprise',$entrepriseProject);
  1816.         }
  1817.         if($responsableProject){
  1818.             $qb->innerJoin('c.responsableUser', 'responsable');
  1819.             $qb->andWhere('responsable.responsable in (:responsable)')
  1820.                 ->setParameter('responsable',$responsableProject);
  1821.         }
  1822.         if($responsableFoncierProject){
  1823.             $qb->innerJoin('c.responsableFoncierUser', 'responsable');
  1824.             $qb->andWhere('responsable.responsable in (:responsable)')
  1825.                 ->setParameter('responsable',$responsableFoncierProject);
  1826.         }
  1827.         if($responsableDevProject){
  1828.             $qb->innerJoin('c.responsableDeveloppement', 'responsableDev');
  1829.             $qb->andWhere('responsableDev.responsable in (:responsableDevStr)')
  1830.                 ->setParameter('responsableDevStr',$responsableDevProject);
  1831.         }
  1832.         if($constructeurProject){
  1833.             $qb->innerJoin('c.constructeurUser', 'constructeur');
  1834.             $qb->andWhere('constructeur.constructeur in (:constructeur)')
  1835.                 ->setParameter('constructeur',$constructeurProject);
  1836.         }
  1837.         if($intervenantProject){
  1838.             $qb->innerJoin('c.intervenantUser', 'intervenantUser');
  1839.             $qb->andWhere('intervenantUser.intervenant in (:intervenantUser)')
  1840.                 ->setParameter('intervenantUser',$intervenantProject);
  1841.         }
  1842.          $qb->select('DISTINCT c');
  1843.          $qb->addSelect('etap160.lat as longi, etap160.longi as lat');
  1844.          $qb->addSelect('etap14.firstnameProprietaire as firstnameProprietaire,etap14.lastnameProprietaire as lastnameProprietaire, etap14.phoneProprietaire as phoneProprietaire');
  1845.         return $qb->getQuery()->getResult();
  1846.     }
  1847.     public function getCentraleEploitationBySpv($spv) {
  1848.         $qb =  $this->createQueryBuilder('c');
  1849.         $qb->leftJoin('c.spv','spv');
  1850.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1851.         $qb->andWhere('c.statusAdministratif = :status')
  1852.             ->setParameter('status', Project::STATUS_CUSTOM_EXPLOITATION);
  1853.         $qb->andWhere('c.spv = :spvId')
  1854.             ->setParameter('spvId',$spv->getId());
  1855.         return $qb->getQuery()->getResult();
  1856.     }
  1857.     public function searchProjectAnalyse($data, $page = 0, $max = NULL, $getResult = true, $columnOrder = NULL, $dirOrder = NULL,$count=false) {
  1858.         $qb =  $this->createQueryBuilder('c');
  1859.         $query = isset($data['query']) && $data['query'] ? $data['query'] : null;
  1860.         $projectIds = isset($data['projectIds']) && $data['projectIds'] ? $data['projectIds'] : null;
  1861. //        $qb->leftJoin(SolecoProject::class, 'solecoProject', 'WITH', 'solecoProject.project = c.id');
  1862. //        $qb->leftJoin(SolargisProject::class, 'solargisProject', 'WITH', 'solargisProject.project = c.id');
  1863. //        $qb->leftJoin('solecoProject.soleco','soleco');
  1864. //        $qb->leftJoin('solargisProject.solargisPan','solargisPan');
  1865.         if(isset($data['projectIds'])){
  1866.             if($projectIds){
  1867.                 $qb->andWhere('c.id in (:projectIds) ')
  1868.                     ->setParameter('projectIds', $projectIds);
  1869.             }else{
  1870.                 $qb->andWhere('c.id = 0 ')  ;
  1871.             }
  1872.         }
  1873.         $qb->andWhere('c.name like :query ')
  1874.             ->setParameter('query', "%" . $query . "%");
  1875.         $qb->andWhere('c.isArchived = 0 or c.isArchived is null');
  1876.         $qb->andWhere('c.statusAdministratif = :status')
  1877.             ->setParameter('status', Project::STATUS_CUSTOM_EXPLOITATION);
  1878.         if($count){
  1879.             $qb->select('count(DISTINCT c.id) as result');
  1880.             return $qb->getQuery()->getOneOrNullResult();
  1881.         }else{
  1882.             $qb->select('DISTINCT c');
  1883.             $qb->orderBy("c.createdAt", $dirOrder);
  1884.             if ($max) {
  1885.                 $preparedQuery = $qb->getQuery()
  1886.                     ->setMaxResults($max)
  1887.                     ->setFirstResult($page * $max)
  1888.                 ;
  1889.             } else {
  1890.                 $preparedQuery = $qb->getQuery();
  1891.             }
  1892.             return $getResult ? $preparedQuery->getResult() : $preparedQuery;
  1893.         }
  1894.     }
  1895.     public function checkProjectAccess($user,$project,$spvsTab) {
  1896.         $qb =  $this->createQueryBuilder('c');
  1897.         $qb->leftJoin('c.fournisseurProject', 'fournisseurProject');
  1898.         $qb->andWhere('c.id = :id')
  1899.             ->setParameter('id',$project->getId());
  1900.         if(in_array('ROLE_DEV',$user->getRoles())){
  1901.             if($user->getEntreprise()){
  1902.                 $qb->andWhere('(c.developpeur = :user) or (c.entreprise = :userEntreprise)')
  1903.                     ->setParameter('user',$user->getId())
  1904.                     ->setParameter('userEntreprise',$user->getEntreprise()->getId());
  1905.             }else{
  1906.                 $qb->andWhere('c.developpeur = :user')
  1907.                     ->setParameter('user',$user->getId());
  1908.             }
  1909.         }elseif (in_array('ROLE_EPC',$user->getRoles())){
  1910.             $qb->andWhere('c.epc = :user or c.developpeur = :user')
  1911.                 ->setParameter('user',$user->getId());
  1912.         }elseif (in_array('ROLE_CONSTRUCTEUR',$user->getRoles())){
  1913.             $qb->innerJoin('c.constructeurUser','constructeur');
  1914.             $qb->andWhere('constructeur.constructeur = :user')
  1915.                 ->setParameter('user',$user->getId());
  1916.         }elseif (in_array('ROLE_ADMIN',$user->getRoles()) || in_array('ROLE_SUPER_ADMINISTRATOR',$user->getRoles())){
  1917.         }
  1918.         if($user && in_array($user->getTypeAcces(),[User::ACCES_intervenant,User::ACCES_visiteur,User::ACCES_comptable])){
  1919.             if($user && $spvsTab ){
  1920.                 $qb->andWhere('c.spv in (:spvsTab)')
  1921.                     ->setParameter('spvsTab',$spvsTab);
  1922.             }else{
  1923.                 if (in_array('ROLE_COMPTABLE',$user->getRoles())||in_array('ROLE_AUDITEUR',$user->getRoles())) {
  1924.                     $qb->andWhere('fournisseurProject.user = :userCourant')
  1925.                         ->setParameter('userCourant', $user->getId());
  1926.                 }elseif (in_array('ROLE_FOURNISSEUR',$user->getRoles())){
  1927.                     $qb->innerJoin('fournisseurProject.fournisseur', 'fournisseur');
  1928.                     $qb->leftJoin('c.fournisseur', 'fournisseurUser');
  1929.                     $qb->leftJoin('fournisseur.user', 'fournisseurProjectUser');
  1930.                     $qb->leftJoin('fournisseurUser.user', 'fournisseurUserUser');
  1931.                     $qb->andWhere('fournisseurProjectUser.id = :userFournisseur or fournisseurUserUser.id = :userFournisseur')
  1932.                         ->setParameter('userFournisseur', $user->getId());
  1933.                 }
  1934.             }
  1935.         }
  1936.         $qb->setMaxResults(1);
  1937.         return $qb->getQuery()->getOneOrNullResult() ;
  1938.     }
  1939. }