Ajout d'un export csv hebdomadaire sur les rapports

This commit is contained in:
2020-06-19 11:56:33 +02:00
parent 32c08bcb52
commit 7fbed84998
4 changed files with 151 additions and 47 deletions

View File

@@ -288,6 +288,10 @@ app_report:
path: /user/report path: /user/report
defaults: { _controller: App\Controller\ReportController:report } defaults: { _controller: App\Controller\ReportController:report }
app_report_export:
path: /user/report/export
defaults: { _controller: App\Controller\ReportController:export }
app_holiday: app_holiday:
path: /user/holiday path: /user/holiday
defaults: { _controller: App\Controller\ReportController:holiday } defaults: { _controller: App\Controller\ReportController:holiday }

View File

@@ -6,6 +6,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse; use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
class ReportController extends AbstractController class ReportController extends AbstractController
{ {
@@ -15,7 +16,6 @@ class ReportController extends AbstractController
public function synthese(Request $request) public function synthese(Request $request)
{ {
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$nbmonth=$this->get("session")->get("nbmonth"); $nbmonth=$this->get("session")->get("nbmonth");
$iduser=$this->get("session")->get("iduser"); $iduser=$this->get("session")->get("iduser");
@@ -102,7 +102,7 @@ class ReportController extends AbstractController
$tmp["events"][$idday]["allday"]=true; $tmp["events"][$idday]["allday"]=true;
$tmp["events"][$idday]["colorday"]=$event->getTask()->getColor(); $tmp["events"][$idday]["colorday"]=$event->getTask()->getColor();
$tmp["events"][$idday]["descriptionday"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription(); $tmp["events"][$idday]["descriptionday"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription();
} }
else { else {
// Matin ou après-midi ? // Matin ou après-midi ?
$time=$event->getStart()->format("H"); $time=$event->getStart()->format("H");
@@ -119,7 +119,7 @@ class ReportController extends AbstractController
} }
$st->add(new \DateInterval('P1D')); $st->add(new \DateInterval('P1D'));
} }
} }
// On formate le tableau des astreintes // On formate le tableau des astreintes
@@ -157,7 +157,7 @@ class ReportController extends AbstractController
} }
$st->add(new \DateInterval('P1D')); $st->add(new \DateInterval('P1D'));
} }
} }
// On formate le tableau des jours fériés // On formate le tableau des jours fériés
@@ -184,7 +184,7 @@ class ReportController extends AbstractController
$tmp["events"][$idday]["descriptionday"]="Jour Férié"; $tmp["events"][$idday]["descriptionday"]="Jour Férié";
$st->add(new \DateInterval('P1D')); $st->add(new \DateInterval('P1D'));
} }
} }
array_push($tbevents,$tmp); array_push($tbevents,$tmp);
@@ -202,9 +202,9 @@ class ReportController extends AbstractController
return new PdfResponse( return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($render), $this->knpSnappy->getOutputFromHtml($render),
'synthese.pdf' 'synthese.pdf'
); );
} }
else { else {
return $this->render('Report/synthese.html.twig',[ return $this->render('Report/synthese.html.twig',[
"useheader" => true, "useheader" => true,
"usesidebar" => ($this->getUser()), "usesidebar" => ($this->getUser()),
@@ -246,7 +246,7 @@ class ReportController extends AbstractController
if($project->getId()!=$this->get('session')->get('idproject')) if($project->getId()!=$this->get('session')->get('idproject'))
continue; continue;
} }
// Ne prendre que les projets actif/inactif // Ne prendre que les projets actif/inactif
if($this->get('session')->get('activeproject')!=$project->getActive()) if($this->get('session')->get('activeproject')!=$project->getActive())
continue; continue;
@@ -350,7 +350,7 @@ class ReportController extends AbstractController
$end=new \Datetime('first day of this month'); $end=new \Datetime('first day of this month');
$end->add(new \DateInterval('P'.$nbmonth.'M')); $end->add(new \DateInterval('P'.$nbmonth.'M'));
$end->sub(new \DateInterval('P1D')); $end->sub(new \DateInterval('P1D'));
foreach($users as $user) { foreach($users as $user) {
$tbevents = $this->getEventuser($user,$start,$end,false); $tbevents = $this->getEventuser($user,$start,$end,false);
@@ -368,7 +368,7 @@ class ReportController extends AbstractController
} }
} }
} }
// Cumule // Cumule
foreach($tbprojects as $project) { foreach($tbprojects as $project) {
foreach($project["months"] as $month) { foreach($project["months"] as $month) {
@@ -387,7 +387,7 @@ class ReportController extends AbstractController
$totmonth+=$day["duration"]; $totmonth+=$day["duration"];
$totmontha+=$day["astreinte"]; $totmontha+=$day["astreinte"];
} }
if($totuser==0&&$totusera==0) { if($totuser==0&&$totusera==0) {
unset($tbprojects[$project["id"]]["months"][$month["monthid"]]["users"][$user["id"]]); unset($tbprojects[$project["id"]]["months"][$month["monthid"]]["users"][$user["id"]]);
} else { } else {
@@ -398,7 +398,7 @@ class ReportController extends AbstractController
if(!$haveuser) if(!$haveuser)
unset($tbprojects[$project["id"]]["months"][$month["monthid"]]); unset($tbprojects[$project["id"]]["months"][$month["monthid"]]);
else { else {
$tbprojects[$project["id"]]["months"][$month["monthid"]]["total"]=$totmonth; $tbprojects[$project["id"]]["months"][$month["monthid"]]["total"]=$totmonth;
$tbprojects[$project["id"]]["months"][$month["monthid"]]["totala"]=$totmontha; $tbprojects[$project["id"]]["months"][$month["monthid"]]["totala"]=$totmontha;
} }
@@ -418,9 +418,9 @@ class ReportController extends AbstractController
return new PdfResponse( return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($render,["orientation"=>"Landscape"]), $this->knpSnappy->getOutputFromHtml($render,["orientation"=>"Landscape"]),
'planning.pdf' 'planning.pdf'
); );
} }
else { else {
return $this->render('Report/planning.html.twig',[ return $this->render('Report/planning.html.twig',[
"useheader" => true, "useheader" => true,
"usesidebar" => ($this->getUser()), "usesidebar" => ($this->getUser()),
@@ -428,7 +428,7 @@ class ReportController extends AbstractController
"access" => $access, "access" => $access,
"key" => $key "key" => $key
]); ]);
} }
} }
public function report($key=null,$access=null,Request $request) { public function report($key=null,$access=null,Request $request) {
@@ -447,7 +447,7 @@ class ReportController extends AbstractController
} }
$projects=$em->getRepository("App:Project")->findAll(); $projects=$em->getRepository("App:Project")->findAll();
//Construction du tableau des projets //Construction du tableau des projets
$tbprojects=[]; $tbprojects=[];
foreach($projects as $project) { foreach($projects as $project) {
@@ -468,7 +468,7 @@ class ReportController extends AbstractController
if($project->getId()!=$this->get('session')->get('idproject')) if($project->getId()!=$this->get('session')->get('idproject'))
continue; continue;
} }
// Ne prendre que les projets actif/inactif // Ne prendre que les projets actif/inactif
if($this->get('session')->get('activeproject')!=$project->getActive()) if($this->get('session')->get('activeproject')!=$project->getActive())
continue; continue;
@@ -541,10 +541,10 @@ class ReportController extends AbstractController
"monthlabel"=>$event->getStart()->format("m/Y"), "monthlabel"=>$event->getStart()->format("m/Y"),
"duration" => 0, "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(); $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 // Somme astreinte validé avant la date
$end=new \Datetime('first day of this month'); $end=new \Datetime('first day of this month');
$end->sub(new \DateInterval('P'.$nbmonth.'M')); $end->sub(new \DateInterval('P'.$nbmonth.'M'));
@@ -570,10 +570,10 @@ class ReportController extends AbstractController
"monthlabel"=>$penalty->getStart()->format("m/Y"), "monthlabel"=>$penalty->getStart()->format("m/Y"),
"duration" => 0, "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(); $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 // Somme event validé par semaine
$start=new \Datetime('first day of this month'); $start=new \Datetime('first day of this month');
$start->sub(new \DateInterval('P'.$nbmonth.'M')); $start->sub(new \DateInterval('P'.$nbmonth.'M'));
@@ -583,7 +583,7 @@ class ReportController extends AbstractController
$endmonth->add(new \DateInterval('P1M')); $endmonth->add(new \DateInterval('P1M'));
$endmonth->modify('next monday'); $endmonth->modify('next monday');
$end->setTime(23,59,0); $end->setTime(23,59,0);
$eventsbyweek = $em $eventsbyweek = $em
->createQueryBuilder('event') ->createQueryBuilder('event')
->select('event') ->select('event')
@@ -619,7 +619,7 @@ class ReportController extends AbstractController
$endmonth->add(new \DateInterval('P1M')); $endmonth->add(new \DateInterval('P1M'));
$endmonth->modify('next monday'); $endmonth->modify('next monday');
$end->setTime(23,59,0); $end->setTime(23,59,0);
$penaltybyweek = $em $penaltybyweek = $em
->createQueryBuilder('penalty') ->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(); $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 // Recap des Commandes
$offers=$em->getRepository("App:Offer")->findBy(["project"=>$project->getId()]); $offers=$em->getRepository("App:Offer")->findBy(["project"=>$project->getId()]);
foreach($offers as $offer) { foreach($offers as $offer) {
@@ -655,7 +655,7 @@ class ReportController extends AbstractController
"ref"=>$offer->getRef(), "ref"=>$offer->getRef(),
"quantity"=>$offer->getQuantity(), "quantity"=>$offer->getQuantity(),
]; ];
} }
// Formater les mois // Formater les mois
$start=new \Datetime('first day of this month'); $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; $tbproject["months"][$start->format("Ym")]["tasks"][$event["id"]]=$tbtask;
} }
$start->add(new \DateInterval('P1M')); $start->add(new \DateInterval('P1M'));
} }
@@ -756,7 +756,7 @@ class ReportController extends AbstractController
$end->add(new \DateInterval('P'.$nbmonth.'M')); $end->add(new \DateInterval('P'.$nbmonth.'M'));
$end->sub(new \DateInterval('P1D')); $end->sub(new \DateInterval('P1D'));
$end->setTime(23,59,0); $end->setTime(23,59,0);
foreach($users as $user) { foreach($users as $user) {
$tbevents = $this->getEventuser($user,$start,$end,true); $tbevents = $this->getEventuser($user,$start,$end,true);
@@ -792,7 +792,7 @@ class ReportController extends AbstractController
$totmonth+=$day["duration"]; $totmonth+=$day["duration"];
$totmontha+=$day["astreinte"]; $totmontha+=$day["astreinte"];
} }
if($totuser==0&&$totusera==0) { if($totuser==0&&$totusera==0) {
unset($tbprojects[$project["id"]]["months"][$month["monthid"]]["users"][$user["id"]]); unset($tbprojects[$project["id"]]["months"][$month["monthid"]]["users"][$user["id"]]);
} else { } else {
@@ -803,7 +803,7 @@ class ReportController extends AbstractController
if(!$haveuser) if(!$haveuser)
unset($tbprojects[$project["id"]]["months"][$month["monthid"]]); unset($tbprojects[$project["id"]]["months"][$month["monthid"]]);
else { else {
$tbprojects[$project["id"]]["months"][$month["monthid"]]["total"]=$totmonth; $tbprojects[$project["id"]]["months"][$month["monthid"]]["total"]=$totmonth;
$tbprojects[$project["id"]]["months"][$month["monthid"]]["totala"]=$totmontha; $tbprojects[$project["id"]]["months"][$month["monthid"]]["totala"]=$totmontha;
} }
@@ -823,9 +823,9 @@ class ReportController extends AbstractController
return new PdfResponse( return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($render,["orientation"=>"Landscape"]), $this->knpSnappy->getOutputFromHtml($render,["orientation"=>"Landscape"]),
'report.pdf' 'report.pdf'
); );
} }
else { else {
return $this->render('Report/report.html.twig',[ return $this->render('Report/report.html.twig',[
"useheader" => true, "useheader" => true,
"usesidebar" => ($this->getUser()), "usesidebar" => ($this->getUser()),
@@ -833,7 +833,7 @@ class ReportController extends AbstractController
"access" => $access, "access" => $access,
"key" => $key "key" => $key
]); ]);
} }
} }
private function getEventuser($user,$start,$end,$onlyvalidate) { private function getEventuser($user,$start,$end,$onlyvalidate) {
@@ -850,7 +850,7 @@ class ReportController extends AbstractController
->setParameter('end',$end); ->setParameter('end',$end);
if($onlyvalidate) if($onlyvalidate)
$qb->andWhere('event.validate=:validate')->setParameter('validate',true); $qb->andWhere('event.validate=:validate')->setParameter('validate',true);
$events=$qb->getQuery()->getResult(); $events=$qb->getQuery()->getResult();
foreach($events as $event) { foreach($events as $event) {
$project=$event->getTask()->getProject(); $project=$event->getTask()->getProject();
@@ -869,14 +869,14 @@ class ReportController extends AbstractController
if($idproject!=$this->get('session')->get('idproject')) if($idproject!=$this->get('session')->get('idproject'))
continue; continue;
} }
// Ne prendre que les projets actif/inactif // Ne prendre que les projets actif/inactif
if($this->get('session')->get('activeproject')!=$activeproject) if($this->get('session')->get('activeproject')!=$activeproject)
continue; continue;
if(!isset($tbevents[$idproject])) if(!isset($tbevents[$idproject]))
$tbevents[$idproject] = []; $tbevents[$idproject] = [];
$st=clone $event->getStart(); $st=clone $event->getStart();
while($st<$event->getEnd()) { while($st<$event->getEnd()) {
$idday=$st->format("Ymd"); $idday=$st->format("Ymd");
@@ -897,7 +897,7 @@ class ReportController extends AbstractController
$st->add(new \DateInterval('P1D')); $st->add(new \DateInterval('P1D'));
} }
} }
@@ -912,7 +912,7 @@ class ReportController extends AbstractController
->setParameter('end',$end); ->setParameter('end',$end);
if($onlyvalidate) if($onlyvalidate)
$qb->andWhere('penalty.validate=:validate')->setParameter('validate',true); $qb->andWhere('penalty.validate=:validate')->setParameter('validate',true);
$penaltys=$qb->getQuery()->getResult(); $penaltys=$qb->getQuery()->getResult();
foreach($penaltys as $penalty) { foreach($penaltys as $penalty) {
$project=$penalty->getTask()->getProject(); $project=$penalty->getTask()->getProject();
@@ -931,14 +931,14 @@ class ReportController extends AbstractController
if($idproject!=$this->get('session')->get('idproject')) if($idproject!=$this->get('session')->get('idproject'))
continue; continue;
} }
// Ne prendre que les projets actif/inactif // Ne prendre que les projets actif/inactif
if($this->get('session')->get('activeproject')!=$activeproject) if($this->get('session')->get('activeproject')!=$activeproject)
continue; continue;
if(!isset($tbevents[$idproject])) if(!isset($tbevents[$idproject]))
$tbevents[$idproject] = []; $tbevents[$idproject] = [];
$st=clone $penalty->getStart(); $st=clone $penalty->getStart();
while($st<$penalty->getEnd()) { while($st<$penalty->getEnd()) {
$idday=$st->format("Ymd"); $idday=$st->format("Ymd");
@@ -959,7 +959,7 @@ class ReportController extends AbstractController
$st->add(new \DateInterval('P1D')); $st->add(new \DateInterval('P1D'));
} }
} }
return $tbevents; return $tbevents;
@@ -968,7 +968,7 @@ class ReportController extends AbstractController
public function holiday(Request $request) public function holiday(Request $request)
{ {
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$iduser=$this->getUser(); $iduser=$this->getUser();
$users=$em->getRepository("App:User")->findBy(["id"=>$iduser]); $users=$em->getRepository("App:User")->findBy(["id"=>$iduser]);
@@ -1017,13 +1017,13 @@ class ReportController extends AbstractController
"useheader" => true, "useheader" => true,
"usesidebar" => ($this->getUser()), "usesidebar" => ($this->getUser()),
"users" => $tbevents, "users" => $tbevents,
"fgprint" => $request->query->get('fgprint'), "fgprint" => $request->query->get('fgprint'),
]); ]);
return new PdfResponse( return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($render), $this->knpSnappy->getOutputFromHtml($render),
'conges.pdf' 'conges.pdf'
); );
} }
else { else {
return $this->render('Report/holiday.html.twig',[ return $this->render('Report/holiday.html.twig',[
@@ -1031,15 +1031,93 @@ class ReportController extends AbstractController
"usesidebar" => ($this->getUser()), "usesidebar" => ($this->getUser()),
"users" => $tbevents "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() { public function activeholiday() {
$this->get('session')->set('activeholiday',!$this->get('session')->get('activeholiday')); $this->get('session')->set('activeholiday',!$this->get('session')->get('activeholiday'));
return $this->redirectToRoute("app_holiday"); return $this->redirectToRoute("app_holiday");
} }
private function frmDay($daynumber) { private function frmDay($daynumber) {
switch($daynumber) { switch($daynumber) {
@@ -1065,3 +1143,4 @@ class ReportController extends AbstractController
} }
} }
} }

View File

@@ -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 %}

View File

@@ -93,7 +93,6 @@
{% block body %} {% block body %}
{% if fgprint is defined and fgprint %}<h1>Planning</h1>{%endif%} {% if fgprint is defined and fgprint %}<h1>Planning</h1>{%endif%}
{% if access=="customer" and not app.user %} {% if access=="customer" and not app.user %}
<div class="no-print" style="margin-top:10px;"> <div class="no-print" style="margin-top:10px;">
<style> .select2-container { display:inline-block} </style> <style> .select2-container { display:inline-block} </style>
@@ -112,6 +111,13 @@
</select> </select>
</div> </div>
{% endif %} {% endif %}
{% if access!="customer" and app.user %}
<div class="card">
<div class="card-header">
<a href="{{ path('app_report_export') }}" class="btn btn-success">Exporter2</a>
</div>
</div>
{% endif %}
{% for project in projects %} {% 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 %} {% if not project.months is empty or project.hors!=0 or not project.before is empty or not project.beforeastreinte is empty %}
<div class="card"> <div class="card">