mise en place de sprint dans les jalons

This commit is contained in:
2024-02-15 18:59:09 +01:00
parent ecb1d43b38
commit 9205735d1f
21 changed files with 1768 additions and 729 deletions

View File

@ -1,212 +0,0 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
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 IssueController extends AbstractController
{
private $appKernel;
private $data = "issue";
private $route = "app_issue";
private $render = "Issue/";
private $entity = "App:Issue";
public function __construct(KernelInterface $appKernel,giteaService $giteaservice) {
$this->appKernel = $appKernel;
$this->giteaservice = $giteaservice;
}
public function list($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$fgcsv = $request->get("fgcsv");
// Récupérer les repos de gitea
if($id==0) $scrums=$em->getRepository("App:Scrum")->findBy([],["name"=>"ASC"]);
else $scrums=$em->getRepository("App:Scrum")->findBy(["id"=>$id],["name"=>"ASC"]);
$giteacategorys=[];
$gitearepos=[];
$giteamilestones=[];
$giteacolumns=[];
$giteateams=[];
$giteaprioritys=[];
$giteatypes=[];
$gitealabels=[];
$giteaassignees=$em->getRepository("App:User")->findBy([],["username"=>"ASC"]);
$viewclosed = $request->getSession()->get("viewclosed");
foreach($scrums as $key => $scrum) {
if(!in_array($scrum->getCategory(),$giteacategorys))
array_push($giteacategorys,$scrum->getCategory());
$gitearepo=$this->giteaservice->getRepo($scrum->getGiteajson()["id"]);
if(!$gitearepo) die("Probleme de connexion avec gitea veuillez vous <a href='/ninegitea/logout'>reconnecter</a>");
if($gitearepo->updated_at!=$scrum->getGiteajson()["updated_at"]||$gitearepo->open_issues_count!=$scrum->getGiteajson()["open_issues_count"]) {
$scrum->setGiteajson(json_decode(json_encode($gitearepo), true));
$em->persist($scrum);
$em->flush();
}
if($gitearepo->open_issues_count>0) {
$giteatmp=$this->giteaservice->getMilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open"));
foreach($giteatmp as $key => $value) {
$giteatmp[$key]->title = $scrum->getGiteajson()["full_name"]. " = ".$giteatmp[$key]->title;
}
array_push($giteatmp,["id"=>$scrum->getGiteajson()["full_name"],"title"=> $scrum->getGiteajson()["full_name"]. " = Aucun Jalon"]);
$giteamilestones=array_merge($giteamilestones,$giteatmp);
$giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open"));
$json=$scrum->getGiteajson();
$json["issues"]=$giteaissues;
$json["category"]=$scrum->getCategory();
foreach($json["issues"] as $key => $giteaissue) {
$issue=$em->getRepository("App:Scrumissue")->findOneBy(["giteaid"=>$giteaissue->id]);
if($issue) {
$json["issues"][$key]->weight=$issue->getWeight();
$json["issues"][$key]->issueid=$issue->getId();
$json["issues"][$key]->scrumid=$issue->getScrum()->getId();
}
else {
$json["issues"][$key]->weight=0;
$json["issues"][$key]->issueid=0;
$json["issues"][$key]->scrumid=0;
}
}
$tmp=[];
foreach($scrum->getScrumcolumns() as $column) {
array_push($tmp,$column->getGiteaid());
if(!in_array($column->getGiteajson()["name"],$giteacolumns))
array_push($giteacolumns,$column->getGiteajson()["name"]);
}
$json["columns"]=$tmp;
array_push($gitearepos,$json);
foreach($scrum->getScrumteams() as $team) {
if(!in_array($team->getGiteajson()["name"],$giteateams))
array_push($giteateams,$team->getGiteajson()["name"]);
}
foreach($scrum->getScrumprioritys() as $priority) {
if(!in_array($priority->getGiteajson()["name"],$giteaprioritys))
array_push($giteaprioritys,$priority->getGiteajson()["name"]);
}
foreach($scrum->getScrumtypes() as $type) {
if(!in_array($type->getGiteajson()["name"],$giteatypes))
array_push($giteatypes,$type->getGiteajson()["name"]);
}
foreach($giteaissues as $giteaissue) {
foreach($giteaissue->labels as $label) {
if(!in_array($label->name,$gitealabels))
array_push($gitealabels,$label->name);
}
}
}
}
$keysort = array_column($giteamilestones, 'title');
array_multisort($keysort, SORT_DESC, $giteamilestones);
sort($giteacolumns);
sort($giteateams);
sort($giteaprioritys);
sort($giteatypes);
sort($gitealabels);
sort($giteacategorys);
// Préférences utilisateur
$filtercategorys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercategorys",$id);
$filterrepos = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterrepos",$id);
$filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id);
$filtercolumns = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercolumns",$id);
$filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id);
$filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id);
$filtertypes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtertypes",$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);
if($fgcsv) {
$dir = $this->appKernel->getProjectDir() . '/uploads/issues/';
$file = "issues-".$id.".csv";
$fs = new Filesystem();
$fs->mkdir($dir);
$csvh = fopen($dir.$file, 'w');
$d = ';'; // this is the default but i like to be explicit
$e = '"'; // this is the default but i like to be explicit
$tmp=["Projet","Jalon","Type","Id","Titre","Statut","Label"];
fputcsv($csvh, $tmp, $d, $e);
foreach($gitearepos as $gitearepo) {
foreach($gitearepo["issues"] as $giteaissue) {
$statut="";
$type="";
$labels="";
foreach($giteaissue->labels as $label) {
if(in_array($label->id,$gitearepo["columns"]))
$statut=$label->name;
elseif(in_array($label->name,$giteatypes))
$type=$label->name;
else
$labels=$labels.($labels!=""?"\n":"").$label->name;
}
$tmp=[
$gitearepo["name"],
(isset($giteaissue->milestone->title)?$giteaissue->milestone->title:""),
$type,
$giteaissue->number,
$giteaissue->title,
$statut,
$labels
];
fputcsv($csvh, $tmp, $d, $e);
}
}
fclose($csvh);
$response = new BinaryFileResponse($dir.$file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
return $response;
}
return $this->render($this->render.'list.html.twig',[
"useheader" => true,
"usesidebar" => false,
"id" => $id,
"giteacategorys" => $giteacategorys,
"gitearepos" => $gitearepos,
"giteamilestones" => $giteamilestones,
"giteacolumns" => $giteacolumns,
"giteateams" => $giteateams,
"giteaprioritys" => $giteaprioritys,
"giteatypes" => $giteatypes,
"gitealabels" => $gitealabels,
"giteaassignees" => $giteaassignees,
"filtercategorys" => $filtercategorys,
"filterrepos" => $filterrepos,
"filtermilestones" => $filtermilestones,
"filtercolumns" => $filtercolumns,
"filterteams" => $filterteams,
"filterprioritys" => $filterprioritys,
"filtertypes" => $filtertypes,
"filterlabels" => $filterlabels,
"filterexcludes" => $filterexcludes,
"filterassignees" => $filterassignees,
"showfilters" => $showfilters,
]);
}
}

