diff --git a/src/ninebadge-1.0/config/routes.yaml b/src/ninebadge-1.0/config/routes.yaml index fb7da83..dbb1325 100644 --- a/src/ninebadge-1.0/config/routes.yaml +++ b/src/ninebadge-1.0/config/routes.yaml @@ -208,3 +208,7 @@ app_tallyday_userupdate: app_tallyday_userlist: path: /user/tallydays defaults: { _controller: App\Controller\TallydayController:usertallydays } + +app_tallyday_masterlist: + path: /master/tallydays + defaults: { _controller: App\Controller\TallydayController:mastertallydays } \ No newline at end of file diff --git a/src/ninebadge-1.0/public/uploads/avatar/noavatar.png b/src/ninebadge-1.0/public/uploads/avatar/noavatar.png new file mode 100644 index 0000000..a561a74 Binary files /dev/null and b/src/ninebadge-1.0/public/uploads/avatar/noavatar.png differ diff --git a/src/ninebadge-1.0/src/Controller/TallydayController.php b/src/ninebadge-1.0/src/Controller/TallydayController.php index 0251e77..17e31cd 100755 --- a/src/ninebadge-1.0/src/Controller/TallydayController.php +++ b/src/ninebadge-1.0/src/Controller/TallydayController.php @@ -35,7 +35,42 @@ class TallydayController extends AbstractController public function usertallydays(Request $request) { - $this->tallydays($this->getUser(),$request,$dates,$datenext,$dateprev,$timeweek); + 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, @@ -43,49 +78,102 @@ class TallydayController extends AbstractController "usemonocolor" => false, "maxwidth" => true, "dates" => $dates, - "datenext" => $datenext, - "dateprev" => $dateprev, + "week" => $weeknow, + "weeknext" => $weeknext, + "weekprev" => $weekprev, "timeweek" => $timeweek, + "firstvalidate" => $firstvalidate, "message" => $request->get("message"), ]); - - } - private function tallydays($user, Request $request,&$dates,&$datenext,&$dateprev,&$timeweek) { - if($request->get("date")) { - $datenow=new \DateTime($request->get("date")); - $datenow->modify('monday this week'); - $datenext=clone $datenow; - $datenext->modify('monday next week'); - $dateprev=clone $datenow; - $dateprev->modify('monday previous week'); - } - else { - $datenow=new \DateTime('monday this week'); - $datenext=new \DateTime('monday next week'); - $dateprev=new \DateTime('monday previous week'); - } - - $em = $this->getDoctrine()->getManager(); - + public function mastertallydays(Request $request) { $dates=[]; - $dateend=clone $datenow; - $dateend->modify("sunday this week"); - - $e = new \DateTime('00:00'); - $f = clone $e; - while($datenow<=$dateend) { - $data= $em->getRepository($this->entity)->findTallyday($user,$datenow); - array_push($dates,["date"=>clone $datenow,"tallyday"=>$data]); - if($data) $e->add($data->getTimeday()); - $datenow->add(new \DateInterval('P1D')); + // 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; + } + } } - $timeweek = $f->diff($e)->format("%H:%I"); + 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(); @@ -177,8 +265,25 @@ class TallydayController extends AbstractController $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(!$data) return $this->redirectToRoute("app_tallyday"); + 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") @@ -193,14 +298,23 @@ class TallydayController extends AbstractController $em->flush(); if($request->get("from")=="list") - return $this->redirectToRoute("app_tallyday_userlist"); + return $this->redirectToRoute("app_tallyday_userlist",["week"=>$request->get("week")]); else return $this->redirectToRoute("app_tallyday"); } - public function userdevalidate() { + 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(),new \DateTime("now")); + $data = $em->getRepository($this->entity)->findTallyday($this->getUser(),$date); // Pas normal if(!$data) return $this->redirectToRoute("app_tallyday"); @@ -212,9 +326,13 @@ class TallydayController extends AbstractController $data->setValidateuser(false); $em->persist($data); $em->flush(); - return $this->redirectToRoute("app_tallyday"); - } - + + 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); @@ -231,7 +349,13 @@ class TallydayController extends AbstractController // 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(); @@ -259,12 +383,36 @@ class TallydayController extends AbstractController 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"); + return $this->redirectToRoute("app_tallyday_userlist",["week"=>$request->get("week")]); else return $this->redirectToRoute($this->route); } @@ -276,6 +424,7 @@ class TallydayController extends AbstractController "usemonocolor" => true, "maxwidth" => true, $this->data => $data, + "week" => $request->get("week"), "from" => $request->get("from"), 'form' => $form->createView() ]); @@ -284,6 +433,7 @@ class TallydayController extends AbstractController 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"); @@ -298,6 +448,7 @@ class TallydayController extends AbstractController 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())) diff --git a/src/ninebadge-1.0/src/Controller/UserController.php b/src/ninebadge-1.0/src/Controller/UserController.php index eb0c9ac..3ff5f29 100755 --- a/src/ninebadge-1.0/src/Controller/UserController.php +++ b/src/ninebadge-1.0/src/Controller/UserController.php @@ -166,7 +166,8 @@ class UserController extends AbstractController // Affichage du formulaire return $this->render($this->render.'edit.html.twig', [ 'useheader' => true, - 'usesidebar' => false, + 'usesidebar' => false, + 'maxwidth' => true, $this->data => $data, 'mode' => 'profil', 'form' => $form->createView() diff --git a/src/ninebadge-1.0/src/Entity/Tallyday.php b/src/ninebadge-1.0/src/Entity/Tallyday.php index fe89757..ebabe65 100644 --- a/src/ninebadge-1.0/src/Entity/Tallyday.php +++ b/src/ninebadge-1.0/src/Entity/Tallyday.php @@ -78,7 +78,9 @@ class Tallyday } public function getTimedayformatted() { - return $this->getTimeday()->format("%H:%I"); + $interval=$this->getTimeday(); + $timeday = sprintf("%02s",(($interval->days*24)) + $interval->h).":".sprintf("%02s",$interval->i); + return $timeday; } public function getId(): ?int diff --git a/src/ninebadge-1.0/src/Form/TallydayType.php b/src/ninebadge-1.0/src/Form/TallydayType.php index 1ccca02..402172a 100644 --- a/src/ninebadge-1.0/src/Form/TallydayType.php +++ b/src/ninebadge-1.0/src/Form/TallydayType.php @@ -5,6 +5,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Form\Extension\Core\Type\DateTimeType; +use Symfony\Component\Form\Extension\Core\Type\TimeType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\Extension\Core\Type\RepeatedType; @@ -33,7 +34,7 @@ class TallydayType extends AbstractType ); $builder->add('datestartam', - DatetimeType::class, [ + TimeType::class, [ "label" => "Matin Début", "required" => false, "widget" => 'single_text', @@ -41,7 +42,7 @@ class TallydayType extends AbstractType ); $builder->add('dateendam', - DatetimeType::class, [ + TimeType::class, [ "label" => "Matin Fin", "required" => false, "widget" => 'single_text', @@ -49,7 +50,7 @@ class TallydayType extends AbstractType ); $builder->add('datestartpm', - DatetimeType::class, [ + TimeType::class, [ "label" => "Aprés-midi Début", "required" => false, "widget" => 'single_text', @@ -57,7 +58,7 @@ class TallydayType extends AbstractType ); $builder->add('dateendpm', - DatetimeType::class, [ + TimeType::class, [ "label" => "Aprés-midi Fin", "required" => false, "widget" => 'single_text', diff --git a/src/ninebadge-1.0/templates/Tallyday/edit.html.twig b/src/ninebadge-1.0/templates/Tallyday/edit.html.twig index d9817e5..fc2fec2 100755 --- a/src/ninebadge-1.0/templates/Tallyday/edit.html.twig +++ b/src/ninebadge-1.0/templates/Tallyday/edit.html.twig @@ -8,7 +8,7 @@ {{ form_widget(form.submit) }} {% if from=="list" %} - Annuler + Annuler {% else %} Annuler {% endif %} @@ -33,10 +33,40 @@ {% endif %} + {% set trans_day_hash = { + "Monday": "Lundi", + "Tuesday": "Mardi", + "Wednesday": "Mercredi", + "Thursday": "Jeudi", + "Friday": "Vendredi", + "Saturday": "Samedi", + "Sunday": "Dimanche" + } + %} + +

{{ trans_day_hash[tallyday.dateof|date('l')] }} {{tallyday.dateof|date("d/m/Y")}}

+
+
+ {{ form_row(form.datestartam) }} +
+
+ {{ form_row(form.dateendam) }} +
+ +
+ {{ form_row(form.datestartpm) }} +
+
+ {{ form_row(form.dateendpm) }} +
+
{{ form_end(form) }} + {% endblock %} {% block localjavascript %} - + $(document).ready(function() { + $("#tallyday_datestartam").focus(); + }); {% endblock %} diff --git a/src/ninebadge-1.0/templates/Tallyday/list.html.twig b/src/ninebadge-1.0/templates/Tallyday/list.html.twig index a81a682..cb15f52 100644 --- a/src/ninebadge-1.0/templates/Tallyday/list.html.twig +++ b/src/ninebadge-1.0/templates/Tallyday/list.html.twig @@ -8,8 +8,8 @@ Retour - Semaine Suivante - Semaine Précedente + Semaine Suivante + Semaine Précedente {% if message is defined and not message is empty %}
@@ -35,25 +35,24 @@ Action Date - AM début - AM fin - PM début - PM fin - Durée + AM début + AM fin + PM début + PM fin + Durée {%for date in dates %} - {% if date["tallyday"] is empty or not date["tallyday"].validateuser %} - - {% if date["tallyday"] %} - - {% endif %} - + {% if date["tallyday"] is empty or (not date["tallyday"].validateuser and not date["tallyday"].validatemaster) %} + {% if not firstvalidate or firstvalidate.dateof < date["date"] %} + + + {% endif %} {% elseif not date["tallyday"].validatemaster %} - + {% endif %} {{ trans_day_hash[date["date"]|date('l')] }} {{date["date"]|date("d/m/Y")}} @@ -62,13 +61,13 @@ - 00:00 + 00:00 {% else %} - {% if date["tallyday"].datestartam is not null %}{{date["tallyday"].datestartam|date("H:i")}}{%endif%} - {% if date["tallyday"].dateendam is not null %}{{date["tallyday"].dateendam|date("H:i")}}{%endif%} - {% if date["tallyday"].datestartpm is not null %}{{date["tallyday"].datestartpm|date("H:i")}}{%endif%} - {% if date["tallyday"].dateendpm is not null %}{{date["tallyday"].dateendpm|date("H:i")}}{%endif%} - {{ date["tallyday"].timedayformatted }} + {% if date["tallyday"].datestartam is not null %}{{date["tallyday"].datestartam|date("H:i")}}{%endif%} + {% if date["tallyday"].dateendam is not null %}{{date["tallyday"].dateendam|date("H:i")}}{%endif%} + {% if date["tallyday"].datestartpm is not null %}{{date["tallyday"].datestartpm|date("H:i")}}{%endif%} + {% if date["tallyday"].dateendpm is not null %}{{date["tallyday"].dateendpm|date("H:i")}}{%endif%} + {{ date["tallyday"].timedayformatted }} {% endif %} {%endfor%} diff --git a/src/ninebadge-1.0/templates/Tallyday/master.html.twig b/src/ninebadge-1.0/templates/Tallyday/master.html.twig new file mode 100644 index 0000000..a82bb32 --- /dev/null +++ b/src/ninebadge-1.0/templates/Tallyday/master.html.twig @@ -0,0 +1,161 @@ +{% extends "base.html.twig" %} + +{% block localstyle %} +th, td { + border: 1px solid #37474F; + color: #ffffff; + background-color: #37474F; + text-align: center; + width: 85px; +} + +td { + background-color: #e8ecf1; + height: 44px; + vertical-align: top; + font-size: 9px; + color: var(--colorftbodylight); +} + +.date { + color: #ffffff; + background-color: #37474F; +} + +{% endblock %} + +{% block body %} +

+ VALIDATION DES POINTAGES +

+ + Retour + + {% if message is defined and not message is empty %} +
+ Erreur
+ {{ message|raw }}
+
+ {% endif %} + +
+ {% for date in dates %} +
+
+ {{ date.displayname }} +
+ +
+ + + + + + + + + + + + + + + + + {% if date.validates %} + + {% for validate in date.validates %} + {% if loop.first %} + + + {% endif %} + + + {% endfor %} + + {% endif %} + + {% if date.notvalidates %} + {% for notvalidate in date.notvalidates %} + {% if loop.first or notvalidate.dateof|date("l")=="Monday" %} + + + + {% endif %} + + + + {% if loop.last or notvalidate.dateof|date("l")=="Sunday"%} + + {% endif %} + {% endfor %} + {% endif %} + +
sLMMJVSD
+ {{validate.dateof|date("W")}}
+ = {{validate.timeweek }} +
+
{{validate.dateof|date("d/m")}}
+
+ {% if validate.tallyday %} + {%if validate.tallyday.datestartam %} de {{validate.tallyday.datestartam|date("H:i") }} {% endif %} + {%if validate.tallyday.dateendam %} à {{validate.tallyday.dateendam|date("H:i") }} {% endif %} + + {%if validate.tallyday.datestartam or validate.tallyday.dateendam %}
{% endif %} + + {%if validate.tallyday.datestartpm %} de {{validate.tallyday.datestartpm|date("H:i") }} {% endif %} + {%if validate.tallyday.dateendpm %} à {{validate.tallyday.dateendpm|date("H:i") }} {% endif %} + {% endif %} +
+ +
+ {% if validate.tallyday %} + = {{validate.tallyday.timedayformatted}} + {% else %} + = 00:00 + {% endif %} +
+
+ {{notvalidate.dateof|date("W")}}
+ = {{notvalidate.timeweek }} +
+
{{notvalidate.dateof|date("d/m")}}
+
+ {% if notvalidate.tallyday %} + {%if notvalidate.tallyday.datestartam %} de {{notvalidate.tallyday.datestartam|date("H:i") }} {% endif %} + {%if notvalidate.tallyday.dateendam %} à {{notvalidate.tallyday.dateendam|date("H:i") }} {% endif %} + + {%if notvalidate.tallyday.datestartam or notvalidate.tallyday.dateendam %}
{% endif %} + + {%if notvalidate.tallyday.datestartpm %} de {{notvalidate.tallyday.datestartpm|date("H:i") }} {% endif %} + {%if notvalidate.tallyday.dateendpm %} à {{notvalidate.tallyday.dateendpm|date("H:i") }} {% endif %} + {% endif %} +
+ +
+ {% if notvalidate.tallyday %} + = {{notvalidate.tallyday.timedayformatted}} + {% else %} + = 00:00 + {% endif %} +
+
+
+
+ {% endfor %} +
+{% endblock %} + +{% block localjavascript %} + $(document).ready(function() { + $('#dataTables').DataTable({ + columnDefs: [ { "targets": "no-sort", "orderable": false }, { "targets": "no-string", "type" : "num" } ], + responsive: true, + iDisplayLength: 100, + paging: false, + ordering: false, + info: false, + searching: false, + }); + }); +{% endblock %} \ No newline at end of file diff --git a/src/ninebadge-1.0/templates/Tallyday/tallyday.html.twig b/src/ninebadge-1.0/templates/Tallyday/tallyday.html.twig index fe2f283..2f01fcf 100644 --- a/src/ninebadge-1.0/templates/Tallyday/tallyday.html.twig +++ b/src/ninebadge-1.0/templates/Tallyday/tallyday.html.twig @@ -69,7 +69,11 @@ {% endif %} Gérer mes Pointages - + {% if is_granted('ROLE_MASTER') %} +
+ Gestion des Pointages + {% endif %} + {% if tallyday and tallyday.validateuser and not tallyday.validatemaster %}
Dévalider ma journée {% endif %}