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: не сохранено]" : "")); } }