'User lifecycle run', 'description' => 'Runs automatic user deactivate/delete policy', 'default_enabled' => 1, 'default_timezone' => defined('APP_TIMEZONE') ? (string) APP_TIMEZONE : 'UTC', 'default_schedule_type' => 'daily', 'default_schedule_interval' => 1, 'default_schedule_time' => '02:15', 'default_schedule_weekdays_csv' => null, 'default_catchup_once' => 1, 'allowed_schedule_types' => ['hourly', 'daily', 'weekly'], ]; } public function execute(?int $actorUserId): array { $result = $this->userLifecycleService->run($actorUserId !== null && $actorUserId > 0 ? $actorUserId : null); if (!($result['ok'] ?? false)) { $errorCode = (string) ($result['error'] ?? 'job_failed'); $status = $errorCode === 'lock_not_acquired' ? 'skipped' : 'failed'; return [ 'status' => $status, 'error_code' => $errorCode, 'error_message' => null, 'result' => $this->formatResult($result), ]; } return [ 'status' => 'success', 'error_code' => null, 'error_message' => null, 'result' => $this->formatResult($result), ]; } private function formatResult(array $result): array { return [ 'run_uuid' => (string) ($result['run_uuid'] ?? ''), 'deactivated_count' => (int) ($result['deactivated_count'] ?? 0), 'deleted_count' => (int) ($result['deleted_count'] ?? 0), 'skipped_count' => (int) ($result['skipped_count'] ?? 0), 'duration_ms' => (int) ($result['duration_ms'] ?? 0), ]; } }