Files
schedule/src/schedule-2.0/src/Controller/ValidationController.php
2020-05-11 15:53:07 +02:00

547 lines
21 KiB
PHP
Executable File

<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
class ValidationController extends AbstractController
{
private $knpSnappy;
public function __construct(\Knp\Snappy\Pdf $knpSnappy) { $this->knpSnappy = $knpSnappy; }
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();
}
$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");
}
}