From 885b69426dc8a73e16ce8726efcf7bc7770c14ba Mon Sep 17 00:00:00 2001 From: matks Date: Thu, 31 Mar 2022 22:03:16 +0200 Subject: [PATCH] Enable developer week view --- src/Controller/ReviewStatsHomeController.php | 6 +- src/Helper/DayComputer.php | 5 ++ src/Helper/ReviewStatsService.php | 68 ++++++++++++-------- templates/developer_stats.html.twig | 42 +++++++++--- tests/Helper/DayComputerTest.php | 13 ++++ tests/Helper/ReviewStatsServiceTest.php | 8 ++- 6 files changed, 104 insertions(+), 38 deletions(-) diff --git a/src/Controller/ReviewStatsHomeController.php b/src/Controller/ReviewStatsHomeController.php index aa9eef8..78b73cc 100644 --- a/src/Controller/ReviewStatsHomeController.php +++ b/src/Controller/ReviewStatsHomeController.php @@ -86,7 +86,11 @@ public function viewDeveloper(string $login): Response ); return $this->render('developer_stats.html.twig', - ['stats' => $developerStats, 'login' => $login] + [ + 'login' => $login, + 'dayByDayStats' => $developerStats['dayByDayStats'], + 'weekStats' => array_reverse($developerStats['weekStats']), + ] ); } } diff --git a/src/Helper/DayComputer.php b/src/Helper/DayComputer.php index 8c4e81b..a47aefc 100644 --- a/src/Helper/DayComputer.php +++ b/src/Helper/DayComputer.php @@ -110,4 +110,9 @@ public static function getPastWeekRanges($numberOfWeeks, DateTime $day) return array_reverse($result); } + + public static function findWeekNumber(DateTime $date): int + { + return (int) $date->format("W"); + } } diff --git a/src/Helper/ReviewStatsService.php b/src/Helper/ReviewStatsService.php index 3e4174a..61cad3e 100644 --- a/src/Helper/ReviewStatsService.php +++ b/src/Helper/ReviewStatsService.php @@ -119,7 +119,7 @@ public function getTeamStatsGroupedByDay(DateTime $from, DateTime $to): array * @param int $howManyDays * @param DateTime $endDate * - * @return array> + * @return array */ public function getDeveloperStats(string $login, int $howManyDays, DateTime $endDate): array { @@ -131,37 +131,27 @@ public function getDeveloperStats(string $login, int $howManyDays, DateTime $end $result = $this->pdo->query($sql)->fetchAll(); - $cleanResult = []; - foreach ($result as $item) { - $cleanResult[] = [ - 'day' => $item['day'], - 'PR' => $this->formatPRs($item['PR']), - 'total' => $item['total'], + $weekRanges = DayComputer::getPastWeekRanges(12, DayComputer::getSundayBefore($endDate)); + $weekRangesTotals = []; + foreach ($weekRanges as $weekRange) { + $weekRangesTotals[] = [ + 'begin' => new DateTime($weekRange[0]), + 'end' => new DateTime($weekRange[1]), + 'number' => DayComputer::findWeekNumber(new DateTime($weekRange[0])), + 'total' => 0 ]; } - return $cleanResult; - } - - /** - * @param array> $groupedByLogin - * @param string $login - * @param string $day - * @param int $total - * - * @return array> - */ - private function addOrInsert(array $groupedByLogin, string $login, string $day, int $total): array - { - if (!array_key_exists($login, $groupedByLogin)) { - $groupedByLogin[$login] = []; - } - if (!array_key_exists($day, $groupedByLogin[$login])) { - $groupedByLogin[$login][$day] = []; + $dayByDayStats = []; + foreach ($result as $item) { + $dayByDayStats[] = $this->buildDayStat($item); + $weekRangesTotals = $this->insertIntoWeekStat($item, $weekRangesTotals); } - $groupedByLogin[$login][$day] = $total; - return $groupedByLogin; + return [ + 'dayByDayStats' => $dayByDayStats, + 'weekStats' => $weekRangesTotals, + ]; } /** @@ -226,4 +216,28 @@ private function computeAndInsertTotals(array $groupedByLogin): array return $copy; } + + private function buildDayStat(array $item): array + { + return [ + 'day' => $item['day'], + 'PR' => $this->formatPRs($item['PR']), + 'total' => $item['total'], + ]; + } + + private function insertIntoWeekStat(array $item, array $weekRangesTotals): array + { + $day = new DateTime($item['day']); + foreach ($weekRangesTotals as $i => $weekRangesTotal) { + if ($day >= $weekRangesTotal['begin'] && $day <= $weekRangesTotal['end']) { + $weekRangesTotals[$i]['total'] += (int) $item['total']; + break; + } + } + + return $weekRangesTotals; + } + + } diff --git a/templates/developer_stats.html.twig b/templates/developer_stats.html.twig index be02602..b16d4bd 100644 --- a/templates/developer_stats.html.twig +++ b/templates/developer_stats.html.twig @@ -12,21 +12,47 @@ {% endblock %} {% block page_info %} -
-

About this dashboard

-
- You can see the same data on your personal GitHub page: - https://github.com/{{ login }} +
+

About this dashboard

+
+ You can see the same data on your personal GitHub page: + https://github.com/{{ login }} +
-
{% endblock %} {% block page_content %} + +
+

Week stats

+
+ + + + + + + + + + {% for weekStat in weekStats %} + + + + + {% endfor %} + +
WeekTotal
{{ weekStat.number }}{{ weekStat.total }}
+ +
+

Last 90 days

+
+
- {% for data in stats %} + {% for data in dayByDayStats %}
On {{ data['day'] }} reviewed {{ data['total'] }} pull requests:
- {{ data['PR'] | raw }} + {{ data['PR'] | raw }}
{% endfor %} diff --git a/tests/Helper/DayComputerTest.php b/tests/Helper/DayComputerTest.php index 4138fc3..9ddeed7 100644 --- a/tests/Helper/DayComputerTest.php +++ b/tests/Helper/DayComputerTest.php @@ -188,4 +188,17 @@ public function testGetMultiplePastWeekRange(): void DayComputer::getPastWeekRanges(3, new DateTime('2022-01-10 05:00:00')) ); } + + public function testFindWeekNumber(): void + { + $dateTime1 = new DateTime('2022-03-21 05:00:00'); + $dateTime2 = new DateTime('2022-03-22 05:00:00'); + $dateTime3 = new DateTime('2022-03-27 05:00:00'); + $dateTime4 = new DateTime('2022-03-20 05:00:00'); + + $this->assertEquals(12, DayComputer::findWeekNumber($dateTime1)); + $this->assertEquals(12, DayComputer::findWeekNumber($dateTime2)); + $this->assertEquals(12, DayComputer::findWeekNumber($dateTime3)); + $this->assertEquals(11, DayComputer::findWeekNumber($dateTime4)); + } } diff --git a/tests/Helper/ReviewStatsServiceTest.php b/tests/Helper/ReviewStatsServiceTest.php index 8279182..a3269e8 100644 --- a/tests/Helper/ReviewStatsServiceTest.php +++ b/tests/Helper/ReviewStatsServiceTest.php @@ -38,12 +38,14 @@ public function testGetDeveloperStatsFromMatks(): void $statsService = new ReviewStatsService($this->getPDO()); - $stats = $statsService->getDeveloperStats( + $result = $statsService->getDeveloperStats( 'matks', 10, new DateTime('2021-12-06') ); + $stats = $result['dayByDayStats']; + $this->assertEquals($stats[0]['day'], '2021-12-05'); $this->assertEquals($stats[0]['total'], 2); $this->assertEquals($stats[4]['day'], '2021-12-01'); @@ -56,12 +58,14 @@ public function testGetDeveloperStatsFromPierreRambaud(): void $statsService = new ReviewStatsService($this->getPDO()); - $stats = $statsService->getDeveloperStats( + $result = $statsService->getDeveloperStats( 'PierreRambaud', 10, new DateTime('2021-12-06') ); + $stats = $result['dayByDayStats']; + $this->assertEquals($stats[0]['day'], '2021-12-02'); $this->assertEquals($stats[0]['total'], 20); $this->assertEquals($stats[1]['day'], '2021-12-01');