src/Repository/OccupationPerHourRepository.php line 45

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