diff --git a/src/schedule-2.0/config/routes.yaml b/src/schedule-2.0/config/routes.yaml index 81223d7..da7d898 100644 --- a/src/schedule-2.0/config/routes.yaml +++ b/src/schedule-2.0/config/routes.yaml @@ -410,7 +410,11 @@ app_export_penalty_additional: export_project_weekly: path: /export/export_project_weekly - defaults: { _controller: App\Controller\ExportController:export_project_weekly } + defaults: { _controller: App\Controller\ExportController:export_project_weekly } + +export_full_worked_days: + path: /export/export_full_worked_days + defaults: { _controller: App\Controller\ExportController:export_full_worked_days } #== API =========================================================================================================== diff --git a/src/schedule-2.0/src/Controller/EventController.php b/src/schedule-2.0/src/Controller/EventController.php index 57db4c4..aaa8c52 100755 --- a/src/schedule-2.0/src/Controller/EventController.php +++ b/src/schedule-2.0/src/Controller/EventController.php @@ -48,7 +48,6 @@ class EventController extends AbstractController if($iduser=="all") $events=$em->getRepository("App:Event")->findAll(); else { - $iduser=$this->get("session")->get("iduser"); $user=$em->getRepository("App:User")->find($iduser); $events=$em->getRepository("App:Event")->findBy(["user"=>$user]); } diff --git a/src/schedule-2.0/src/Controller/ExportController.php b/src/schedule-2.0/src/Controller/ExportController.php index 07e728a..081921e 100644 --- a/src/schedule-2.0/src/Controller/ExportController.php +++ b/src/schedule-2.0/src/Controller/ExportController.php @@ -31,14 +31,175 @@ class ExportController extends AbstractController ]); } + public function export_full_worked_days(Request $request,$access=null): Response + { + $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]); + } + + $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 formate le tableau de jour + $start=new \Datetime('first day of this month'); + $start->sub(new \DateInterval('P'.$nbmonth.'M')); + $start->modify('previous monday'); + $start->setTime(0,0,0); + $end = new \Datetime('first day of this month'); + $end->add(new \DateInterval('P1M')); + $end->modify('next monday'); + $end->setTime(23,59,0); + while($start<$end) { + $idday=$start->format("Ymd"); + $idmonth=$start->format("Ym"); + + $tmp["events"][$idday] = [ + "date"=>clone $start, + "allday"=>false, + "descriptionday"=>"", + "am"=>false, + "descriptionam"=>"", + "ap"=>false, + "descriptionap"=>"", + "astreinte"=>false, + "descriptionastreinte"=>"", + ]; + + $start->add(new \DateInterval('P1D')); + } + + // On formate le tableau des event + $start=new \Datetime('first day of this month'); + $start->sub(new \DateInterval('P'.$nbmonth.'M')); + $start->modify('previous monday'); + $start->setTime(0,0,0); + $end = new \Datetime('first day of this month'); + $end->add(new \DateInterval('P1M')); + $end->modify('next monday'); + $end->setTime(23,59,0); + + $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; + } + $isvac= $event->getTask()->getNature()->getIsvacation(); + if($isvac) {continue;} + $st=clone $event->getStart(); + while($st<$event->getEnd()) { + + $idday=$st->format("Ymd"); + if($event->getAllday()) { + $tmp["events"][$idday]["allday"]=true; + $tmp["events"][$idday]["descriptionday"]=strtoupper($event->getTask()->getDisplayname()); + } + else { + // Matin ou après-midi ? + $time=$event->getStart()->format("H"); + if($time==9) { + $tmp["events"][$idday]["am"]=true; + if(isset($tmp["events"][$idday]["ap"]) && $tmp["events"][$idday]["ap"]==true){$tmp["events"][$idday]["allday"]=true;} + $tmp["events"][$idday]["descriptionam"]=strtoupper($event->getTask()->getDisplayname()); + } + else { + $tmp["events"][$idday]["ap"]=true; + if(isset($tmp["events"][$idday]["am"]) && $tmp["events"][$idday]["am"] ==true){$tmp["events"][$idday]["allday"]=true;} + $tmp["events"][$idday]["descriptionap"]=strtoupper($event->getTask()->getDisplayname()); + } + } + + $st->add(new \DateInterval('P1D')); + } + } + + + // On formate le tableau des astreintes + $start=new \Datetime('first day of this month'); + $start->sub(new \DateInterval('P'.$nbmonth.'M')); + $start->modify('previous monday'); + $start->setTime(0,0,0); + $end = new \Datetime('first day of this month'); + $end->add(new \DateInterval('P1M')); + $end->modify('next monday'); + $end->setTime(23,59,0); + + $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]["descriptionastreinte"]=strtoupper($penalty->getTask()->getDisplayname()); + } + + $st->add(new \DateInterval('P1D')); + } + } + + array_push($tbevents,$tmp); + } + } + $csv = $this->renderView('Export/export_full_worked_days.csv.twig', ["users" => $tbevents]); + $response = new Response($csv); + $response->headers->set('Content-Type', 'text/csv; charset=utf-8'); + $response->headers->set('Content-Disposition', 'attachment; filename="export_full_worked_days.csv"'); + + return $response; + } public function export_penalty_additional(Request $request,$access=null): Response { $em = $this->getDoctrine()->getManager(); $iduser = $this->get("session")->get("iduser"); - $user = $em->getRepository("App:User")->find($iduser); - $tasks = $em->getRepository("App:Task")->findAll(); $timers = $em->getRepository("App:Timer")->findBy(["user"=>$iduser]); $tbtimers = []; foreach ($timers as $timer) { @@ -101,7 +262,7 @@ class ExportController extends AbstractController $tbproject["projectname"] = $project->getDisplayname(); $tbproject["name"] = $project->getname(); $tbproject["customer"] = $project->getCustomer()->getName(); - // Somme event validé par semaine + // Somme event validé par semaine $start=new \Datetime('first day of this month'); $start->sub(new \DateInterval('P'.$nbmonth.'M')); $start->modify('previous monday'); diff --git a/src/schedule-2.0/src/Controller/ReportController.php b/src/schedule-2.0/src/Controller/ReportController.php index 91dee02..039fb5c 100755 --- a/src/schedule-2.0/src/Controller/ReportController.php +++ b/src/schedule-2.0/src/Controller/ReportController.php @@ -121,6 +121,7 @@ class ReportController extends AbstractController $st->add(new \DateInterval('P1D')); } } + // On formate le tableau des astreintes $start=new \Datetime('first day of this month'); @@ -205,6 +206,7 @@ class ReportController extends AbstractController ); } else { + return $this->render('Report/synthese.html.twig',[ "useheader" => true, "usesidebar" => ($this->getUser()), diff --git a/src/schedule-2.0/templates/Export/export_full_worked_days.csv.twig b/src/schedule-2.0/templates/Export/export_full_worked_days.csv.twig new file mode 100644 index 0000000..1ed7156 --- /dev/null +++ b/src/schedule-2.0/templates/Export/export_full_worked_days.csv.twig @@ -0,0 +1,8 @@ +{% block body %} +Utilisateur;Jour;Journée entière;Astreinte;AM;AP;Taches;AM;Tache AM;AP;Tache AP;Astreinte;Description Astreintes +{% for user in users %} +{% for day, event in user.events %} +{{ user.user.displayname }};{{day}};{{event.allday}};{{event.astreinte}};{{event.am}};{{event.ap}};{{event.descriptionday|trim}} {{event.descriptionam|trim}} {{event.descriptionap|trim}} {{event.descriptionastreinte|trim}} +{% endfor %} +{% endfor %} +{% endblock %} \ No newline at end of file diff --git a/src/schedule-2.0/templates/Export/export_project_weekly.csv.twig b/src/schedule-2.0/templates/Export/export_project_weekly.csv.twig index 5ccce07..ff1b4b1 100644 --- a/src/schedule-2.0/templates/Export/export_project_weekly.csv.twig +++ b/src/schedule-2.0/templates/Export/export_project_weekly.csv.twig @@ -1,6 +1,7 @@ {% block body %} Client;Projet;Tâche;Utilisateur;Année;Semaine;Cumul; {% for project in projects %} +{% if project.weeks_by_task_by_user is defined %} {% for year,weeks in project.weeks_by_task_by_user %} {% for week in weeks %} {% for task in week.tasks%} @@ -10,5 +11,6 @@ Client;Projet;Tâche;Utilisateur;Année;Semaine;Cumul; {% endfor %} {% endfor %} {% endfor %} +{% endif %} {% endfor %} {% endblock %} \ No newline at end of file diff --git a/src/schedule-2.0/templates/Export/list.html.twig b/src/schedule-2.0/templates/Export/list.html.twig index 2d746db..0b962dc 100644 --- a/src/schedule-2.0/templates/Export/list.html.twig +++ b/src/schedule-2.0/templates/Export/list.html.twig @@ -5,10 +5,11 @@ EXPORTS DE DONNEES