View File

@ -20,6 +20,7 @@ class ScrumController extends AbstractController
private $route = "app_scrum";
private $render = "Scrum/";
private $entity = "App:Scrum";
private $giteaservice;
public function __construct(giteaService $giteaservice) { $this->giteaservice = $giteaservice; }
@ -178,11 +179,197 @@ class ScrumController extends AbstractController
$forcereload=false;
if($request->get("forcereload")) $forcereload=$request->get("forcereload");
// Mise à jour des issues par rapport à gitea
$em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$giteateams,$giteaprioritys,$giteatypes,$gitealabels,$forcereload);
// Création du tableau des issues
$issues=$data->getScrumissues();
$tbissues=[];
$tbcols=[];
$tbjals=[];
$tbsprs=[];
$tbestim=[];
$viewclosed = $this->get('session')->get("viewclosed");
foreach($issues as $issue) {
// bypass closed
if($viewclosed=="false"&&$issue->getGiteastate()=="closed") continue;
// Ids
$idcol=$issue->getScrumcolumn()->getId();
$idjal=($issue->getGiteamilestone()?$issue->getGiteamilestone():-100);
$idspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getId():-100);
// Roworders
$rowcol=$issue->getScrumcolumn()->getRowid();
$rowjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():-100);
$rowspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getRowid():-100);
// Names
$nmcol=$issue->getScrumcolumn()->getName();
$nmjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():"Aucun");
$nmspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getName():"Aucun");
// Idgiteas
$gicol=$issue->getScrumcolumn()->getGiteaid();
$gijal=$issue->getGiteaMilestone();
// Liste des colonnes/jalons/sprint avec des issues
if(!in_array($idcol,$tbcols)) array_push($tbcols,$idcol);
if(!in_array($idcol."|".$idjal,$tbjals)) array_push($tbjals,$idcol."|".$idjal);
if(!in_array($idcol."|".$idjal."|".$idspr,$tbsprs)) array_push($tbsprs,$idcol."|".$idjal."|".$idspr);
// Initialisation du tableau des estimations
if(!array_key_exists($idjal,$tbestim)) {
$tbestim[$idjal] = [
"rowjal" => $rowjal,
"idjal" => $idjal,
"nmjal" => $nmjal,
"gijal" => $gijal,
"nbjrs" => 0,
"sprints" => []
];
}
if(!array_key_exists($idspr,$tbestim[$idjal]["sprints"])) {
$tbestim[$idjal]["sprints"][$idspr] = [
"rowspr" => $rowspr,
"idspr" => $idspr,
"nmspr" => $nmspr,
"nbjrs" => 0,
];
}
// Initialisation du tableau des colonnes
if(!array_key_exists($idcol,$tbissues)) {
$tbissues[$idcol]=[
"rowcol" => $rowcol,
"idcol" => $idcol,
"nmcol" => $nmcol,
"gicol" => $gicol,
"nbjrs" => 0,
"jalons" => [],
];
}
// Initialisation du tableau des jalons de la colonne encours
if(!array_key_exists($idjal,$tbissues[$idcol]["jalons"])) {
$tbissues[$idcol]["jalons"][$idjal] = [
"rowjal" => $rowjal,
"idjal" => $idjal,
"nmjal" => $nmjal,
"gijal" => $gijal,
"nbjrs" => 0,
"sprints" => [],
];
}
// Initialisation du tableau des sprint de la colonne/jalon encours
if(!array_key_exists($idspr,$tbissues[$idcol]["jalons"][$idjal]["sprints"])) {
$tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr] = [
"rowspr" => $rowspr,
"idspr" => $idspr,
"nmspr" => $nmspr,
"nbjrs" => 0,
"issues" => [],
];
}
// On cumule les estimations
$tbissues[$idcol]["nbjrs"]+=$issue->getWeight();
$tbissues[$idcol]["jalons"][$idjal]["nbjrs"]+=$issue->getWeight();
$tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight();
$tbestim[$idjal]["nbjrs"]+=$issue->getWeight();
$tbestim[$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight();
// On sauvegarde l'issue
array_push($tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr]["issues"],$issue);
}
// On ajoute les colonnes sans issues
$columns=$data->getScrumcolumns();
foreach($columns as $column) {
if(!in_array($column->getId(),$tbcols)) {
$tbissues[$column->getId()] = [
"rowcol" => $column->getRowid(),
"idcol" => $column->getId(),
"nmcol" => $column->getName(),
"gicol" => $column->getGiteaid(),
"nbjrs" => 0,
"jalons" => [],
];
}
// On ajoute les jalons sans issues
foreach($giteamilestones as $milestone) {
if(!in_array($column->getId()."|".$milestone->id,$tbjals)) {
$tbissues[$column->getId()]["jalons"][$milestone->id] = [
"rowjal" => $milestone->title,
"idjal" => $milestone->id,
"nmjal" => $milestone->title,
"gijal" => $milestone->id,
"nbjrs" => 0,
"sprints" => [],
];
}
}
// On ajoute le jalon aucun si sans issue
if(!in_array($column->getId()."|-100",$tbjals)) {
$tbissues[$column->getId()]["jalons"][-100] = [
"rowjal" => -100,
"idjal" => -100,
"nmjal" => "Aucun",
"gijal" => null,
"nbjrs" => 0,
"sprints" => [],
];
}
// On ajoutes les sprints sans issues
foreach($tbissues[$column->getId()]["jalons"] as $jalon) {
$sprints=$em->getRepository("App:Scrumsprint")->findBy(["scrum"=>$data,"giteamilestone"=>$jalon["idjal"]]);
foreach($sprints as $sprint) {
if(!in_array($column->getId()."|".$jalon["idjal"]."|".$sprint->getId(),$tbsprs)) {
$tbissues[$column->getId()]["jalons"][$jalon["idjal"]]["sprints"][$sprint->getId()] = [
"rowspr" => $sprint->getRowid(),
"idspr" => $sprint->getId(),
"nmspr" => $sprint->getName(),
"nbjrs" => 0,
"issues" => [],
];
}
}
// On ajoute les sprint aucun sans issue
if(!in_array($column->getId()."|".$jalon["idjal"]."|-100",$tbsprs)) {
$tbissues[$column->getId()]["jalons"][$jalon["idjal"]]["sprints"][-100] = [
"rowspr" => -100,
"idspr" => -100,
"nmspr" => "Aucun",
"nbjrs" => 0,
"issues" => [],
];
}
}
}
// Tri des issues par colonne/jalon/sprint/issue
$rowcol = array_column($tbissues, 'rowcol');
array_multisort($rowcol, SORT_ASC, $tbissues);
foreach($tbissues as $keycol=>$column) {
$rowjal = array_column($tbissues[$keycol]["jalons"], 'rowjal');
array_multisort($rowjal, SORT_DESC, $tbissues[$keycol]["jalons"]);
foreach($tbissues[$keycol]["jalons"] as $keyjal=>$jalon) {
$rowspr = array_column($tbissues[$keycol]["jalons"][$keyjal]["sprints"], 'rowspr');
array_multisort($rowspr, SORT_DESC, $tbissues[$keycol]["jalons"][$keyjal]["sprints"]);
}
}
// Préférences utilisateur
$filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id);
$filtersprints = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtersprints",$id);
$filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id);
$filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id);
$filtertypes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtertypes",$id);
@ -198,11 +385,13 @@ class ScrumController extends AbstractController
'giteaassignees' => $giteaassignees,
'giteacolumns' => $giteacolumns,
'giteamilestones' => $giteamilestones,
'sprints' => $data->getScrumsprints(),
'giteateams' => $giteateams,
'giteaprioritys' => $giteaprioritys,
'giteatypes' => $giteatypes,
'gitealabels' => $gitealabels,
'filtermilestones' => $filtermilestones,
'filtersprints' => $filtersprints,
'filterteams' => $filterteams,
'filterprioritys' => $filterprioritys,
'filtertypes' => $filtertypes,
@ -210,10 +399,187 @@ class ScrumController extends AbstractController
'filterassignees' => $filterassignees,
'filterexcludes' => $filterexcludes,
'showfilters' => $showfilters,
'tbissues' => $tbissues,
'tbestim' => $tbestim,
$this->data => $data,
]);
}
public function table($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$fgcsv = $request->get("fgcsv");
// Récupérer les repos de gitea
$scrum=$em->getRepository("App:Scrum")->findOneBy(["id"=>$id]);
$gitearepos=[];
$giteamilestones=[];
$giteacolumns=[];
$giteateams=[];
$giteaprioritys=[];
$giteatypes=[];
$gitealabels=[];
$giteaassignees=$em->getRepository("App:User")->findBy([],["username"=>"ASC"]);
$viewclosed = $request->getSession()->get("viewclosed");
$gitearepo=$this->giteaservice->getRepo($scrum->getGiteajson()["id"]);
if($gitearepo->updated_at!=$scrum->getGiteajson()["updated_at"]||$gitearepo->open_issues_count!=$scrum->getGiteajson()["open_issues_count"]) {
$scrum->setGiteajson(json_decode(json_encode($gitearepo), true));
$em->persist($scrum);
$em->flush();
}
$giteamilestones=$this->giteaservice->getMilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open"));
$giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open"));
$json=$scrum->getGiteajson();
$json["issues"]=$giteaissues;
foreach($json["issues"] as $key => $giteaissue) {
$issue=$em->getRepository("App:Scrumissue")->findOneBy(["giteaid"=>$giteaissue->id]);
if($issue) {
$json["issues"][$key]->weight=$issue->getWeight();
$json["issues"][$key]->issueid=$issue->getId();
$json["issues"][$key]->scrumid=$issue->getScrum()->getId();
$json["issues"][$key]->sprintid=($issue->getScrumsprint()?$issue->getScrumsprint()->getId():-100);
$json["issues"][$key]->sprintname=($issue->getScrumsprint()?$issue->getScrumsprint()->getName():"Aucun");
}
else {
$json["issues"][$key]->weight=0;
$json["issues"][$key]->issueid=0;
$json["issues"][$key]->scrumid=0;
$json["issues"][$key]->sprintid=-100;
$json["issues"][$key]->sprintname="Aucun";
}
}
$tmp=[];
foreach($scrum->getScrumcolumns() as $column) {
array_push($tmp,$column->getGiteaid());
if(!in_array($column->getGiteajson()["name"],$giteacolumns))
array_push($giteacolumns,$column->getGiteajson()["name"]);
}
$json["columns"]=$tmp;
array_push($gitearepos,$json);
foreach($scrum->getScrumteams() as $team) {
if(!in_array($team->getGiteajson()["name"],$giteateams))
array_push($giteateams,$team->getGiteajson()["name"]);
}
foreach($scrum->getScrumprioritys() as $priority) {
if(!in_array($priority->getGiteajson()["name"],$giteaprioritys))
array_push($giteaprioritys,$priority->getGiteajson()["name"]);
}
foreach($scrum->getScrumtypes() as $type) {
if(!in_array($type->getGiteajson()["name"],$giteatypes))
array_push($giteatypes,$type->getGiteajson()["name"]);
}
foreach($giteaissues as $giteaissue) {
foreach($giteaissue->labels as $label) {
if(!in_array($label->name,$gitealabels))
array_push($gitealabels,$label->name);
}
}
$keysort = array_column($giteamilestones, 'title');
array_multisort($keysort, SORT_DESC, $giteamilestones);
sort($giteacolumns);
sort($giteateams);
sort($giteaprioritys);
sort($giteatypes);
sort($gitealabels);
// Préférences utilisateur
$filtercategorys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercategorys",$id);
$filterrepos = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterrepos",$id);
$filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id);
$filtersprints = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtersprints",$id);
$filtercolumns = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercolumns",$id);
$filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id);
$filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id);
$filtertypes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtertypes",$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);
if($fgcsv) {
$dir = $this->appKernel->getProjectDir() . '/uploads/issues/';
$file = "issues-".$id.".csv";
$fs = new Filesystem();
$fs->mkdir($dir);
$csvh = fopen($dir.$file, 'w');
$d = ';'; // this is the default but i like to be explicit
$e = '"'; // this is the default but i like to be explicit
$tmp=["Projet","Jalon","Type","Id","Titre","Statut","Label"];
fputcsv($csvh, $tmp, $d, $e);
foreach($gitearepos as $gitearepo) {
foreach($gitearepo["issues"] as $giteaissue) {
$statut="";
$type="";
$labels="";
foreach($giteaissue->labels as $label) {
if(in_array($label->id,$gitearepo["columns"]))
$statut=$label->name;
elseif(in_array($label->name,$giteatypes))
$type=$label->name;
else
$labels=$labels.($labels!=""?"\n":"").$label->name;
}
$tmp=[
$gitearepo["name"],
(isset($giteaissue->milestone->title)?$giteaissue->milestone->title:""),
$type,
$giteaissue->number,
$giteaissue->title,
$statut,
$labels
];
fputcsv($csvh, $tmp, $d, $e);
}
}
fclose($csvh);
$response = new BinaryFileResponse($dir.$file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
return $response;
}
return $this->render($this->render.'table.html.twig',[
"useheader" => true,
"usesidebar" => false,
"id" => $id,
"gitearepos" => $gitearepos,
"giteamilestones" => $giteamilestones,
"sprints" => $scrum->getScrumsprints(),
"giteacolumns" => $giteacolumns,
"giteateams" => $giteateams,
"giteaprioritys" => $giteaprioritys,
"giteatypes" => $giteatypes,
"gitealabels" => $gitealabels,
"giteaassignees" => $giteaassignees,
"filtercategorys" => $filtercategorys,
"filterrepos" => $filterrepos,
"filtermilestones" => $filtermilestones,
"filtersprints" => $filtersprints,
"filtercolumns" => $filtercolumns,
"filterteams" => $filterteams,
"filterprioritys" => $filterprioritys,
"filtertypes" => $filtertypes,
"filterlabels" => $filterlabels,
"filterexcludes" => $filterexcludes,
"filterassignees" => $filterassignees,
"showfilters" => $showfilters,
]);
}
public function stat($id,Request $request)
{
// Initialisation de l'enregistrement
@ -225,94 +591,94 @@ class ScrumController extends AbstractController
// Préférences utilisateur
$filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id);
$filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id);
$filtersprints = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtersprints",$id);
$showfilters = $em->getRepository("App:User")->getUserpreference($this->getUser(),"showfilters",$id);
$tbstat=[];
foreach($data->getScrumIssues() as $issue) {
// Création du tableau des issues
$issues=$data->getScrumissues();
$tbissues=[];
$tbcols=[];
$tbjals=[];
$tbsprs=[];
$tbestim=[];
$viewclosed = $this->get('session')->get("viewclosed");
foreach($issues as $issue) {
// bypass closed
if($viewclosed=="false"&&$issue->getGiteastate()=="closed") continue;
$labels=$issue->getGiteajson()["labels"];
$haveteams=true;
if($filterteams) {
$haveteams=false;
foreach($filterteams as $filterteam) {
foreach($labels as $label) {
if($label["id"]==$filterteam) {
$haveteams=true;
}
}
}
// Ids
$idcol=$issue->getScrumcolumn()->getId();
$idjal=($issue->getGiteamilestone()?$issue->getGiteamilestone():-100);
$idspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getId():-100);
// Roworders
$rowcol=$issue->getScrumcolumn()->getRowid();
$rowjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():-100);
$rowspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getRowid():-100);
// Names
$nmcol=$issue->getScrumcolumn()->getName();
$nmjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():"Aucun");
$nmspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getName():"Aucun");
if(!array_key_exists($idjal,$tbestim)) {
$tbestim[$idjal] = [
"rowjal" => $rowjal,
"idjal" => $idjal,
"nmjal" => $nmjal,
"nbjrs" => 0,
"columns" => [],
"sprints" => [],
];
}
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($idspr,$tbestim[$idjal]["sprints"])) {
$tbestim[$idjal]["sprints"][$idspr] = [
"rowspr" => $rowspr,
"idspr" => $idspr,
"nmspr" => $nmspr,
"nbjrs" => 0,
"columns" => [],
];
}
if(!$issue->getScrumcolumn()) $ordercolumns=0;
else $ordercolumns=array_search($issue->getScrumcolumn()->getGiteaid(),$giteacolumns);
//$ordercolumns=$issue->getScrumcolumn()->getId();
if(!array_key_exists($ordercolumns,$tbstat[$idmilestone]["stat"])) {
$tbstat[$idmilestone]["stat"][$ordercolumns]=[
"id"=>$issue->getScrumcolumn()->getId(),
"label"=>$issue->getScrumcolumn()->getName(),
"total"=>0,
"color"=>"#".$issue->getScrumcolumn()->getGiteajson()["color"],
"labels"=>[],
];
}
foreach($labels as $label) {
if($ordercolumns!=$label["id"]) {
if(!array_key_exists($label["id"],$tbstat[$idmilestone]["stat"][$ordercolumns]["labels"])) {
$tbstat[$idmilestone]["stat"][$ordercolumns]["labels"][$label["id"]] = [
"id"=>$label["id"],
"label"=>$label["name"],
"total"=>0,
"color"=>"#".$label["color"],
];
}
$tbstat[$idmilestone]["stat"][$ordercolumns]["labels"][$label["id"]]["total"]+=$issue->getWeight();
}
}
$tbstat[$idmilestone]["stat"][$ordercolumns]["total"]+=$issue->getWeight();
}
if(!array_key_exists($idcol,$tbestim[$idjal]["columns"])) {
$tbestim[$idjal]["columns"][$idcol] = [
"rowcol" => $rowcol,
"idcol" => $idcol,
"nmcol" => $nmcol,
"color" => $issue->getScrumcolumn()->getGiteajson()["color"],
"nbjrs" => 0,
];
}
if(!array_key_exists($idcol,$tbestim[$idjal]["sprints"][$idspr]["columns"])) {
$tbestim[$idjal]["sprints"][$idspr]["columns"][$idcol] = [
"rowcol" => $rowcol,
"idcol" => $idcol,
"nmcol" => $nmcol,
"color" => $issue->getScrumcolumn()->getGiteajson()["color"],
"nbjrs" => 0,
];
}
// On cumule les estimations
$tbestim[$idjal]["nbjrs"]+=$issue->getWeight();
$tbestim[$idjal]["columns"][$idcol]["nbjrs"]+=$issue->getWeight();
$tbestim[$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight();
$tbestim[$idjal]["sprints"][$idspr]["columns"][$idcol]["nbjrs"]+=$issue->getWeight();
}
foreach($tbstat as $k1=>$milestone) {
$tmp=$tbstat[$k1]["stat"];
ksort($tmp);
$tbstat[$k1]["stat"]=$tmp;
}
foreach($tbstat as $k1=>$milestone) {
foreach($tbstat[$k1]["stat"] as $k2=>$statut) {
$keysort = array_column($tbstat[$k1]["stat"][$k2]["labels"], 'label');
array_multisort($keysort, SORT_ASC, $tbstat[$k1]["stat"][$k2]["labels"]);
}
}
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,
'giteatypes' => $giteatypes,
'gitealabels' => $gitealabels,
'filtermilestones' => $filtermilestones,
'filterteams' => $filterteams,
'showfilters' => $showfilters,
$this->data => $data,
'tbstat' => $tbstat,
'tbestim' => $tbestim,
]);
}
@ -345,6 +711,196 @@ class ScrumController extends AbstractController
return new JsonResponse($output);
}
private function consolidateScrum($scrum,$giteamilestones,&$tbissues,&$tbestim) {
$em = $this->getDoctrine()->getManager();
$issues=$scrum->getScrumissues();
$tbissues=[];
$tbestim=[];
$tbcols=[];
$tbjals=[];
$tbsprs=[];
$viewclosed = $this->get('session')->get("viewclosed");
foreach($issues as $issue) {
// bypass closed
if($viewclosed=="false"&&$issue->getGiteastate()=="closed") continue;
// Ids
$idcol=$issue->getScrumcolumn()->getId();
$idjal=($issue->getGiteamilestone()?$issue->getGiteamilestone():-100);
$idspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getId():-100);
// Roworders
$rowcol=$issue->getScrumcolumn()->getRowid();
$rowjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():-100);
$rowspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getRowid():-100);
// Names
$nmcol=$issue->getScrumcolumn()->getName();
$nmjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():"Aucun");
$nmspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getName():"Aucun");
// Idgiteas
$gicol=$issue->getScrumcolumn()->getGiteaid();
$gijal=$issue->getGiteaMilestone();
// Liste des colonnes/jalons/sprint avec des issues
if(!in_array($idcol,$tbcols)) array_push($tbcols,$idcol);
if(!in_array($idcol."|".$idjal,$tbjals)) array_push($tbjals,$idcol."|".$idjal);
if(!in_array($idcol."|".$idjal."|".$idspr,$tbsprs)) array_push($tbsprs,$idcol."|".$idjal."|".$idspr);
// Initialisation du tableau des estimations
if(!array_key_exists($idjal,$tbestim)) {
$tbestim[$idjal] = [
"rowjal" => $rowjal,
"idjal" => $idjal,
"nmjal" => $nmjal,
"gijal" => $gijal,
"nbjrs" => 0,
"sprints" => []
];
}
if(!array_key_exists($idspr,$tbestim[$idjal]["sprints"])) {
$tbestim[$idjal]["sprints"][$idspr] = [
"rowspr" => $rowspr,
"idspr" => $idspr,
"nmspr" => $nmspr,
"nbjrs" => 0,
];
}
// Initialisation du tableau des colonnes
if(!array_key_exists($idcol,$tbissues)) {
$tbissues[$idcol]=[
"rowcol" => $rowcol,
"idcol" => $idcol,
"nmcol" => $nmcol,
"gicol" => $gicol,
"nbjrs" => 0,
"jalons" => [],
];
}
// Initialisation du tableau des jalons de la colonne encours
if(!array_key_exists($idjal,$tbissues[$idcol]["jalons"])) {
$tbissues[$idcol]["jalons"][$idjal] = [
"rowjal" => $rowjal,
"idjal" => $idjal,
"nmjal" => $nmjal,
"gijal" => $gijal,
"nbjrs" => 0,
"sprints" => [],
];
}
// Initialisation du tableau des sprint de la colonne/jalon encours
if(!array_key_exists($idspr,$tbissues[$idcol]["jalons"][$idjal]["sprints"])) {
$tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr] = [
"rowspr" => $rowspr,
"idspr" => $idspr,
"nmspr" => $nmspr,
"nbjrs" => 0,
"issues" => [],
];
}
// On cumule les estimations
$tbissues[$idcol]["nbjrs"]+=$issue->getWeight();
$tbissues[$idcol]["jalons"][$idjal]["nbjrs"]+=$issue->getWeight();
$tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight();
$tbestim[$idjal]["nbjrs"]+=$issue->getWeight();
$tbestim[$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight();
// On sauvegarde l'issue
array_push($tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr]["issues"],$issue);
}
// On ajoute les colonnes sans issues
$columns=$scrum->getScrumcolumns();
foreach($columns as $column) {
if(!in_array($column->getId(),$tbcols)) {
$tbissues[$column->getId()] = [
"rowcol" => $column->getRowid(),
"idcol" => $column->getId(),
"nmcol" => $column->getName(),
"gicol" => $column->getGiteaid(),
"nbjrs" => 0,
"jalons" => [],
];
}
// On ajoute les jalons sans issues
foreach($giteamilestones as $milestone) {
if(!in_array($column->getId()."|".$milestone->id,$tbjals)) {
$tbissues[$column->getId()]["jalons"][$milestone->id] = [
"rowjal" => $milestone->title,
"idjal" => $milestone->id,
"nmjal" => $milestone->title,
"gijal" => $milestone->id,
"nbjrs" => 0,
"sprints" => [],
];
}
}
// On ajoute le jalon aucun si sans issue
if(!in_array($column->getId()."|-100",$tbjals)) {
$tbissues[$column->getId()]["jalons"][-100] = [
"rowjal" => -100,
"idjal" => -100,
"nmjal" => "Aucun",
"gijal" => null,
"nbjrs" => 0,
"sprints" => [],
];
}
// On ajoutes les sprints sans issues
foreach($tbissues[$column->getId()]["jalons"] as $jalon) {
$sprints=$em->getRepository("App:Scrumsprint")->findBy(["scrum"=>$scrum,"giteamilestone"=>$jalon["idjal"]]);
foreach($sprints as $sprint) {
if(!in_array($column->getId()."|".$jalon["idjal"]."|".$sprint->getId(),$tbsprs)) {
$tbissues[$column->getId()]["jalons"][$jalon["idjal"]]["sprints"][$sprint->getId()] = [
"rowspr" => $sprint->getRowid(),
"idspr" => $sprint->getId(),
"nmspr" => $sprint->getName(),
"nbjrs" => 0,
"issues" => [],
];
}
}
// On ajoute les sprint aucun sans issue
if(!in_array($column->getId()."|".$jalon["idjal"]."|-100",$tbsprs)) {
$tbissues[$column->getId()]["jalons"][$jalon["idjal"]]["sprints"][-100] = [
"rowspr" => -100,
"idspr" => -100,
"nmspr" => "Aucun",
"nbjrs" => 0,
"issues" => [],
];
}
}
}
// Tri des issues par colonne/jalon/sprint/issue
$rowcol = array_column($tbissues, 'rowcol');
array_multisort($rowcol, SORT_ASC, $tbissues);
foreach($tbissues as $keycol=>$column) {
$rowjal = array_column($tbissues[$keycol]["jalons"], 'rowjal');
array_multisort($rowjal, SORT_DESC, $tbissues[$keycol]["jalons"]);
foreach($tbissues[$keycol]["jalons"] as $keyjal=>$jalon) {
$rowspr = array_column($tbissues[$keycol]["jalons"][$keyjal]["sprints"], 'rowspr');
array_multisort($rowspr, SORT_DESC, $tbissues[$keycol]["jalons"][$keyjal]["sprints"]);
}
}
}
protected function getErrorForm($id,$form,$request,$data,$mode) {
if ($form->get('submit')->isClicked()&&$mode=="delete") {
}

View File

@ -31,8 +31,10 @@ class ScrumissueController extends AbstractController
$newcolumn=$request->get('newcolumn');
$oldmilestone=$request->get('oldmilestone');
$newmilestone=$request->get('newmilestone');
$oldsprint=$request->get('oldsprint');
$newsprint=$request->get('newsprint');
if($oldcolumn!=$newcolumn||$oldmilestone!=$newmilestone) {
if($oldcolumn!=$newcolumn||$oldmilestone!=$newmilestone||$oldsprint!=$newsprint) {
// Rechercher l'issue en cours
$scrumissue=$em->getRepository("App:Scrumissue")->find($id);
if(!$scrumissue) return new JsonResponse(['message' => 'No Issue'], 403);
@ -68,16 +70,31 @@ class ScrumissueController extends AbstractController
$return=$this->giteaservice->patchIssue($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber(),$patchs);
if(!$return) return new JsonResponse(['message' => 'No API patchIssue'], 403);
}
// Mettre à jour le sprint
if($oldsprint!=$newsprint) {
$scrumissue->setScrumsprint(null);
$sprint=$em->getRepository("App:Scrumsprint")->find($newsprint);
if($sprint) {
$scrumissue->setScrumsprint($sprint);
}
$em->flush();
}
// Récupérer l'issue modifiée pour mettre à jour la date de modification gitea
$giteaissue=$this->giteaservice->getIssue($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber());
if(!$giteaissue) return new JsonResponse(['message' => 'No API getIssue'], 403);
$updatedate=new \DateTime($giteaissue->updated_at);
if($updatedate > $scrumissue->getScrum()->getUpdatedate()) {
$scrumissue->getScrum()->setUpdatedate(new \DateTime($giteaissue->updated_at));
$updateissue=new \DateTime($giteaissue->updated_at);
$updateissue->setTimezone(new \DateTimeZone("UTC"));
$lastupdate=$scrumissue->getScrum()->getUpdatedate();
if($updateissue > $lastupdate) {
$scrumissue->getScrum()->setUpdatedate($updateissue);
$em->persist($scrumissue->getScrum());
$em->flush();
return new JsonResponse($updatedate->format("Ymd H:i:s"));
return new JsonResponse($lastupdate->format("Ymd H:i:s"));
}
}
return new JsonResponse(false);
@ -159,10 +176,10 @@ class ScrumissueController extends AbstractController
$em = $this->getDoctrine()->getManager();
$id=$request->get('id');
$lastupdate=new \DateTime($request->get('lastupdate'));
$scrum=$em->getRepository("App:Scrum")->find($id);
if(!$scrum) return new JsonResponse(['message' => 'No Scrum'], 403);
$lastupdate=$scrum->getUpdatedate();
$giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]);
if(!is_array($giteaissues)) die("Probleme de connexion avec gitea veuillez vous <a href='/ninegitea/logout'>reconnecter</a>");
@ -174,12 +191,15 @@ class ScrumissueController extends AbstractController
$scrumissue=$em->getRepository("App:Scrumissue")->findOneBy(["scrum"=>$scrum,"giteaid"=>$giteaissue->id]);
if(!$scrumissue)
if(!$scrumissue) {
return new JsonResponse(true);
}
$fgissueupdated=false;
$updatedate=new \DateTime(json_decode(json_encode($giteaissue), true)["updated_at"]);
if($updatedate>$lastupdate) {
$updateissue=new \DateTime(json_decode(json_encode($giteaissue), true)["updated_at"]);
$updateissue->setTimezone(new \DateTimeZone("UTC"));
if($updateissue>$lastupdate) {
$fgissueupdated=true;
}

View File

@ -0,0 +1,194 @@
<?php
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\Scrumsprint as Entity;
use App\Form\ScrumsprintType as Form;
use App\Service\giteaService;
class ScrumsprintController extends AbstractController
{
private $data = "scrumsprint";
private $route = "app_scrumsprint";
private $render = "Scrumsprint/";
private $entity = "App:Scrumsprint";
public function __construct(giteaService $giteaservice) { $this->giteaservice = $giteaservice; }
public function submit($scrumid, Request $request)
{
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$scrum=$em->getRepository("App:Scrum")->find($scrumid);
$data = new Entity();
$data->setScrum($scrum);
$last = $em->getRepository('App:Scrumsprint')->findOneBy(["scrum"=>$scrum], ['rowid' => 'DESC']);
if(!$last) $data->setRowid(0);
else $data->setRowid($last->getRowid()+1);
// Récupérer les repos de gitea
$giteamilestones=$this->giteaservice->getmilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]);
if(!is_array($giteamilestones)) die("Probleme de connexion avec gitea veuillez vous <a href='".$this->getParameters("appAlias")."/logout'>reconnecter</a>");
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"submit","giteamilestones"=>$giteamilestones));
// 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();
$getmilestone=$this->giteaservice->getmilestone($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$data->getGiteamilestone());
$data->setGiteamilestonename($getmilestone->title);
$em->persist($data);
$em->flush();
// Retour à la liste
return $this->render($this->render.'close.html.twig');
}
// Affichage du formulaire
return $this->render($this->render.'edit.html.twig', [
'useheader' => false,
'usesidebar' => false,
$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);
$scrum=$data->getScrum();
// Récupérer les repos de gitea
$giteamilestones=$this->giteaservice->getmilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]);
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"update","giteamilestones"=>$giteamilestones));
// 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();
$getmilestone=$this->giteaservice->getmilestone($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$data->getGiteamilestone());
$data->setGiteamilestonename($getmilestone->title);
$em->persist($data);
$em->flush();
// Retour à la liste
return $this->render($this->render.'close.html.twig');
}
// Affichage du formulaire
return $this->render($this->render.'edit.html.twig', [
'useheader' => false,
'usesidebar' => false,
$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->render($this->render.'close.html.twig');
}
}
public function select($scrumid, Request $request)
{
// S'assurer que c'est un appel ajax
if (!$request->isXmlHttpRequest()) {
return new JsonResponse(array('message' => 'Interdit'), 400);
}
$em = $this->getDoctrine()->getManager();
$scrum=$em->getRepository("App:Scrum")->find($scrumid);
$scrumsprints = $scrum->getScrumsprints();
$output=array();
foreach($scrumsprints as $scrumsprint) {
array_push($output,array("id"=>$scrumsprint->getId(),"name"=>"<b>".$scrumsprint->getName()."</b><br><small>liè au jalon gitea ".$scrumsprint->getGiteamilestonename()."</small>"));
}
$response = new Response(json_encode($output));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
public function order($scrumid, Request $request)
{
$em = $this->getDoctrine()->getManager();
$scrumsprintids=explode(",",$request->get('lstordered'));
$i=1;
foreach($scrumsprintids as $id) {
$scrumsprint=$em->getRepository($this->entity)->find($id);
if($scrumsprint) {
$scrumsprint->setRowid($i);
$em->persist($scrumsprint);
$em->flush();
}
$i++;
}
$response = new Response();
$response->headers->set('Content-Type', 'application/json');
return $response;
}
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());
}
}
}
}

