554 lines
21 KiB
PHP
Executable File
554 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;
|
|
private $notificator;
|
|
public function __construct(\Knp\Snappy\Pdf $knpSnappy, \App\Service\notificationService $notificator) {
|
|
$this->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");
|
|
}
|
|
|
|
}
|