diff --git a/config/routes.yaml b/config/routes.yaml
index 8b8616f..14491a3 100644
--- a/config/routes.yaml
+++ b/config/routes.yaml
@@ -182,22 +182,10 @@ app_scrum:
path: /user/scrum
defaults: { _controller: App\Controller\ScrumController:list }
-app_scrum_view:
- path: /user/scrum/{id}
- defaults: { _controller: App\Controller\ScrumController:view }
-
app_scrum_submit:
path: /master/scrum/submit
defaults: { _controller: App\Controller\ScrumController:submit }
-app_scrum_stat:
- path: /user/scrum/stat/{id}
- defaults: { _controller: App\Controller\ScrumController:stat }
-
-app_scrum_info:
- path: /user/scrum/info/{id}
- defaults: { _controller: App\Controller\ScrumController:info }
-
app_scrum_update:
path: /master/scrum/update/{id}
defaults: { _controller: App\Controller\ScrumController:update }
@@ -206,6 +194,24 @@ app_scrum_delete:
path: /master/scrum/delete/{id}
defaults: { _controller: App\Controller\ScrumController:delete }
+app_scrum_view:
+ path: /user/scrum/{id}
+ defaults: { _controller: App\Controller\ScrumController:view }
+
+app_scrum_table:
+ path: /user/scrum/table/{id}
+ defaults: { _controller: App\Controller\ScrumController:table }
+
+app_scrum_stat:
+ path: /user/scrum/stat/{id}
+ defaults: { _controller: App\Controller\ScrumController:stat }
+
+
+app_scrum_info:
+ path: /user/scrum/info/{id}
+ defaults: { _controller: App\Controller\ScrumController:info }
+
+
#== Scrumcolumn ========================================================================================================
app_scrumcolumn_submit:
@@ -272,6 +278,27 @@ app_scrumpriority_order:
path: /master/scrumpriority/order/{scrumid}
defaults: { _controller: App\Controller\ScrumpriorityController:order }
+#== Scrumsprint ========================================================================================================
+app_scrumsprint_submit:
+ path: /master/scrumsprint/submit/{scrumid}
+ defaults: { _controller: App\Controller\ScrumsprintController:submit }
+
+app_scrumsprint_update:
+ path: /master/scrumsprint/update/{id}
+ defaults: { _controller: App\Controller\ScrumsprintController:update }
+
+app_scrumsprint_delete:
+ path: /master/scrumsprint/delete/{id}
+ defaults: { _controller: App\Controller\ScrumsprintController:delete }
+
+app_scrumsprint_select:
+ path: /master/scrumsprint/select/{scrumid}
+ defaults: { _controller: App\Controller\ScrumsprintController:select }
+
+app_scrumsprint_order:
+ path: /master/scrumsprint/order/{scrumid}
+ defaults: { _controller: App\Controller\ScrumsprintController:order }
+
#== Scrumtype ========================================================================================================
app_scrumtype_submit:
@@ -314,12 +341,3 @@ app_scrumissue_update:
app_scrumissue_ctrlchange:
path: /user/scrumissue/ctrlchange
defaults: { _controller: App\Controller\ScrumissueController:ctrlchange }
-
-#== Issue ========================================================================================================
-app_issue:
- path: /user/issue
- defaults: { _controller: App\Controller\IssueController:list, id: 0 }
-
-app_issuescrum:
- path: /user/issuescrum/{id}
- defaults: { _controller: App\Controller\IssueController:list }
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 2132324..df00e4c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -22,7 +22,7 @@ services:
container_name: ninegitea-app
image: reg.cadoles.com/envole/ninegitea
ports:
- - "8000:80"
+ - "8005:80"
volumes:
- ./src:/app/src:delegated
- ./templates:/app/templates:delegated
@@ -31,6 +31,12 @@ services:
- ./.env.local:/app/.env.local:delegated
- ./public/uploads:/app/public/uploads:delegated
+ adminer:
+ image: adminer
+ container_name: ninegitea-adminer
+ restart: always
+ ports:
+ - 6081:8080
volumes:
mariadb-data:
diff --git a/src/Controller/IssueController.php b/src/Controller/IssueController.php
deleted file mode 100755
index cbc463a..0000000
--- a/src/Controller/IssueController.php
+++ /dev/null
@@ -1,212 +0,0 @@
-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 reconnecter");
-
- 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,
- ]);
- }
-
-}
diff --git a/src/Controller/ScrumController.php b/src/Controller/ScrumController.php
index 20a8a74..350449b 100755
--- a/src/Controller/ScrumController.php
+++ b/src/Controller/ScrumController.php
@@ -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") {
}
diff --git a/src/Controller/ScrumissueController.php b/src/Controller/ScrumissueController.php
index 54c97fe..e31fc76 100755
--- a/src/Controller/ScrumissueController.php
+++ b/src/Controller/ScrumissueController.php
@@ -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 reconnecter");
@@ -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;
}
diff --git a/src/Controller/ScrumsprintController.php b/src/Controller/ScrumsprintController.php
new file mode 100755
index 0000000..7a4c63f
--- /dev/null
+++ b/src/Controller/ScrumsprintController.php
@@ -0,0 +1,194 @@
+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 reconnecter");
+
+ // 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"=>"".$scrumsprint->getName()."
liè au jalon gitea ".$scrumsprint->getGiteamilestonename().""));
+ }
+
+ $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());
+ }
+ }
+ }
+}
diff --git a/src/Entity/Scrum.php b/src/Entity/Scrum.php
index 295c1a1..e5f1e7b 100644
--- a/src/Entity/Scrum.php
+++ b/src/Entity/Scrum.php
@@ -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;
+ }
}
\ No newline at end of file
diff --git a/src/Entity/Scrumcolumn.php b/src/Entity/Scrumcolumn.php
index 9a86bd5..b06d356 100644
--- a/src/Entity/Scrumcolumn.php
+++ b/src/Entity/Scrumcolumn.php
@@ -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;
diff --git a/src/Entity/Scrumissue.php b/src/Entity/Scrumissue.php
index 401f24b..0abea4f 100644
--- a/src/Entity/Scrumissue.php
+++ b/src/Entity/Scrumissue.php
@@ -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;
+ }
+
}
\ No newline at end of file
diff --git a/src/Entity/Scrumsprint.php b/src/Entity/Scrumsprint.php
new file mode 100644
index 0000000..b280875
--- /dev/null
+++ b/src/Entity/Scrumsprint.php
@@ -0,0 +1,159 @@
+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;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/Form/ScrumsprintType.php b/src/Form/ScrumsprintType.php
new file mode 100644
index 0000000..651553c
--- /dev/null
+++ b/src/Form/ScrumsprintType.php
@@ -0,0 +1,58 @@
+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',
+ ));
+ }
+}
diff --git a/src/Repository/ScrumRepository.php b/src/Repository/ScrumRepository.php
index ef3d960..d0e8869 100644
--- a/src/Repository/ScrumRepository.php
+++ b/src/Repository/ScrumRepository.php
@@ -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 reconnecter");
+
+ // 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 reconnecter");
+ // 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);
diff --git a/src/Service/giteaService.php b/src/Service/giteaService.php
index 8072cd3..91c4944 100644
--- a/src/Service/giteaService.php
+++ b/src/Service/giteaService.php
@@ -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;
diff --git a/templates/Scrum/edit.html.twig b/templates/Scrum/edit.html.twig
index 24ad434..c9cc02d 100755
--- a/templates/Scrum/edit.html.twig
+++ b/templates/Scrum/edit.html.twig
@@ -45,7 +45,7 @@