]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
fix diagnostic origin/feature_filippov_20260129_fix_diagnostic
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 29 Jan 2026 08:04:28 +0000 (11:04 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 29 Jan 2026 08:04:28 +0000 (11:04 +0300)
erp24/controllers/DiagnosticController.php
erp24/views/diagnostic/index.php

index 0e5e6f5926c06e28bbc5e66469189df8593f0781..644f028ff7047a63aad9b0b8e80ffb019c8ca7d7 100644 (file)
@@ -273,6 +273,69 @@ class DiagnosticController extends Controller
         }
     }
 
+    /**
+     * Тестирование 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 бота
      */
@@ -352,9 +415,11 @@ class DiagnosticController extends Controller
             ]);
         }
 
-        $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([
@@ -370,7 +435,11 @@ class DiagnosticController extends Controller
             $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, [
@@ -479,9 +548,13 @@ class DiagnosticController extends Controller
         $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();
@@ -497,7 +570,7 @@ class DiagnosticController extends Controller
         // 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 {
@@ -536,7 +609,12 @@ class DiagnosticController extends Controller
             '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' => 'Схема внешней БД',
@@ -609,9 +687,13 @@ class DiagnosticController extends Controller
                 '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,
index c79ad0f4e0ab8fe89ce9995ffc9a247a32713c54..d94f4b77b98334a5d6457af4275f9f3282d83b74 100644 (file)
@@ -499,11 +499,11 @@ $this->params['breadcrumbs'][] = $this->title;
             <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>
@@ -520,6 +520,27 @@ $this->params['breadcrumbs'][] = $this->title;
             </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>
@@ -549,8 +570,9 @@ $this->params['breadcrumbs'][] = $this->title;
 
                 <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()">
@@ -679,6 +701,7 @@ $this->params['breadcrumbs'][] = $this->title;
         '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']) ?>',
@@ -773,7 +796,7 @@ $this->params['breadcrumbs'][] = $this->title;
         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;
 
@@ -821,4 +844,52 @@ $this->params['breadcrumbs'][] = $this->title;
             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>