diff --git a/src/schedule-2.0/config/routes.yaml b/src/schedule-2.0/config/routes.yaml index 114088d..079aadb 100644 --- a/src/schedule-2.0/config/routes.yaml +++ b/src/schedule-2.0/config/routes.yaml @@ -288,6 +288,10 @@ app_report: path: /user/report defaults: { _controller: App\Controller\ReportController:report } +app_report_export: + path: /user/report/export + defaults: { _controller: App\Controller\ReportController:export } + app_holiday: path: /user/holiday defaults: { _controller: App\Controller\ReportController:holiday } diff --git a/src/schedule-2.0/src/Controller/ReportController.php b/src/schedule-2.0/src/Controller/ReportController.php index a4de755..92fc54b 100755 --- a/src/schedule-2.0/src/Controller/ReportController.php +++ b/src/schedule-2.0/src/Controller/ReportController.php @@ -6,6 +6,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse; +use Symfony\Component\HttpFoundation\ResponseHeaderBag; class ReportController extends AbstractController { @@ -15,7 +16,6 @@ class ReportController extends AbstractController public function synthese(Request $request) { $em = $this->getDoctrine()->getManager(); - $nbmonth=$this->get("session")->get("nbmonth"); $iduser=$this->get("session")->get("iduser"); @@ -102,7 +102,7 @@ class ReportController extends AbstractController $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"); @@ -119,7 +119,7 @@ class ReportController extends AbstractController } $st->add(new \DateInterval('P1D')); - } + } } // On formate le tableau des astreintes @@ -157,7 +157,7 @@ class ReportController extends AbstractController } $st->add(new \DateInterval('P1D')); - } + } } // On formate le tableau des jours fériés @@ -184,7 +184,7 @@ class ReportController extends AbstractController $tmp["events"][$idday]["descriptionday"]="Jour Férié"; $st->add(new \DateInterval('P1D')); - } + } } array_push($tbevents,$tmp); @@ -202,9 +202,9 @@ class ReportController extends AbstractController return new PdfResponse( $this->knpSnappy->getOutputFromHtml($render), 'synthese.pdf' - ); + ); } - else { + else { return $this->render('Report/synthese.html.twig',[ "useheader" => true, "usesidebar" => ($this->getUser()), @@ -246,7 +246,7 @@ class ReportController extends AbstractController if($project->getId()!=$this->get('session')->get('idproject')) continue; } - + // Ne prendre que les projets actif/inactif if($this->get('session')->get('activeproject')!=$project->getActive()) continue; @@ -350,7 +350,7 @@ class ReportController extends AbstractController $end=new \Datetime('first day of this month'); $end->add(new \DateInterval('P'.$nbmonth.'M')); $end->sub(new \DateInterval('P1D')); - + foreach($users as $user) { $tbevents = $this->getEventuser($user,$start,$end,false); @@ -368,7 +368,7 @@ class ReportController extends AbstractController } } } - + // Cumule foreach($tbprojects as $project) { foreach($project["months"] as $month) { @@ -387,7 +387,7 @@ class ReportController extends AbstractController $totmonth+=$day["duration"]; $totmontha+=$day["astreinte"]; } - + if($totuser==0&&$totusera==0) { unset($tbprojects[$project["id"]]["months"][$month["monthid"]]["users"][$user["id"]]); } else { @@ -398,7 +398,7 @@ class ReportController extends AbstractController if(!$haveuser) unset($tbprojects[$project["id"]]["months"][$month["monthid"]]); - else { + else { $tbprojects[$project["id"]]["months"][$month["monthid"]]["total"]=$totmonth; $tbprojects[$project["id"]]["months"][$month["monthid"]]["totala"]=$totmontha; } @@ -418,9 +418,9 @@ class ReportController extends AbstractController return new PdfResponse( $this->knpSnappy->getOutputFromHtml($render,["orientation"=>"Landscape"]), 'planning.pdf' - ); + ); } - else { + else { return $this->render('Report/planning.html.twig',[ "useheader" => true, "usesidebar" => ($this->getUser()), @@ -428,7 +428,7 @@ class ReportController extends AbstractController "access" => $access, "key" => $key ]); - } + } } public function report($key=null,$access=null,Request $request) { @@ -447,7 +447,7 @@ class ReportController extends AbstractController } $projects=$em->getRepository("App:Project")->findAll(); - + //Construction du tableau des projets $tbprojects=[]; foreach($projects as $project) { @@ -468,7 +468,7 @@ class ReportController extends AbstractController if($project->getId()!=$this->get('session')->get('idproject')) continue; } - + // Ne prendre que les projets actif/inactif if($this->get('session')->get('activeproject')!=$project->getActive()) continue; @@ -541,10 +541,10 @@ class ReportController extends AbstractController "monthlabel"=>$event->getStart()->format("m/Y"), "duration" => 0, ]; - } + } $tbproject["before"][$event->getStart()->format("Y")][$event->getStart()->format("Ym")]["duration"]=$tbproject["before"][$event->getStart()->format("Y")][$event->getStart()->format("Ym")]["duration"]+$event->getDuration(); } - + // Somme astreinte validé avant la date $end=new \Datetime('first day of this month'); $end->sub(new \DateInterval('P'.$nbmonth.'M')); @@ -570,10 +570,10 @@ class ReportController extends AbstractController "monthlabel"=>$penalty->getStart()->format("m/Y"), "duration" => 0, ]; - } + } $tbproject["beforeastreinte"][$penalty->getStart()->format("Y")][$penalty->getStart()->format("Ym")]["duration"]=$tbproject["beforeastreinte"][$penalty->getStart()->format("Y")][$penalty->getStart()->format("Ym")]["duration"]+$penalty->getDuration(); } - + // Somme event validé par semaine $start=new \Datetime('first day of this month'); $start->sub(new \DateInterval('P'.$nbmonth.'M')); @@ -583,7 +583,7 @@ class ReportController extends AbstractController $endmonth->add(new \DateInterval('P1M')); $endmonth->modify('next monday'); $end->setTime(23,59,0); - + $eventsbyweek = $em ->createQueryBuilder('event') ->select('event') @@ -619,7 +619,7 @@ class ReportController extends AbstractController $endmonth->add(new \DateInterval('P1M')); $endmonth->modify('next monday'); $end->setTime(23,59,0); - + $penaltybyweek = $em ->createQueryBuilder('penalty') @@ -646,7 +646,7 @@ class ReportController extends AbstractController } $tbproject["weeks"][$penalty->getStart()->format("Y")][$penalty->getStart()->format("W")]["cumul"] = $tbproject["weeks"][$penalty->getStart()->format("Y")][$penalty->getStart()->format("W")]["cumul"]+$penalty->getDuration(); } - + // Recap des Commandes $offers=$em->getRepository("App:Offer")->findBy(["project"=>$project->getId()]); foreach($offers as $offer) { @@ -655,7 +655,7 @@ class ReportController extends AbstractController "ref"=>$offer->getRef(), "quantity"=>$offer->getQuantity(), ]; - } + } // Formater les mois $start=new \Datetime('first day of this month'); @@ -712,7 +712,7 @@ class ReportController extends AbstractController ]; $tbproject["months"][$start->format("Ym")]["tasks"][$event["id"]]=$tbtask; } - + $start->add(new \DateInterval('P1M')); } @@ -756,7 +756,7 @@ class ReportController extends AbstractController $end->add(new \DateInterval('P'.$nbmonth.'M')); $end->sub(new \DateInterval('P1D')); $end->setTime(23,59,0); - + foreach($users as $user) { $tbevents = $this->getEventuser($user,$start,$end,true); @@ -792,7 +792,7 @@ class ReportController extends AbstractController $totmonth+=$day["duration"]; $totmontha+=$day["astreinte"]; } - + if($totuser==0&&$totusera==0) { unset($tbprojects[$project["id"]]["months"][$month["monthid"]]["users"][$user["id"]]); } else { @@ -803,7 +803,7 @@ class ReportController extends AbstractController if(!$haveuser) unset($tbprojects[$project["id"]]["months"][$month["monthid"]]); - else { + else { $tbprojects[$project["id"]]["months"][$month["monthid"]]["total"]=$totmonth; $tbprojects[$project["id"]]["months"][$month["monthid"]]["totala"]=$totmontha; } @@ -823,9 +823,9 @@ class ReportController extends AbstractController return new PdfResponse( $this->knpSnappy->getOutputFromHtml($render,["orientation"=>"Landscape"]), 'report.pdf' - ); + ); } - else { + else { return $this->render('Report/report.html.twig',[ "useheader" => true, "usesidebar" => ($this->getUser()), @@ -833,7 +833,7 @@ class ReportController extends AbstractController "access" => $access, "key" => $key ]); - } + } } private function getEventuser($user,$start,$end,$onlyvalidate) { @@ -850,7 +850,7 @@ class ReportController extends AbstractController ->setParameter('end',$end); if($onlyvalidate) $qb->andWhere('event.validate=:validate')->setParameter('validate',true); - + $events=$qb->getQuery()->getResult(); foreach($events as $event) { $project=$event->getTask()->getProject(); @@ -869,14 +869,14 @@ class ReportController extends AbstractController if($idproject!=$this->get('session')->get('idproject')) continue; } - + // Ne prendre que les projets actif/inactif if($this->get('session')->get('activeproject')!=$activeproject) continue; if(!isset($tbevents[$idproject])) $tbevents[$idproject] = []; - + $st=clone $event->getStart(); while($st<$event->getEnd()) { $idday=$st->format("Ymd"); @@ -897,7 +897,7 @@ class ReportController extends AbstractController $st->add(new \DateInterval('P1D')); - } + } } @@ -912,7 +912,7 @@ class ReportController extends AbstractController ->setParameter('end',$end); if($onlyvalidate) $qb->andWhere('penalty.validate=:validate')->setParameter('validate',true); - + $penaltys=$qb->getQuery()->getResult(); foreach($penaltys as $penalty) { $project=$penalty->getTask()->getProject(); @@ -931,14 +931,14 @@ class ReportController extends AbstractController if($idproject!=$this->get('session')->get('idproject')) continue; } - + // Ne prendre que les projets actif/inactif if($this->get('session')->get('activeproject')!=$activeproject) continue; if(!isset($tbevents[$idproject])) $tbevents[$idproject] = []; - + $st=clone $penalty->getStart(); while($st<$penalty->getEnd()) { $idday=$st->format("Ymd"); @@ -959,7 +959,7 @@ class ReportController extends AbstractController $st->add(new \DateInterval('P1D')); - } + } } return $tbevents; @@ -968,7 +968,7 @@ class ReportController extends AbstractController public function holiday(Request $request) { $em = $this->getDoctrine()->getManager(); - + $iduser=$this->getUser(); $users=$em->getRepository("App:User")->findBy(["id"=>$iduser]); @@ -1017,13 +1017,13 @@ class ReportController extends AbstractController "useheader" => true, "usesidebar" => ($this->getUser()), "users" => $tbevents, - "fgprint" => $request->query->get('fgprint'), + "fgprint" => $request->query->get('fgprint'), ]); return new PdfResponse( $this->knpSnappy->getOutputFromHtml($render), 'conges.pdf' - ); + ); } else { return $this->render('Report/holiday.html.twig',[ @@ -1031,15 +1031,93 @@ class ReportController extends AbstractController "usesidebar" => ($this->getUser()), "users" => $tbevents ]); - } } + public function export(Request $request,$access=null): Response { + $nbmonth=$this->get("session")->get("nbmonth"); + $em = $this->getDoctrine()->getManager(); + $projects=$em->getRepository("App:Project")->findAll(); + + //Construction du tableau des projets + $tbprojects=[]; + foreach($projects as $project) { + // Filtre par Customer + if($access=="customer") { + if($project->getCustomer()->getKeypass()!=$key) + continue; + } + + // Filtre par Service + if($this->get('session')->get('idservice')!="all") { + if($project->getService()->getId()!=$this->get('session')->get('idservice')) + continue; + } + + // Filtre par project + if($this->get('session')->get('idproject')!="all") { + if($project->getId()!=$this->get('session')->get('idproject')) + continue; + } + + // Ne prendre que les projets actif/inactif + if($this->get('session')->get('activeproject')!=$project->getActive()) + continue; + + $tbproject= []; + $tbproject["projectname"] = $project->getDisplayname(); + // Somme event validé par semaine + $start=new \Datetime('first day of this month'); + $start->sub(new \DateInterval('P'.$nbmonth.'M')); + $start->modify('previous monday'); + $start->setTime(0,0,0); + $endmonth = new \Datetime('first day of this month'); + $endmonth->add(new \DateInterval('P1M')); + $endmonth->modify('next monday'); + + $eventsbyweek = $em + ->createQueryBuilder('event') + ->select('event') + ->from('App:Task','task') + ->from('App:Event','event') + ->Where('task.project=:project') + ->andWhere('event.task=task') + ->andWhere('event.end >=:start') + ->andWhere('event.end <:end') + ->andWhere('event.validate=:validate') + ->setParameter('project',$project) + ->setParameter('validate',true) + ->setParameter('start',$start) + ->setParameter('end',$endmonth) + ->orderBy('event.start') + ->getQuery()->getResult(); + + foreach($eventsbyweek as $event) { + if(!isset($tbproject["weeks"][$event->getStart()->format("Y")][$event->getStart()->format("W")])){ + $tbproject["weeks"][$event->getStart()->format("Y")][$event->getStart()->format("W")] = [ + "weeknumber" => $event->getStart()->format("W"), + "cumul" => 0, + ]; + } + $tbproject["weeks"][$event->getStart()->format("Y")][$event->getStart()->format("W")]["cumul"] = $tbproject["weeks"][$event->getStart()->format("Y")][$event->getStart()->format("W")]["cumul"]+$event->getDuration(); + + } + $tbprojects[$project->getId()]=$tbproject; + } + + $csv = $this->renderView('Report/export.csv.twig', ["projects" => $tbprojects]); + $response = new Response($csv); + $response->headers->set('Content-Type', 'text/csv; charset=utf-8'); + $response->headers->set('Content-Disposition', 'attachment; filename="export.csv"'); + + return $response; + } + public function activeholiday() { $this->get('session')->set('activeholiday',!$this->get('session')->get('activeholiday')); - + return $this->redirectToRoute("app_holiday"); - } + } private function frmDay($daynumber) { switch($daynumber) { @@ -1065,3 +1143,4 @@ class ReportController extends AbstractController } } } + diff --git a/src/schedule-2.0/templates/Report/export.csv.twig b/src/schedule-2.0/templates/Report/export.csv.twig new file mode 100644 index 0000000..97ec932 --- /dev/null +++ b/src/schedule-2.0/templates/Report/export.csv.twig @@ -0,0 +1,15 @@ +{% block body %} +{% for project in projects %} +{{ project.projectname|raw }} +{% for years in project %} +{% for year,weeks in years %} +{{year}} +;{% for week in weeks %}S{{week.weeknumber}};{% endfor %} + +;{% for week in weeks %}{{week.cumul}};{% endfor %} + +{% endfor %} +{% endfor %} + +{% endfor %} +{% endblock %} \ No newline at end of file diff --git a/src/schedule-2.0/templates/Report/report.html.twig b/src/schedule-2.0/templates/Report/report.html.twig index 45c5229..082a666 100644 --- a/src/schedule-2.0/templates/Report/report.html.twig +++ b/src/schedule-2.0/templates/Report/report.html.twig @@ -93,7 +93,6 @@ {% block body %} {% if fgprint is defined and fgprint %}

Planning

{%endif%} - {% if access=="customer" and not app.user %}
@@ -112,6 +111,13 @@
{% endif %} + {% if access!="customer" and app.user %} +
+
+ Exporter2 +
+
+ {% endif %} {% for project in projects %} {% if not project.months is empty or project.hors!=0 or not project.before is empty or not project.beforeastreinte is empty %}