diff --git a/src/ninebadge-1.0/config/routes.yaml b/src/ninebadge-1.0/config/routes.yaml index b4d31f3..5d40836 100644 --- a/src/ninebadge-1.0/config/routes.yaml +++ b/src/ninebadge-1.0/config/routes.yaml @@ -233,6 +233,10 @@ app_tallyday_masterdevalidate: path: /master/devalidate/{{userid}}/{{weekday}} defaults: { _controller: App\Controller\TallydayController:masterdevalidate } +app_tallyday_mastermonth: + path: /master/month/{monthof} + defaults: { _controller: App\Controller\TallydayController:mastermonth } + app_tallyday_masterexport: path: /master/export defaults: { _controller: App\Controller\TallydayController:masterexport } \ No newline at end of file diff --git a/src/ninebadge-1.0/src/Command/BreakdayCommand.php b/src/ninebadge-1.0/src/Command/BreakdayCommand.php index 0c3bed3..8ea375c 100644 --- a/src/ninebadge-1.0/src/Command/BreakdayCommand.php +++ b/src/ninebadge-1.0/src/Command/BreakdayCommand.php @@ -95,8 +95,8 @@ class BreakdayCommand extends Command while($start<=$end) { $havebreakday=false; foreach($response->body->events as $event) { - $manip=clone $start; if($event->eventallday) { + $manip=clone $start; $manip->setTime(8,0); if(new \Datetime($event->eventstart)<=$manip && $manip < new \Datetime($event->eventend) ) { $this->writeln($start->format("d/m/Y")." >> tallybreakday full day"); @@ -113,7 +113,7 @@ class BreakdayCommand extends Command // Les breakday am sont supprimés $manip=clone $start; - $manip->setTime(9,0); + $manip->setTime(8,30); $tallydays=$this->em->getRepository("App:Tallyday")->findBy(["user"=>$user,"dateof"=>$start,"datestart"=>$manip,"isbreakday"=>true]); foreach($tallydays as $tallyday) { $this->em->remove($tallyday); @@ -154,7 +154,102 @@ class BreakdayCommand extends Command } } else { + $manip=clone $start; + $manip->setTime(10,0); + if(new \Datetime($event->eventstart)<=$manip && $manip < new \Datetime($event->eventend) ) { + $this->writeln($start->format("d/m/Y")." >> tallybreakday AM"); + // On s'assure que la journée n'a pas été validé master + $tallyday=$this->em->getRepository("App:Tallyday")->findOneBy(["user"=>$user,"dateof"=>$start,"validatemaster"=>true]); + if(!$tallyday) { + // Les pointages du matin qui ne sont des congès sont supprimés + $tallydays=$this->em->getRepository("App:Tallyday")->findAM($user,$start,false); + foreach($tallydays as $tallyday) { + $this->em->remove($tallyday); + $this->em->flush(); + } + // Les breakday fullday sont supprimés + $manip=clone $start; + $manip->setTime(10,0); + $tallydays=$this->em->getRepository("App:Tallyday")->findBy(["user"=>$user,"dateof"=>$start,"datestart"=>$manip,"isbreakday"=>true]); + foreach($tallydays as $tallyday) { + $this->em->remove($tallyday); + $this->em->flush(); + } + + // Le breakday est généré s'il n'existe pas + $manip=clone $start; + $manip->setTime(8,30); + $tallyday=$this->em->getRepository("App:Tallyday")->findOneBy(["user"=>$user,"dateof"=>$start,"datestart"=>$manip,"isbreakday"=>true]); + if(!$tallyday) { + $data = new Tallyday(); + $data->setDateof($start); + $data->setUser($user); + $data->setValidateuser(false); + $data->setValidatemaster(false); + $data->setIsbreakday(true); + $data->setName("AM = ".$event->taskname); + $data->setDatestart(clone $manip); + + $manip->add(new \DateInterval("PT3H")); + $manip->add(new \DateInterval("PT30M")); + $data->setDateend(clone $manip); + $this->em->persist($data); + $this->em->flush(); + } + + $havebreakday=true; + } + } + else { + $manip=clone $start; + $manip->setTime(15,0); + if(new \Datetime($event->eventstart)<=$manip && $manip < new \Datetime($event->eventend) ) { + $this->writeln($start->format("d/m/Y")." >> tallybreakday PM"); + // On s'assure que la journée n'a pas été validé master + $tallyday=$this->em->getRepository("App:Tallyday")->findOneBy(["user"=>$user,"dateof"=>$start,"validatemaster"=>true]); + if(!$tallyday) { + // Les pointages de l'aprés midi qui ne sont des congès sont supprimés + $tallydays=$this->em->getRepository("App:Tallyday")->findPM($user,$start,false); + foreach($tallydays as $tallyday) { + $this->em->remove($tallyday); + $this->em->flush(); + } + + // Les breakday fullday sont supprimés + $manip=clone $start; + $manip->setTime(10,0); + $tallydays=$this->em->getRepository("App:Tallyday")->findBy(["user"=>$user,"dateof"=>$start,"datestart"=>$manip,"isbreakday"=>true]); + foreach($tallydays as $tallyday) { + $this->em->remove($tallyday); + $this->em->flush(); + } + + // Le breakday est généré s'il n'existe pas + $manip=clone $start; + $manip->setTime(13,30); + $tallyday=$this->em->getRepository("App:Tallyday")->findOneBy(["user"=>$user,"dateof"=>$start,"datestart"=>$manip,"isbreakday"=>true]); + if(!$tallyday) { + $data = new Tallyday(); + $data->setDateof($start); + $data->setUser($user); + $data->setValidateuser(false); + $data->setValidatemaster(false); + $data->setIsbreakday(true); + $data->setName("PM = ".$event->taskname); + $data->setDatestart(clone $manip); + + $manip->add(new \DateInterval("PT3H")); + $manip->add(new \DateInterval("PT30M")); + $data->setDateend(clone $manip); + $this->em->persist($data); + $this->em->flush(); + } + + $havebreakday=true; + } + } + } } } diff --git a/src/ninebadge-1.0/src/Command/CronInitCommand.php b/src/ninebadge-1.0/src/Command/CronInitCommand.php index 1eb283c..1827a0b 100644 --- a/src/ninebadge-1.0/src/Command/CronInitCommand.php +++ b/src/ninebadge-1.0/src/Command/CronInitCommand.php @@ -78,6 +78,24 @@ class CronInitCommand extends Command $this->em->persist($entity); } + // Job Breakday + // Toute les heures + $entity = $this->em->getRepository('App:Cron')->findOneBy(["command"=>"app:Breakday"]); + if(!$entity) { + $entity = new Cron; + $nextdate=$entity->getSubmitdate(); + $nextdate->setTime($nextdate->format("H"),0); + + $entity->setCommand("app:Breakday"); + $entity->setDescription("Récupération des Breakdays de Schedule"); + $entity->setStatut(2); + $entity->setRepeatcall(0); + $entity->setRepeatexec(0); + $entity->setRepeatinterval(3600); + $entity->setNextexecdate($entity->getSubmitdate()); + $this->em->persist($entity); + } + // Job de purge des fichiers obsolète // Toute les 24h à 3h00 $entity = $this->em->getRepository('App:Cron')->findOneBy(["command"=>"app:purgeFile"]); @@ -85,6 +103,7 @@ class CronInitCommand extends Command $entity = new Cron; $nextdate=$entity->getSubmitdate(); $nextdate->setTime(3,0); + $entity->setCommand("app:purgeFile"); $entity->setDescription("Suppression des fichiers obsolètes"); $entity->setStatut(2); diff --git a/src/ninebadge-1.0/src/Controller/TallydayController.php b/src/ninebadge-1.0/src/Controller/TallydayController.php index e05b466..79dee92 100755 --- a/src/ninebadge-1.0/src/Controller/TallydayController.php +++ b/src/ninebadge-1.0/src/Controller/TallydayController.php @@ -7,6 +7,11 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Form\FormError; use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpKernel\KernelInterface; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\HttpFoundation\BinaryFileResponse; +use Symfony\Component\HttpFoundation\ResponseHeaderBag; + use App\Entity\Tallyday as Entity; use App\Form\TallydayType as Form; @@ -16,13 +21,22 @@ class TallydayController extends AbstractController private $route = "app_tallyday"; private $render = "Tallyday/"; private $entity = "App:Tallyday"; + + private $appKernel; + private $knpSnappy; + + public function __construct(KernelInterface $appKernel,\Knp\Snappy\Pdf $knpSnappy) + { + $this->appKernel = $appKernel; + $this->knpSnappy = $knpSnappy; + } public function tallyday(Request $request) { $datenow=new \DateTime(); $em = $this->getDoctrine()->getManager(); $datas = $em->getRepository($this->entity)->findTallyday($this->getUser(),$datenow); - + // Calcul du temps de la journée $e = new \DateTime('00:00'); $f = clone $e; @@ -40,7 +54,7 @@ class TallydayController extends AbstractController "maxwidth" => true, $this->data."s" => $datas, "timeday" => $timeday, - "capitaltime" => $em->getRepository("App:Tallyday")->getCapitaltime(["user"=>$this->getUser()]), + "capitaltime" => $em->getRepository("App:Tallyday")->getCapitaltime($this->getUser()), "message" => $request->get("message"), ]); } @@ -110,7 +124,7 @@ class TallydayController extends AbstractController "weekprev" => $weekprev, "timeweek" => $timeweek, "firstvalidate" => $firstvalidate, - "capitaltime" => $em->getRepository("App:Tallyday")->getCapitaltime(["user"=>$this->getUser()]), + "capitaltime" => $em->getRepository("App:Tallyday")->getCapitaltime($this->getUser()), "message" => $request->get("message"), ]); } @@ -127,7 +141,7 @@ class TallydayController extends AbstractController "id"=>$user->getId(), "avatar"=>$user->getAvatar(), "displayname"=>$user->getDisplayname(), - "capitaltime"=>$em->getRepository("App:Tallyday")->getCapitaltime(["user"=>$user]), + "capitaltime"=>$em->getRepository("App:Tallyday")->getCapitaltime($user), "validates"=>[], "notvalidates"=>[], ]; @@ -532,7 +546,7 @@ class TallydayController extends AbstractController // Pas normal if(!$user) return $this->redirectToRoute("app_tallyday_masterlist"); - + // Premiere passe de controle $datenow=new \DateTime($weekday); $dateend=clone $datenow; @@ -544,7 +558,7 @@ class TallydayController extends AbstractController // Si aucun enregistrement on initialise le pointage sur la journée à vide if(!$datas) { $data = new Entity(); - $data->setUser($this->getUser()); + $data->setUser($user); $data->setDateof($datenow); $data->setValidateuser(false); @@ -665,6 +679,147 @@ class TallydayController extends AbstractController return $this->redirectToRoute("app_tallyday_masterlist"); } + public function mastermonth($monthof, Request $request) { + // Pour l'ensemble des utlisateurs + $em = $this->getDoctrine()->getManager(); + $users = $em->getRepository("App:User")->findBy([],["firstname"=>"ASC","lastname"=>"ASC"]); + $dates=[]; + + foreach($users as $user) { + if($user->hasRole("ROLE_USER")) { + $dates[$user->getId()] = [ + "id"=>$user->getId(), + "avatar"=>$user->getAvatar(), + "displayname"=>$user->getDisplayname(), + "timemonth"=>"00:00", + "validates"=>[], + ]; + + $datenow=new \DateTime($monthof."01"); + $dateend=clone $datenow; + $dateend->modify("last day of this month"); + + $nextmonth=clone $datenow; + $nextmonth->modify("first day of next month"); + + $prevmonth=clone $datenow; + $prevmonth->modify("first day of previous month"); + + $emonth = new \DateTime('00:00'); + $fmonth = clone $emonth; + + while($datenow<=$dateend) { + $eday = new \DateTime('00:00'); + $fday = clone $eday; + + $datas = $em->getRepository($this->entity)->findTallyday($user,$datenow); + foreach($datas as $data) { + $emonth->add($data->getTimeday()); + $eday->add($data->getTimeday()); + } + + $interval = $fday->diff($eday); + $timeday = (($interval->days*24) + $interval->h).":".sprintf("%02s",$interval->i); + + array_push($dates[$user->getId()]["validates"],[ + "dateof"=>clone $datenow, + "timeday"=>$timeday, + "tallydays"=>$datas + ]); + + $datenow->add(new \DateInterval('P1D')); + } + + $interval = $fmonth->diff($emonth); + $timeweek = (($interval->days*24) + $interval->h).":".sprintf("%02s",$interval->i); + $dates[$user->getId()]["timemonth"]=$timeweek; + } + } + + if($request->get('type')=="pdf") { + $rootdir = $this->appKernel->getProjectDir()."/uploads"; + $filename="Rapport-".$dateend->format("Ym").".pdf"; + $fileloc=$rootdir."/".$filename; + + $fs = new Filesystem(); + $fs->remove(array($fileloc)); + + $render = $this->renderView('Tallyday/month.html.twig',[ + "useheader" => false, + "usesidebar" => false, + "usemonocolor" => false, + "maxwidth" => false, + "monthof" => $dateend, + "nextmonth" => $nextmonth->format("Ym"), + "prevmonth" => $prevmonth->format("Ym"), + "dates" => $dates, + "fgprint" => true, + "message" => $request->get("message"), + ]); + + $appWeburl=$this->getParameter("appWeburl"); + $appAlias=$this->getParameter("appAlias"); + + $render=str_replace("/$appAlias/","https://$appWeburl/$appAlias/",$render); + //dump($render); + + $this->knpSnappy->generateFromHtml($render,$fileloc); + return $this->file($fileloc); + } + else { + return $this->render('Tallyday/month.html.twig',[ + "useheader" => true, + "usesidebar" => false, + "usemonocolor" => false, + "maxwidth" => false, + "monthof" => $dateend, + "nextmonth" => $nextmonth->format("Ym"), + "prevmonth" => $prevmonth->format("Ym"), + "dates" => $dates, + "fgprint" => false, + "message" => $request->get("message"), + ]); + } + } + + public function masterexport() { + $em = $this->getDoctrine()->getManager(); + $rootdir = $this->appKernel->getProjectDir()."/uploads"; + + $dateof=new \DateTime(); + $filename="Export-".$dateof->format("Ymd").".csv"; + + $fs = new Filesystem(); + $fs->mkdir($rootdir); + $csvh = fopen($rootdir."/".$filename, 'w'); + $d = ';'; // this is the default but i like to be explicit + $e = '"'; // this is the default but i like to be explicit + + $csvh = fopen($rootdir."/".$filename, 'w'); + + $csv=["Utilisateur",utf8_decode("Début"),"Fin","Temps",utf8_decode("Libellé")]; + fputcsv($csvh, $csv, $d, $e); + + $datas = $em->getRepository($this->entity)->findBy([],["user"=>"ASC","dateof"=>"ASC"]); + foreach($datas as $data) { + if($data->getDatestart() || $data->getDateend()) { + $csv=[ + utf8_decode($data->getUser()->getDisplayname()), + $data->getDatestart()->format("d/m/Y H:i"), + ($data->getDateend()?$data->getDateend()->format("d/m/Y H:i"):""), + $data->getTimedayformatted(), + utf8_decode(($data->getName()?$data->getName():"")) + + ]; + fputcsv($csvh, $csv, $d, $e); + } + } + + $response = new BinaryFileResponse($rootdir."/".$filename); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); + return $response; + } + public function start() { $em = $this->getDoctrine()->getManager(); @@ -723,37 +878,7 @@ class TallydayController extends AbstractController 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"); - } protected function getErrorForm($id,$form,$request,$data,$mode) { $em = $this->getDoctrine()->getManager(); diff --git a/src/ninebadge-1.0/src/Repository/TallydayRepository.php b/src/ninebadge-1.0/src/Repository/TallydayRepository.php index 7a93b07..fdf9756 100644 --- a/src/ninebadge-1.0/src/Repository/TallydayRepository.php +++ b/src/ninebadge-1.0/src/Repository/TallydayRepository.php @@ -51,30 +51,31 @@ class TallydayRepository extends ServiceEntityRepository return $datas; } - public function getCapitaltime($user) { + public function getCapitaltime($user,$monthof=null) { $datenow=new \DateTime('00:00'); $datas = $this->_em->getRepository('App:Tallyday')->findBy(["user"=>$user],["datestart"=>"DESC"]); $tbweek=[]; $ework = new \DateTime('00:00'); - + $idweeknow=$datenow->format("Y").$datenow->format("W"); $lastdayvalidate=false; + foreach($datas as $data) { if($data->getDateof()<$datenow) { - $idweek=strval($data->getDateof()->format("Y"))."-".strval($data->getDateof()->format("W")); - if(!in_array($idweek,$tbweek)) array_push($tbweek,$idweek); + $idweek=$data->getDateof()->format("Y").$data->getDateof()->format("W"); + if(!in_array($idweek,$tbweek)&&$idweek!=$idweeknow) array_push($tbweek,$idweek); $ework->add($data->getTimeday()); } if($data->getDateof()==$datenow&&($data->getValidateuser()||$data->getValidatemaster())) { $lastdayvalidate=true; - $idweek=strval($data->getDateof()->format("Y"))."-".strval($data->getDateof()->format("W")); - if(!in_array($idweek,$tbweek)) array_push($tbweek,$idweek); + $idweek=$data->getDateof()->format("Y").$data->getDateof()->format("W"); + if(!in_array($idweek,$tbweek)&&$idweek!=$idweeknow) array_push($tbweek,$idweek); $ework->add($data->getTimeday()); } } // Nbday worked - $nbdaywork=(count($tbweek)-1)*5; + $nbdaywork=count($tbweek)*5; if($datenow->format("w")==6||$datenow->format("w")==7) $nbdaywork+=5; else { @@ -162,4 +163,47 @@ class TallydayRepository extends ServiceEntityRepository return true; } + public function findAM($user,$dateof,$isbreakday) { + $start=clone $dateof; + $start->setTime(8,30); + + $end=clone $dateof; + $end->setTime(12,00); + + $datas = $this->createQueryBuilder('tallydate') + ->Where('tallydate.user=:user') + ->andWhere('tallydate.dateof=:day') + ->andWhere('(tallydate.datestart<=:start AND :start<=tallydate.dateend)OR(tallydate.datestart>=:start AND tallydate.datestart<=:end) OR (tallydate.dateend>=:start AND tallydate.dateend<=:end)') + ->andWhere('tallydate.isbreakday=:isbreakday') + ->setParameter('user',$user) + ->setParameter('isbreakday',$isbreakday) + ->setParameter('day',$dateof->format("Y-m-d H:i:s")) + ->setParameter('start',$start->format("Y-m-d H:i:s")) + ->setParameter('end',$end->format("Y-m-d H:i:s")) + ->getQuery()->getResult(); + + return $datas; + } + + public function findPM($user,$dateof,$isbreakday) { + $start=clone $dateof; + $start->setTime(13,30); + + $end=clone $dateof; + $end->setTime(17,00); + + $datas = $this->createQueryBuilder('tallydate') + ->Where('tallydate.user=:user') + ->andWhere('tallydate.dateof=:day') + ->andWhere('(tallydate.datestart<=:start AND :start<=tallydate.dateend)OR(tallydate.datestart>=:start AND tallydate.datestart<=:end) OR (tallydate.dateend>=:start AND tallydate.dateend<=:end)') + ->andWhere('tallydate.isbreakday=:isbreakday') + ->setParameter('user',$user) + ->setParameter('isbreakday',$isbreakday) + ->setParameter('day',$dateof->format("Y-m-d H:i:s")) + ->setParameter('start',$start->format("Y-m-d H:i:s")) + ->setParameter('end',$end->format("Y-m-d H:i:s")) + ->getQuery()->getResult(); + + return $datas; + } } diff --git a/src/ninebadge-1.0/templates/Tallyday/master.html.twig b/src/ninebadge-1.0/templates/Tallyday/master.html.twig index fa75626..b1eb211 100644 --- a/src/ninebadge-1.0/templates/Tallyday/master.html.twig +++ b/src/ninebadge-1.0/templates/Tallyday/master.html.twig @@ -6,14 +6,14 @@ th, td { color: #ffffff; background-color: #37474F; text-align: center; - width: 85px; + width: 100px; } td { background-color: #e8ecf1; height: 44px; vertical-align: top; - font-size: 9px; + font-size: 12px; color: var(--colorftbodylight); } @@ -35,6 +35,7 @@ td { Retour Export CSV + Rapport Mensuel {% if message is defined and not message is empty %}
s | +L | +M | +M | +J | +V | +S | +D | +
---|---|---|---|---|---|---|---|
+ {{validate.dateof|date("W")}} + | + + {% if loop.first %} + {% for i in 2..(validate.dateof|date("N")) %} ++ {% endfor %} + {%endif %} + {% endif %} + + |
+ {{validate.dateof|date("d/m")}}
+
+ {% for tallyday in validate.tallydays %}
+ {% if tallyday.isbreakday %}
+ {% if tallyday.datestart|date("H")==10 %}
+ {% set breakdayall=true %}
+ {% endif %}
+ {{tallyday.name}}
+ {% else %}
+ {%if tallyday.datestart %} de {{tallyday.datestart|date("H:i") }} {% endif %}
+ {%if tallyday.dateend %} à {{tallyday.dateend|date("H:i") }} {% endif %}
+ {%endif%}
+
+
+ + {% endfor %} +
+ = {{validate.timeday}}
+
+ |
+
+ {% if loop.last or validate.dateof|date("l")=="Sunday"%}
+ |||||