View File

@ -67,6 +67,12 @@ class Scrum
*/
private $scrumcolumns;
/**
* @ORM\OneToMany(targetEntity="Scrumsprint", mappedBy="scrum", cascade={"persist"}, orphanRemoval=true)
* @ORM\OrderBy({"rowid" = "ASC"})
*/
private $scrumsprints;
/**
* @ORM\OneToMany(targetEntity="Scrumissue", mappedBy="scrum", cascade={"persist"}, orphanRemoval=true)
* @ORM\OrderBy({"giteamilestonename" = "DESC", "rowid" = "ASC"})
@ -117,6 +123,7 @@ class Scrum
$this->scrumteams = new ArrayCollection();
$this->scrumprioritys = new ArrayCollection();
$this->scrumtypes = new ArrayCollection();
$this->scrumsprints = new ArrayCollection();
}
public function getId(): ?int
@ -378,4 +385,35 @@ class Scrum
return $this;
}
/**
* @return Collection|Scrumsprint[]
*/
public function getScrumsprints(): Collection
{
return $this->scrumsprints;
}
public function addScrumsprint(Scrumsprint $scrumsprint): self
{
if (!$this->scrumsprints->contains($scrumsprint)) {
$this->scrumsprints[] = $scrumsprint;
$scrumsprint->setScrum($this);
}
return $this;
}
public function removeScrumsprint(Scrumsprint $scrumsprint): self
{
if ($this->scrumsprints->contains($scrumsprint)) {
$this->scrumsprints->removeElement($scrumsprint);
// set the owning side to null (unless already changed)
if ($scrumsprint->getScrum() === $this) {
$scrumsprint->setScrum(null);
}
}
return $this;
}
}

