485 lines
18 KiB
PHP
Executable File
485 lines
18 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Controller;
|
|
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\Form\FormError;
|
|
|
|
|
|
use App\Entity\Tallyday as Entity;
|
|
use App\Form\TallydayType as Form;
|
|
|
|
class TallydayController extends AbstractController
|
|
{
|
|
private $data = "tallyday";
|
|
private $route = "app_tallyday";
|
|
private $render = "Tallyday/";
|
|
private $entity = "App:Tallyday";
|
|
|
|
public function tallyday(Request $request)
|
|
{
|
|
$datenow=new \DateTime();
|
|
$em = $this->getDoctrine()->getManager();
|
|
$data = $em->getRepository($this->entity)->findTallyday($this->getUser(),$datenow);
|
|
|
|
return $this->render('Tallyday/tallyday.html.twig',[
|
|
"useheader" => true,
|
|
"usesidebar" => false,
|
|
"usemonocolor" => true,
|
|
"maxwidth" => true,
|
|
$this->data => $data,
|
|
"message" => $request->get("message"),
|
|
]);
|
|
}
|
|
|
|
|
|
public function usertallydays(Request $request) {
|
|
if($request->get("week")) {
|
|
$weeknow=new \DateTime($request->get("week"));
|
|
$weeknow->modify('monday this week');
|
|
$weeknext=clone $weeknow;
|
|
$weeknext->modify('monday next week');
|
|
$weekprev=clone $weeknow;
|
|
$weekprev->modify('monday previous week');
|
|
}
|
|
else {
|
|
$weeknow=new \DateTime('monday this week');
|
|
$weeknext=new \DateTime('monday next week');
|
|
$weekprev=new \DateTime('monday previous week');
|
|
}
|
|
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
$dates=[];
|
|
$dateend=clone $weeknow;
|
|
$dateend->modify("sunday this week");
|
|
|
|
$e = new \DateTime('00:00');
|
|
$f = clone $e;
|
|
|
|
$datenow=clone $weeknow;
|
|
while($datenow<=$dateend) {
|
|
$data= $em->getRepository($this->entity)->findTallyday($this->getUser(),$datenow);
|
|
array_push($dates,["date"=>clone $datenow,"tallyday"=>$data]);
|
|
if($data) $e->add($data->getTimeday());
|
|
$datenow->add(new \DateInterval('P1D'));
|
|
}
|
|
|
|
$interval = $f->diff($e);
|
|
$timeweek = (($interval->days*24) + $interval->h).":".sprintf("%02s",$interval->i);
|
|
|
|
// récupérer la premier validation master
|
|
$firstvalidate= $em->getRepository($this->entity)->findOneBy(["user"=>$this->getUser(),"validatemaster"=>true],["dateof"=>"ASC"]);
|
|
|
|
return $this->render('Tallyday/list.html.twig',[
|
|
"useheader" => true,
|
|
"usesidebar" => false,
|
|
"usemonocolor" => false,
|
|
"maxwidth" => true,
|
|
"dates" => $dates,
|
|
"week" => $weeknow,
|
|
"weeknext" => $weeknext,
|
|
"weekprev" => $weekprev,
|
|
"timeweek" => $timeweek,
|
|
"firstvalidate" => $firstvalidate,
|
|
"message" => $request->get("message"),
|
|
]);
|
|
}
|
|
|
|
public function mastertallydays(Request $request) {
|
|
$dates=[];
|
|
|
|
// Pour l'ensemble des utlisateurs
|
|
$em = $this->getDoctrine()->getManager();
|
|
$users = $em->getRepository("App:User")->findBy([],["firstname"=>"ASC","lastname"=>"ASC"]);
|
|
foreach($users as $user) {
|
|
if($user->hasRole("ROLE_USER")) {
|
|
$dates[$user->getId()] = [
|
|
"id"=>$user->getId(),
|
|
"avatar"=>$user->getAvatar(),
|
|
"displayname"=>$user->getDisplayname(),
|
|
"validates"=>[],
|
|
"notvalidates"=>[],
|
|
];
|
|
|
|
// On recherche le dernier pointage validé
|
|
$tallydate=$em->getRepository(("App:Tallyday"))->findOneBy(["user"=>$user,"validatemaster"=>true],["dateof"=>"DESC"]);
|
|
if($tallydate) {
|
|
$datenow=clone $tallydate->getDateof();
|
|
$datenow=$datenow->modify("monday this week");
|
|
$dateend=clone $tallydate->getDateof();
|
|
$dateend->modify("sunday this week");
|
|
|
|
$e = new \DateTime('00:00');
|
|
$f = clone $e;
|
|
|
|
while($datenow<=$dateend) {
|
|
$tallydate= $em->getRepository($this->entity)->findTallyday($user,$datenow);
|
|
$tmp= [
|
|
"dateof"=>clone $datenow,
|
|
"tallyday"=>$tallydate,
|
|
"timeweek"=>"",
|
|
];
|
|
|
|
array_push($dates[$user->getId()]["validates"],$tmp);
|
|
if($tallydate) $e->add($tallydate->getTimeday());
|
|
$datenow->add(new \DateInterval('P1D'));
|
|
}
|
|
|
|
$interval = $f->diff($e);
|
|
$timeweek = (($interval->days*24) + $interval->h).":".sprintf("%02s",$interval->i);
|
|
$dates[$user->getId()]["validates"][0]["timeweek"]=$timeweek;
|
|
}
|
|
|
|
// On recherche le pointage à valider
|
|
$tallydate=$em->getRepository(("App:Tallyday"))->findOneBy(["user"=>$user,"validatemaster"=>false],["dateof"=>"ASC"]);
|
|
if($tallydate) {
|
|
$datenow=clone $tallydate->getDateof();
|
|
$dateend=clone $tallydate->getDateof();
|
|
$dateend->modify("last day of this month");
|
|
$dateend->modify("next sunday");
|
|
|
|
$e = new \DateTime('00:00');
|
|
$f = clone $e;
|
|
|
|
while($datenow<=$dateend) {
|
|
$tallydate= $em->getRepository($this->entity)->findTallyday($user,$datenow);
|
|
$tmp= [
|
|
"dateof"=>clone $datenow,
|
|
"tallyday"=>$tallydate,
|
|
"timeweek"=>"",
|
|
];
|
|
|
|
array_push($dates[$user->getId()]["notvalidates"],$tmp);
|
|
if($tallydate) $e->add($tallydate->getTimeday());
|
|
$datenow->add(new \DateInterval('P1D'));
|
|
}
|
|
|
|
$interval = $f->diff($e);
|
|
$timeweek = (($interval->days*24) + $interval->h).":".sprintf("%02s",$interval->i);
|
|
$dates[$user->getId()]["notvalidates"][0]["timeweek"]=$timeweek;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $this->render('Tallyday/master.html.twig',[
|
|
"useheader" => true,
|
|
"usesidebar" => false,
|
|
"usemonocolor" => false,
|
|
"maxwidth" => false,
|
|
"dates" => $dates,
|
|
"message" => $request->get("message"),
|
|
]);
|
|
}
|
|
|
|
|
|
public function start() {
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
$em = $this->getDoctrine()->getManager();
|
|
$data = $em->getRepository($this->entity)->findTallyday($this->getUser(),new \DateTime("now"));
|
|
|
|
if(!$data) {
|
|
$data = new Entity();
|
|
$data->setDateof(new \DateTime("now"));
|
|
$data->setUser($this->getUser());
|
|
$data->setValidateuser(false);
|
|
$data->setValidatemaster(false);
|
|
}
|
|
|
|
$datenow=new \DateTime("now");
|
|
$datenow->setTime ( $datenow->format("H"), $datenow->format("i"), 0 );
|
|
$endam=clone $datenow;
|
|
$endam->setTime(13,00);
|
|
|
|
if($datenow < $endam)
|
|
$data->setDatestartam($datenow);
|
|
else
|
|
$data->setDatestartpm($datenow);
|
|
|
|
$em->persist($data);
|
|
$em->flush();
|
|
|
|
return $this->redirectToRoute("app_tallyday");
|
|
}
|
|
|
|
public function endam() {
|
|
$em = $this->getDoctrine()->getManager();
|
|
$data = $em->getRepository($this->entity)->findTallyday($this->getUser(),new \DateTime("now"));
|
|
|
|
// Pas normal
|
|
if(!$data)
|
|
return $this->redirectToRoute("app_tallyday");
|
|
|
|
$datenow=new \DateTime("now");
|
|
$datenow->setTime ( $datenow->format("H"), $datenow->format("i"), 0 );
|
|
$data->setDateendam($datenow);
|
|
$em->persist($data);
|
|
$em->flush();
|
|
return $this->redirectToRoute("app_tallyday");
|
|
}
|
|
|
|
public function startpm() {
|
|
$em = $this->getDoctrine()->getManager();
|
|
$data = $em->getRepository($this->entity)->findTallyday($this->getUser(),new \DateTime("now"));
|
|
|
|
// Pas normal
|
|
if(!$data)
|
|
return $this->redirectToRoute("app_tallyday");
|
|
|
|
$datenow=new \DateTime("now");
|
|
$datenow->setTime ( $datenow->format("H"), $datenow->format("i"), 0 );
|
|
$data->setDatestartpm($datenow);
|
|
$em->persist($data);
|
|
$em->flush();
|
|
return $this->redirectToRoute("app_tallyday");
|
|
}
|
|
|
|
public function endpm() {
|
|
$em = $this->getDoctrine()->getManager();
|
|
$data = $em->getRepository($this->entity)->findTallyday($this->getUser(),new \DateTime("now"));
|
|
|
|
// Pas normal
|
|
if(!$data)
|
|
return $this->redirectToRoute("app_tallyday");
|
|
|
|
$datenow=new \DateTime("now");
|
|
$datenow->setTime ( $datenow->format("H"), $datenow->format("i"), 0 );
|
|
$data->setDateendpm($datenow);
|
|
$em->persist($data);
|
|
$em->flush();
|
|
return $this->redirectToRoute("app_tallyday");
|
|
}
|
|
|
|
public function uservalidate(Request $request) {
|
|
return $this->validate($this->getUser(),$request);
|
|
}
|
|
|
|
public function validate($user,Request $request) {
|
|
if($request->get("date"))
|
|
$date=new \DateTime($request->get("date"));
|
|
else
|
|
$date=new \DateTime("now");
|
|
|
|
$em = $this->getDoctrine()->getManager();
|
|
$data = $em->getRepository($this->entity)->findTallyday($user,$date);
|
|
|
|
// récupérer la premier validation master
|
|
$firstvalidate= $em->getRepository($this->entity)->findOneBy(["user"=>$this->getUser(),"validatemaster"=>true],["dateof"=>"ASC"]);
|
|
|
|
// Pas normal
|
|
if($firstvalidate && $firstvalidate->getDateof() > $date) return $this->redirectToRoute("app_tallyday");
|
|
|
|
// Si aucun enregistrement on initialise le pointage sur la journée
|
|
if(!$data) {
|
|
$data = new Entity();
|
|
$data->setUser($this->getUser());
|
|
|
|
$datenow=clone $date;
|
|
$data->setDateof($datenow);
|
|
$data->setValidateuser(false);
|
|
$data->setValidatemaster(false);
|
|
|
|
$em->persist($data);
|
|
$em->flush();
|
|
}
|
|
|
|
if(($data->getDatestartam()&&!$data->getDateendam())||($data->getDatestartpm()&&!$data->getDateendpm())) {
|
|
if($request->get("from")=="list")
|
|
return $this->redirectToRoute("app_tallyday_userlist",["message"=>"Impossible de valider, il vous manque des dates de fin"]);
|
|
else
|
|
return $this->redirectToRoute("app_tallyday",["message"=>"Impossible de valider, il vous manque des dates de fin"]);
|
|
}
|
|
|
|
// Validation
|
|
$data->setValidateuser(true);
|
|
$em->persist($data);
|
|
$em->flush();
|
|
|
|
if($request->get("from")=="list")
|
|
return $this->redirectToRoute("app_tallyday_userlist",["week"=>$request->get("week")]);
|
|
else
|
|
return $this->redirectToRoute("app_tallyday");
|
|
}
|
|
|
|
public function userdevalidate(Request $request) {
|
|
return $this->devalidate($this->getUser(),$request);
|
|
}
|
|
|
|
public function devalidate($user, Request $request) {
|
|
if($request->get("date"))
|
|
$date=new \DateTime($request->get("date"));
|
|
else
|
|
$date=new \DateTime("now");
|
|
|
|
$em = $this->getDoctrine()->getManager();
|
|
$data = $em->getRepository($this->entity)->findTallyday($this->getUser(),$date);
|
|
|
|
// Pas normal
|
|
if(!$data) return $this->redirectToRoute("app_tallyday");
|
|
|
|
// Pas normal
|
|
if($data->getValidatemaster()) return $this->redirectToRoute("app_tallyday");
|
|
|
|
// Dévalidation
|
|
$data->setValidateuser(false);
|
|
$em->persist($data);
|
|
$em->flush();
|
|
|
|
if($request->get("from")=="list")
|
|
return $this->redirectToRoute("app_tallyday_userlist",["week"=>$request->get("week")]);
|
|
else
|
|
return $this->redirectToRoute("app_tallyday");
|
|
}
|
|
|
|
public function userupdate(Request $request)
|
|
{
|
|
return $this->update($this->getUser(),$request);
|
|
}
|
|
|
|
public function update($user,Request $request)
|
|
{
|
|
if($request->get("date"))
|
|
$date=new \DateTime($request->get("date"));
|
|
else
|
|
$date=new \DateTime("now");
|
|
|
|
|
|
// Initialisation de l'enregistrement
|
|
$em = $this->getDoctrine()->getManager();
|
|
$data = $em->getRepository($this->entity)->findTallyday($this->getUser(),$date);
|
|
|
|
// Récupérer la premier validation master
|
|
$firstvalidate= $em->getRepository($this->entity)->findOneBy(["user"=>$this->getUser(),"validatemaster"=>true],["dateof"=>"ASC"]);
|
|
|
|
// Pas normal
|
|
if($firstvalidate && $firstvalidate->getDateof() > $date) return $this->redirectToRoute("app_tallyday");
|
|
|
|
// Si aucun enregistrement on initialise le pointage sur la journée
|
|
if(!$data) {
|
|
$data = new Entity();
|
|
$data->setUser($this->getUser());
|
|
|
|
$datenow=clone $date;
|
|
$data->setDateof($datenow);
|
|
$data->setValidateuser(false);
|
|
$data->setValidatemaster(false);
|
|
|
|
$em->persist($data);
|
|
$em->flush();
|
|
}
|
|
|
|
// Création du formulaire
|
|
$form = $this->createForm(Form::class,$data);
|
|
|
|
// Récupération des data du formulaire
|
|
$form->handleRequest($request);
|
|
|
|
// Sur erreur
|
|
$this->getErrorForm(null,$form,$request,$data);
|
|
|
|
// Sur validation
|
|
if ($form->get('submit')->isClicked() && $form->isValid()) {
|
|
$data = $form->getData();
|
|
|
|
if($data->getDatestartam()) {
|
|
$datestartam= clone $date;
|
|
$datestartam->setTime($data->getDatestartam()->format("H"),$data->getDatestartam()->format("i"));
|
|
$data->setDatestartam($datestartam);
|
|
} else $data->setDatestartam(null);
|
|
|
|
if($data->getDateendam()) {
|
|
$dateendam= clone $date;
|
|
$dateendam->setTime($data->getDateendam()->format("H"),$data->getDateendam()->format("i"));
|
|
$data->setDateendam($dateendam);
|
|
} else $data->setDateendam(null);
|
|
|
|
if($data->getDatestartpm()) {
|
|
$datestartpm= clone $date;
|
|
$datestartpm->setTime($data->getDatestartpm()->format("H"),$data->getDatestartpm()->format("i"));
|
|
$data->setDatestartpm($datestartpm);
|
|
} else $data->setDatestartpm(null);
|
|
|
|
if($data->getDateendpm()) {
|
|
$dateendpm= clone $date;
|
|
$dateendpm->setTime($data->getDateendpm()->format("H"),$data->getDateendpm()->format("i"));
|
|
$data->setDateendpm($dateendpm);
|
|
} else $data->setDateendpm(null);
|
|
|
|
$em->persist($data);
|
|
$em->flush();
|
|
|
|
// Retour à la liste
|
|
if($request->get("from")=="list")
|
|
return $this->redirectToRoute("app_tallyday_userlist",["week"=>$request->get("week")]);
|
|
else
|
|
return $this->redirectToRoute($this->route);
|
|
}
|
|
|
|
// Affichage du formulaire
|
|
return $this->render($this->render.'edit.html.twig', [
|
|
"useheader" => true,
|
|
"usesidebar" => false,
|
|
"usemonocolor" => true,
|
|
"maxwidth" => true,
|
|
$this->data => $data,
|
|
"week" => $request->get("week"),
|
|
"from" => $request->get("from"),
|
|
'form' => $form->createView()
|
|
]);
|
|
}
|
|
|
|
protected function getErrorForm($id,$form,$request,$data) {
|
|
if ($form->get('submit')->isClicked()) {
|
|
// On s'assure que l'ensemble des dates sont bien dans la journée
|
|
/*
|
|
$i1=0;
|
|
if($data->getDatestartam()) $i1 = $data->getDateof()->diff($data->getDatestartam())->format("%a");
|
|
|
|
$i2=0;
|
|
if($data->getDateendam()) $i2 = $data->getDateof()->diff($data->getDateendam())->format("%a");
|
|
|
|
$i3=0;
|
|
if($data->getDatestartpm()) $i3 = $data->getDateof()->diff($data->getDatestartpm())->format("%a");
|
|
|
|
$i4=0;
|
|
if($data->getDateendpm()) $i4 = $data->getDateof()->diff($data->getDateendpm())->format("%a");
|
|
|
|
if(($i1+$i2+$i3+$i4)!=0)
|
|
$form->addError(new FormError("L'ensemble des dates doivent être pour la journée du = ".$data->getDateof()->format("d/m/Y")));
|
|
*/
|
|
|
|
// Si date fin il faut une date début
|
|
if(($data->getDateendam()&&!$data->getDatestartam())||($data->getDateendpm()&&!$data->getDatestartpm()))
|
|
$form->addError(new FormError("Si vous renseignez un horaire de fin, il faut un horaire de début"));
|
|
|
|
// date début < date fin
|
|
if($data->getDatestartam()&&$data->getDateendam()) {
|
|
if($data->getDatestartam()>=$data->getDateendam())
|
|
$form->addError(new FormError("Date de début de matin doit être inférieure à la date de fin de matin"));
|
|
}
|
|
if($data->getDatestartpm()&&$data->getDateendpm()) {
|
|
if($data->getDatestartpm()>=$data->getDateendpm())
|
|
$form->addError(new FormError("Date de début d'aprés-midi doit être inférieure à la date de fin d'aprés-midi"));
|
|
}
|
|
|
|
// Créneau matin < Créneau aprés-midi
|
|
if($data->getDatestartam()&&$data->getDateendam()&&$data->getDatestartpm()&&$data->getDateendpm()) {
|
|
if($data->getDatestartpm()<=$data->getDateendam())
|
|
$form->addError(new FormError("Le créneau matin ne peut être dans le créneau aprés-midi"));
|
|
}
|
|
}
|
|
|
|
if ($form->get('submit')->isClicked() && !$form->isValid()) {
|
|
$this->get('session')->getFlashBag()->clear();
|
|
|
|
$errors = $form->getErrors();
|
|
foreach( $errors as $error ) {
|
|
$request->getSession()->getFlashBag()->add("error", $error->getMessage());
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|