From de65a2b60c20aba7ece213f53465e9754b9d5b74 Mon Sep 17 00:00:00 2001 From: "an.nechaev" Date: Thu, 18 Jun 2026 12:04:24 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=BB=D0=B2=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=20dry?= =?UTF-8?q?-run=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B5=20=D0=B2=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2=20=D0=91=D0=94=20=D0=98=D0=98?= =?UTF-8?q?=20based?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/console/calculate_sprint_completion.php | 41 +++++++++++++-------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/console/calculate_sprint_completion.php b/src/console/calculate_sprint_completion.php index 616b972..87fc69a 100644 --- a/src/console/calculate_sprint_completion.php +++ b/src/console/calculate_sprint_completion.php @@ -5,7 +5,7 @@ use Nechaev\Reports\Core\App; require_once __DIR__ . '/../functions.php'; require_once __DIR__ . '/../../init.php'; -$options = getopt('h::', ['non-interactive::', 'help::', 'sprint-id::', 'team::', 'log::']); +$options = getopt('h::', ['non-interactive::', 'help::', 'sprint-id::', 'team::', 'log::', 'dry-run::']); if (isset($options['h']) || isset($options['help'])) { $helpText = "Использование: php " . basename($argv[0]) . " [ОПЦИИ]\n" . @@ -25,6 +25,7 @@ if (isset($options['h']) || isset($options['help'])) { " (пересчитывается даже если процент уже посчитан)\n" . " --log[=ПУТЬ] Писать процесс выполнения (ключ задачи и решение по ней) в файл.\n" . " Если путь не указан, используется sprint_completion_<дата>.log\n" . + " --dry-run Только посчитать и показать результат, без изменений в базе данных\n" . " --non-interactive Не задавать вопросы в процессе работы\n"; fwrite(STDOUT, $helpText); @@ -32,6 +33,7 @@ if (isset($options['h']) || isset($options['help'])) { } $interactiveMode = !isset($options['non-interactive']); +$dryRun = isset($options['dry-run']); $sprintIdFilter = null; if (isset($options['sprint-id']) && $options['sprint-id'] !== false && $options['sprint-id'] !== '') { @@ -139,6 +141,11 @@ foreach ($membershipRows as $row) { echo "Найдено спринтов без посчитанного процента закрытия: " . count($sprints) . "\n"; +if ($dryRun) { + echo "Режим dry-run: изменения в базу данных вноситься не будут.\n"; + $writeLog("Режим dry-run: изменения в базу данных не вносятся."); +} + if ($interactiveMode) { $answer = readline("Рассчитать процент закрытия для этих спринтов? (Y/n): "); if (strtolower(trim($answer)) === 'n') { @@ -432,27 +439,31 @@ foreach ($sprintsByJiraId as $jiraSprintId => $sprintRows) { $percentage = round($stats['done'] / $stats['total'] * 100, 2); - try { - App::getDb()->execute( - "UPDATE sprints SET sprint_completion_percentage = :percentage WHERE id = :id", - [ - 'percentage' => $percentage, - 'id' => $sprintRowId, - ] - ); - } catch (PDOException $e) { - echo "⚠️ Не удалось сохранить процент для спринта '{$sprintName}' (команда {$teamId}): " - . $e->getMessage() . "\n"; - $writeLog("Спринт '{$sprintName}' (команда {$teamId}): ошибка сохранения — " . $e->getMessage()); - continue; + if (!$dryRun) { + try { + App::getDb()->execute( + "UPDATE sprints SET sprint_completion_percentage = :percentage WHERE id = :id", + [ + 'percentage' => $percentage, + 'id' => $sprintRowId, + ] + ); + } catch (PDOException $e) { + echo "⚠️ Не удалось сохранить процент для спринта '{$sprintName}' (команда {$teamId}): " + . $e->getMessage() . "\n"; + $writeLog("Спринт '{$sprintName}' (команда {$teamId}): ошибка сохранения — " . $e->getMessage()); + continue; + } } echo "Спринт '{$sprintName}' (команда {$teamId}): " . "{$stats['done']} из {$stats['total']} задач завершено — {$percentage}%" . ($notInSprintAtStartCount > 0 ? " (по спринту исключено отсутствовавших в спринте на старте: {$notInSprintAtStartCount})" : "") + . ($dryRun ? " [dry-run: не сохранено]" : "") . "\n"; $writeLog("ИТОГ спринт '{$sprintName}' (команда {$teamId}): " - . "{$stats['done']}/{$stats['total']} закрыто — {$percentage}%"); + . "{$stats['done']}/{$stats['total']} закрыто — {$percentage}%" + . ($dryRun ? " [dry-run: не сохранено]" : "")); } }