View File

@ -49,8 +49,8 @@ class Scrumcolumn
private $scrum;
/**
* @ORM\OneToMany(targetEntity="Scrumissue", mappedBy="scrumcolumn", cascade={"persist"}, orphanRemoval=true)
* @ORM\OrderBy({"giteamilestonename" = "DESC", "rowid" = "ASC"})
* @ORM\OneToMany(targetEntity="Scrumissue", mappedBy="scrumcolumn", cascade={"persist"}, orphanRemoval=false)
* @ORM\OrderBy({"giteamilestonename" = "DESC", "scrumsprint" = "DESC", "rowid" = "ASC"})
*/
private $scrumissues;

View File

@ -75,9 +75,16 @@ class Scrumissue
/**
* @ORM\ManyToOne(targetEntity="Scrumcolumn", inversedBy="Scrumissues")
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/
private $scrumcolumn;
/**
* @ORM\ManyToOne(targetEntity="Scrumsprint", inversedBy="Scrumissues")
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/
private $scrumsprint;
public function getId(): ?int
{
return $this->id;
@ -215,6 +222,18 @@ class Scrumissue
return $this;
}
public function getScrumsprint(): ?Scrumsprint
{
return $this->scrumsprint;
}
public function setScrumsprint(?Scrumsprint $scrumsprint): self
{
$this->scrumsprint = $scrumsprint;
return $this;
}
}

159
src/Entity/Scrumsprint.php Normal file
View File

@ -0,0 +1,159 @@
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* Scrumcolumn
*
* @ORM\Entity()
* @ORM\Table(name="scrumsprint")
*/
class Scrumsprint
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="name", type="string")
*
*/
private $name;
/**
* @ORM\Column(type="integer")
*/
private $rowid;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $giteamilestone;
/**
* @ORM\Column(type="string", nullable=true)
*
*/
private $giteamilestonename;
/**
* @ORM\ManyToOne(targetEntity="Scrum", inversedBy="scrumsprints")
*/
private $scrum;
/**
* @ORM\OneToMany(targetEntity="Scrumissue", mappedBy="scrumsprint", cascade={"persist"}, orphanRemoval=false)
*/
private $scrumissues;
public function __construct()
{
$this->scrumissues = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getRowid(): ?int
{
return $this->rowid;
}
public function setRowid(int $rowid): self
{
$this->rowid = $rowid;
return $this;
}
public function getGiteamilestone(): ?int
{
return $this->giteamilestone;
}
public function setGiteamilestone(?int $giteamilestone): self
{
$this->giteamilestone = $giteamilestone;
return $this;
}
public function getGiteamilestonename(): ?string
{
return $this->giteamilestonename;
}
public function setGiteamilestonename(?string $giteamilestonename): self
{
$this->giteamilestonename = $giteamilestonename;
return $this;
}
public function getScrum(): ?Scrum
{
return $this->scrum;
}
public function setScrum(?Scrum $scrum): self
{
$this->scrum = $scrum;
return $this;
}
/**
* @return Collection|Scrumissue[]
*/
public function getScrumissues(): Collection
{
return $this->scrumissues;
}
public function addScrumissue(Scrumissue $scrumissue): self
{
if (!$this->scrumissues->contains($scrumissue)) {
$this->scrumissues[] = $scrumissue;
$scrumissue->setScrumsprint($this);
}
return $this;
}
public function removeScrumissue(Scrumissue $scrumissue): self
{
if ($this->scrumissues->contains($scrumissue)) {
$this->scrumissues->removeElement($scrumissue);
// set the owning side to null (unless already changed)
if ($scrumissue->getScrumsprint() === $this) {
$scrumissue->setScrumsprint(null);
}
}
return $this;
}
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManager;
class ScrumsprintType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('submit',
SubmitType::class, [
"label" => "Valider",
"attr" => ["class" => "btn btn-success no-print"],
]
);
$builder->add('name',
TextType::class, [
"label" =>"Nom",
]
);
$choices=[];
foreach($options["giteamilestones"] as $milestone) {
$choices[$milestone->title]=$milestone->id;
}
$builder->add('giteamilestone',
ChoiceType::class, [
"label" => "Jalon Gitea",
"choices" => $choices,
"disabled" => ($options["mode"]=="submit"?false:true),
"placeholder" => "Selectionnez un label gitea",
]
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'App\Entity\Scrumsprint',
'mode' => 'string',
'giteamilestones' => 'string',
));
}
}

