src/Repository/OccupationPerHourRepository.php line 46

  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\GroupAncestorDetails;
  4. use App\Entity\OccupationPerHour;
  5. use App\Entity\Origin;
  6. use App\Entity\Resource;
  7. use App\Entity\Status;
  8. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  9. use Doctrine\ORM\Query\Expr\Join;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. /**
  12.  * @extends ServiceEntityRepository<OccupationPerHour>
  13.  *
  14.  * @method OccupationPerHour|null find($id, $lockMode = null, $lockVersion = null)
  15.  * @method OccupationPerHour|null findOneBy(array $criteria, array $orderBy = null)
  16.  * @method OccupationPerHour[]    findAll()
  17.  * @method OccupationPerHour[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  18.  */
  19. class OccupationPerHourRepository extends ServiceEntityRepository
  20. {
  21.     public function __construct(ManagerRegistry $registry)
  22.     {
  23.         parent::__construct($registryOccupationPerHour::class);
  24.     }
  25.     public function save(OccupationPerHour $entitybool $flush false): void
  26.     {
  27.         $this->getEntityManager()->persist($entity);
  28.         if ($flush) {
  29.             $this->getEntityManager()->flush();
  30.         }
  31.     }
  32.     public function remove(OccupationPerHour $entitybool $flush false): void
  33.     {
  34.         $this->getEntityManager()->remove($entity);
  35.         if ($flush) {
  36.             $this->getEntityManager()->flush();
  37.         }
  38.     }
  39.     public function findCreneau($resource null,$resourceType null,$localisation null$startDate null,$endDate null,$user null,$status): array
  40.     {
  41.         $conn $this->getEntityManager()->getConnection();
  42.         $reqDate "";
  43.         if ($startDate && $endDate){
  44.             $reqDate " where date between '$startDate' and '$endDate 23:59:59'";
  45.         }elseif ($startDate){
  46.             $reqDate " where date >= $startDate";
  47.         }elseif ($endDate){
  48.             $reqDate " where date <= '$endDate 23:59:59'";
  49.         }
  50.         $reqUser $user " and r.user_id = $user"";
  51.         $resourcesReq "";
  52.         if ($resource) {
  53.             $resourcesReq " and r.resource_id = $resource";
  54.         }else{
  55.             if ($localisation) {
  56.                 $resourcesReq  " and r.resource_id in (SELECT DISTINCT id as resource FROM `resource` where group_id in ($localisation))";
  57.             }
  58.             if ($resourceType) {
  59.                 $resourcesReq  .= " and r.resource_id in (SELECT DISTINCT id as resource FROM `resource` where group_id in ($resourceType))";
  60.             }
  61.         }
  62.         $sql "SELECT hour,date, sum(percentage) as 'value', sum(real_percentage) as 'value_reel'
  63.         FROM `occupation_per_hour` o 
  64.         left join reservation r on o.reservation_id = r.id $reqDate $reqUser $resourcesReq and r.status_id in ($status) group by hour,date";
  65.         $stmt $conn->prepare($sql);
  66.         $resultSet $stmt->executeQuery();
  67.     
  68.         // returns an array of arrays (i.e. a raw data set)
  69.         return $resultSet->fetchAllAssociative();
  70.     }
  71.     public function findReservationByDay($resource null,$resourceType null,$localisation null$startDate null,$endDate null,$user null,$status): array
  72.     {
  73.         $conn $this->getEntityManager()->getConnection();
  74.         $reqDate "";
  75.         if ($startDate && $endDate){
  76.             $reqDate " where date between '$startDate' and '$endDate 23:59:59'";
  77.         }elseif ($startDate){
  78.             $reqDate " where date >= $startDate";
  79.         }elseif ($endDate){
  80.             $reqDate " where date <= '$endDate 23:59:59'";
  81.         }
  82.         $reqUser $user " and r.user_id = $user"";
  83.         $resourcesReq "";
  84.         if ($resource) {
  85.             $resourcesReq " and r.resource_id = $resource";
  86.         }else{
  87.             if ($localisation) {
  88.                 $resourcesReq  " and r.resource_id in (SELECT DISTINCT id as resource FROM `resource` where group_id in ($localisation))";
  89.             }
  90.             if ($resourceType) {
  91.                 $resourcesReq  .= " and r.resource_id in (SELECT DISTINCT id as resource FROM `resource` where group_id in ($resourceType))";
  92.             }
  93.         }
  94.         $sql "SELECT o.date,count(DISTINCT reservation_id) as value FROM `occupation_per_hour` o
  95.         left join reservation r on o.reservation_id = r.id $reqDate $reqUser $resourcesReq and r.status_id in ($status) group by date";
  96.         $stmt $conn->prepare($sql);
  97.         $resultSet $stmt->executeQuery();
  98.         // returns an array of arrays (i.e. a raw data set)
  99.         return $resultSet->fetchAllAssociative();
  100.     }
  101.     public function findByFilter($localisation$user$startDate$endDate,$status$lang,$resource null,$resourceType null$filter null$limit null){
  102.         $status explode(',',$status);
  103.         $qb=$this->createQueryBuilder('oph')
  104.             ->select('count(distinct r.id) as value')
  105.             ->leftJoin('oph.reservation','r')
  106.             ->leftJoin(Resource::class,'res',Join::WITH,'res.id=r.resourceId')
  107.             ->andWhere('r.status in (:status)')
  108.             ->andWhere('oph.date between :startDate and :endDate')
  109.             ->setParameter('startDate',$startDate)
  110.             ->setParameter('endDate',$endDate)
  111.             ->setParameter('status',$status)
  112.             ->orderBy('value','DESC');
  113.         if ($filter == "resourceBySite") {
  114.             $qb->groupBy('item');
  115.             $qb->addSelect('ga.groupName as item');
  116.             $qb->leftJoin(GroupAncestorDetails::class,'ga',Join::WITH,'ga.ancestorGroupId=res.groupParentId');
  117.             $qb->andWhere('ga.groupTypeName=:groupTypeName')
  118.                 ->setParameter('groupTypeName','Place');
  119.         }elseif ($filter == "resourceByStage") {
  120.             $qb->groupBy('item');
  121.             $qb->addSelect('ga.groupName as item');
  122.             $qb->leftJoin(GroupAncestorDetails::class,'ga',Join::WITH,'ga.ancestorGroupId=res.groupId')
  123.                 ->andWhere('ga.groupLevelId=4');
  124.             $qb->andWhere('ga.groupTypeName=:groupTypeName')
  125.                 ->setParameter('groupTypeName','Place');
  126.         }elseif ($filter == "resourceByZone") {
  127.             $qb->groupBy('item');
  128.             $qb->addSelect('ga.groupName as item');
  129.             $qb->leftJoin(GroupAncestorDetails::class,'ga',Join::WITH,'ga.ancestorGroupId=res.groupId')
  130.                 ->andWhere('ga.groupLevelId=5');
  131.             $qb->andWhere('ga.groupTypeName=:groupTypeName')
  132.                 ->setParameter('groupTypeName','Place');
  133.         }elseif ($filter == "resourceByBuilding") {
  134.             $qb->groupBy('item');
  135.             $qb->addSelect('ga.groupName as item');
  136.             $qb->select('ga_building.groupName as item''count(distinct r.id) as value')
  137.                 ->leftJoin(GroupAncestorDetails::class,'ga',Join::WITH,'ga.ancestorGroupId=res.groupId')
  138.                 ->leftJoin(GroupAncestorDetails::class,'ga_building',Join::WITH,'ga_building.ancestorGroupId=ga.groupId')
  139.                 ->andWhere('ga_building.groupLevelId=2');
  140.             $qb->andWhere('ga_building.groupTypeName=:groupTypeName')
  141.                 ->setParameter('groupTypeName','Place');
  142.         }elseif ($filter == "resourceByWing") {
  143.             $qb->groupBy('item');
  144.             $qb->addSelect('ga.groupName as item');
  145.             $qb->select('ga_building.groupName as item''count(distinct r.id) as value')
  146.                 ->leftJoin(GroupAncestorDetails::class,'ga',Join::WITH,'ga.ancestorGroupId=res.groupId')
  147.                 ->leftJoin(GroupAncestorDetails::class,'ga_building',Join::WITH,'ga_building.ancestorGroupId=ga.groupId')
  148.                 ->andWhere('ga_building.groupLevelId=3');
  149.             $qb->andWhere('ga_building.groupTypeName=:groupTypeName')
  150.                 ->setParameter('groupTypeName','Place');
  151.         }elseif ($filter == "hasNotChildren") {
  152.             $qb->groupBy('item');
  153.             $qb->addSelect('ga.groupName as item');
  154.             $qb->leftJoin(GroupAncestorDetails::class,'ga',Join::WITH,'ga.ancestorGroupId=res.groupParentId');
  155.             $qb->leftJoin(GroupAncestorDetails::class,'ga_sub_category',Join::WITH,'ga.ancestorGroupId=ga.groupId');
  156.             $qb->andWhere('ga.groupTypeName=:groupTypeName and ga_sub_category.ancestorGroupId is null')
  157.                 ->setParameter('groupTypeName','Type');
  158.         }elseif ($filter == "resourceByType") {
  159.             $qb->groupBy('item');
  160.             $qb->addSelect('ga.groupName as item');
  161.             $qb->leftJoin(GroupAncestorDetails::class,'ga',Join::WITH,'ga.ancestorGroupId=res.groupId');
  162.             $qb->leftJoin(GroupAncestorDetails::class,'ga_parent',Join::WITH,'ga_parent.ancestorGroupId=res.groupParentId');
  163.             $qb->andWhere('ga.groupTypeName=:groupTypeName')
  164.                ->andWhere('ga_parent.groupTypeName=:groupTypeName')
  165.                 ->setParameter('groupTypeName','Type');
  166.             $qb->addSelect('ga_parent.groupName as site');
  167.         }elseif ($filter == "status") {
  168.             $qb->groupBy('item');
  169.             $qb->addSelect("case 
  170.                 when r.status = -1 then 'Refused' 
  171.                 when r.status = 0 then 'Cancelled' 
  172.                 when r.status = 1 then 'Pending' 
  173.                 else 'Confirmed' end as item");
  174.         }elseif ($filter == "origin") {
  175.             $qb->groupBy('item');
  176.             $qb->addSelect("case 
  177.                 when r.origin = 1 then 'App' 
  178.                 else '' end as item");
  179.         }elseif ($filter == "immediat_use") {
  180.             $qb->groupBy('item');
  181.             $qb->addSelect("case when r.immediatUse = 1 then 'Immediate use' else 'Deferred' end as item");
  182.         }
  183.         if ($resource) {
  184.             $qb->andWhere('r.resourceId=:resource_id')
  185.                 ->setParameter('resource_id',$resource);
  186.         }else{
  187.             $qb
  188.                 ->andWhere('r.resourceId in (SELECT DISTINCT rc.id  FROM App\Entity\Resource rc  where rc.groupId in (:localisations))')
  189.                 ->andWhere('r.resourceId in (SELECT DISTINCT rc1.id  FROM App\Entity\Resource rc1  where rc1.groupId in (:resourceTypes))')
  190.                 ->setParameter('localisations',explode(',',$localisation))
  191.                 ->setParameter('resourceTypes',explode(',',$resourceType));
  192.         }
  193.         if($user){
  194.             $qb->andWhere('r.userId=:user_id')->setParameter('user_id',$user);
  195.         }
  196.         if ($limit) {
  197.             $qb->setMaxResults($limit);
  198.         }
  199.         return $qb->getQuery()->getResult();
  200.     }
  201.     public function totalReservations($resource null,$resourceType null,$localisation$user$startDate$endDate,$status$filter null$limit null) {
  202.         $qb=$this->createQueryBuilder('oph')
  203.             ->select('count(distinct r.id) as value')
  204.             ->leftJoin('oph.reservation','r')
  205.             ->andWhere('r.status in (:status)')
  206.             ->andWhere('oph.date between :startDate and :endDate')
  207.             ->andWhere('r.resourceId in (SELECT DISTINCT rc.id  FROM App\Entity\Resource rc  where rc.groupId in (:localisations))')
  208.             ->andWhere('r.resourceId in (SELECT DISTINCT rc1.id  FROM App\Entity\Resource rc1  where rc1.groupId in (:resourceTypes))')
  209.             ->setParameter('startDate',$startDate)
  210.             ->setParameter('endDate',$endDate)
  211.             ->setParameter('status',explode(','$status))
  212.             ->setParameter('localisations',explode(',',$localisation))
  213.             ->setParameter('resourceTypes',explode(',',$resourceType))
  214.             ->orderBy('value','DESC');
  215.         
  216.         return $qb->getQuery()->getResult();
  217.     }
  218. //    /**
  219. //     * @return OccupationPerHour[] Returns an array of OccupationPerHour objects
  220. //     */
  221. //    public function findByExampleField($value): array
  222. //    {
  223. //        return $this->createQueryBuilder('o')
  224. //            ->andWhere('o.exampleField = :val')
  225. //            ->setParameter('val', $value)
  226. //            ->orderBy('o.id', 'ASC')
  227. //            ->setMaxResults(10)
  228. //            ->getQuery()
  229. //            ->getResult()
  230. //        ;
  231. //    }
  232. //    public function findOneBySomeField($value): ?OccupationPerHour
  233. //    {
  234. //        return $this->createQueryBuilder('o')
  235. //            ->andWhere('o.exampleField = :val')
  236. //            ->setParameter('val', $value)
  237. //            ->getQuery()
  238. //            ->getOneOrNullResult()
  239. //        ;
  240. //    }
  241. }