knpSnappy = $knpSnappy; $this->notificator = $notificator; } public function validation(Request $request) { $em = $this->getDoctrine()->getManager(); $nbmonth=$this->get("session")->get("nbmonth"); $iduser=$this->get("session")->get("iduser"); if($iduser=="all") { $users=$em->getRepository("App:User")->findAll(); } else { $users=$em->getRepository("App:User")->findBy(["id"=>$iduser]); } $maxend=new \Datetime(); $maxend->add(new \DateInterval('P1M')); $maxend->modify('first Monday'); $tbevents=[]; foreach($users as $user) { if(in_array("ROLE_USER",$user->getRoles())) { // Filtre par Service if($this->get('session')->get('idservice')!="all") { if($user->getService()->getId()!=$this->get('session')->get('idservice')) continue; } $tmp=[ "id" => $user->getId(), "user" => $user, "events" => [], ]; // On recherche le dernier evenement non congés validé pour ce user $eventstart = $em ->createQueryBuilder('event') ->select("event") ->from('App:Event','event') ->Where('event.user=:user') ->andWhere('event.validate=true') ->setParameter('user',$user) ->setMaxResults(1) ->orderBy('event.start', 'DESC') ->getQuery()->getOneOrNullResult(); if(!$eventstart) { // Sinon on recherche le premier evenement de l'utilisateur $eventstart=$em->getRepository("App:Event")->findOneBy(["user"=>$user],["start"=>"ASC"]); } // On formate le tableau des jours $start=clone $eventstart->getStart(); if($start->format("w")!=1) $start->modify('last Monday'); $end=clone $maxend; while($start<$end) { $idday=$start->format("Ymd"); $idmonth=$start->format("Ym"); // Si le lundi on regarde s'il une tache de validé dans la semaine if($start->format("w")==1) { $validate=false; $endweek=clone $start; $endweek->modify('next Monday'); $event = $em ->createQueryBuilder('event') ->select("event.id") ->from('App:Event','event') ->Where('event.user=:user') ->andWhere('event.start>=:start') ->andWhere('event.end<:end') ->andWhere('event.validate=true') ->setParameter('user',$user) ->setParameter('start',$start) ->setParameter('end',$endweek) ->getQuery()->getResult(); if($event) { $validate=true; } } $tmp["events"][$idday] = [ "date"=>clone $start, "allday"=>false, "colorday"=>"", "descriptionday"=>"", "am"=>false, "coloram"=>"", "descriptionam"=>"", "ap"=>false, "colorap"=>"", "descriptionap"=>"", "validate"=>$validate, "astreinte"=>false, "colorastreinte"=>"", "descriptionastreinte"=>"", ]; $start->add(new \DateInterval('P1D')); } // On formate le tableau des event $start=clone $eventstart->getStart(); if($start->format("w")!=1) $start->modify('last Monday'); $end=clone $maxend; $events = $em ->createQueryBuilder('event') ->select('event') ->from('App:Event','event') ->Where('event.user=:user AND event.start>=:start AND event.end <:end') ->setParameter('user',$user->getId()) ->setParameter('start',$start) ->setParameter('end',$end) ->getQuery()->getResult(); foreach($events as $event) { $idproject=$event->getTask()->getProject()->getId(); // Filtre par project if($this->get('session')->get('idproject')!="all") { if($idproject!=$this->get('session')->get('idproject')) continue; } $st=clone $event->getStart(); while($st<$event->getEnd()) { $idday=$st->format("Ymd"); if($event->getAllday()) { $tmp["events"][$idday]["allday"]=true; $tmp["events"][$idday]["colorday"]=$event->getTask()->getColor(); $tmp["events"][$idday]["descriptionday"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription(); } else { // Matin ou après-midi ? $time=$event->getStart()->format("H"); if($time==9) { $tmp["events"][$idday]["am"]=true; $tmp["events"][$idday]["coloram"]=$event->getTask()->getColor(); $tmp["events"][$idday]["descriptionam"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription(); } else { $tmp["events"][$idday]["ap"]=true; $tmp["events"][$idday]["colorap"]=$event->getTask()->getColor(); $tmp["events"][$idday]["descriptionap"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription(); } } $st->add(new \DateInterval('P1D')); } } // On formate le tableau des astreintes $start=clone $eventstart->getStart(); if($start->format("w")!=1) $start->modify('last Monday'); $end=clone $maxend; $penaltys = $em ->createQueryBuilder('penalty') ->select('penalty') ->from('App:Penalty','penalty') ->Where('penalty.user=:user AND penalty.start>=:start AND penalty.end <:end') ->setParameter('user',$user->getId()) ->setParameter('start',$start) ->setParameter('end',$end) ->getQuery()->getResult(); foreach($penaltys as $penalty) { $idproject=$penalty->getTask()->getProject()->getId(); // Filtre par project if($this->get('session')->get('idproject')!="all") { if($idproject!=$this->get('session')->get('idproject')) continue; } $st=clone $penalty->getStart(); while($st<$penalty->getEnd()) { $idday=$st->format("Ymd"); if($penalty->getAllday()) { $tmp["events"][$idday]["astreinte"]=true; $tmp["events"][$idday]["colorastreinte"]=$penalty->getTask()->getColor(); $tmp["events"][$idday]["descriptionastreinte"]=strtoupper($penalty->getTask()->getDisplayname())."\n\n".$penalty->getDescription(); } $st->add(new \DateInterval('P1D')); } } // On formate le tableau des jours fériés $start=clone $eventstart->getStart(); if($start->format("w")!=1) $start->modify('last Monday'); $end=clone $maxend; $breakdays = $em ->createQueryBuilder('breakday') ->select('breakday') ->from('App:Breakday','breakday') ->Where('breakday.start>=:start AND breakday.end <:end') ->setParameter('start',$start) ->setParameter('end',$end) ->getQuery()->getResult(); foreach($breakdays as $breakday) { $st=clone $breakday->getStart(); while($st<$breakday->getEnd()) { $idday=$st->format("Ymd"); $tmp["events"][$idday]["allday"]=true; $tmp["events"][$idday]["colorday"]="#6c7a89"; $tmp["events"][$idday]["descriptionday"]="Jour Férié"; $st->add(new \DateInterval('P1D')); } } array_push($tbevents,$tmp); } } if($request->query->get('fgprint')) { $render = $this->renderView('Validation/validation.html.twig',[ "useheader" => true, "usesidebar" => ($this->getUser()), "users" => $tbevents, "fgprint" => $request->query->get('fgprint'), ]); return new PdfResponse( $this->knpSnappy->getOutputFromHtml($render), 'validation.pdf' ); } else { return $this->render('Validation/validation.html.twig',[ "useheader" => true, "usesidebar" => ($this->getUser()), "users" => $tbevents ]); } } public function validate(Request $request){ $em = $this->getDoctrine()->getManager(); // Récupération des variables envoyées en post $iduser = $request->request->get('iduser'); $day = $request->request->get('day'); $start= new \Datetime($day); $end=clone $start; $end->modify('next Saturday'); // Somme dans la semaine $duration=0; // Somme des jours fériés de la semaine $breakdays = $em ->createQueryBuilder('breakday') ->select("breakday") ->from('App:Breakday','breakday') ->Where('breakday.start>=:start') ->andWhere('breakday.end<=:end') ->setParameter('start',$start) ->setParameter('end',$end) ->getQuery()->getResult(); foreach($breakdays as $breakday) { $duration++; } // On recherche l'ensemble des évènements de la semaine $events = $em ->createQueryBuilder('event') ->select("event") ->from('App:Event','event') ->Where('event.user=:user') ->andWhere('event.start>=:start') ->andWhere('event.end<=:end') ->setParameter('user',$iduser) ->setParameter('start',$start) ->setParameter('end',$end) ->getQuery()->getResult(); foreach($events as $event) { $duration+=$event->getDuration(); // Si congès = le congès doit etre validé if($event->getTask()->getNature()->getId()==-200) { if(!$event->getValidateholiday()) { $output=["return"=>"KO","error"=>"Validation impossible = présence de congés non validés"]; return new Response(json_encode($output)); } } } if($duration!= 5) { $output=["return"=>"KO","error"=>"Validation impossible = semaine incomplète"]; return new Response(json_encode($output)); } // OK = On valide les evenements foreach($events as $event) { $event->setValidate(true); $em->persist($event); $em->flush(); } // OK = On valide les astreintes $start= new \Datetime($day); $end=clone $start; $end->modify('next Monday'); $penaltys = $em ->createQueryBuilder('penalty') ->select("penalty") ->from('App:Penalty','penalty') ->Where('penalty.user=:user') ->andWhere('penalty.start>=:start') ->andWhere('penalty.end<=:end') ->setParameter('user',$iduser) ->setParameter('start',$start) ->setParameter('end',$end) ->getQuery()->getResult(); foreach($penaltys as $penalty) { $penalty->setValidate(true); $em->persist($penalty); $em->flush(); } $output=[]; return new Response(json_encode($output)); } public function devalidate(Request $request){ $em = $this->getDoctrine()->getManager(); // Récupération des variables envoyées en post $iduser = $request->request->get('iduser'); $day = $request->request->get('day'); $start= new \Datetime($day); $end=clone $start; $end->modify('next Saturday'); // On recherche l'ensemble des évènements de la semaine $events = $em ->createQueryBuilder('event') ->select("event") ->from('App:Event','event') ->Where('event.user=:user') ->andWhere('event.start>=:start') ->andWhere('event.end<=:end') ->setParameter('user',$iduser) ->setParameter('start',$start) ->setParameter('end',$end) ->getQuery()->getResult(); /* foreach($events as $event) { // Si congès = le congès doit etre non validé if($event->getTask()->getNature()->getId()==-200) { if($event->getValidateholiday()) { $output=["return"=>"KO","error"=>"Dévalidation impossible = présence de congés validés"]; return new Response(json_encode($output)); } } } */ // OK = On devalide les evenements foreach($events as $event) { $event->setValidate(false); $em->persist($event); $em->flush(); } // OK = On devalide les astreintes $start= new \Datetime($day); $end=clone $start; $end->modify('next Monday'); $penaltys = $em ->createQueryBuilder('penalty') ->select("penalty") ->from('App:Penalty','penalty') ->Where('penalty.user=:user') ->andWhere('penalty.start>=:start') ->andWhere('penalty.end<=:end') ->setParameter('user',$iduser) ->setParameter('start',$start) ->setParameter('end',$end) ->getQuery()->getResult(); foreach($penaltys as $penalty) { $penalty->setValidate(false); $em->persist($penalty); $em->flush(); } $output=[]; return new Response(json_encode($output)); } public function validationholiday(Request $request) { $em = $this->getDoctrine()->getManager(); $iduser=$this->get("session")->get("iduser"); if($iduser=="all") { $users=$em->getRepository("App:User")->findAll(); } else { $users=$em->getRepository("App:User")->findBy(["id"=>$iduser]); } $tbevents=[]; foreach($users as $user) { if(in_array("ROLE_USER",$user->getRoles())) { // Filtre par Service if($this->get('session')->get('idservice')!="all") { if($user->getService()->getId()!=$this->get('session')->get('idservice')) continue; } $tmp=[ "id" => $user->getId(), "user" => $user, "holidays" => [], "holidaystodevalidate" => [], ]; // Congès à valider ou à dévalider $holidays = $em ->createQueryBuilder('event') ->select('event') ->from('App:Event','event') ->from('App:Task','task') ->Where('event.user=:user') ->andWhere('event.validateholiday=:validate') ->andWhere('task=event.task') ->andWhere('task.nature=:nature') ->setParameter('user',$user->getId()) ->setParameter('validate',!($this->get("session")->get("activeholiday"))) ->setParameter('nature',-200) ->getQuery()->getResult(); foreach($holidays as $holiday) { // On ne peut dévalider les congès que sur une semaine non validé if(!$this->get("session")->get("activeholiday")&&$holiday->getValidate()) continue; $tbholiday = [ "id"=>$holiday->getId(), "start"=>$holiday->getStart(), "end"=>$holiday->getEnd()->sub(new \DateInterval('PT1M')), "task"=>$holiday->getTask()->getName(), "duration"=>$holiday->getDuration(), "validateholiday"=>$holiday->getValidateholiday(), ]; array_push($tmp["holidays"],$tbholiday); } array_push($tbevents,$tmp); } } if($request->query->get('fgprint')) { $render = $this->renderView('Validation/validationholiday.html.twig',[ "useheader" => true, "usesidebar" => ($this->getUser()), "users" => $tbevents, "fgprint" => $request->query->get('fgprint'), ]); return new PdfResponse( $this->knpSnappy->getOutputFromHtml($render), 'validationconges.pdf' ); } else { return $this->render('Validation/validationholiday.html.twig',[ "useheader" => true, "usesidebar" => ($this->getUser()), "users" => $tbevents ]); } } public function validateholiday(Request $request){ $em = $this->getDoctrine()->getManager(); // Récupération des variables envoyées en post $id = $request->request->get('id'); $event=$em->getRepository("App:Event")->find($id); if($event) { $event->setValidateholiday(true); $em->persist($event); $em->flush(); $iduser=$this->get("session")->get("iduser"); $idevent=$event->getId(); $this->notificator->sendNotifValid("Congé validé", $iduser, $event); } $output=[]; return new Response(json_encode($output)); } public function devalidateholiday(Request $request){ $em = $this->getDoctrine()->getManager(); // Récupération des variables envoyées en post $id = $request->request->get('id'); $event=$em->getRepository("App:Event")->find($id); if($event) { if($event->getValidate()) { $output=["return"=>"KO","error"=>"Dévalidation impossible = semaine de travail validée"]; return new Response(json_encode($output)); } $event->setValidateholiday(false); $em->persist($event); $em->flush(); } $output=[]; return new Response(json_encode($output)); } public function activeholiday() { $this->get('session')->set('activeholiday',!$this->get('session')->get('activeholiday')); return $this->redirectToRoute("app_validationholiday"); } }