View File

@ -39,6 +39,60 @@ class ScrumRepository extends ServiceEntityRepository
public function getGitea($scrum,&$giteaassignees,&$giteacolumns,&$giteamilestones,&$giteateams,&$giteaprioritys,&$giteatypes,&$gitealabels, $forcereload=false) {
$viewclosed = $this->session->get("viewclosed");
// Récupérer les labels de gitea
$gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]);
if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous <a href='/ninegitea/logout'>reconnecter</a>");
// S'assurer que nos colonnes existes toujours
$scrumcolumns=$scrum->getScrumcolumns();
foreach($scrumcolumns as $scrumcolumn) {
$gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumcolumn->getGiteaid());
if(!$gitealabel) {
$this->_em->remove($scrumcolumn);
$this->_em->flush();
}
}
// S'assurer que nos teams existes toujours
$scrumteams=$scrum->getScrumteams();
foreach($scrumteams as $scrumteam) {
$gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumteam->getGiteaid());
if(!$gitealabel) {
$this->_em->remove($scrumteam);
$this->_em->flush();
}
}
// S'assurer que nos prioritys existes toujours
$scrumprioritys=$scrum->getScrumprioritys();
foreach($scrumprioritys as $scrumpriority) {
$gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumpriority->getGiteaid());
if(!$gitealabel) {
$this->_em->remove($scrumpriority);
$this->_em->flush();
}
}
// S'assurer que nos types existes toujours
$scrumtypes=$scrum->getScrumtypes();
foreach($scrumtypes as $scrumtype) {
$gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumtype->getGiteaid());
if(!$gitealabel) {
$this->_em->remove($scrumtype);
$this->_em->flush();
}
}
// S'assurer que nos sprint sont toujours lié à un jalon existant
$scrumsprints=$scrum->getScrumsprints();
foreach($scrumsprints as $scrumsprint) {
$giteamilestone=$this->giteaservice->getMilestone($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumsprint->getGiteamilestone());
if(!$giteamilestone) {
$this->_em->remove($scrumsprint);
$this->_em->flush();
}
}
// Récupérer le dernier order
$last = $this->_em->getRepository('App:Scrumissue')->findOneBy(["scrum"=>$scrum], ['rowid' => 'DESC']);
if(!$last) $lastrowid=-1;
@ -110,7 +164,7 @@ class ScrumRepository extends ServiceEntityRepository
// Récupérer les labels de gitea
$gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]);
if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous <a href='/ninegitea/logout'>reconnecter</a>");
// Formatter les labels non colomn/team/priority/type
foreach($gitealabels as $key => $gitealabel) {
if(in_array($gitealabel->id,$giteacolumns)||in_array($gitealabel->id,$giteateams)||in_array($gitealabel->id,$giteaprioritys)||in_array($gitealabel->id,$giteatypes))
unset($gitealabels[$key]);
@ -126,10 +180,6 @@ class ScrumRepository extends ServiceEntityRepository
$this->datescrumupdate=new \DateTime();
foreach($giteaissues as $giteaissue) {
// On ne prend pas les pull request
if(!is_null($giteaissue->pull_request)) {
continue;
}
$scrumissue=$this->_em->getRepository("App:Scrumissue")->findOneBy(["scrum"=>$scrum,"giteaid"=>$giteaissue->id]);
@ -139,42 +189,51 @@ class ScrumRepository extends ServiceEntityRepository
$scrumissue->setScrum($scrum);
$scrumissue->setRowid($lastrowid);
$scrumissue->setGiteaid($giteaissue->id);
$this->majissue($scrumissue,$giteaissue,true);
}
else {
$fgissueupdated=false;
if($scrumissue->getGiteajson()["updated_at"]!=json_decode(json_encode($giteaissue), true)["updated_at"])
$fgissueupdated=true;
if($scrumissue->getGiteajson()["closed_at"]!=json_decode(json_encode($giteaissue), true)["closed_at"])
$fgissueupdated=true;
if($giteaissue->milestone&&$scrumissue->getGiteamilestonename()!=$giteaissue->milestone->title)
$fgissueupdated=true;
if(!$giteaissue->milestone&&!is_null($scrumissue->getGiteamilestone()))
$fgissueupdated=true;
$fgissueupdated=false;
if($scrumissue->getGiteajson()["updated_at"]!=json_decode(json_encode($giteaissue), true)["updated_at"])
$fgissueupdated=true;
if($scrumissue->getGiteajson()["closed_at"]!=json_decode(json_encode($giteaissue), true)["closed_at"])
$fgissueupdated=true;
if($giteaissue->milestone&&$scrumissue->getGiteamilestonename()!=$giteaissue->milestone->title)
$fgissueupdated=true;
if(!$giteaissue->milestone&&!is_null($scrumissue->getGiteamilestone()))
$fgissueupdated=true;
if($forcereload) {
$fgissueupdated=true;
}
if($forcereload) {
$fgissueupdated=true;
}
if($fgissueupdated) {
$fgscrumupdate=true;
$this->majissue($scrumissue,$giteaissue);
if($fgissueupdated) {
$fgscrumupdate=true;
$this->majissue($scrumissue,$giteaissue,false);
}
}
array_push($tbgiteaissues,$giteaissue->number);
}
// Bug faudrait placer à closed l'ensemble des issues vu comme open mais qui ne le sont plus
// Placer à closed l'ensemble des issues vu comme open mais qui ne le sont plus
if($viewclosed=="false") {
$scrumissues=$scrum->getScrumissues();
foreach($scrumissues as $scrumissue) {
if($scrumissue->getGiteastate()=="open"&&!in_array($scrumissue->getGiteanumber(),$tbgiteaissues)) {
$giteaissue=$this->giteaservice->getIssue($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumissue->getGiteanumber());
$fgscrumupdate=true;
$this->majissue($scrumissue,$giteaissue);
// S'il ne trouve pas d'issue c'est qu'elle n'existe plus
if(!$giteaissue) {
// Faudrait supprimer mais pour l'instant pas touche
//dump("netrouvepasissue alors");
//dump($scrumissue->getGiteanumber());
}
// Sinon mise
else $this->majissue($scrumissue,$giteaissue,false);
}
}
}
if($fgscrumupdate) {
$scrum->setUpdatedate($this->datescrumupdate);
$this->_em->persist($scrum);
@ -182,13 +241,11 @@ class ScrumRepository extends ServiceEntityRepository
}
}
function majissue($scrumissue,$giteaissue) {
if($scrumissue->getGiteajson()["updated_at"]>$this->datescrumupdate)
$this->datescrumupdate=$scrumissue->getGiteajson()["updated_at"];
function majissue($scrumissue,$giteaissue,$issubmit) {
$scrumissue->setGiteanumber($giteaissue->number);
$scrumissue->setGiteastate($giteaissue->state);
$scrumissue->setGiteatitle($giteaissue->title);
if($giteaissue->milestone) {
$scrumissue->setGiteamilestone($giteaissue->milestone->id);
$scrumissue->setGiteamilestonename($giteaissue->milestone->title);

View File

@ -202,8 +202,15 @@ class giteaService
else return $response->body;
}
public function getmilestone($owner,$name,$id) {
$apiurl = $this->url."/repos/$owner/$name/milestones/".$id;
$response=$this->api("GET",$apiurl,null,$this->session->get("giteatoken"));
if(!$response||$response->code!="200") return false;
else return $response->body;
}
public function getissues($owner,$name,$state="?state=open") {
$apiurl = $this->url."/repos/$owner/$name/issues".$state;
$apiurl = $this->url."/repos/$owner/$name/issues".$state."&type=issues";
$page=1;
$limit=20;