add export csv
This commit is contained in:
parent
2c123e7089
commit
1b7ac66fe8
@ -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
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
66
src/ninegitea-1.0/templates/Report/csv.html.twig
Normal file
66
src/ninegitea-1.0/templates/Report/csv.html.twig
Normal file
@ -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 %}
|
||||
|
||||
<h1>{{repo.full_name}}</h1>
|
||||
<table class="mt-4 table table-striped table-bordered table-hover" id="dataTables" style="width:100%; zoom:80%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>id</th>
|
||||
<th>titre</th>
|
||||
<th>submit</th>
|
||||
<th>clos</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for issue in issues %}
|
||||
<tr>
|
||||
<td>{{issue.number}}</td>
|
||||
<td>{{issue.title}}</td>
|
||||
<td>{{issue.created_at|date("d/m/Y H:i")}}</td>
|
||||
<td>{{ (issue.closed_at ? issue.closed_at|date("d/m/Y H:i") : "") }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock %}
|
||||
|
||||
{% block localjavascript %}
|
||||
$(document).ready(function() {
|
||||
$('#dataTables').DataTable( {
|
||||
dom: 'Bfrtip',
|
||||
buttons: [
|
||||
'copy', 'csv', 'excel', 'pdf', 'print'
|
||||
]
|
||||
} );
|
||||
} );
|
||||
{% endblock %}
|
||||
|
Loading…
Reference in New Issue
Block a user