}
}
+ /**
+ * Тестирование Telegram бота (продакшн)
+ */
+ public function actionTestTelegramProd(): Response
+ {
+ Yii::$app->response->format = Response::FORMAT_JSON;
+
+ $token = getenv('TELEGRAM_BOT_TOKEN_PROD') ?: '';
+
+ if (empty($token)) {
+ return $this->asJson([
+ 'success' => false,
+ 'message' => 'TELEGRAM_BOT_TOKEN_PROD не настроен',
+ 'hint' => 'Установите TELEGRAM_BOT_TOKEN_PROD в .env файле',
+ ]);
+ }
+
+ if (strpos($token, '000000000') === 0) {
+ return $this->asJson([
+ 'success' => false,
+ 'message' => 'TELEGRAM_BOT_TOKEN_PROD содержит placeholder значение',
+ 'hint' => 'Замените placeholder на реальный токен бота',
+ ]);
+ }
+
+ try {
+ $client = new Client(['timeout' => 10]);
+ $url = "https://api.telegram.org/bot{$token}/getMe";
+
+ $startTime = microtime(true);
+ $response = $client->get($url);
+ $duration = round((microtime(true) - $startTime) * 1000, 2);
+
+ $data = json_decode($response->getBody()->getContents(), true);
+
+ if ($data['ok'] ?? false) {
+ return $this->asJson([
+ 'success' => true,
+ 'message' => 'Telegram Prod бот подключен успешно',
+ 'data' => [
+ 'bot_id' => $data['result']['id'] ?? 'N/A',
+ 'bot_name' => $data['result']['first_name'] ?? 'N/A',
+ 'bot_username' => '@' . ($data['result']['username'] ?? 'N/A'),
+ 'can_read_messages' => $data['result']['can_read_all_group_messages'] ?? false,
+ 'duration_ms' => $duration,
+ ],
+ ]);
+ }
+
+ return $this->asJson([
+ 'success' => false,
+ 'message' => 'Telegram Prod API вернул ошибку',
+ 'error' => $data['description'] ?? 'Unknown error',
+ ]);
+ } catch (GuzzleException $e) {
+ return $this->asJson([
+ 'success' => false,
+ 'message' => 'Ошибка подключения к Telegram Prod API',
+ 'error' => $e->getMessage(),
+ ]);
+ }
+ }
+
/**
* Тестирование Telegram Salebot бота
*/
]);
}
- $token = $botType === 'salebot'
- ? getenv('TELEGRAM_BOT_TOKEN_SALEBOT')
- : getenv('TELEGRAM_BOT_TOKEN');
+ $token = match ($botType) {
+ 'prod' => getenv('TELEGRAM_BOT_TOKEN_PROD'),
+ 'salebot' => getenv('TELEGRAM_BOT_TOKEN_SALEBOT'),
+ default => getenv('TELEGRAM_BOT_TOKEN'),
+ };
if (empty($token) || strpos($token, '000000000') === 0) {
return $this->asJson([
$message = "🔧 *Тестовое сообщение ERP24*\n\n"
. "Время: " . date('Y-m-d H:i:s') . "\n"
. "Сервер: " . gethostname() . "\n"
- . "Бот: " . ($botType === 'salebot' ? 'Salebot' : 'Main') . "\n"
+ . "Бот: " . match ($botType) {
+ 'prod' => 'Prod',
+ 'salebot' => 'Salebot',
+ default => 'Dev',
+ } . "\n"
. "Пользователь: " . (Yii::$app->user->identity->name ?? 'N/A');
$response = $client->post($url, [
$rabbitResult = $this->actionTestRabbitmq();
$results['rabbitmq'] = json_decode($rabbitResult->content, true);
- // Telegram Main
+ // Telegram Dev
$telegramResult = $this->actionTestTelegram();
- $results['telegram_main'] = json_decode($telegramResult->content, true);
+ $results['telegram_dev'] = json_decode($telegramResult->content, true);
+
+ // Telegram Prod
+ $telegramProdResult = $this->actionTestTelegramProd();
+ $results['telegram_prod'] = json_decode($telegramProdResult->content, true);
// Telegram Salebot
$salebotResult = $this->actionTestTelegramSalebot();
// Summary
$successCount = 0;
$failCount = 0;
- foreach (['postgresql', 'db_remote', 'rabbitmq', 'telegram_main', 'telegram_salebot', 'queue'] as $key) {
+ foreach (['postgresql', 'db_remote', 'rabbitmq', 'telegram_dev', 'telegram_prod', 'telegram_salebot', 'queue'] as $key) {
if ($results[$key]['success'] ?? false) {
$successCount++;
} else {
'POSTGRES_SCHEMA' => 'Схема PostgreSQL',
'POSTGRES_USER' => 'Пользователь PostgreSQL',
'RABBIT_HOST' => 'Хост RabbitMQ',
+ 'TELEGRAM_BOT_TOKEN_PROD' => 'Токен Telegram (Prod)',
'TELEGRAM_BOT_TOKEN_SALEBOT' => 'Токен Salebot',
+ 'TELEGRAM_CHAT_CHANNEL_ID' => 'ID основного канала',
+ 'TELEGRAM_CHAT_CHANNEL_ERP_ID' => 'ID ERP канала',
+ 'TELEGRAM_ORDER_CONTROL_CHAT_ID_DEV' => 'ID канала контроля заказов (Dev)',
+ 'TELEGRAM_ORDER_CONTROL_CHAT_ID_PROD' => 'ID канала контроля заказов (Prod)',
'DB_REMOTE_HOST' => 'Хост внешней БД',
'DB_REMOTE_PORT' => 'Порт внешней БД',
'DB_REMOTE_SCHEMA' => 'Схема внешней БД',
'configured' => !empty(getenv('RABBIT_USER')) && !empty(getenv('RABBIT_PASSWORD')),
],
'telegram' => [
- 'name' => 'Telegram Bot (основной)',
+ 'name' => 'Telegram Bot (Dev)',
'configured' => !empty(getenv('TELEGRAM_BOT_TOKEN')) && strpos(getenv('TELEGRAM_BOT_TOKEN'), '000000000') !== 0,
],
+ 'telegram_prod' => [
+ 'name' => 'Telegram Bot (Prod)',
+ 'configured' => !empty(getenv('TELEGRAM_BOT_TOKEN_PROD')) && strpos(getenv('TELEGRAM_BOT_TOKEN_PROD'), '000000000') !== 0,
+ ],
'telegram_salebot' => [
'name' => 'Telegram Bot (Salebot)',
'configured' => !empty(getenv('TELEGRAM_BOT_TOKEN_SALEBOT')) && strpos(getenv('TELEGRAM_BOT_TOKEN_SALEBOT'), '000000000') !== 0,
<h3>📱 Telegram боты</h3>
</div>
<div class="section-body" style="padding: 0;">
- <!-- Main Telegram Bot -->
+ <!-- Dev Telegram Bot -->
<div class="test-item">
- <div class="test-icon telegram">ð\9f\93±</div>
+ <div class="test-icon telegram">ð\9f\94§</div>
<div class="test-info">
- <div class="test-name">Telegram Bot (основной)</div>
+ <div class="test-name">Telegram Bot (Dev)</div>
<div class="test-status" id="telegram-status">
<?php if ($connections['telegram']['configured']): ?>
<span class="status-badge info">Сконфигурирован</span>
</div>
<div class="result-container" id="telegram-result"></div>
+ <!-- Prod Telegram Bot -->
+ <div class="test-item">
+ <div class="test-icon telegram">📱</div>
+ <div class="test-info">
+ <div class="test-name">Telegram Bot (Prod)</div>
+ <div class="test-status" id="telegram-prod-status">
+ <?php if ($connections['telegram_prod']['configured'] ?? false): ?>
+ <span class="status-badge info">Сконфигурирован</span>
+ <?php else: ?>
+ <span class="status-badge warning">Не настроен</span>
+ <?php endif; ?>
+ </div>
+ </div>
+ <div class="test-actions">
+ <button class="btn-test btn-test-primary" onclick="testConnection('telegram-prod')">
+ Тестировать
+ </button>
+ </div>
+ </div>
+ <div class="result-container" id="telegram-prod-result"></div>
+
<!-- Salebot Telegram Bot -->
<div class="test-item">
<div class="test-icon telegram">🤖</div>
<label for="bot-type">Бот:</label>
<select id="bot-type">
- <option value="main">Основной бот</option>
- <option value="salebot">Salebot</option>
+ <option value="main" id="bot-option-main">Dev бот (загрузка...)</option>
+ <option value="prod" id="bot-option-prod">Prod бот (загрузка...)</option>
+ <option value="salebot" id="bot-option-salebot">Salebot (загрузка...)</option>
</select>
<button class="btn-test btn-test-success" onclick="sendTestMessage()">
'db-remote': '<?= \yii\helpers\Url::to(['/diagnostic/test-db-remote']) ?>',
'rabbitmq': '<?= \yii\helpers\Url::to(['/diagnostic/test-rabbitmq']) ?>',
'telegram': '<?= \yii\helpers\Url::to(['/diagnostic/test-telegram']) ?>',
+ 'telegram-prod': '<?= \yii\helpers\Url::to(['/diagnostic/test-telegram-prod']) ?>',
'telegram-salebot': '<?= \yii\helpers\Url::to(['/diagnostic/test-telegram-salebot']) ?>',
'queue': '<?= \yii\helpers\Url::to(['/diagnostic/test-queue']) ?>',
'send-message': '<?= \yii\helpers\Url::to(['/diagnostic/send-test-message']) ?>',
document.getElementById('total-count').textContent = '...';
// Run individual tests
- const tests = ['postgres', 'db-remote', 'rabbitmq', 'telegram', 'telegram-salebot', 'queue'];
+ const tests = ['postgres', 'db-remote', 'rabbitmq', 'telegram', 'telegram-prod', 'telegram-salebot', 'queue'];
let passed = 0;
let failed = 0;
header.classList.remove('collapsed');
}
}
+
+ // Загрузка реальных названий ботов при открытии страницы
+ async function loadBotNames() {
+ // Загрузка Dev бота
+ try {
+ const mainResponse = await fetch(endpoints['telegram']);
+ const mainData = await mainResponse.json();
+ const mainOption = document.getElementById('bot-option-main');
+ if (mainData.success && mainData.data) {
+ mainOption.textContent = '[DEV] ' + mainData.data.bot_name + ' (' + mainData.data.bot_username + ')';
+ } else {
+ mainOption.textContent = 'Dev бот (не настроен)';
+ }
+ } catch (e) {
+ document.getElementById('bot-option-main').textContent = 'Dev бот (ошибка)';
+ }
+
+ // Загрузка Prod бота
+ try {
+ const prodResponse = await fetch(endpoints['telegram-prod']);
+ const prodData = await prodResponse.json();
+ const prodOption = document.getElementById('bot-option-prod');
+ if (prodData.success && prodData.data) {
+ prodOption.textContent = '[PROD] ' + prodData.data.bot_name + ' (' + prodData.data.bot_username + ')';
+ } else {
+ prodOption.textContent = 'Prod бот (не настроен)';
+ }
+ } catch (e) {
+ document.getElementById('bot-option-prod').textContent = 'Prod бот (ошибка)';
+ }
+
+ // Загрузка Salebot
+ try {
+ const salebotResponse = await fetch(endpoints['telegram-salebot']);
+ const salebotData = await salebotResponse.json();
+ const salebotOption = document.getElementById('bot-option-salebot');
+ if (salebotData.success && salebotData.data) {
+ salebotOption.textContent = '[SALEBOT] ' + salebotData.data.bot_name + ' (' + salebotData.data.bot_username + ')';
+ } else {
+ salebotOption.textContent = 'Salebot (не настроен)';
+ }
+ } catch (e) {
+ document.getElementById('bot-option-salebot').textContent = 'Salebot (ошибка)';
+ }
+ }
+
+ // Загружаем названия ботов при загрузке страницы
+ document.addEventListener('DOMContentLoaded', loadBotNames);
</script>