]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Тестирование контроллера и синхронизации
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 25 Dec 2024 10:59:36 +0000 (13:59 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 25 Dec 2024 10:59:36 +0000 (13:59 +0300)
erp24/controllers/UsersMessageManagementController.php
erp24/views/users-message-management/export-kogort.php

index 2db02053462619e64cc255060ea39c34d5d82fe0..bbb984b0e458b71a5a722050735684b2c911aaf2 100644 (file)
@@ -7,10 +7,12 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
 use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 use Yii;
 use yii\base\DynamicModel;
+use yii\console\ExitCode;
 use yii\data\ActiveDataProvider;
 use yii\data\ArrayDataProvider;
 use yii\db\Exception;
 use yii\helpers\ArrayHelper;
+use yii\helpers\BaseConsole;
 use yii\helpers\Json;
 use yii\web\Controller;
 use yii_app\records\Sales;
@@ -19,6 +21,7 @@ use yii_app\records\Users;
 use yii_app\records\UsersEvents;
 use yii_app\records\UsersMessageManagement;
 use yii_app\records\UsersMessageManagementLogs;
+use yii_app\records\UsersTelegramLog;
 
 class UsersMessageManagementController extends Controller
 {
@@ -382,4 +385,102 @@ class UsersMessageManagementController extends Controller
 
         return ['success' => false, 'message' => 'Invalid request'];
     }
+
+
+    public function actionSyncTelegramUsers()
+    {
+        $remoteDb = Yii::$app->dbRemote;
+        $batchSize = 500;
+        $offset = 0;
+
+        $csvFilePath = Yii::getAlias('@runtime/missing_users.csv');
+        $fileHandle = fopen($csvFilePath, 'w');
+        fputcsv($fileHandle, ['phone', 'username', 'chat_id', 'is-blocked', 'is_registered', 'reason'], ';');
+
+        while (true) {
+            $chatbotUsers = $remoteDb
+                ->createCommand('SELECT * FROM chatbot_telegram_users LIMIT :limit OFFSET :offset', [
+                    ':limit' => $batchSize,
+                    ':offset' => $offset,
+                ])->queryAll();
+
+            if (empty($chatbotUsers)) {
+                break;
+            }
+
+            foreach ($chatbotUsers as $remoteUser) {
+                $phone = $remoteUser['phone'];
+                $chatId = $remoteUser['chat_id'];
+                $username = $remoteUser['username'];
+                $isBlocked = (int)$remoteUser['is_blocked'];
+                $isRegistered = (int)$remoteUser['is_registered'];
+                if (empty($phone)) {
+                    fputcsv($fileHandle, [$phone, $username, $chatId, $isBlocked, $isRegistered, 'Отсутствует телефон'], ';');
+                    continue;
+                }
+
+                $existingLog = UsersTelegramLog::find()
+                    ->where(['phone' => $phone, 'date_end' => null])
+                    ->one();
+
+                if ($existingLog) {
+                    if (
+                        $existingLog->is_blocked != $isBlocked ||
+                        $existingLog->is_registered != $isRegistered
+                    ) {
+                        $existingLog->date_end = date('Y-m-d H:i:s');
+                        $existingLog->save(false);
+
+                        $this->createTelegramLog($phone, $isBlocked, $isRegistered);
+                    }
+                } else {
+                    $this->createTelegramLog($phone, $isBlocked, $isRegistered);
+                }
+
+                $user = Users::findOne(['phone' => $phone]);
+
+                if (!$user) {
+                    fputcsv($fileHandle, [$phone, $username, $chatId, $isBlocked, $isRegistered, 'Пользователь не найден'], ';');
+                    continue;
+                }
+
+                if (empty($user->telegram_chat_id)) {
+                    $user->telegram_chat_id = $chatId;
+                }
+
+                if ($isRegistered && $user->telegram_is_subscribed == 0) {
+                    $user->telegram_is_subscribed = 1;
+                } elseif (!$isRegistered && $user->telegram_is_subscribed == 1) {
+                    $user->telegram_is_subscribed = 0;
+                    $user->telegram_unsubscribed_at = date('Y-m-d H:i:s');
+                }
+
+                $user->save(false);
+            }
+
+            $offset += $batchSize;
+
+        }
+
+        fclose($fileHandle);
+        return 'ok';
+    }
+
+    /**
+     * Создает новую запись в таблице users_telegram_log.
+     *
+     * @param string $phone
+     * @param int $isBlocked
+     * @param int $isRegistered
+     */
+    protected function createTelegramLog($phone, $isBlocked, $isRegistered)
+    {
+        $log = new UsersTelegramLog([
+            'phone' => $phone,
+            'is_blocked' => $isBlocked,
+            'is_registered' => $isRegistered,
+            'active' => ($isBlocked == 0 && $isRegistered == 1) ? 1 : 0,
+        ]);
+        $log->save(false);
+    }
 }
index 77916ac2e7fbdda95f0f918e12df90ad794022e7..7ebae89c7e9acd9f5a7fa53c2ef81c56e3c4cbab 100644 (file)
@@ -98,15 +98,6 @@ $this->title = 'Рассылка по когортам';
             <?php endforeach; ?>
             </tbody>
         </table>
+        <?= Html::a('Запустить синхронизацию', ['sync-telegram-users'], ['class' => 'btn btn-primary']) ?>
     </div>
 
-    <?php
-
-        $rows = Yii::$app->dbRemote->createCommand("SELECT * FROM chatbot_telegram_users LIMIT 10")
-        ->queryAll();
-
-        foreach ($rows as $row) {
-         print_r($row);
-        }
-
-?>
\ No newline at end of file