From 1b7ac66fe82605fa679e05689a46a1d7fa3e0a07 Mon Sep 17 00:00:00 2001 From: afornerot Date: Wed, 10 May 2023 10:18:40 +0200 Subject: [PATCH] add export csv --- src/ninegitea-1.0/config/routes.yaml | 8 +- .../src/Controller/ReportController.php | 299 +++--------------- .../templates/Report/csv.html.twig | 66 ++++ 3 files changed, 118 insertions(+), 255 deletions(-) create mode 100644 src/ninegitea-1.0/templates/Report/csv.html.twig diff --git a/src/ninegitea-1.0/config/routes.yaml b/src/ninegitea-1.0/config/routes.yaml index 74984bd..ba7109d 100644 --- a/src/ninegitea-1.0/config/routes.yaml +++ b/src/ninegitea-1.0/config/routes.yaml @@ -165,10 +165,14 @@ app_group_select: defaults: { _controller: App\Controller\GroupController:select } #== Report ======================================================================================================= -app_report: - path: /user/report/{id} +app_report_list: + path: /user/report/list/{id} defaults: { _controller: App\Controller\ReportController:list } +app_report_csv: + path: /user/report/csv/{id} + defaults: { _controller: App\Controller\ReportController:csv } + #== Scrum ======================================================================================================== app_scrum: path: /user/scrum diff --git a/src/ninegitea-1.0/src/Controller/ReportController.php b/src/ninegitea-1.0/src/Controller/ReportController.php index 99fdbd1..a66fc50 100755 --- a/src/ninegitea-1.0/src/Controller/ReportController.php +++ b/src/ninegitea-1.0/src/Controller/ReportController.php @@ -5,17 +5,18 @@ namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Form\FormError; - -use App\Entity\Scrum as Entity; -use App\Entity\Scrumissue as Scrumissue; -use App\Form\ScrumType as Form; - +use Symfony\Component\HttpKernel\KernelInterface; +use Symfony\Component\HttpFoundation\BinaryFileResponse; +use Symfony\Component\Filesystem\Filesystem; +use Symfony\Component\HttpFoundation\ResponseHeaderBag; use App\Service\giteaService; class ReportController extends AbstractController { - public function __construct(giteaService $giteaservice) { $this->giteaservice = $giteaservice; } + public function __construct(KernelInterface $appKernel, giteaService $giteaservice) { + $this->appKernel = $appKernel; + $this->giteaservice = $giteaservice; + } public function list($id,Request $request) { @@ -51,260 +52,52 @@ class ReportController extends AbstractController } - public function submit(Request $request) + public function csv($id,Request $request) { - // Initialisation de l'enregistrement + set_time_limit(0); + $em = $this->getDoctrine()->getManager(); - $data = new Entity(); + $scrum = $em->getRepository("App:Scrum")->find($id); + $repoid = $scrum->getGiteaid(); + $repoowner = $scrum->getGiteajson()["owner"]["login"]; + $reponame = $scrum->getGiteajson()["name"]; + + $repo=$this->giteaservice->getRepo($repoid); + $issues=$this->giteaservice->getIssues($repoowner,$reponame,"?state=all"); + + $fs = new Filesystem(); + $rootdir = $this->appKernel->getProjectDir(); + $destdir = $rootdir."/var/log/export.csv"; - // Récupérer les repos de gitea - $gitearepos=$this->giteaservice->getRepos(); - - // Création du formulaire - $form = $this->createForm(Form::class,$data,array("mode"=>"submit","gitearepos"=>$gitearepos)); + $csvh = fopen($destdir, 'w'); + $d = ';'; // this is the default but i like to be explicit + $e = '"'; // this is the default but i like to be explicit - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur erreur - $this->getErrorForm(null,$form,$request,$data,"submit"); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - $gitearepo=$this->giteaservice->getRepo($data->getGiteaid()); - $data->setGiteaname($gitearepo->full_name); - $data->setGiteajson(json_decode(json_encode($gitearepo), true)); + $tbcumul=[]; - $em->persist($data); - $em->flush(); + foreach($issues as $issue) { + $monthsubmit=new \DateTime($issue->created_at); + $monthsubmit=$monthsubmit->format("Ym"); + if(!array_key_exists($monthsubmit,$tbcumul)) + $tbcumul[$monthsubmit]=["month"=>$monthsubmit,"nbsubmit"=>0,"nbclose"=>0]; + $tbcumul[$monthsubmit]["nbsubmit"]=$tbcumul[$monthsubmit]["nbsubmit"]+1; - // Retour à la liste - return $this->redirectToRoute($this->route); - } - - // Affichage du formulaire - return $this->render($this->render.'edit.html.twig', [ - 'useheader' => true, - 'usesidebar' => false, - 'maxwidth' => true, - $this->data => $data, - 'mode' => 'submit', - 'form' => $form->createView() - ]); - } - - public function update($id,Request $request) - { - // Initialisation de l'enregistrement - $em = $this->getDoctrine()->getManager(); - $data=$em->getRepository($this->entity)->find($id); - - // Récupérer les repos de gitea - $gitearepos=$this->giteaservice->getRepos(); - - // Création du formulaire - $form = $this->createForm(Form::class,$data,array("mode"=>"update","gitearepos"=>$gitearepos)); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur erreur - $this->getErrorForm(null,$form,$request,$data,"update"); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - $gitearepo=$this->giteaservice->getRepo($data->getGiteaid()); - $data->setGiteaname($gitearepo->full_name); - $data->setGiteajson(json_decode(json_encode($gitearepo), true)); - - $em->persist($data); - $em->flush(); - - // Retour à la liste - return $this->redirectToRoute($this->route); - } - - // Affichage du formulaire - return $this->render($this->render.'edit.html.twig', [ - 'useheader' => true, - 'usesidebar' => false, - 'maxwidth' => true, - $this->data => $data, - 'mode' => 'update', - 'form' => $form->createView() - ]); - } - - public function delete($id,Request $request) - { - // Initialisation de l'enregistrement - $em = $this->getDoctrine()->getManager(); - $data=$em->getRepository($this->entity)->find($id); - - // Controle avant suppression - $error=false; - if($id<0) $error=true; - - if($error) - return $this->redirectToRoute($this->route."_update",["id"=>$id]); - else { - $em->remove($data); - $em->flush(); - - // Retour à la liste - return $this->redirectToRoute($this->route); - } - } - - public function view($id,Request $request) - { - // Initialisation de l'enregistrement - $em = $this->getDoctrine()->getManager(); - $data=$em->getRepository($this->entity)->find($id); - if(!$data) return $this->redirectToRoute($this->route); - - $em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$giteateams,$giteaprioritys,$gitealabels); - - // Préférences utilisateur - $filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id); - $filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id); - $filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id); - $filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id); - $filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id); - $filterexcludes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterexcludes",$id); - $showfilters = $em->getRepository("App:User")->getUserpreference($this->getUser(),"showfilters",$id); - - return $this->render($this->render.'view.html.twig', [ - 'useheader' => true, - 'usesidebar' => false, - 'usetitle' => $data->getName(), - 'giteaassignees' => $giteaassignees, - 'giteacolumns' => $giteacolumns, - 'giteamilestones' => $giteamilestones, - 'giteateams' => $giteateams, - 'giteaprioritys' => $giteaprioritys, - 'gitealabels' => $gitealabels, - 'filtermilestones' => $filtermilestones, - 'filterteams' => $filterteams, - 'filterprioritys' => $filterprioritys, - 'filterlabels' => $filterlabels, - 'filterassignees' => $filterassignees, - 'filterexcludes' => $filterexcludes, - 'showfilters' => $showfilters, - $this->data => $data, - ]); - } - - public function stat($id,Request $request) - { - // Initialisation de l'enregistrement - $em = $this->getDoctrine()->getManager(); - $data=$em->getRepository($this->entity)->find($id); - if(!$data) return $this->redirectToRoute($this->route); - - $em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$giteateams,$giteaprioritys,$gitealabels); - - // Préférences utilisateur - $filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id); - $filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id); - $showfilters = $em->getRepository("App:User")->getUserpreference($this->getUser(),"showfilters",$id); - - $tbstat=[]; - foreach($data->getScrumIssues() as $issue) { - - $labels=$issue->getGiteajson()["labels"]; - $haveteams=true; - if($filterteams) { - $haveteams=false; - foreach($filterteams as $filterteam) { - foreach($labels as $label) { - if($label["id"]==$filterteam) { - $haveteams=true; - } - } - } - } - - if($haveteams) { - $idmilestone=($issue->getGiteamilestone()?$issue->getGiteamilestone():-100); - $lbmilestone=($issue->getGiteamilestone()?$issue->getGiteamilestonename():"Aucun"); - if(!array_key_exists($idmilestone,$tbstat)) { - $tbstat[$idmilestone]=["id"=>$idmilestone,"name"=>$lbmilestone,"stat"=>[]]; - } - - if(!array_key_exists($issue->getScrumcolumn()->getId(),$tbstat[$idmilestone]["stat"])) { - $tbstat[$idmilestone]["stat"][$issue->getScrumcolumn()->getId()]=[ - "id"=>$issue->getScrumcolumn()->getId(), - "label"=>$issue->getScrumcolumn()->getName(), - "total"=>0, - "color"=>"#".$issue->getScrumcolumn()->getGiteajson()["color"], - "labels"=>[], - ]; - } - - foreach($labels as $label) { - if($issue->getScrumcolumn()->getGiteaid()!=$label["id"]) { - if(!array_key_exists($label["id"],$tbstat[$idmilestone]["stat"][$issue->getScrumcolumn()->getId()]["labels"])) { - $tbstat[$idmilestone]["stat"][$issue->getScrumcolumn()->getId()]["labels"][$label["id"]] = [ - "id"=>$label["id"], - "label"=>$label["name"], - "total"=>0, - "color"=>"#".$label["color"], - ]; - } - $tbstat[$idmilestone]["stat"][$issue->getScrumcolumn()->getId()]["labels"][$label["id"]]["total"]++; - } - } - - $tbstat[$idmilestone]["stat"][$issue->getScrumcolumn()->getId()]["total"]++; - } + $monthclose=new \DateTime($issue->closed_at); + $monthclose=$monthclose->format("Ym"); + if(!array_key_exists($monthclose,$tbcumul)) + $tbcumul[$monthclose]=["month"=>$monthclose,"nbsubmit"=>0,"nbclose"=>0]; + $tbcumul[$monthclose]["nbclose"]=$tbcumul[$monthclose]["nbclose"]+1; } - foreach($tbstat as $k1=>$milestone) { - foreach($milestone["stat"] as $k2=>$statut) { - $keysort = array_column($tbstat[$k1]["stat"][$k2]["labels"], 'label'); - array_multisort($keysort, SORT_ASC, $tbstat[$k1]["stat"][$k2]["labels"]); - } - + foreach($tbcumul as $cumul) { + fputcsv($csvh, $cumul, $d, $e); } + fclose($csvh); + + $response = new BinaryFileResponse($destdir); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); + + return $response; - return $this->render($this->render.'stat.html.twig', [ - 'useheader' => true, - 'usesidebar' => false, - 'usetitle' => $data->getName(), - 'giteaassignees' => $giteaassignees, - 'giteacolumns' => $giteacolumns, - 'giteamilestones' => $giteamilestones, - 'giteateams' => $giteateams, - 'giteaprioritys' => $giteaprioritys, - 'gitealabels' => $gitealabels, - 'filtermilestones' => $filtermilestones, - 'filterteams' => $filterteams, - 'showfilters' => $showfilters, - $this->data => $data, - 'tbstat' => $tbstat, - ]); - } - - protected function getErrorForm($id,$form,$request,$data,$mode) { - if ($form->get('submit')->isClicked()&&$mode=="delete") { - } - - if ($form->get('submit')->isClicked() && $mode=="submit") { - } - - if ($form->get('submit')->isClicked() && ($mode=="submit" || $mode=="update")) { - } - - if ($form->get('submit')->isClicked() && !$form->isValid()) { - $this->get('session')->getFlashBag()->clear(); - - $errors = $form->getErrors(); - foreach( $errors as $error ) { - $request->getSession()->getFlashBag()->add("error", $error->getMessage()); - } - } - } + } } diff --git a/src/ninegitea-1.0/templates/Report/csv.html.twig b/src/ninegitea-1.0/templates/Report/csv.html.twig new file mode 100644 index 0000000..5149c0d --- /dev/null +++ b/src/ninegitea-1.0/templates/Report/csv.html.twig @@ -0,0 +1,66 @@ +{% extends "base.html.twig" %} + +{% block localstyle %} + body { + background-color: #efefef; + } + + .issuetitle { + margin-top:100px; + page-break-before: always; + } + + .issuediv { + zoom:60%; + } + + .issuecontent { + width:80%; + } + .issuedetail { + width:20%; + } + + @media print { + body { + background-color: transparent; + } + } +{% endblock %} + +{% block body %} + +

{{repo.full_name}}

+ + + + + + + + + + + {% for issue in issues %} + + + + + + + {% endfor %} + +
idtitresubmitclos
{{issue.number}}{{issue.title}}{{issue.created_at|date("d/m/Y H:i")}}{{ (issue.closed_at ? issue.closed_at|date("d/m/Y H:i") : "") }}
+{% endblock %} + +{% block localjavascript %} +$(document).ready(function() { + $('#dataTables').DataTable( { + dom: 'Bfrtip', + buttons: [ + 'copy', 'csv', 'excel', 'pdf', 'print' + ] + } ); +} ); +{% endblock %} +