giteaservice = $giteaservice; $this->session = $session; $this->showTime = false; } private function showtime($istart,$title="") { if($this->showTime) { if($istart) { $this->totalTime = microtime(true); $this->startTime = microtime(true); } else { $endTime = microtime(true); $executionTime = $endTime - $this->startTime; $totalTime = $endTime - $this->totalTime; dump($executionTime." / ".$totalTime." = ".$title); $this->startTime = microtime(true); } } } public function findByUser($user) { if($user->hasRole("ROLE_MASTER") || $user->hasRole("ROLE_MODO") || $user->hasRole("ROLE_ADMIN")) return $this->_em->getRepository("App:Scrum")->findBy([],["name"=>"ASC"]); else { $scrums=$this ->createQueryBuilder('s') ->from('App:User','u') ->Where('u.id = :id') ->andWhere('u MEMBER OF s.users') ->setParameter('id',$user->getId()) ->orderBy('s.name') ->getQuery()->getResult(); return $scrums; } } public function getGitea($scrum,&$giteaassignees,&$giteacolumns,&$giteamilestones,&$giteateams,&$giteaprioritys,&$giteatypes,&$gitealabels, $forcereload=false) { $this->showtime(true); $lastupdate = $scrum->getUpdatedate(); if(!$lastupdate) $lastupdate = new \DateTime(("19000101")); $lastupdate->sub(new \DateInterval('PT30M')); $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"); $giteaidlabels=array_column($gitealabels, 'id'); // Récupérer les jalons 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"); $giteaidmilestones=array_column($giteamilestones, 'id'); // Temps d'execution $this->showtime(false,"Récupération gitealabels & giteamilestones"); // S'assurer que nos colonnes existes toujours $scrumcolumns=$scrum->getScrumcolumns(); foreach($scrumcolumns as $scrumcolumn) { if(!in_array($scrumcolumn->getGiteaid(),$giteaidlabels)) { $this->_em->remove($scrumcolumn); $this->_em->flush(); } } // S'assurer que nos teams existes toujours $scrumteams=$scrum->getScrumteams(); foreach($scrumteams as $scrumteam) { if(!in_array($scrumteam->getGiteaid(),$giteaidlabels)) { $this->_em->remove($scrumteam); $this->_em->flush(); } } // S'assurer que nos prioritys existes toujours $scrumprioritys=$scrum->getScrumprioritys(); foreach($scrumprioritys as $scrumpriority) { if(!in_array($scrumpriority->getGiteaid(),$giteaidlabels)) { $this->_em->remove($scrumpriority); $this->_em->flush(); } } // S'assurer que nos types existes toujours $scrumtypes=$scrum->getScrumtypes(); foreach($scrumtypes as $scrumtype) { if(!in_array($scrumtype->getGiteaid(),$giteaidlabels)) { $this->_em->remove($scrumtype); $this->_em->flush(); } } // Temps d'execution $this->showtime(false,"S'assurer que nos labels colonnes teams prioritys types existes toujours"); // S'assurer que nos sprint sont toujours lié à un jalon existant $scrumsprints=$scrum->getScrumsprints(); foreach($scrumsprints as $scrumsprint) { if(!in_array($scrumsprint->getGiteamilestone(),$giteaidmilestones)) { $this->_em->remove($scrumsprint); $this->_em->flush(); } } // Temps d'execution $this->showtime(false,"S'assurer que nos sprint sont toujours lié à un jalon existant"); // Récupérer le dernier order $last = $this->_em->getRepository('App:Scrumissue')->findOneBy(["scrum"=>$scrum], ['rowid' => 'DESC']); if(!$last) $lastrowid=-1; else $lastrowid=$last->getRowid(); // Récupérer la premier column scrum $this->firstcolumn=$this->_em->getRepository('App:Scrumcolumn')->findOneBy(["scrum"=>$scrum], ['rowid' => 'ASC']); if(!$this->firstcolumn) return $this->redirectToRoute($this->route."_update",["id"=>$scrum->getId()]); // Récupérer la premier column scrum $columns=$this->_em->getRepository('App:Scrumcolumn')->findBy(["scrum"=>$scrum], ['rowid' => 'ASC']); $giteacolumns=[]; foreach($columns as $column) { array_push($giteacolumns,$column->getGiteaid()); } // Récupérer les teams $teams=$this->_em->getRepository('App:Scrumteam')->findBy(["scrum"=>$scrum], ['rowid' => 'ASC']); $giteateams=[]; foreach($teams as $team) { array_push($giteateams,$team->getGiteaid()); } // Récupérer les prioritys $prioritys=$this->_em->getRepository('App:Scrumpriority')->findBy(["scrum"=>$scrum], ['rowid' => 'ASC']); $giteaprioritys=[]; foreach($prioritys as $priority) { array_push($giteaprioritys,$priority->getGiteaid()); } // Récupérer les types $types=$this->_em->getRepository('App:Scrumtype')->findBy(["scrum"=>$scrum], ['rowid' => 'ASC']); $giteatypes=[]; foreach($types as $type) { array_push($giteatypes,$type->getGiteaid()); } // Récupérer la orga de gitea if(!empty($scrum->getGiteajson()["owner"]["email"])) $giteaassignees=[$scrum->getGiteajson()["owner"]]; else $giteaassignees=[]; // Temps d'execution $this->showtime(false,"Récupérer info ninegitea"); // Récupérer les intervenants $giteacollaborators=$this->giteaservice->getAssignees($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); if(!is_array($giteacollaborators)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); foreach($giteacollaborators as $giteacollaborator) { if(!in_array($giteacollaborator,$giteaassignees)) array_push($giteaassignees,$giteacollaborator); } // Temps d'execution $this->showtime(false,"Récupérer les intervenants"); // Récupérer les milestones de gitea $giteamilestones=$this->giteaservice->getMilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open")); if(!is_array($giteamilestones)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); $keysort = array_column($giteamilestones, 'title'); array_multisort($keysort, SORT_DESC, $giteamilestones); // Temps d'execution $this->showtime(false,"Récupérer les milestones"); // Récupérer les issues de gitea $giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=all".(!$forcereload?"&since=".urlencode($lastupdate->format(\DateTime::RFC3339_EXTENDED)):"")); if(!is_array($giteaissues)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); // Temps d'execution $this->showtime(false,"Récupérer les issues"); // Génération des issues $tbgiteaissues=[]; $fgscrumupdate=false; $updatedates=[]; foreach($giteaissues as $giteaissue) { $scrumissue=$this->_em->getRepository("App:Scrumissue")->findOneBy(["scrum"=>$scrum,"giteaid"=>$giteaissue->id]); if(!$scrumissue) { $lastrowid++; $scrumissue=new Scrumissue(); $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; if($forcereload) { $fgissueupdated=true; } if($fgissueupdated) { $updateissue=new \DateTime(json_decode(json_encode($giteaissue), true)["updated_at"]); $updateissue->setTimezone(new \DateTimeZone("UTC")); array_push($updatedates,$updateissue); if($giteaissue->closed_at) { $closeissue=new \DateTime(json_decode(json_encode($giteaissue), true)["closed_at"]); $closeissue->setTimezone(new \DateTimeZone("UTC")); array_push($updatedates,$closeissue); } $fgscrumupdate=true; $this->majissue($scrumissue,$giteaissue,false); } } array_push($tbgiteaissues,$giteaissue->number); } // Temps d'execution $this->showtime(false,"Traiter les issues"); if($fgscrumupdate) { // Convertir les objets DateTime en timestamps $timestamps = array_map(function($date) { return $date->getTimestamp(); }, $updatedates); // Trouver le timestamp le plus récent $mostRecentTimestamp = max($timestamps); // Créer une nouvelle instance de DateTime à partir du timestamp le plus récent $mostRecentDate = (new \DateTime())->setTimestamp($mostRecentTimestamp); // Mettre à jour la date update du scrum $scrum->setUpdatedate($mostRecentDate); $this->_em->flush(); // Temps d'execution $this->showtime(false,"Mettre à jour le scrum"); } } public 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); } else { $scrumissue->setGiteamilestone(null); $scrumissue->setGiteamilestonename(null); } $scrumissue->setGiteajson(json_decode(json_encode($giteaissue), true)); // Si le ticket est lié à un sprint on s'assure que ce sprint est bien lié au milestone du ticket if($scrumissue->getScrumsprint()) { if($scrumissue->getScrumsprint()->getGiteamilestone()!=$scrumissue->getGiteamilestone()) { $scrumissue->setScrumsprint(null); } } $issueblock=$this->giteaservice->getissueblocks($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber()); if($issueblock&&!empty($issueblock)) { $idblock=$issueblock[0]->number; if(!$scrumissue->getScrumissueblock()||$scrumissue->getScrumissueblock()->getGiteanumber()!=$idblock) { $scrumissueblock=$this->_em->getRepository('App:Scrumissue')->findOneBy(["scrum"=>$scrumissue->getScrum(),"giteanumber"=>$idblock]); $scrumissue->setScrumissueblock($scrumissueblock); } } elseif(empty($issueblock)&&$scrumissue->getScrumissueblock()) { $scrumissue->setScrumissueblock(null); } $this->_em->persist($scrumissue); $this->_em->flush(); $havecolumn=false; foreach($giteaissue->labels as $gitealabel) { $scrumcolumn=$this->_em->getRepository('App:Scrumcolumn')->findOneBy(["scrum"=>$scrumissue->getScrum(),"giteaid"=>$gitealabel->id]); if($scrumcolumn) { $havecolumn=true; $scrumissue->setScrumcolumn($scrumcolumn); break; } } if(!$havecolumn) { $scrumissue->setScrumcolumn($this->firstcolumn); // Affecter le label backlog en tant que gitealabel $backlog=array($this->firstcolumn->getGiteaid()); $this->giteaservice->putIssuelabels($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber(),$backlog); } // Sauvegarde de l'issue $this->_em->persist($scrumissue); $this->_em->flush(); } private function getMaxDate(\DateTime ...$dates): \DateTime { // Initialiser la date maximale avec la première date de la liste $maxDate = $dates[0]; // Comparer chaque date avec la date maximale actuelle foreach ($dates as $date) { if ($date > $maxDate) { $maxDate = $date; } } return $maxDate; } }