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;
use yii_app\records\UsersEvents;
use yii_app\records\UsersMessageManagement;
use yii_app\records\UsersMessageManagementLogs;
+use yii_app\records\UsersTelegramLog;
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);
+ }
}